From 05a2c37e604a16b18ba18ec4d62cda586094ef23 Mon Sep 17 00:00:00 2001 From: db4tz <69345937+db4tz@users.noreply.github.com> Date: Thu, 30 Jan 2025 05:20:10 +0200 Subject: [PATCH] Added BakaInUa plugin (#1470) * add BakaInUa plugin * fixed BakaInUa bugs * fixed BakaInUa bugs * Added search for BakaInUa * fixed BakaInUa parseChapter --- public/static/src/uk/bakainua/icon.png | Bin 0 -> 3916 bytes src/plugins/ukrainian/bakainua.ts | 86 +++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 public/static/src/uk/bakainua/icon.png create mode 100644 src/plugins/ukrainian/bakainua.ts diff --git a/public/static/src/uk/bakainua/icon.png b/public/static/src/uk/bakainua/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9edbb732f4837f2a389c5d3df794448fa942bdeb GIT binary patch literal 3916 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 V29stI+m8QEt { + const novels: Plugin.NovelItem[] = []; + + const result = await fetchApi(this.site + '/fictions/alphabetical'); + const body = await result.text(); + const $ = parseHTML(body); + + $('#fiction-list > ol > li > div > div').each((index, elem) => { + novels.push({ + path: $(elem).find('a').attr('href'), + name: $(elem).find('a>h2').text(), + cover: this.site + $(elem).find('a>div>div>div>img').attr('src'), + }); + }); + return novels; + } + async parseNovel(novelUrl: string): Promise { + const result = await fetchApi(this.site + '/' + novelUrl); + const body = await result.text(); + const $ = parseHTML(body); + + const novel: Plugin.SourceNovel = { + path: novelUrl, + name: $('h2.text-xl.font-bold.text-stone-800.mb-2').text(), + author: $('button#fictions-author-search').text(), + cover: + this.site + + $('div.from-stone-50.to-stone-100>div.relative>img').attr('src'), + summary: $('p.text-sm.leading-relaxed').text(), + status: $('div.bg-stone-100:nth-child(3)>p:nth-child(2)').text(), + }; + + let chapters: Plugin.ChapterItem[] = []; + $('li.group') + .find('a') + .each((index, elem) => { + const chapter: Plugin.ChapterItem = { + name: $(elem).find('div>div>span:nth-child(2)').text().trim(), + path: $(elem).attr('href'), + chapterNumber: index + 1, + }; + chapters.push(chapter); + }); + + novel.chapters = chapters.reverse(); + return novel; + } + + async parseChapter(chapterUrl: string): Promise { + const result = await fetchApi(this.site + '/' + chapterUrl); + const body = await result.text(); + const $ = parseHTML(body); + return $('#user-content').html(); + } + + async searchNovels(searchTerm: string): Promise { + let novels: Plugin.NovelItem[] = []; + + const result = await fetchApi( + this.site + '/search?search%5B%5D=' + searchTerm, + ); + const body = await result.text(); + const $ = parseHTML(body); + $('ul>section>div>div').each((index, elem) => { + novels.push({ + path: $(elem).find('div:nth-child(2)>a').attr('href'), + name: $(elem).find('div:nth-child(2)>a').text().trim(), + cover: this.site + $(elem).find('div:nth-child(1)>img').attr('src'), + }); + }); + return novels; + } +} + +export default new BakaInUa();