diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/CupFoxParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/CupFoxParser.kt new file mode 100644 index 00000000..2f2eb6b0 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/CupFoxParser.kt @@ -0,0 +1,202 @@ +package org.koitharu.kotatsu.parsers.site.cupfox + +import org.jsoup.nodes.Document +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.PagedMangaParser +import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.util.* +import java.util.* + +internal abstract class CupFoxParser( + context: MangaLoaderContext, + source: MangaParserSource, + domain: String, + pageSize: Int = 24, +) : PagedMangaParser(context, source, pageSize) { + + override val configKeyDomain = ConfigKey.Domain(domain) + + override val availableSortOrders: Set = EnumSet.of( + SortOrder.POPULARITY, + SortOrder.UPDATED, + ) + + override val availableStates: Set = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED) + + override val isMultipleTagsSupported = false + + override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { + val url = buildString { + append("https://") + append(domain) + when (filter) { + is MangaListFilter.Search -> { + append("/search/") + append(filter.query.urlEncoded()) + append('/') + append(page) + } + + is MangaListFilter.Advanced -> { + append("/category/") + + when (filter.sortOrder) { + SortOrder.POPULARITY -> append("order/hits/") + SortOrder.UPDATED -> append("order/addtime/") + else -> append("order/addtime/") + } + + filter.states.oneOrThrowIfMany()?.let { + append( + when (it) { + MangaState.ONGOING -> "finish/1/" + MangaState.FINISHED -> "finish/2/" + else -> "" + }, + ) + } + + if (filter.tags.isNotEmpty()) { + filter.tags.oneOrThrowIfMany()?.let { + append("tags/") + append(it.key) + append('/') + } + } + + append("page/") + append(page) + } + + null -> { + append("/category/order/addtime/page/") + append(page) + } + } + } + return parseMangaList(webClient.httpGet(url).parseHtml()) + } + + protected open val selectMangas = + "ul.row li, ul.stui-vodlist li, ul.clearfix li.dm-list, div.vod-list ul.row li, ul.ewave-vodlist li" + protected open val selectMangasCover = + "div.img-wrapper, div.stui-vodlist__thumb, a.stui-vodlist__thumb, div.ewave-vodlist__thumb, img.dm-thumb" + + private fun parseMangaList(doc: Document): List { + return doc.select(selectMangas).map { li -> + val href = li.selectFirstOrThrow("a").attrAsRelativeUrl("href") + Manga( + id = generateUid(href), + title = li.selectFirst("h3, h4, p.dm-bn")?.text().orEmpty(), + altTitle = null, + url = href, + publicUrl = href.toAbsoluteUrl(domain), + rating = RATING_UNKNOWN, + isNsfw = false, + coverUrl = li.selectFirst(selectMangasCover) + ?.src().orEmpty(), + tags = setOf(), + state = null, + author = null, + source = source, + ) + } + } + + protected open val selectMangaDetailsAltTitle = + "div.info span:contains(Autres noms), div.info span:contains(Biệt danh)" + protected open val selectMangaDetailsTags = + "div.info span a[href*=tags], p.data a[href*=tags], div.book-main-right p.info-text a[href*=tags]" + protected open val selectMangaDetailsAuthor = + "div.info span:contains(Auteur(s)), div.info span:contains(Tác giả), p.data span:contains(Auteur(s)), p.data span:contains(Autor), p.data span:contains(作者), div.book-main-right div.book-info:contains(作者) .info-text" + protected open val selectMangaDescription = + "div.vod-list:contains(Résumé) div.more-box, div.stui-pannel__head:contains(Résumé), div.book-desc div.info-text, div.info div.text:contains(Giới thiệu), #desc" + protected open val selectMangaChapters = + "div.episode-box ul li, ul.stui-content__playlist li a, ul.cnxh-ul li a, ul.ewave-content__playlist li a" + + override suspend fun getDetails(manga: Manga): Manga { + val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() + return manga.copy( + altTitle = doc.selectFirst(selectMangaDetailsAltTitle)?.text()?.substringAfter(":"), + state = null, + tags = doc.select(selectMangaDetailsTags).mapNotNullToSet { a -> + MangaTag( + key = a.attr("href").removeSuffix("/").substringAfterLast('/'), + title = a.text().toTitleCase(), + source = source, + ) + }, + author = doc.selectFirst(selectMangaDetailsAuthor)?.text()?.substringAfter(":"), + description = doc.selectFirst(selectMangaDescription) + ?.html(), + chapters = doc.select(selectMangaChapters) + .mapChapters { i, li -> + val a = li.selectFirstOrThrow("a") + val href = a.attrAsRelativeUrl("href") + MangaChapter( + id = generateUid(href), + name = a.text(), + number = i + 1f, + volume = 0, + url = href, + scanlator = null, + uploadDate = 0L, + branch = null, + source = source, + ) + }, + ) + } + + override suspend fun getRelatedManga(seed: Manga): List { + val doc = webClient.httpGet(seed.url.toAbsoluteUrl(domain)).parseHtml() + return doc.select("div.vod-list div.more-box li, ul.stui-vodlist__bd li, ul.about-yxul li, ul.ewave-vodlist__bd li") + .map { li -> + val href = li.selectFirstOrThrow("a").attrAsRelativeUrl("href") + Manga( + id = generateUid(href), + title = li.selectFirst("h3, h4, p.dm-bn")?.text().orEmpty(), + altTitle = null, + url = href, + publicUrl = href.toAbsoluteUrl(domain), + rating = RATING_UNKNOWN, + isNsfw = false, + coverUrl = li.selectFirst(selectMangasCover)?.src().orEmpty(), + tags = setOf(), + state = null, + author = null, + source = source, + ) + } + } + + protected open val selectPages = "div.more-box li img, ul.main li img" + + override suspend fun getPages(chapter: MangaChapter): List { + val fullUrl = chapter.url.toAbsoluteUrl(domain) + val doc = webClient.httpGet(fullUrl).parseHtml() + return doc.select(selectPages).map { img -> + val url = img.src() ?: img.parseFailed("Image src not found") + MangaPage( + id = generateUid(url), + url = url, + preview = null, + source = source, + ) + } + } + + protected open val selectAvailableTags = "div.swiper-wrapper a[href*=tags], ul.stui-screen__list li a[href*=tags]" + override suspend fun getAvailableTags(): Set { + val doc = webClient.httpGet("https://$domain/category/").parseHtml() + return doc.select(selectAvailableTags) + .mapNotNullToSet { a -> + MangaTag( + key = a.attr("href").removeSuffix("/").substringAfterLast('/'), + title = a.text().toTitleCase(), + source = source, + ) + } + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/de/MangaHaus.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/de/MangaHaus.kt new file mode 100644 index 00000000..1c6ad80a --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/de/MangaHaus.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.cupfox.de + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.cupfox.CupFoxParser + +@MangaSourceParser("MANGAHAUS", "MangaHaus", "de") +internal class MangaHaus(context: MangaLoaderContext) : + CupFoxParser(context, MangaParserSource.MANGAHAUS, "www.mangahaus.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/fr/EnLigneManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/fr/EnLigneManga.kt new file mode 100644 index 00000000..c5222923 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/fr/EnLigneManga.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.cupfox.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.cupfox.CupFoxParser + +@MangaSourceParser("ENLIGNEMANGA", "EnLigneManga", "fr") +internal class EnLigneManga(context: MangaLoaderContext) : + CupFoxParser(context, MangaParserSource.ENLIGNEMANGA, "www.enlignemanga.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/fr/FrManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/fr/FrManga.kt new file mode 100644 index 00000000..67b163ed --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/fr/FrManga.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.cupfox.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.cupfox.CupFoxParser + +@MangaSourceParser("FRMANGA", "FrManga", "fr") +internal class FrManga(context: MangaLoaderContext) : + CupFoxParser(context, MangaParserSource.FRMANGA, "www.frmanga.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/fr/SeineManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/fr/SeineManga.kt new file mode 100644 index 00000000..607d5676 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/fr/SeineManga.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.cupfox.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.cupfox.CupFoxParser + +@MangaSourceParser("SEINEMANGA", "SeineManga", "fr") +internal class SeineManga(context: MangaLoaderContext) : + CupFoxParser(context, MangaParserSource.SEINEMANGA, "www.seinemanga.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/ja/MangaKoinu.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/ja/MangaKoinu.kt new file mode 100644 index 00000000..0fbb3d2f --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/ja/MangaKoinu.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.cupfox.ja + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.cupfox.CupFoxParser + +@MangaSourceParser("MANGAKOINU", "MangaKoinu", "ja") +internal class MangaKoinu(context: MangaLoaderContext) : + CupFoxParser(context, MangaParserSource.MANGAKOINU, "www.mangakoinu.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/vi/OioiVn.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/vi/OioiVn.kt new file mode 100644 index 00000000..ad61f7c4 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/vi/OioiVn.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.cupfox.vi + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.cupfox.CupFoxParser + +@MangaSourceParser("OIOIVN", "OioiVn", "vi") +internal class OioiVn(context: MangaLoaderContext) : + CupFoxParser(context, MangaParserSource.OIOIVN, "oioivn.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/MangaScanFr.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/MangaScanFr.kt new file mode 100644 index 00000000..39ff2bee --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/fr/MangaScanFr.kt @@ -0,0 +1,14 @@ +package org.koitharu.kotatsu.parsers.site.mmrcms.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.mmrcms.MmrcmsParser +import java.util.* + +@MangaSourceParser("MANGASCANFR", "MangaScanFr", "fr") +internal class MangaScanFr(context: MangaLoaderContext) : + MmrcmsParser(context, MangaParserSource.MANGASCANFR, "mangascan-fr.net") { + override val sourceLocale: Locale = Locale.ENGLISH + override val imgUpdated = ".jpg" +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/OneMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/OneMangaParser.kt new file mode 100644 index 00000000..65cd6e1d --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/OneMangaParser.kt @@ -0,0 +1,98 @@ +package org.koitharu.kotatsu.parsers.site.onemanga + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.PagedMangaParser +import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.util.* +import java.util.* + +internal abstract class OneMangaParser( + context: MangaLoaderContext, + source: MangaParserSource, + domain: String, + pageSize: Int = 1, +) : PagedMangaParser(context, source, pageSize) { + + override val configKeyDomain = ConfigKey.Domain(domain) + + private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent()) + + override fun onCreateConfig(keys: MutableCollection>) { + super.onCreateConfig(keys) + keys.add(userAgentKey) + } + + override val isMultipleTagsSupported = false + + override val isSearchSupported = false + + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) + + override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { + if (page > 1) { + return emptyList() + } + val url = "https://$domain" + val doc = webClient.httpGet(url).parseHtml() + val manga = ArrayList() + manga.add( + Manga( + id = generateUid(url), + url = url, + publicUrl = url, + coverUrl = doc.selectFirst("div.elementor-widget-container img")?.src().orEmpty(), + title = doc.selectFirst("ul.elementor-nav-menu li a")?.text().orEmpty(), + altTitle = doc.selectFirst("div.elementor-widget-text-editor ul li:contains(Nom(s) Alternatif(s))") + ?.text()?.replace("Nom(s) Alternatif(s) :", "").orEmpty(), + rating = RATING_UNKNOWN, + tags = emptySet(), + author = doc.selectFirst("div.elementor-widget-text-editor ul li:contains(Auteur(s))")?.text() + ?.replace("Auteur(s): ", "").orEmpty(), + description = doc.selectLast("div.elementor-widget-text-editor ul li")?.text().orEmpty(), + state = null, + source = source, + isNsfw = isNsfwSource, + ), + ) + return manga + } + + override suspend fun getAvailableTags(): Set = emptySet() + + override suspend fun getDetails(manga: Manga): Manga { + val fullUrl = manga.url.toAbsoluteUrl(domain) + val doc = webClient.httpGet(fullUrl).parseHtml() + return manga.copy( + chapters = doc.requireElementById("All_chapters").select("ul li a") + .mapChapters(reversed = true) { i, a -> + val href = a.attrAsRelativeUrl("href") + MangaChapter( + id = generateUid(href), + name = a.text(), + number = i + 1f, + volume = 0, + url = href, + scanlator = null, + uploadDate = 0L, + branch = null, + source = source, + ) + }, + ) + } + + override suspend fun getPages(chapter: MangaChapter): List { + val fullUrl = chapter.url.toAbsoluteUrl(domain) + val doc = webClient.httpGet(fullUrl).parseHtml() + return doc.select("div.elementor-widget-container img").map { img -> + val url = img.src() ?: img.parseFailed("Image src not found") + MangaPage( + id = generateUid(url), + url = url, + preview = null, + source = source, + ) + } + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/BerserkScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/BerserkScan.kt new file mode 100644 index 00000000..f4493287 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/BerserkScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("BERSERKSCAN", "BerserkScan", "fr") +internal class BerserkScan(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.BERSERKSCAN, "berserkscan.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/BlueLockScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/BlueLockScan.kt new file mode 100644 index 00000000..1a5cb2c9 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/BlueLockScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("BLUELOCKSCAN", "BlueLockScan", "fr") +internal class BlueLockScan(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.BLUELOCKSCAN, "bluelockscan.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/CenturyBoys20Th.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/CenturyBoys20Th.kt new file mode 100644 index 00000000..43bfec0c --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/CenturyBoys20Th.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("CENTURYBOYS20TH", "20ThCenturyBoys", "fr") +internal class CenturyBoys20Th(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.CENTURYBOYS20TH, "20thcenturyboys.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/ChainsawManScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/ChainsawManScan.kt new file mode 100644 index 00000000..92d51271 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/ChainsawManScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("CHAINSAWMANSCAN", "ChainsawManScan", "fr") +internal class ChainsawManScan(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.CHAINSAWMANSCAN, "chainsawman-scan.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/Dandadan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/Dandadan.kt new file mode 100644 index 00000000..3694a017 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/Dandadan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("DANDADAN", "Dandadan", "fr") +internal class Dandadan(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.DANDADAN, "dandadan.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/DemonSlayerScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/DemonSlayerScan.kt new file mode 100644 index 00000000..85de3227 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/DemonSlayerScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("DEMONSLAYERSCAN", "DemonSlayerScan", "fr") +internal class DemonSlayerScan(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.DEMONSLAYERSCAN, "demonslayerscan.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/DrStone.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/DrStone.kt new file mode 100644 index 00000000..80480a70 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/DrStone.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("DRSTONE", "DrStone", "fr") +internal class DrStone(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.DRSTONE, "drstone.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/FireForce.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/FireForce.kt new file mode 100644 index 00000000..e61b4b11 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/FireForce.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("FIREFORCE", "FireForce", "fr") +internal class FireForce(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.FIREFORCE, "fireforce.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/Haikyuu.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/Haikyuu.kt new file mode 100644 index 00000000..c49d0bed --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/Haikyuu.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("HAIKYUU", "Haikyuu", "fr") +internal class Haikyuu(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.HAIKYUU, "haikyuu.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/HellsParadiseScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/HellsParadiseScan.kt new file mode 100644 index 00000000..463daff4 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/HellsParadiseScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("HELLSPARADISESCAN", "HellsParadiseScan", "fr") +internal class HellsParadiseScan(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.HELLSPARADISESCAN, "hellsparadisescan.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/HunterXHunterScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/HunterXHunterScan.kt new file mode 100644 index 00000000..4a57ee52 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/HunterXHunterScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("HUNTERXHUNTERSCAN", "HunterXHunterScan", "fr") +internal class HunterXHunterScan(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.HUNTERXHUNTERSCAN, "hunterxhunterscan.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/KaijuNo8.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/KaijuNo8.kt new file mode 100644 index 00000000..ae63027e --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/KaijuNo8.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("KAIJUNO8", "KaijuNo8", "fr") +internal class KaijuNo8(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.KAIJUNO8, "kaijuno8.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/KingdomScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/KingdomScan.kt new file mode 100644 index 00000000..54aec70f --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/KingdomScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("KINGDOMSCAN", "KingdomScan", "fr") +internal class KingdomScan(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.KINGDOMSCAN, "kingdomscan.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/MashleScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/MashleScan.kt new file mode 100644 index 00000000..91381d39 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/MashleScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("MASHLESCAN", "MashleScan", "fr") +internal class MashleScan(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.MASHLESCAN, "mashlescan.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/MyHeroacAdemiaScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/MyHeroacAdemiaScan.kt new file mode 100644 index 00000000..ca4fad58 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/MyHeroacAdemiaScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("MYHEROACADEMIASCAN", "MyHeroacAdemiaScan", "fr") +internal class MyHeroacAdemiaScan(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.MYHEROACADEMIASCAN, "myheroacademiascan.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/OnePieceScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/OnePieceScan.kt new file mode 100644 index 00000000..a6e59d80 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/OnePieceScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("ONEPIECESCAN", "OnePieceScan", "fr") +internal class OnePieceScan(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.ONEPIECESCAN, "onepiecescan.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/OnePunchManScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/OnePunchManScan.kt new file mode 100644 index 00000000..cff3eac7 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/OnePunchManScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("ONEPUNCHMANSCAN", "OnePunchManScan", "fr") +internal class OnePunchManScan(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.ONEPUNCHMANSCAN, "onepunchmanscan.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/OshiNoKo.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/OshiNoKo.kt new file mode 100644 index 00000000..6509b66f --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/OshiNoKo.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("OSHINOKO", "OshiNoKo", "fr") +internal class OshiNoKo(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.OSHINOKO, "oshinoko.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/SakamotoDays.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/SakamotoDays.kt new file mode 100644 index 00000000..17960a1f --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/SakamotoDays.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("SAKAMOTODAYS", "SakamotoDays", "fr") +internal class SakamotoDays(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.SAKAMOTODAYS, "sakamotodays.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/ScanBoruto.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/ScanBoruto.kt new file mode 100644 index 00000000..b595c664 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/ScanBoruto.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("SCANBORUTO", "ScanBoruto", "fr") +internal class ScanBoruto(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.SCANBORUTO, "scanboruto.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/ScanJujutsuKaisen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/ScanJujutsuKaisen.kt new file mode 100644 index 00000000..8b8faefa --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/ScanJujutsuKaisen.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("SCANJUJUTSUKAISEN", "ScanJujutsuKaisen", "fr") +internal class ScanJujutsuKaisen(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.SCANJUJUTSUKAISEN, "scanjujutsukaisen.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/SnkScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/SnkScan.kt new file mode 100644 index 00000000..3fc24697 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/SnkScan.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("SNKSCAN", "SnkScan", "fr") +internal class SnkScan(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.SNKSCAN, "snkscan.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/TokyoRevengers.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/TokyoRevengers.kt new file mode 100644 index 00000000..2b985590 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/TokyoRevengers.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("TOKYOREVENGERS", "TokyoRevengers", "fr") +internal class TokyoRevengers(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.TOKYOREVENGERS, "tokyorevengers.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/VinlandSaga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/VinlandSaga.kt new file mode 100644 index 00000000..84f5ecbf --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/fr/VinlandSaga.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.onemanga.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.onemanga.OneMangaParser + +@MangaSourceParser("VINLANDSAGA", "VinlandSaga", "fr") +internal class VinlandSaga(context: MangaLoaderContext) : + OneMangaParser(context, MangaParserSource.VINLANDSAGA, "vinlandsaga.fr") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/fr/ScanTrad.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/fr/ScanTrad.kt new file mode 100644 index 00000000..44f8c2b0 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/fr/ScanTrad.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.parsers.site.scan.fr + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.MangaParserSource +import org.koitharu.kotatsu.parsers.site.scan.ScanParser + +@MangaSourceParser("SCANTRAD", "ScanTrad", "fr") +internal class ScanTrad(context: MangaLoaderContext) : + ScanParser(context, MangaParserSource.SCANTRAD, "scan-trad.com")