diff --git a/web/src/engine/websites/LireScan.ts b/web/src/engine/websites/LireScan.ts new file mode 100644 index 0000000000..4471c26faa --- /dev/null +++ b/web/src/engine/websites/LireScan.ts @@ -0,0 +1,28 @@ +import { Tags } from '../Tags'; +import icon from './LireScan.webp'; +import { DecoratableMangaScraper } from '../providers/MangaPlugin'; +import * as Common from './decorators/Common'; + +function ChapterExtractor(anchor: HTMLAnchorElement) { + return { + id: anchor.pathname, + title: anchor.text.replace(/Scan/i, '').replace(/VF/i, '').trim() + }; +} + +@Common.MangaCSS(/^https?:\/\/lire-scan\.me\/manga\/\S+\.html$/, 'div.pmovie__header div.pmovie__header-main h1') +@Common.MangasMultiPageCSS('/manga/page/{page}', 'div.sect__content div.item a:first-of-type', 1, 1, 0, Common.AnchorInfoExtractor(false, 'div.item-poster__img')) +@Common.ChaptersSinglePageCSS('ul li div.chapter a', ChapterExtractor) +@Common.PagesSinglePageJS('manga[currentChapter]') +@Common.ImageAjax() + +export default class extends DecoratableMangaScraper { + + public constructor() { + super('lirescan', `LireScan`, 'https://lire-scan.me', Tags.Media.Manga, Tags.Media.Manhwa, Tags.Media.Manhua, Tags.Language.French); + } + + public override get Icon() { + return icon; + } +} \ No newline at end of file diff --git a/web/src/engine/websites/LireScan.webp b/web/src/engine/websites/LireScan.webp new file mode 100644 index 0000000000..ccb81fe716 Binary files /dev/null and b/web/src/engine/websites/LireScan.webp differ diff --git a/web/src/engine/websites/LireScan_e2e.ts b/web/src/engine/websites/LireScan_e2e.ts new file mode 100644 index 0000000000..6b6a488f0d --- /dev/null +++ b/web/src/engine/websites/LireScan_e2e.ts @@ -0,0 +1,25 @@ +import { TestFixture, type Config } from '../../../test/WebsitesFixture'; + +const config: Config = { + plugin: { + id: 'lirescan', + title: 'LireScan' + }, + container: { + url: 'https://lire-scan.me/manga/51-kingdom.html', + id: '/manga/51-kingdom.html', + title: 'Kingdom' + }, + child: { + id: '/manga/51-kingdom/chapitre-774.html', + title: '774' + }, + entry: { + index: 0, + size: 3_538_686, + type: 'image/webp' + } +}; + +const fixture = new TestFixture(config); +describe(fixture.Name, () => fixture.AssertWebsite()); \ No newline at end of file diff --git a/web/src/engine/websites/_index.ts b/web/src/engine/websites/_index.ts index 65b7656b28..e2dba2b23e 100755 --- a/web/src/engine/websites/_index.ts +++ b/web/src/engine/websites/_index.ts @@ -148,6 +148,7 @@ export { default as LHTranslation } from './LHTranslation'; export { default as LianScans } from './LianScans'; export { default as LilyManga } from './LilyManga'; export { default as LimaScans } from './LimaScans'; +export { default as LireScan } from './LireScan'; export { default as LittleGarden } from './LittleGarden'; export { default as LSHiver } from './LSHiver'; export { default as LuminousScans } from './LuminousScans'; @@ -577,7 +578,6 @@ export { default as LineWebtoonID } from './legacy/LineWebtoonID'; export { default as LineWebtoonTH } from './legacy/LineWebtoonTH'; export { default as LineWebtoonTranslate } from './legacy/LineWebtoonTranslate'; export { default as LineWebtoonZH } from './legacy/LineWebtoonZH'; -export { default as LireScan } from './legacy/LireScan'; export { default as LoliVault } from './legacy/LoliVault'; export { default as LupiTeam } from './legacy/LupiTeam'; export { default as LxHentai } from './legacy/LxHentai'; diff --git a/web/src/engine/websites/legacy/LireScan.ts b/web/src/engine/websites/legacy/LireScan.ts deleted file mode 100755 index 6428f60116..0000000000 --- a/web/src/engine/websites/legacy/LireScan.ts +++ /dev/null @@ -1,88 +0,0 @@ -// Auto-Generated export from HakuNeko Legacy -// See: https://gist.github.com/ronny1982/0c8d5d4f0bd9c1f1b21dbf9a2ffbfec9 - -//import { Tags } from '../../Tags'; -import icon from './LireScan.webp'; -import { DecoratableMangaScraper } from '../../providers/MangaPlugin'; - -export default class extends DecoratableMangaScraper { - - public constructor() { - super('lirescan', `LireScan`, 'https://www.lirescan.me' /*, Tags.Language.English, Tags ... */); - } - - public override get Icon() { - return icon; - } -} - -// Original Source -/* -class LireScan extends Connector { - - constructor() { - super(); - super.id = 'lirescan'; - super.label = 'LireScan'; - this.tags = [ 'manga', 'webtoon', 'french' ]; - this.url = 'https://www.lirescan.me'; - - this.path = '/zusun-lecture-en-ligne/'; - } - - async _getMangaFromURI(uri) { - let request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, 'select#mangas option[selected="selected"]'); - let id = this.getRootRelativeOrAbsoluteLink(data[0].value, request.url); - let title = data[0].textContent.trim(); - return new Manga(this, id, title); - } - - async _getMangas() { - let request = new Request(this.url + this.path, this.requestOptions); - let data = await this.fetchDOM(request, 'select#mangas option'); - return data.map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element.value, request.url), - title: element.textContent.trim() - }; - }); - } - - async _getChapters(manga) { - let request = new Request(this.url + manga.id, this.requestOptions); - let data = await this.fetchDOM(request, 'select#chapitres option'); - return data.map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element.value, request.url), - title: element.textContent.trim(), - language: '' - }; - }); - } - - async _getPages(chapter) { - let request = new Request(this.url + chapter.id, this.requestOptions); - let data = await this.fetchDOM(request, 'ul.pagination li a'); - data = data.filter(a => !isNaN(a.text)).pop(); - let path = new URL(data.href).pathname.replace(/\d+\/?$/, ''); - let pageCount = parseInt(data.text); - return [...new Array(pageCount).keys()].map(page => { - page++; - let url = this.getAbsolutePath(path + page, request.url); - return this.createConnectorURI(url); - }); - } - - async _handleConnectorURI(payload) { - let request = new Request(payload, this.requestOptions); - let data = await this.fetchDOM(request, 'a#imglink source#image_scan'); - request = new Request(this.getAbsolutePath(data[0], payload)); - let response = await fetch(request); - return { - mimeType: response.headers.get('content-type'), - data: new Uint8Array(await response.arrayBuffer()) - }; - } -} -*/ \ No newline at end of file diff --git a/web/src/engine/websites/legacy/LireScan.webp b/web/src/engine/websites/legacy/LireScan.webp deleted file mode 100755 index 23c91c217a..0000000000 Binary files a/web/src/engine/websites/legacy/LireScan.webp and /dev/null differ