From 4d5cfc3c1afa125a6d2d30e5a22998a1d1b37207 Mon Sep 17 00:00:00 2001 From: Elfing <106489440+elfing44@users.noreply.github.com> Date: Mon, 27 May 2024 04:01:15 +0200 Subject: [PATCH] Feature(plugin): add phenixscan (#951) --- icons/src/fr/phenixscans/icon.png | Bin 0 -> 17689 bytes plugins/french/phenixscans.ts | 281 ++++++++++++++++++++++++++++++ 2 files changed, 281 insertions(+) create mode 100644 icons/src/fr/phenixscans/icon.png create mode 100644 plugins/french/phenixscans.ts diff --git a/icons/src/fr/phenixscans/icon.png b/icons/src/fr/phenixscans/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..878d68a7b445564740ad67c219cfa73f72af418f GIT binary patch literal 17689 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 { + const r = await fetchApi(url); + const body = await r.text(); + const $ = load(body); + return $; + } + + async popularNovels( + pageNo: number, + { showLatestNovels, filters }: Plugin.PopularNovelsOptions, + ): Promise { + const novels: Plugin.NovelItem[] = []; + let novel: Plugin.NovelItem; + + let filter = ''; + for (const key in filters) { + if (typeof filters[key].value === 'object') { + for (const value of filters[key].value as string[]) { + filter += `&genre%5B%5D=${value}`; + } + } + } + + const order = showLatestNovels ? 'update' : 'popular'; + const url = `${this.site}/manga/?page=${pageNo}${filter}&status=&type=novel&order=${order}`; + + let $ = await this.getCheerio(url); + $('div div div div a').each((i, elem) => { + const novelName = $(elem).attr('title')?.trim(); + const novelUrl = $(elem).attr('href'); + const novelCover = $(elem).find('div img').attr('src') || defaultCover; + + if (novelUrl && novelName) { + novel = { + name: novelName, + cover: novelCover, + path: novelUrl.replace(this.site, ''), + }; + novels.push(novel); + } + }); + return novels; + } + + async parseNovel(novelPath: string): Promise { + const novel: Plugin.SourceNovel = { + path: novelPath, + name: 'Sans titre', + }; + + let $ = await this.getCheerio(this.site + novelPath); + + novel.name = $('h1[itemprop=name]').text().replace('– Novel', '').trim(); + novel.cover = + $('div[itemprop=image] img').first().attr('src') || defaultCover; + novel.author = $('.fmed b:contains(Auteur)+span').text().trim(); + novel.genres = $('.mgen a') + .map(function () { + return $(this).text(); + }) + .get() + .join(', '); + novel.summary = $('.entry-content[itemprop=description]').text().trim(); + novel.status = this.getStatus( + $('.tsinfo .imptdt:contains(Statut)').text().replace('Statut', '').trim(), + ); + + let chapters: Plugin.ChapterItem[] = []; + $('ul li:has(div.chbox):has(div.eph-num)').each((i, elem) => { + const chapterName = $(elem).find('a .chapternum').text().trim(); + const chapterUrl = $(elem).find('a').attr('href'); + const releaseDate = this.parseDate($(elem).find('a .chapterdate').text()); + if (chapterUrl && chapterUrl.includes(this.site) && chapterName) { + chapters.push({ + name: chapterName, + path: chapterUrl.replace(this.site, ''), + releaseTime: releaseDate, + }); + } + }); + novel.chapters = chapters; + return novel; + } + + parseDate(date: string): string { + const monthMapping: { [key: string]: string } = { + janvier: 'January', + fevrier: 'February', + mars: 'March', + avril: 'April', + mai: 'May', + juin: 'June', + juillet: 'July', + aout: 'August', + septembre: 'September', + octobre: 'October', + novembre: 'November', + decembre: 'December', + }; + const [month, day, year] = date.split(' '); + return dayjs( + `${day} ${monthMapping[month.normalize('NFD').replace(/[\u0300-\u036f]/g, '')]} ${year}`, + 'D MMMM YYYY', + ).format('YYYY-MM-DD'); + } + + getStatus(status: string) { + const lowerCaseStatus = status.toLowerCase(); + const ongoing = ['en cours', 'en cours de publication']; + const onhiatus = ['en pause', 'en attente']; + const completed = ['complété', 'fini', 'achevé', 'terminé']; + const cancelled = ['abandonné']; + + if (ongoing.includes(lowerCaseStatus)) { + return NovelStatus.Ongoing; + } else if (onhiatus.includes(lowerCaseStatus)) { + return NovelStatus.OnHiatus; + } else if (completed.includes(lowerCaseStatus)) { + return NovelStatus.Completed; + } else if (cancelled.includes(lowerCaseStatus)) { + return NovelStatus.Cancelled; + } + return NovelStatus.Unknown; + } + + async parseChapter(chapterPath: string): Promise { + const $ = await this.getCheerio(this.site + chapterPath); + return $('#readerarea').html() || ''; + } + + async searchNovels( + searchTerm: string, + pageNo: number, + ): Promise { + if (pageNo !== 1) return []; + + let popularNovels = this.popularNovels(1, { + showLatestNovels: true, + filters: undefined, + }); + + let novels = (await popularNovels).filter(novel => + novel.name + .toLowerCase() + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .trim() + .includes( + searchTerm + .toLowerCase() + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .trim(), + ), + ); + + return novels; + } + + async fetchImage(url: string): Promise { + const headers = new Headers({ + 'Referer': `${this.site}`, + }); + return await fetchFile(url, { headers }); + } + + filters = { + genre: { + type: FilterTypes.CheckboxGroup, + label: 'Genre', + value: [], + options: [ + { label: 'Action', value: 'action' }, + { + label: 'Action Adventure Fantaisie Psychologique', + value: 'action-adventure-fantaisie-psychologique', + }, + { + label: 'Action Arts martiaux Aventure Fantastique Surnaturel', + value: 'action-arts-martiaux-aventure-fantastique-surnaturel', + }, + { + label: 'Action Aventure Fantastique', + value: 'action-aventure-fantastique', + }, + { label: 'Action Drame Shônen', value: 'action-drame-shonen' }, + { label: 'Adult', value: 'adult' }, + { label: 'Adventure', value: 'adventure' }, + { label: 'amitié', value: 'amitie' }, + { label: 'amour', value: 'amour' }, + { label: 'Art-martiaux', value: 'art-martiaux' }, + { label: 'Arts-martiaux', value: 'arts-martiaux' }, + { label: 'Aventure', value: 'aventure' }, + { label: 'Combat', value: 'combat' }, + { label: 'Comedie', value: 'comedie' }, + { label: 'Comedy', value: 'comedy' }, + { label: 'Demons', value: 'demons' }, + { label: 'Dragon', value: 'dragon' }, + { label: 'Drama', value: 'drama' }, + { label: 'Drame', value: 'drame' }, + { label: 'Ecchi', value: 'ecchi' }, + { label: 'Fantaisie', value: 'fantaisie' }, + { label: 'fantastique', value: 'fantastique' }, + { label: 'Fantasy', value: 'fantasy' }, + { label: 'Ghosts', value: 'ghosts' }, + { label: 'Harem', value: 'harem' }, + { label: 'Historical', value: 'historical' }, + { label: 'Historique', value: 'historique' }, + { label: 'Horreur', value: 'horreur' }, + { label: 'Horror', value: 'horror' }, + { label: 'Isekai', value: 'isekai' }, + { label: 'Josei', value: 'josei' }, + { label: 'longstrip art', value: 'longstrip-art' }, + { label: 'Magic', value: 'magic' }, + { label: 'Magie', value: 'magie' }, + { label: 'Male Protagonist', value: 'male-protagonist' }, + { label: 'manga', value: 'manga' }, + { label: 'Manhwa', value: 'manhwa' }, + { label: 'Manhwa Player', value: 'manhwa-player' }, + { label: 'Manwha', value: 'manwha' }, + { label: 'Martial Arts', value: 'martial-arts' }, + { label: 'Mature', value: 'mature' }, + { label: 'Monstre', value: 'monstre' }, + { label: 'Murim', value: 'murim' }, + { label: 'mystère', value: 'mystere' }, + { label: 'Mystery', value: 'mystery' }, + { label: 'Necromancien', value: 'necromancien' }, + { label: 'necromencer', value: 'necromencer' }, + { label: 'Novel', value: 'novel' }, + { label: 'One Shot', value: 'one-shot' }, + { label: 'Over Power MC', value: 'over-power-mc' }, + { label: 'Partenaire', value: 'partenaire' }, + { label: 'Player', value: 'player' }, + { label: 'Player Manhwa', value: 'player-manhwa' }, + { label: 'Portail', value: 'portail' }, + { label: 'Psychological', value: 'psychological' }, + { label: 'Psychologique', value: 'psychologique' }, + { label: 'regresseur', value: 'regresseur' }, + { label: 'régression', value: 'regression' }, + { label: 'Réincarnation', value: 'reincarnation' }, + { label: 'Returner', value: 'returner' }, + { label: 'Romance', value: 'romance' }, + { label: 'School Life', value: 'school-life' }, + { label: 'Sci-fi', value: 'sci-fi' }, + { label: 'Seinen', value: 'seinen' }, + { label: 'Shôjo', value: 'shojo' }, + { label: 'Shônen', value: 'shonen' }, + { label: 'Shotacon', value: 'shotacon' }, + { label: 'Shoujo', value: 'shoujo' }, + { label: 'Shounen', value: 'shounen' }, + { label: 'Slice of Life', value: 'slice-of-life' }, + { label: 'Slide of Life', value: 'slide-of-life' }, + { label: 'Smut', value: 'smut' }, + { label: 'Sports', value: 'sports' }, + { label: 'Supernatural', value: 'supernatural' }, + { label: 'Surnaturel', value: 'surnaturel' }, + { label: 'Système', value: 'systeme' }, + { label: 'Tragédie', value: 'tragedie' }, + { label: 'Tragedy', value: 'tragedy' }, + { label: 'Webtoons', value: 'webtoons' }, + ], + }, + } satisfies Filters; +} + +export default new PhenixScansTradPlugin();