diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt index 96f9f933..e1d3e15b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt @@ -24,8 +24,11 @@ public interface MangaParser : Interceptor { */ public val availableSortOrders: Set + @Deprecated("Too complex. Use filterCapabilities instead") public val searchQueryCapabilities: MangaSearchQueryCapabilities + public val filterCapabilities: MangaListFilterCapabilities + public val config: MangaSourceConfig public val authorizationProvider: MangaParserAuthProvider? @@ -40,8 +43,11 @@ public interface MangaParser : Interceptor { public val domain: String + @Deprecated("Too complex. Use getList with filter instead") public suspend fun getList(query: MangaSearchQuery): List + public suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List + /** * Parse details for [Manga]: chapters list, description, large cover, etc. * Must return the same manga, may change any fields excepts id, url and source @@ -79,13 +85,4 @@ public interface MangaParser : Interceptor { */ @InternalParsersApi public suspend fun resolveLink(resolver: LinkResolver, link: HttpUrl): Manga? - - @Deprecated("Use getList(query: MangaSearchQuery) instead") - public suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List { - return getList(convertToMangaSearchQuery(offset, order, filter)) - } - - @Deprecated("Please check searchQueryCapabilities") - public val filterCapabilities: MangaListFilterCapabilities - get() = searchQueryCapabilities.toMangaListFilterCapabilities() } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/AbstractMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/AbstractMangaParser.kt index 0b49e530..c532a049 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/AbstractMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/AbstractMangaParser.kt @@ -11,27 +11,28 @@ import org.koitharu.kotatsu.parsers.MangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.config.MangaSourceConfig import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.model.search.MangaSearchQuery +import org.koitharu.kotatsu.parsers.model.search.MangaSearchQueryCapabilities import org.koitharu.kotatsu.parsers.network.OkHttpWebClient import org.koitharu.kotatsu.parsers.network.WebClient -import org.koitharu.kotatsu.parsers.util.FaviconParser -import org.koitharu.kotatsu.parsers.util.LinkResolver -import org.koitharu.kotatsu.parsers.util.RelatedMangaFinder -import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl +import org.koitharu.kotatsu.parsers.util.* import java.util.* +@Suppress("OVERRIDE_DEPRECATION") @InternalParsersApi public abstract class AbstractMangaParser @InternalParsersApi constructor( @property:InternalParsersApi public val context: MangaLoaderContext, public final override val source: MangaParserSource, ) : MangaParser { + public final override val searchQueryCapabilities: MangaSearchQueryCapabilities + get() = filterCapabilities.toMangaSearchQueryCapabilities() + public override val config: MangaSourceConfig by lazy { context.getConfig(source) } public open val sourceLocale: Locale get() = if (source.locale.isEmpty()) Locale.ROOT else Locale(source.locale) - protected open val userAgentKey: ConfigKey.UserAgent = ConfigKey.UserAgent(context.getDefaultUserAgent()) - protected val sourceContentRating: ContentRating? get() = if (source.contentType == ContentType.HENTAI) { ContentRating.ADULT @@ -39,10 +40,10 @@ public abstract class AbstractMangaParser @InternalParsersApi constructor( null } - final override val domain: String - get() = config[configKeyDomain] + protected val isNsfwSource: Boolean = source.contentType == ContentType.HENTAI + + protected open val userAgentKey: ConfigKey.UserAgent = ConfigKey.UserAgent(context.getDefaultUserAgent()) - @Deprecated("Override intercept() instead") override fun getRequestHeaders(): Headers = Headers.Builder() .add("User-Agent", config[userAgentKey]) .build() @@ -56,12 +57,22 @@ public abstract class AbstractMangaParser @InternalParsersApi constructor( return SortOrder.entries.first { it in supported } } + final override val domain: String + get() = config[configKeyDomain] + @JvmField protected val webClient: WebClient = OkHttpWebClient(context.httpClient, source) - @Deprecated("Please check searchQueryCapabilities") - final override val filterCapabilities: MangaListFilterCapabilities - get() = super.filterCapabilities + /** + * Search list of manga by specified searchQuery + * + * @param query searchQuery + */ + public final override suspend fun getList(query: MangaSearchQuery): List = getList( + offset = query.offset, + order = query.order ?: defaultSortOrder, + filter = convertToMangaListFilter(query), + ) /** * Fetch direct link to the page image. diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/LegacyMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/FlexibleMangaParser.kt similarity index 54% rename from src/main/kotlin/org/koitharu/kotatsu/parsers/core/LegacyMangaParser.kt rename to src/main/kotlin/org/koitharu/kotatsu/parsers/core/FlexibleMangaParser.kt index 440a27fb..78c9da10 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/LegacyMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/FlexibleMangaParser.kt @@ -11,34 +11,38 @@ import org.koitharu.kotatsu.parsers.MangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.config.MangaSourceConfig import org.koitharu.kotatsu.parsers.model.* -import org.koitharu.kotatsu.parsers.model.search.MangaSearchQuery -import org.koitharu.kotatsu.parsers.model.search.MangaSearchQueryCapabilities import org.koitharu.kotatsu.parsers.network.OkHttpWebClient import org.koitharu.kotatsu.parsers.network.WebClient import org.koitharu.kotatsu.parsers.util.* import java.util.* -@Suppress("OVERRIDE_DEPRECATION") -@InternalParsersApi -public abstract class LegacyMangaParser @InternalParsersApi constructor( - @property:InternalParsersApi public val context: MangaLoaderContext, - public final override val source: MangaParserSource, +@Deprecated("Too complex. Use AbstractMangaParser instead") +internal abstract class FlexibleMangaParser @InternalParsersApi constructor( + @property:InternalParsersApi val context: MangaLoaderContext, + final override val source: MangaParserSource, ) : MangaParser { - public final override val searchQueryCapabilities: MangaSearchQueryCapabilities - get() = filterCapabilities.toMangaSearchQueryCapabilities() + override val config: MangaSourceConfig by lazy { context.getConfig(source) } - abstract override val filterCapabilities: MangaListFilterCapabilities + open val sourceLocale: Locale + get() = if (source.locale.isEmpty()) Locale.ROOT else Locale(source.locale) - public override val config: MangaSourceConfig by lazy { context.getConfig(source) } + protected open val userAgentKey: ConfigKey.UserAgent = ConfigKey.UserAgent(context.getDefaultUserAgent()) - public open val sourceLocale: Locale - get() = if (source.locale.isEmpty()) Locale.ROOT else Locale(source.locale) + final override val filterCapabilities: MangaListFilterCapabilities + get() = searchQueryCapabilities.toMangaListFilterCapabilities() - protected val isNsfwSource: Boolean = source.contentType == ContentType.HENTAI + protected val sourceContentRating: ContentRating? + get() = if (source.contentType == ContentType.HENTAI) { + ContentRating.ADULT + } else { + null + } - protected open val userAgentKey: ConfigKey.UserAgent = ConfigKey.UserAgent(context.getDefaultUserAgent()) + final override val domain: String + get() = config[configKeyDomain] + @Deprecated("Override intercept() instead") override fun getRequestHeaders(): Headers = Headers.Builder() .add("User-Agent", config[userAgentKey]) .build() @@ -46,49 +50,37 @@ public abstract class LegacyMangaParser @InternalParsersApi constructor( /** * Used as fallback if value of `order` passed to [getList] is null */ - public open val defaultSortOrder: SortOrder + open val defaultSortOrder: SortOrder get() { val supported = availableSortOrders return SortOrder.entries.first { it in supported } } - final override val domain: String - get() = config[configKeyDomain] - @JvmField protected val webClient: WebClient = OkHttpWebClient(context.httpClient, source) - /** - * Search list of manga by specified searchQuery - * - * @param query searchQuery - */ - public final override suspend fun getList(query: MangaSearchQuery): List = getList( - offset = query.offset, - order = query.order ?: defaultSortOrder, - filter = convertToMangaListFilter(query), - ) - - abstract override suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List - /** * Fetch direct link to the page image. */ - public override suspend fun getPageUrl(page: MangaPage): String = page.url.toAbsoluteUrl(domain) + override suspend fun getPageUrl(page: MangaPage): String = page.url.toAbsoluteUrl(domain) + + final override suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List { + return getList(convertToMangaSearchQuery(offset, order, filter)) + } /** * Parse favicons from the main page of the source`s website */ - public override suspend fun getFavicons(): Favicons { + override suspend fun getFavicons(): Favicons { return FaviconParser(webClient, domain).parseFavicons() } @CallSuper - public override fun onCreateConfig(keys: MutableCollection>) { + override fun onCreateConfig(keys: MutableCollection>) { keys.add(configKeyDomain) } - public override suspend fun getRelatedManga(seed: Manga): List { + override suspend fun getRelatedManga(seed: Manga): List { return RelatedMangaFinder(listOf(this)).invoke(seed) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/LegacyPagedMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/FlexiblePagedMangaParser.kt similarity index 55% rename from src/main/kotlin/org/koitharu/kotatsu/parsers/core/LegacyPagedMangaParser.kt rename to src/main/kotlin/org/koitharu/kotatsu/parsers/core/FlexiblePagedMangaParser.kt index b572be8a..220ac34b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/LegacyPagedMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/FlexiblePagedMangaParser.kt @@ -1,21 +1,20 @@ package org.koitharu.kotatsu.parsers.core import androidx.annotation.VisibleForTesting -import org.koitharu.kotatsu.parsers.InternalParsersApi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.parsers.model.MangaListFilter import org.koitharu.kotatsu.parsers.model.MangaParserSource -import org.koitharu.kotatsu.parsers.model.SortOrder +import org.koitharu.kotatsu.parsers.model.search.MangaSearchQuery +import org.koitharu.kotatsu.parsers.model.search.SearchableField import org.koitharu.kotatsu.parsers.util.Paginator -@InternalParsersApi -public abstract class LegacyPagedMangaParser( +@Deprecated("Too complex. Use PagedMangaParser instead") +internal abstract class FlexiblePagedMangaParser( context: MangaLoaderContext, source: MangaParserSource, @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) @JvmField public val pageSize: Int, searchPageSize: Int = pageSize, -) : LegacyMangaParser(context, source) { +) : FlexibleMangaParser(context, source) { @JvmField protected val paginator: Paginator = Paginator(pageSize) @@ -23,34 +22,38 @@ public abstract class LegacyPagedMangaParser( @JvmField protected val searchPaginator: Paginator = Paginator(searchPageSize) - final override suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List { - return getList( - paginator = if (filter.query.isNullOrEmpty()) { + final override suspend fun getList(query: MangaSearchQuery): List { + var containTitleNameCriteria = false + query.criteria.forEach { + if (it.field == SearchableField.TITLE_NAME) { + containTitleNameCriteria = true + } + } + + return searchManga( + paginator = if (containTitleNameCriteria) { paginator } else { searchPaginator }, - offset = offset, - order = order, - filter = filter, + query = query, ) } - public abstract suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List + public abstract suspend fun getListPage(query: MangaSearchQuery, page: Int): List protected fun setFirstPage(firstPage: Int, firstPageForSearch: Int = firstPage) { paginator.firstPage = firstPage searchPaginator.firstPage = firstPageForSearch } - private suspend fun getList( + private suspend fun searchManga( paginator: Paginator, - offset: Int, - order: SortOrder, - filter: MangaListFilter, + query: MangaSearchQuery, ): List { + val offset: Int = query.offset val page = paginator.getPage(offset) - val list = getListPage(page, order, filter) + val list = getListPage(query, page) paginator.onListReceived(offset, page, list.size) return list } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/LegacySinglePageMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/LegacySinglePageMangaParser.kt deleted file mode 100644 index 898280ce..00000000 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/LegacySinglePageMangaParser.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.koitharu.kotatsu.parsers.core - -import org.koitharu.kotatsu.parsers.InternalParsersApi -import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.parsers.model.MangaListFilter -import org.koitharu.kotatsu.parsers.model.MangaParserSource -import org.koitharu.kotatsu.parsers.model.SortOrder - -@InternalParsersApi -public abstract class LegacySinglePageMangaParser( - context: MangaLoaderContext, - source: MangaParserSource, -) : LegacyMangaParser(context, source) { - - final override suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List { - if (offset > 0) { - return emptyList() - } - return getList(order, filter) - } - - public abstract suspend fun getList(order: SortOrder, filter: MangaListFilter): List -} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/MangaParserWrapper.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/MangaParserWrapper.kt index 38507046..847336f0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/MangaParserWrapper.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/MangaParserWrapper.kt @@ -18,6 +18,7 @@ internal class MangaParserWrapper( override val authorizationProvider: MangaParserAuthProvider? get() = delegate as? MangaParserAuthProvider + @Deprecated("Too complex. Use getList with filter instead") override suspend fun getList(query: MangaSearchQuery): List = withContext(Dispatchers.Default) { if (!query.skipValidation) { searchQueryCapabilities.validate(query) @@ -25,6 +26,14 @@ internal class MangaParserWrapper( delegate.getList(query) } + override suspend fun getList( + offset: Int, + order: SortOrder, + filter: MangaListFilter, + ): List = withContext(Dispatchers.Default) { + delegate.getList(offset, order, filter) + } + override suspend fun getDetails(manga: Manga): Manga = withContext(Dispatchers.Default) { delegate.getDetails(manga) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/PagedMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/PagedMangaParser.kt index 805004a2..d8744eae 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/PagedMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/PagedMangaParser.kt @@ -4,9 +4,9 @@ import androidx.annotation.VisibleForTesting import org.koitharu.kotatsu.parsers.InternalParsersApi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.parsers.model.MangaListFilter import org.koitharu.kotatsu.parsers.model.MangaParserSource -import org.koitharu.kotatsu.parsers.model.search.MangaSearchQuery -import org.koitharu.kotatsu.parsers.model.search.SearchableField +import org.koitharu.kotatsu.parsers.model.SortOrder import org.koitharu.kotatsu.parsers.util.Paginator @InternalParsersApi @@ -23,38 +23,34 @@ public abstract class PagedMangaParser( @JvmField protected val searchPaginator: Paginator = Paginator(searchPageSize) - final override suspend fun getList(query: MangaSearchQuery): List { - var containTitleNameCriteria = false - query.criteria.forEach { - if (it.field == SearchableField.TITLE_NAME) { - containTitleNameCriteria = true - } - } - - return searchManga( - paginator = if (containTitleNameCriteria) { + final override suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List { + return getList( + paginator = if (filter.query.isNullOrEmpty()) { paginator } else { searchPaginator }, - query = query, + offset = offset, + order = order, + filter = filter, ) } - public abstract suspend fun getListPage(query: MangaSearchQuery, page: Int): List + public abstract suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List protected fun setFirstPage(firstPage: Int, firstPageForSearch: Int = firstPage) { paginator.firstPage = firstPage searchPaginator.firstPage = firstPageForSearch } - private suspend fun searchManga( + private suspend fun getList( paginator: Paginator, - query: MangaSearchQuery, + offset: Int, + order: SortOrder, + filter: MangaListFilter, ): List { - val offset: Int = query.offset val page = paginator.getPage(offset) - val list = getListPage(query, page) + val list = getListPage(page, order, filter) paginator.onListReceived(offset, page, list.size) return list } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/SinglePageMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/SinglePageMangaParser.kt index 1934cd5d..5e06b69e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/SinglePageMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/SinglePageMangaParser.kt @@ -3,8 +3,9 @@ package org.koitharu.kotatsu.parsers.core import org.koitharu.kotatsu.parsers.InternalParsersApi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.parsers.model.MangaListFilter import org.koitharu.kotatsu.parsers.model.MangaParserSource -import org.koitharu.kotatsu.parsers.model.search.MangaSearchQuery +import org.koitharu.kotatsu.parsers.model.SortOrder @InternalParsersApi public abstract class SinglePageMangaParser( @@ -12,12 +13,12 @@ public abstract class SinglePageMangaParser( source: MangaParserSource, ) : AbstractMangaParser(context, source) { - final override suspend fun getList(query: MangaSearchQuery): List { - if (query.offset > 0) { + final override suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List { + if (offset > 0) { return emptyList() } - return getSinglePageList(query) + return getList(order, filter) } - public abstract suspend fun getSinglePageList(searchQuery: MangaSearchQuery): List + public abstract suspend fun getList(order: SortOrder, filter: MangaListFilter): List } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilter.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilter.kt index 771f2287..d643e5e2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilter.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilter.kt @@ -2,7 +2,6 @@ package org.koitharu.kotatsu.parsers.model import java.util.* -@Deprecated("Please check new searchManga method and MangaSearchQuery class") public data class MangaListFilter( @JvmField val query: String? = null, @JvmField val tags: Set = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilterCapabilities.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilterCapabilities.kt index 00a479cd..d0daa06d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilterCapabilities.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilterCapabilities.kt @@ -2,7 +2,6 @@ package org.koitharu.kotatsu.parsers.model import org.koitharu.kotatsu.parsers.InternalParsersApi -@Deprecated("Please check new MangaSearchQueryCapabilities class") public data class MangaListFilterCapabilities @InternalParsersApi constructor( /** diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/MangaSearchQuery.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/MangaSearchQuery.kt index ae03fdee..085981a2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/MangaSearchQuery.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/MangaSearchQuery.kt @@ -13,6 +13,7 @@ import org.koitharu.kotatsu.parsers.model.SortOrder * @property offset The offset number for paginated search results (optional). */ +@Deprecated("Too complex. Use MangaListFilter instead") @ConsistentCopyVisibility public data class MangaSearchQuery private constructor( @JvmField public val criteria: Set>, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/MangaSearchQueryCapabilities.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/MangaSearchQueryCapabilities.kt index f9feecb3..0ca5625f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/MangaSearchQueryCapabilities.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/MangaSearchQueryCapabilities.kt @@ -4,6 +4,7 @@ import androidx.collection.ArraySet import org.koitharu.kotatsu.parsers.model.search.QueryCriteria.* import org.koitharu.kotatsu.parsers.util.mapToSet +@Deprecated("Too complex. Use MangaListFilterCapabilities instead") @ExposedCopyVisibility public data class MangaSearchQueryCapabilities internal constructor( public val capabilities: Set, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/QueryCriteria.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/QueryCriteria.kt index 6760efdc..0ff22048 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/QueryCriteria.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/QueryCriteria.kt @@ -7,6 +7,7 @@ package org.koitharu.kotatsu.parsers.model.search * @param T The type of value associated with the search criterion. * @property field The field to which this search criterion applies. */ +@Deprecated("Too complex") public sealed interface QueryCriteria { public val field: SearchableField diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/SearchCapability.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/SearchCapability.kt index 175528c0..4394287a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/SearchCapability.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/SearchCapability.kt @@ -21,6 +21,7 @@ import kotlin.reflect.KClass * - `true` if this field can be used with other search criteria. * - `false` if using this field requires it to be the only criterion in query. */ +@Deprecated("Too complex") public data class SearchCapability( /** The searchable field that this capability applies to. */ @JvmField public val field: SearchableField, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/SearchableField.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/SearchableField.kt index 42e3fc40..f29df1d4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/SearchableField.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/search/SearchableField.kt @@ -9,6 +9,7 @@ import java.util.* * * @property type The Java class representing the expected type of values for this field. */ +@Deprecated("Too complex") public enum class SearchableField(public val type: Class<*>) { TITLE_NAME(String::class.java), TAG(MangaTag::class.java), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt index 81a53164..f74c2677 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt @@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -20,7 +20,7 @@ import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.SecretKeySpec @MangaSourceParser("BATOTO", "Bato.To") -internal class BatoToParser(context: MangaLoaderContext) : LegacyPagedMangaParser( +internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser( context = context, source = MangaParserSource.BATOTO, pageSize = 60, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt index 69242e70..946e01cf 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt @@ -8,7 +8,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -20,7 +20,7 @@ private const val CHAPTERS_LIMIT = 99999 @MangaSourceParser("COMICK_FUN", "ComicK") internal class ComickFunParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.COMICK_FUN, 20) { + PagedMangaParser(context, MangaParserSource.COMICK_FUN, 20) { override val configKeyDomain = ConfigKey.Domain("comick.io") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt index d4ecd8d4..93dc3d16 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt @@ -15,7 +15,7 @@ import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.bitmap.Rect import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.exception.TooManyRequestExceptions import org.koitharu.kotatsu.parsers.model.* @@ -32,7 +32,7 @@ private val TAG_PREFIXES = arrayOf("male:", "female:", "other:") @MangaSourceParser("EXHENTAI", "ExHentai", type = ContentType.HENTAI) internal class ExHentaiParser( context: MangaLoaderContext, -) : LegacyPagedMangaParser(context, MangaParserSource.EXHENTAI, pageSize = 25), MangaParserAuthProvider, Interceptor { +) : PagedMangaParser(context, MangaParserSource.EXHENTAI, pageSize = 25), MangaParserAuthProvider, Interceptor { override val availableSortOrders: Set = setOf(SortOrder.NEWEST) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HitomiLaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HitomiLaParser.kt index 60816e7e..fa867578 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HitomiLaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HitomiLaParser.kt @@ -13,7 +13,7 @@ import org.jsoup.Jsoup import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.getStringOrNull @@ -30,7 +30,7 @@ import kotlin.math.min @OptIn(ExperimentalUnsignedTypes::class) @MangaSourceParser("HITOMILA", "Hitomi.La", type = ContentType.HENTAI) -internal class HitomiLaParser(context: MangaLoaderContext) : LegacyMangaParser(context, MangaParserSource.HITOMILA) { +internal class HitomiLaParser(context: MangaLoaderContext) : AbstractMangaParser(context, MangaParserSource.HITOMILA) { override val configKeyDomain = ConfigKey.Domain("hitomi.la") private val cdnDomain = "gold-usergeneratedcontent.net" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HoloEarthParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HoloEarthParser.kt index ae282e22..eabfcc5e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HoloEarthParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HoloEarthParser.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.all import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.search.* import org.koitharu.kotatsu.parsers.util.generateUid @@ -15,7 +15,7 @@ import java.util.Locale @MangaSourceParser("HOLOEARTH", "HoloEarth") internal class HoloEarthParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.HOLOEARTH, 3) { + PagedMangaParser(context, MangaParserSource.HOLOEARTH, 3) { override val configKeyDomain: ConfigKey.Domain get() = ConfigKey.Domain("holoearth.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt index f9899bfb..df890bdb 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt @@ -8,14 +8,14 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("IMHENTAI", "ImHentai", type = ContentType.HENTAI) internal class ImHentai(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.IMHENTAI, pageSize = 20) { + PagedMangaParser(context, MangaParserSource.IMHENTAI, pageSize = 20) { override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.RATING) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Koharu.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Koharu.kt index 7bde8ebd..89ca079e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Koharu.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Koharu.kt @@ -6,7 +6,7 @@ import org.jsoup.HttpStatusException import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -24,7 +24,7 @@ import org.koitharu.kotatsu.parsers.Broken @Broken("Need to fix getPages, most manga don't have chapter images due to faulty fetch logic") @MangaSourceParser("KOHARU", "Schale.network", type = ContentType.HENTAI) internal class Koharu(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.KOHARU, 24) { + PagedMangaParser(context, MangaParserSource.KOHARU, 24) { override val configKeyDomain = ConfigKey.Domain("niyaniya.moe") private val apiSuffix = "api.schale.network" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt index 22de2c80..2922d759 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt @@ -8,7 +8,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.exception.NotFoundException import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* @@ -21,7 +21,7 @@ import javax.crypto.spec.SecretKeySpec internal abstract class LineWebtoonsParser( context: MangaLoaderContext, source: MangaParserSource, -) : LegacyMangaParser(context, source) { +) : AbstractMangaParser(context, source) { override val filterCapabilities: MangaListFilterCapabilities get() = MangaListFilterCapabilities( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt index 3f5756f1..4ad7e1eb 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt @@ -10,7 +10,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.AbstractMangaParser +import org.koitharu.kotatsu.parsers.core.FlexibleMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.search.MangaSearchQuery @@ -34,7 +34,7 @@ private const val SERVER_DATA = "data" private const val SERVER_DATA_SAVER = "data-saver" @MangaSourceParser("MANGADEX", "MangaDex") -internal class MangaDexParser(context: MangaLoaderContext) : AbstractMangaParser(context, MangaParserSource.MANGADEX) { +internal class MangaDexParser(context: MangaLoaderContext) : FlexibleMangaParser(context, MangaParserSource.MANGADEX) { override val configKeyDomain = ConfigKey.Domain("mangadex.org") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaFireParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaFireParser.kt index c212576a..260ec3cf 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaFireParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaFireParser.kt @@ -13,7 +13,7 @@ import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.bitmap.Rect import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -28,7 +28,7 @@ internal abstract class MangaFireParser( context: MangaLoaderContext, source: MangaParserSource, private val siteLang: String, -) : LegacyPagedMangaParser(context, source, 30), Interceptor, MangaParserAuthProvider { +) : PagedMangaParser(context, source, 30), Interceptor, MangaParserAuthProvider { override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("mangafire.to") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPark.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPark.kt index 200f5c65..8942026b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPark.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPark.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.coroutineScope import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -15,7 +15,7 @@ import java.util.* @MangaSourceParser("MANGAPARK", "MangaPark") internal class MangaPark(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANGAPARK, pageSize = 36) { + PagedMangaParser(context, MangaParserSource.MANGAPARK, pageSize = 36) { override val configKeyDomain = ConfigKey.Domain( "mangapark.net", diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPlusParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPlusParser.kt index de467812..bb4a3c20 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPlusParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPlusParser.kt @@ -11,7 +11,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -25,7 +25,7 @@ internal abstract class MangaPlusParser( context: MangaLoaderContext, source: MangaParserSource, private val sourceLang: String, -) : LegacySinglePageMangaParser(context, source), Interceptor { +) : SinglePageMangaParser(context, source), Interceptor { private val apiUrl = "https://jumpg-webapi.tokyo-cdn.com/api" override val configKeyDomain = ConfigKey.Domain("mangaplus.shueisha.co.jp") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaReaderToParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaReaderToParser.kt index 59f20075..1d10763f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaReaderToParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaReaderToParser.kt @@ -12,7 +12,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.bitmap.Bitmap import org.koitharu.kotatsu.parsers.bitmap.Rect import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -23,7 +23,7 @@ import kotlin.math.min @MangaSourceParser("MANGAREADERTO", "MangaReader.To") internal class MangaReaderToParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANGAREADERTO, 16), + PagedMangaParser(context, MangaParserSource.MANGAREADERTO, 16), Interceptor, MangaParserAuthProvider { override val configKeyDomain = ConfigKey.Domain("mangareader.to") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Manhwa210.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Manhwa210.kt index 8662458c..780077e0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Manhwa210.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Manhwa210.kt @@ -3,13 +3,13 @@ package org.koitharu.kotatsu.parsers.site.all import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("MANHWA210", "Manhwa210", type = ContentType.MANHWA) -internal class Manhwa210(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.MANHWA210, 60) { +internal class Manhwa210(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.MANHWA210, 60) { override val configKeyDomain = ConfigKey.Domain("manhwa210.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Misskon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Misskon.kt index 82e33981..3ff234ba 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Misskon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Misskon.kt @@ -3,13 +3,13 @@ package org.koitharu.kotatsu.parsers.site.all import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("MISSKON", "MissKon", type = ContentType.OTHER) -internal class Misskon(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.MISSKON, 24) { +internal class Misskon(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.MISSKON, 24) { override val configKeyDomain = ConfigKey.Domain("misskon.com") @@ -145,4 +145,4 @@ internal class Misskon(context: MangaLoaderContext) : LegacyPagedMangaParser(con } return pages } -} \ No newline at end of file +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Multporn.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Multporn.kt index 0983fa5a..f2bba252 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Multporn.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Multporn.kt @@ -4,14 +4,14 @@ import okhttp3.Headers import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("MULTPORN", "Multporn") internal class Multporn(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MULTPORN, 42) { + PagedMangaParser(context, MangaParserSource.MULTPORN, 42) { override val configKeyDomain = ConfigKey.Domain("multporn.net") @@ -226,4 +226,4 @@ internal class Multporn(context: MangaLoaderContext) : document.select(".$className a").map { it.text().trim() } } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MyReadingManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MyReadingManga.kt index 3fe410ee..f7913b94 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MyReadingManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MyReadingManga.kt @@ -6,7 +6,7 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -17,7 +17,7 @@ import org.koitharu.kotatsu.parsers.Broken @Broken // TODO: Fix tags, genres @MangaSourceParser("MYREADINGMANGA", "MyReadingManga") -internal class MyReadingManga(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.MYREADINGMANGA, 20) { +internal class MyReadingManga(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.MYREADINGMANGA, 20) { override val configKeyDomain = ConfigKey.Domain("myreadingmanga.info") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt index 4d453ee0..38b619b6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt @@ -9,7 +9,7 @@ import okhttp3.Response import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -19,7 +19,7 @@ internal abstract class NineMangaParser( context: MangaLoaderContext, source: MangaParserSource, defaultDomain: String, -) : LegacyPagedMangaParser(context, source, pageSize = 26), Interceptor { +) : PagedMangaParser(context, source, pageSize = 26), Interceptor { override val configKeyDomain = ConfigKey.Domain(defaultDomain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineNineNineHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineNineNineHentaiParser.kt index 6c74c651..020d85dd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineNineNineHentaiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineNineNineHentaiParser.kt @@ -9,7 +9,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -23,7 +23,7 @@ import java.util.* @Broken @MangaSourceParser("NINENINENINEHENTAI", "AnimeH", type = ContentType.HENTAI) internal class NineNineNineHentaiParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.NINENINENINEHENTAI, PAGE_SIZE), Interceptor { + PagedMangaParser(context, MangaParserSource.NINENINENINEHENTAI, PAGE_SIZE), Interceptor { override val configKeyDomain = ConfigKey.Domain("animeh.to") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/WebtoonsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/WebtoonsParser.kt index 986221a9..8a73363d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/WebtoonsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/WebtoonsParser.kt @@ -7,7 +7,7 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -17,7 +17,7 @@ import java.util.EnumSet internal abstract class WebtoonsParser( context: MangaLoaderContext, source: MangaParserSource, -) : LegacyMangaParser(context, source) { +) : AbstractMangaParser(context, source) { override val configKeyDomain = ConfigKey.Domain("webtoons.com") @@ -35,10 +35,11 @@ internal abstract class WebtoonsParser( isSearchSupported = true, ) - override val userAgentKey = ConfigKey.UserAgent("Mozilla/5.0 (Linux; Android 12; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36") + override val userAgentKey = + ConfigKey.UserAgent("Mozilla/5.0 (Linux; Android 12; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36") override suspend fun getFilterOptions() = MangaListFilterOptions( - availableTags = availableTags() + availableTags = availableTags(), ) override fun onCreateConfig(keys: MutableCollection>) { @@ -57,7 +58,7 @@ internal abstract class WebtoonsParser( else -> tag } - private suspend fun fetchEpisodes(titleNo: Long) : List { + private suspend fun fetchEpisodes(titleNo: Long): List { val url = "https://$mobileApiDomain/api/v1/webtoon/$titleNo/episodes?pageSize=99999" val json = webClient.httpGet(url).parseJson() @@ -98,7 +99,7 @@ internal abstract class WebtoonsParser( val description = listOf( doc.select("meta[property='og:description']").attr("content"), doc.select("#_asideDetail p.summary").text(), - doc.select(".detail_header .summary").text() + doc.select(".detail_header .summary").text(), ).firstOrNull { it.isNotBlank() }.orEmpty() val coverUrl = doc.select("meta[property=\"og:image\"]").attr("content").let { url -> @@ -108,7 +109,7 @@ internal abstract class WebtoonsParser( val author = listOf( doc.select("meta[property='com-linewebtoon:webtoon:author']").attr("content"), doc.select(".detail_header .info .author").firstOrNull()?.text(), - doc.select(".author_area").text() + doc.select(".author_area").text(), ).firstOrNull { !it.isNullOrBlank() && it != "null" } val genreElements = doc.select(".detail_header .info .genre").ifEmpty { @@ -185,6 +186,7 @@ internal abstract class WebtoonsParser( val searchUrl = "https://$domain/$languageCode/search?keyword=${filter.query.urlEncoded()}" webClient.httpGet(searchUrl).parseHtml() } + filter.tags.isNotEmpty() -> { val selectedGenre = filter.tags.first() val genreUrlPath = genreUrlMap[selectedGenre.key] ?: selectedGenre.key @@ -192,6 +194,7 @@ internal abstract class WebtoonsParser( val genreUrl = "https://$domain/$languageCode/genres/$genreUrlPath?sortOrder=$sortParam" webClient.httpGet(genreUrl).parseHtml() } + else -> { val rankingType = when (order) { SortOrder.POPULARITY -> "popular" @@ -212,7 +215,11 @@ internal abstract class WebtoonsParser( .take(20) } - private fun createMangaFromElement(element: Element, source: MangaParserSource, selectedGenre: MangaTag? = null): Manga { + private fun createMangaFromElement( + element: Element, + source: MangaParserSource, + selectedGenre: MangaTag? = null, + ): Manga { val href = element.absUrl("href") val titleNo = extractTitleNoFromUrl(href) val title = element.select(".title, .card_title").text() @@ -258,7 +265,7 @@ internal abstract class WebtoonsParser( id = generateUid("${chapter.id}-$i"), url = url, preview = null, - source = source + source = source, ) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt index ae7246a2..7a3bed07 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt @@ -6,7 +6,7 @@ import org.json.JSONArray import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -16,7 +16,7 @@ internal abstract class AnimeBootstrapParser( source: MangaParserSource, domain: String, pageSize: Int = 24, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt index 63b0209e..c797ad34 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt @@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.mapJSON @@ -19,7 +19,7 @@ import java.util.* @Broken @MangaSourceParser("FLIXSCANS", "FlixScans.net", "ar") internal class FlixScans(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.FLIXSCANS, 18) { + PagedMangaParser(context, MangaParserSource.FLIXSCANS, 18) { override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("flixscans.net") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt index d126fbcd..2189a044 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt @@ -4,7 +4,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -13,7 +13,7 @@ import java.util.* @Broken @MangaSourceParser("MANGASTORM", "MangaStorm", "ar") internal class MangaStorm(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANGASTORM, 30) { + PagedMangaParser(context, MangaParserSource.MANGASTORM, 30) { override val availableSortOrders: Set = EnumSet.of(SortOrder.POPULARITY, SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("mangastorm.org") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt index aa67fa73..2a50b512 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt @@ -7,7 +7,7 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -15,7 +15,7 @@ import java.util.* @MangaSourceParser("TEAMXNOVEL", "TeamXNovel", "ar") internal class TeamXNovel(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.TEAMXNOVEL, 10) { + PagedMangaParser(context, MangaParserSource.TEAMXNOVEL, 10) { override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt index 0286f831..d891757a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt @@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.generateUid import org.koitharu.kotatsu.parsers.util.getDomain @@ -21,7 +21,7 @@ import java.util.* @Broken @MangaSourceParser("ANIBEL", "Anibel", "be") -internal class AnibelParser(context: MangaLoaderContext) : LegacyMangaParser(context, MangaParserSource.ANIBEL) { +internal class AnibelParser(context: MangaLoaderContext) : AbstractMangaParser(context, MangaParserSource.ANIBEL) { override val configKeyDomain = ConfigKey.Domain("anibel.net") 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 index af3fe50e..6e604087 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/CupFoxParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/CupFoxParser.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.cupfox import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -13,7 +13,7 @@ internal abstract class CupFoxParser( source: MangaParserSource, domain: String, pageSize: Int = 24, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt index cf3eec6b..02c6570e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt @@ -7,7 +7,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -18,7 +18,7 @@ import java.util.* @MangaSourceParser("ASURASCANS", "AsuraComic", "en") internal class AsuraScansParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.ASURASCANS, pageSize = 30) { + PagedMangaParser(context, MangaParserSource.ASURASCANS, pageSize = 30) { override val configKeyDomain = ConfigKey.Domain("asuracomic.net") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BatCave.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BatCave.kt index 0fc94e99..258599f1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BatCave.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BatCave.kt @@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -18,7 +18,7 @@ import java.util.* @MangaSourceParser("BATCAVE", "BatCave", "en", ContentType.COMICS) internal class BatCave(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.BATCAVE, 20) { + PagedMangaParser(context, MangaParserSource.BATCAVE, 20) { override val configKeyDomain = ConfigKey.Domain("batcave.biz") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt index 611c117f..07a88225 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -11,7 +11,7 @@ import java.util.* @MangaSourceParser("BEETOON", "BeeToon.net", "en") internal class BeeToon(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.BEETOON, pageSize = 30) { + PagedMangaParser(context, MangaParserSource.BEETOON, pageSize = 30) { override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt index d265cefd..e0293c69 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt @@ -3,14 +3,14 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("CLONEMANGA", "CloneManga", "en") internal class CloneMangaParser(context: MangaLoaderContext) : - LegacySinglePageMangaParser(context, MangaParserSource.CLONEMANGA) { + SinglePageMangaParser(context, MangaParserSource.CLONEMANGA) { override val availableSortOrders: Set = Collections.singleton( SortOrder.POPULARITY, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt index 562e9da4..386df464 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -12,7 +12,7 @@ import java.util.* @MangaSourceParser("COMICEXTRA", "ComicExtra", "en", ContentType.COMICS) internal class ComicExtra(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.COMICEXTRA, 36) { + PagedMangaParser(context, MangaParserSource.COMICEXTRA, 36) { override val configKeyDomain = ConfigKey.Domain("azcomix.me") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DemonicScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DemonicScans.kt index 96861686..47db8db3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DemonicScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DemonicScans.kt @@ -4,7 +4,7 @@ import androidx.collection.arraySetOf import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.jsoup.nodes.Element @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("DEMONICSCANS", "DemonicScans", "en") internal class DemonicScans(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.DEMONICSCANS, 25) { + PagedMangaParser(context, MangaParserSource.DEMONICSCANS, 25) { override val configKeyDomain = ConfigKey.Domain("demonicscans.org") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt index b89bfee6..75c35f2e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt @@ -10,7 +10,7 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -19,7 +19,7 @@ import java.util.* @MangaSourceParser("DYNASTYSCANS", "DynastyScans", "en") internal class DynastyScans(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.DYNASTYSCANS, 117) { + PagedMangaParser(context, MangaParserSource.DYNASTYSCANS, 117) { override val configKeyDomain = ConfigKey.Domain("dynasty-scans.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlameComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlameComics.kt index 3d46ba1f..6cc21e65 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlameComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlameComics.kt @@ -7,7 +7,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -17,7 +17,7 @@ import java.util.concurrent.TimeUnit @MangaSourceParser("FLAMECOMICS", "FlameComics", "en") internal class FlameComics(context: MangaLoaderContext) : - LegacySinglePageMangaParser(context, MangaParserSource.FLAMECOMICS) { + SinglePageMangaParser(context, MangaParserSource.FLAMECOMICS) { private val commonPrefix = suspendLazy(initializer = ::fetchCommonPrefix) private val removeSpecialCharsRegex = Regex("[^A-Za-z0-9 ]") @@ -235,6 +235,6 @@ internal class FlameComics(context: MangaLoaderContext) : private fun String.toMangaTag() = MangaTag( title = this.toTitleCase(sourceLocale), key = this.lowercase().trim(), - source = source + source = source, ) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlixScansOrg.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlixScansOrg.kt index 2b540df7..343c00c2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlixScansOrg.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlixScansOrg.kt @@ -9,7 +9,7 @@ import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -20,7 +20,7 @@ import java.util.* @Broken @MangaSourceParser("FLIXSCANSORG", "FlixScans.org", "en") internal class FlixScansOrg(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.FLIXSCANSORG, 18) { + PagedMangaParser(context, MangaParserSource.FLIXSCANSORG, 18) { override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("flixscans.org") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Hentalk.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Hentalk.kt index 06c8cd86..db7d924e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Hentalk.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Hentalk.kt @@ -8,7 +8,7 @@ import org.jsoup.HttpStatusException import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents @@ -22,7 +22,7 @@ private const val SERVER_DATA = "" @MangaSourceParser("HENTALK", "Hentalk", "en", type = ContentType.HENTAI) internal class Hentalk(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.HENTALK, 24) { + PagedMangaParser(context, MangaParserSource.HENTALK, 24) { override val configKeyDomain = ConfigKey.Domain("hentalk.pw", "fakku.cc") override val userAgentKey = ConfigKey.UserAgent(UserAgents.KOTATSU) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MTL/MTLParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MTL/MTLParser.kt index 4ccd88b8..df539f9a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MTL/MTLParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MTL/MTLParser.kt @@ -1,8 +1,5 @@ package org.koitharu.kotatsu.parsers.site.en.MTL -import org.json.JSONArray -import org.json.JSONObject -import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.search.MangaSearchQuery @@ -11,118 +8,121 @@ import org.koitharu.kotatsu.parsers.model.search.SearchCapability import org.koitharu.kotatsu.parsers.model.search.SearchableField import org.koitharu.kotatsu.parsers.model.search.QueryCriteria.* import org.koitharu.kotatsu.parsers.util.* -import org.koitharu.kotatsu.parsers.core.PagedMangaParser +import org.koitharu.kotatsu.parsers.core.FlexiblePagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.exception.ParseException import java.text.SimpleDateFormat import java.util.* internal abstract class MTLParser( - context: MangaLoaderContext, - source: MangaParserSource, - domain: String -): PagedMangaParser(context, source, 24) { + context: MangaLoaderContext, + source: MangaParserSource, + domain: String, +) : FlexiblePagedMangaParser(context, source, 24) { - override val configKeyDomain = ConfigKey.Domain(domain) + override val configKeyDomain = ConfigKey.Domain(domain) - override val availableSortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, - SortOrder.NEWEST + SortOrder.NEWEST, ) - override suspend fun getFilterOptions(): MangaListFilterOptions = MangaListFilterOptions() + override suspend fun getFilterOptions(): MangaListFilterOptions = MangaListFilterOptions() - override val searchQueryCapabilities = MangaSearchQueryCapabilities( + override val searchQueryCapabilities = MangaSearchQueryCapabilities( SearchCapability( field = SearchableField.TITLE_NAME, criteriaTypes = setOf(Match::class), - isMultiple = false - ) + isMultiple = false, + ), ) - override suspend fun getListPage(query: MangaSearchQuery, page: Int): List { - val url = buildString { - append("https://") - append(domain) - append("/search") - append("?") - when (query.order) { - SortOrder.POPULARITY -> append("sort_by=views") - SortOrder.UPDATED -> append("sort_by=recent") - else -> append("sort_by=recent") - } - if (page > 1) { - append("&page=") - append(page) - } - query.criteria.find { it.field == SearchableField.TITLE_NAME }?.let { criteria -> - when (criteria) { - is Match -> { - append("&q=") - append(criteria.value.toString()) - } + override suspend fun getListPage(query: MangaSearchQuery, page: Int): List { + val url = buildString { + append("https://") + append(domain) + append("/search") + append("?") + when (query.order) { + SortOrder.POPULARITY -> append("sort_by=views") + SortOrder.UPDATED -> append("sort_by=recent") + else -> append("sort_by=recent") + } + if (page > 1) { + append("&page=") + append(page) + } + query.criteria.find { it.field == SearchableField.TITLE_NAME }?.let { criteria -> + when (criteria) { + is Match -> { + append("&q=") + append(criteria.value.toString()) + } + is Include, is Exclude, - is Range -> Unit // Not supported for this field - } - } - } - - val doc = webClient.httpGet(url).parseHtml() - return doc.select("div.grid.grid-cols-1.sm\\:grid-cols-2.lg\\:grid-cols-3.xl\\:grid-cols-4.gap-8.p-6 > div").map { div -> - val href = div.selectFirst("a")?.attr("href") ?: throw ParseException("Link not found", url) - Manga( - id = generateUid(href), - url = href, - publicUrl = href.toAbsoluteUrl(domain), - coverUrl = div.selectFirst("a > div > img")?.src().orEmpty(), - title = div.selectFirst("div > a > h3")?.text().orEmpty(), - altTitles = emptySet(), - rating = RATING_UNKNOWN, - tags = emptySet(), - authors = emptySet(), - state = null, - source = source, - contentRating = null, - ) - } - } - - override suspend fun getDetails(manga: Manga): Manga { - val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() - val altTitles = doc.select("p:contains(Alternative Title)").firstOrNull()?.text() - ?.substringAfter("Alternative Title:") - ?.removeSurrounding("[", "]") - ?.split(",") - ?.map { it.trim().removeSurrounding("'", "'") } - ?.toSet() - ?: emptySet() - - val description = doc.select("p:contains(Synopsis)").firstOrNull()?.text() - ?.substringAfter("Synopsis:").orEmpty() - - val authors = doc.select("p:contains(Author:)").firstOrNull()?.text() - ?.substringAfter("Author:") - - val state = when (doc.select("p:contains(Status:)").firstOrNull()?.text()?.contains("Ongoing") == true) { - true -> MangaState.ONGOING - false -> MangaState.FINISHED - } - - val chaptersRoot = doc.selectFirst("section.bg-gray-800.rounded-lg.shadow-md.mt-8.p-6") - ?: throw ParseException("Chapters not found", manga.url) - - val chapters = chaptersRoot.select("ul > li").mapNotNull { li -> - val link = li.selectFirst("a") ?: return@mapNotNull null - val href = link.attrAsRelativeUrl("href") - val title = link.text() - val number = title.substringAfter("Chapter ").substringBefore(" ").toFloatOrNull() ?: 0f - - val dateString = li.select("span.text-gray-400").firstOrNull()?.text()?.trim() ?: "" - val uploadDate = if (dateString.isNotEmpty()) parseChapterDate(dateString) else 0L - - MangaChapter( + is Range, + -> Unit // Not supported for this field + } + } + } + + val doc = webClient.httpGet(url).parseHtml() + return doc.select("div.grid.grid-cols-1.sm\\:grid-cols-2.lg\\:grid-cols-3.xl\\:grid-cols-4.gap-8.p-6 > div") + .map { div -> + val href = div.selectFirst("a")?.attr("href") ?: throw ParseException("Link not found", url) + Manga( + id = generateUid(href), + url = href, + publicUrl = href.toAbsoluteUrl(domain), + coverUrl = div.selectFirst("a > div > img")?.src().orEmpty(), + title = div.selectFirst("div > a > h3")?.text().orEmpty(), + altTitles = emptySet(), + rating = RATING_UNKNOWN, + tags = emptySet(), + authors = emptySet(), + state = null, + source = source, + contentRating = null, + ) + } + } + + override suspend fun getDetails(manga: Manga): Manga { + val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() + val altTitles = doc.select("p:contains(Alternative Title)").firstOrNull()?.text() + ?.substringAfter("Alternative Title:") + ?.removeSurrounding("[", "]") + ?.split(",") + ?.map { it.trim().removeSurrounding("'", "'") } + ?.toSet() + ?: emptySet() + + val description = doc.select("p:contains(Synopsis)").firstOrNull()?.text() + ?.substringAfter("Synopsis:").orEmpty() + + val authors = doc.select("p:contains(Author:)").firstOrNull()?.text() + ?.substringAfter("Author:") + + val state = when (doc.select("p:contains(Status:)").firstOrNull()?.text()?.contains("Ongoing") == true) { + true -> MangaState.ONGOING + false -> MangaState.FINISHED + } + + val chaptersRoot = doc.selectFirst("section.bg-gray-800.rounded-lg.shadow-md.mt-8.p-6") + ?: throw ParseException("Chapters not found", manga.url) + + val chapters = chaptersRoot.select("ul > li").mapNotNull { li -> + val link = li.selectFirst("a") ?: return@mapNotNull null + val href = link.attrAsRelativeUrl("href") + val title = link.text() + val number = title.substringAfter("Chapter ").substringBefore(" ").toFloatOrNull() ?: 0f + + val dateString = li.select("span.text-gray-400").firstOrNull()?.text()?.trim() ?: "" + val uploadDate = if (dateString.isNotEmpty()) parseChapterDate(dateString) else 0L + + MangaChapter( id = generateUid(href), title = title, number = number, @@ -131,66 +131,69 @@ internal abstract class MTLParser( scanlator = null, uploadDate = uploadDate, branch = null, - source = source + source = source, ) - }.toList() + }.toList() - return manga.copy( + return manga.copy( description = description, authors = setOfNotNull(authors), state = state, altTitles = altTitles, - chapters = chapters.reversed() + chapters = chapters.reversed(), ) - } - - override suspend fun getPages(chapter: MangaChapter): List { - val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() - val jsonText = doc.selectFirst("div#json-data")?.text() - ?: throw ParseException("JSON data not found", chapter.url) - - val imgUrls = Regex(""""img_url":\s*"([^"]+)"""").findAll(jsonText) - .map { it.groupValues[1] } - .toList() - - return imgUrls.map { imgUrl -> - val fullUrl = "https://$imgUrl" - MangaPage( - id = generateUid(fullUrl), - url = fullUrl, - preview = null, - source = source, - ) - } - } - - private fun parseChapterDate(dateString: String): Long { - val calendar = Calendar.getInstance() - return when { - "minute" in dateString -> { - val minutes = dateString.substringBefore(" minute").toInt() - calendar.add(Calendar.MINUTE, -minutes) - calendar.timeInMillis - } - "hour" in dateString -> { - val hours = dateString.substringBefore(" hour").toInt() - calendar.add(Calendar.HOUR_OF_DAY, -hours) - calendar.timeInMillis - } - "day" in dateString -> { - val days = dateString.substringBefore(" day").toInt() - calendar.add(Calendar.DAY_OF_YEAR, -days) - calendar.timeInMillis - } - else -> { - try { - val sdf = SimpleDateFormat("dd MMMM yyyy", Locale.ENGLISH) - sdf.timeZone = TimeZone.getTimeZone("UTC") - sdf.parse(dateString)?.time ?: 0L - } catch (e: Exception) { - 0L - } - } - } - } -} \ No newline at end of file + } + + override suspend fun getPages(chapter: MangaChapter): List { + val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() + val jsonText = doc.selectFirst("div#json-data")?.text() + ?: throw ParseException("JSON data not found", chapter.url) + + val imgUrls = Regex(""""img_url":\s*"([^"]+)"""").findAll(jsonText) + .map { it.groupValues[1] } + .toList() + + return imgUrls.map { imgUrl -> + val fullUrl = "https://$imgUrl" + MangaPage( + id = generateUid(fullUrl), + url = fullUrl, + preview = null, + source = source, + ) + } + } + + private fun parseChapterDate(dateString: String): Long { + val calendar = Calendar.getInstance() + return when { + "minute" in dateString -> { + val minutes = dateString.substringBefore(" minute").toInt() + calendar.add(Calendar.MINUTE, -minutes) + calendar.timeInMillis + } + + "hour" in dateString -> { + val hours = dateString.substringBefore(" hour").toInt() + calendar.add(Calendar.HOUR_OF_DAY, -hours) + calendar.timeInMillis + } + + "day" in dateString -> { + val days = dateString.substringBefore(" day").toInt() + calendar.add(Calendar.DAY_OF_YEAR, -days) + calendar.timeInMillis + } + + else -> { + try { + val sdf = SimpleDateFormat("dd MMMM yyyy", Locale.ENGLISH) + sdf.timeZone = TimeZone.getTimeZone("UTC") + sdf.parse(dateString)?.time ?: 0L + } catch (e: Exception) { + 0L + } + } + } + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt index 09a96c13..3472e4c4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.coroutineScope import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("MANGAGEKO", "MangaGeko", "en") internal class MangaGeko(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANGAGEKO, 30) { + PagedMangaParser(context, MangaParserSource.MANGAGEKO, 30) { override val availableSortOrders: Set = EnumSet.of(SortOrder.POPULARITY, SortOrder.UPDATED, SortOrder.NEWEST) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaKawaiiEn.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaKawaiiEn.kt index 42ef9c3f..38b694f9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaKawaiiEn.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaKawaiiEn.kt @@ -6,14 +6,14 @@ import okhttp3.Headers import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("MANGAKAWAII_EN", "MangaKawaii En", "en") internal class MangaKawaiiEn(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANGAKAWAII_EN, 50) { + PagedMangaParser(context, MangaParserSource.MANGAKAWAII_EN, 50) { override val configKeyDomain = ConfigKey.Domain("www.mangakawaii.io") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaPill.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaPill.kt index 640af7d8..74f97888 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaPill.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaPill.kt @@ -2,7 +2,7 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -10,7 +10,7 @@ import org.jsoup.nodes.Document import java.util.* @MangaSourceParser("MANGAPILL", "MangaPill", "en") -internal class MangaPill(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.MANGAPILL, 50) { +internal class MangaPill(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.MANGAPILL, 50) { override val configKeyDomain = ConfigKey.Domain("mangapill.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt index ddb055e2..e991d7bc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -12,7 +12,7 @@ import java.util.* @MangaSourceParser("MANGATOWN", "MangaTown", "en") internal class MangaTownParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANGATOWN, 30) { + PagedMangaParser(context, MangaParserSource.MANGATOWN, 30) { override val configKeyDomain = ConfigKey.Domain("www.mangatown.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt index e74af971..b7dae526 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt @@ -6,7 +6,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -17,7 +17,7 @@ import java.util.* @Broken @MangaSourceParser("MANGAOWL", "MangaOwl.to", "en") internal class Mangaowl(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANGAOWL, pageSize = 24) { + PagedMangaParser(context, MangaParserSource.MANGAOWL, pageSize = 24) { override val availableSortOrders: Set = EnumSet.of( SortOrder.POPULARITY, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Com.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Com.kt index f03a809b..41a3356f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Com.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Com.kt @@ -4,7 +4,7 @@ import androidx.collection.ArrayMap import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -12,7 +12,7 @@ import java.util.* @MangaSourceParser("MANHWA18COM", "Manhwa18.com", "en", type = ContentType.HENTAI) internal class Manhwa18Com(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANHWA18COM, pageSize = 18, searchPageSize = 18) { + PagedMangaParser(context, MangaParserSource.MANHWA18COM, pageSize = 18, searchPageSize = 18) { override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("manhwa18.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt index f634bb71..ad095c80 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt @@ -4,7 +4,7 @@ import androidx.collection.ArrayMap import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -12,7 +12,7 @@ import java.util.* @MangaSourceParser("MANHWA18", "Manhwa18.net", "en", type = ContentType.HENTAI) internal class Manhwa18Parser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANHWA18, pageSize = 18, searchPageSize = 18) { + PagedMangaParser(context, MangaParserSource.MANHWA18, pageSize = 18, searchPageSize = 18) { override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("manhwa18.net") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt index 9004ac47..5f3ebc9a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -12,7 +12,7 @@ import java.util.* @MangaSourceParser("MANHWASMEN", "ManhwasMen", "en", type = ContentType.HENTAI) internal class ManhwasMen(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANHWASMEN, pageSize = 30, searchPageSize = 30) { + PagedMangaParser(context, MangaParserSource.MANHWASMEN, pageSize = 30, searchPageSize = 30) { override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("manhwas.men") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MyComicList.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MyComicList.kt index 5a29c591..cdd6c3ba 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MyComicList.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MyComicList.kt @@ -3,14 +3,14 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("MYCOMICLIST", "MyComicList", "en", ContentType.COMICS) internal class MyComicList(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MYCOMICLIST, 24) { + PagedMangaParser(context, MangaParserSource.MYCOMICLIST, 24) { override val configKeyDomain = ConfigKey.Domain("mycomiclist.org") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt index 15df7040..fdad0d56 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt @@ -4,7 +4,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -13,7 +13,7 @@ import java.util.* @Broken @MangaSourceParser("PO2SCANS", "Po2Scans", "en") internal class Po2Scans(context: MangaLoaderContext) : - LegacySinglePageMangaParser(context, MangaParserSource.PO2SCANS) { + SinglePageMangaParser(context, MangaParserSource.PO2SCANS) { override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) override val configKeyDomain = ConfigKey.Domain("po2scans.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt index 46e45c91..f3e792a6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt @@ -9,7 +9,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -17,7 +17,7 @@ import java.util.* @Broken @MangaSourceParser("PURURIN", "Pururin", "en", ContentType.HENTAI) internal class Pururin(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.PURURIN, pageSize = 20) { + PagedMangaParser(context, MangaParserSource.PURURIN, pageSize = 20) { override val configKeyDomain = ConfigKey.Domain("pururin.to") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ReadOnePiece.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ReadOnePiece.kt index 40eb1c7e..246d573c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ReadOnePiece.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ReadOnePiece.kt @@ -3,14 +3,14 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("READONEPIECE", "ReadOnePiece", "en") internal class ReadOnePiece(context: MangaLoaderContext) : - LegacySinglePageMangaParser(context, MangaParserSource.READONEPIECE) { + SinglePageMangaParser(context, MangaParserSource.READONEPIECE) { override val configKeyDomain: ConfigKey.Domain get() = ConfigKey.Domain("ww11.readonepiece.com") @@ -26,7 +26,7 @@ internal class ReadOnePiece(context: MangaLoaderContext) : val doc = webClient.httpGet("https://$domain").parseHtml() val root = doc.body().selectFirstOrThrow("nav ul") val manga = root.select("li") - + return manga.mapNotNull { li -> val a = li.selectFirst("a") ?: return@mapNotNull null val href = a.attrAsRelativeUrlOrNull("href").takeIf { ref -> ref != "/" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/RoliaScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/RoliaScan.kt index 9d5e7684..a2b5d035 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/RoliaScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/RoliaScan.kt @@ -4,13 +4,13 @@ import androidx.collection.arraySetOf import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("ROLIASCAN", "Rolia Scan", "en") -internal class RoliaScan(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.ROLIASCAN, 25) { +internal class RoliaScan(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.ROLIASCAN, 25) { override val configKeyDomain = ConfigKey.Domain("roliascan.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VioletScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VioletScans.kt index 917d547b..e6c41d86 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VioletScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VioletScans.kt @@ -4,7 +4,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.PagedMangaParser +import org.koitharu.kotatsu.parsers.core.FlexiblePagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.search.MangaSearchQuery import org.koitharu.kotatsu.parsers.model.search.MangaSearchQueryCapabilities @@ -18,14 +18,13 @@ import org.koitharu.kotatsu.parsers.util.parseHtml import org.koitharu.kotatsu.parsers.util.selectFirstOrThrow import org.koitharu.kotatsu.parsers.util.urlEncoded import org.koitharu.kotatsu.parsers.util.tryParse -import org.koitharu.kotatsu.parsers.util.mapChapters import java.text.SimpleDateFormat import java.util.Locale @MangaSourceParser("VIOLETSCANS", "VioletScans", "en") -internal class VioletScans(context: MangaLoaderContext): - PagedMangaParser(context, MangaParserSource.VIOLETSCANS, 12) { - +internal class VioletScans(context: MangaLoaderContext) : + FlexiblePagedMangaParser(context, MangaParserSource.VIOLETSCANS, 12) { + override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("violetscans.com") override fun onCreateConfig(keys: MutableCollection>) { @@ -55,6 +54,7 @@ internal class VioletScans(context: MangaLoaderContext): searchParameter = criterion.value.toString() } } + is QueryCriteria.Exclude<*> -> null is QueryCriteria.Range<*> -> null is QueryCriteria.Include<*> -> null diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VyManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VyManga.kt index a2bfcf90..2d4c90aa 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VyManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VyManga.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -12,7 +12,7 @@ import java.util.* @MangaSourceParser("VYMANGA", "VyManga", "en") internal class VyManga(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.VYMANGA, pageSize = 36) { + PagedMangaParser(context, MangaParserSource.VYMANGA, pageSize = 36) { override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("vymanga.net") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/WeebCentral.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/WeebCentral.kt index e609e6d4..c783e7fc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/WeebCentral.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/WeebCentral.kt @@ -10,7 +10,7 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.ContentRating.SAFE import org.koitharu.kotatsu.parsers.model.ContentRating.SUGGESTIVE @@ -22,7 +22,7 @@ import java.text.SimpleDateFormat import java.util.* @MangaSourceParser("WEEBCENTRAL", "Weeb Central", "en") -internal class WeebCentral(context: MangaLoaderContext) : LegacyMangaParser(context, MangaParserSource.WEEBCENTRAL), +internal class WeebCentral(context: MangaLoaderContext) : AbstractMangaParser(context, MangaParserSource.WEEBCENTRAL), MangaParserAuthProvider { override val configKeyDomain = ConfigKey.Domain("weebcentral.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/DragonTranslationParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/DragonTranslationParser.kt index d8528ca4..339a4687 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/DragonTranslationParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/DragonTranslationParser.kt @@ -3,13 +3,13 @@ package org.koitharu.kotatsu.parsers.site.es import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("DRAGONTRANSLATION", "Dragon Translation", "es") -internal class DragonTranslationParser(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.DRAGONTRANSLATION, 30) { +internal class DragonTranslationParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.DRAGONTRANSLATION, 30) { override val configKeyDomain = ConfigKey.Domain("dragontranslation.net") @@ -169,4 +169,4 @@ internal class DragonTranslationParser(context: MangaLoaderContext) : LegacyPage else -> 0L } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt index df4ea493..18755b20 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt @@ -4,7 +4,7 @@ import kotlinx.coroutines.coroutineScope import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -16,7 +16,7 @@ import java.util.* @MangaSourceParser("TEMPLESCANESP", "TempleScanEsp", "es", ContentType.HENTAI) internal class TempleScanEsp(context: MangaLoaderContext) : - LegacySinglePageMangaParser(context, MangaParserSource.TEMPLESCANESP) { + SinglePageMangaParser(context, MangaParserSource.TEMPLESCANESP) { override val availableSortOrders: Set = EnumSet.of(SortOrder.NEWEST_ASC) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt index b99b38fe..52940e29 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt @@ -7,14 +7,14 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.* @MangaSourceParser("TUMANGAONLINE", "TuMangaOnline", "es") -internal class TuMangaOnlineParser(context: MangaLoaderContext) : LegacyPagedMangaParser( +internal class TuMangaOnlineParser(context: MangaLoaderContext) : PagedMangaParser( context, source = MangaParserSource.TUMANGAONLINE, pageSize = 24, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt index e3370b2c..85c2a666 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -17,7 +17,7 @@ internal abstract class FmreaderParser( source: MangaParserSource, domain: String, pageSize: Int = 20, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt index cb76cce0..2ef60776 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt @@ -5,7 +5,7 @@ import org.json.JSONArray import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -16,7 +16,7 @@ internal abstract class FoolSlideParser( source: MangaParserSource, domain: String, pageSize: Int = 25, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt index 2cff4fef..d0114b76 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt @@ -9,7 +9,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -19,7 +19,7 @@ import java.util.* @Broken @MangaSourceParser("BENTOMANGA", "BentoManga", "fr") internal class BentomangaParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.BENTOMANGA, 10) { + PagedMangaParser(context, MangaParserSource.BENTOMANGA, 10) { override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt index 2b132bf9..6917305d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt @@ -6,7 +6,7 @@ import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -16,7 +16,7 @@ import java.util.* @MangaSourceParser("FURYOSOCIETY", "FuryoSociety", "fr") internal class FuryoSociety(context: MangaLoaderContext) : - LegacySinglePageMangaParser(context, MangaParserSource.FURYOSOCIETY) { + SinglePageMangaParser(context, MangaParserSource.FURYOSOCIETY) { override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.UPDATED) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt index 48194ade..bd9c2a49 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt @@ -6,7 +6,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.mapJSON @@ -16,7 +16,7 @@ import java.util.* @Broken("images canvas need to refactor") @MangaSourceParser("LEGACY_SCANS", "LegacyScans", "fr") internal class LegacyScansParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.LEGACY_SCANS, 18) { + PagedMangaParser(context, MangaParserSource.LEGACY_SCANS, 18) { override val configKeyDomain = ConfigKey.Domain("legacy-scans.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt index cc1d2084..7f234320 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt @@ -4,7 +4,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -12,7 +12,7 @@ import java.util.* @Broken @MangaSourceParser("LIRESCAN", "LireScan", "fr") -internal class LireScan(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.LIRESCAN, 20) { +internal class LireScan(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.LIRESCAN, 20) { override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt index 416fe558..3a023b1a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt @@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -17,7 +17,7 @@ import java.util.* @MangaSourceParser("LUGNICASCANS", "LugnicaScans", "fr") internal class LugnicaScans(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.LUGNICASCANS, 10) { + PagedMangaParser(context, MangaParserSource.LUGNICASCANS, 10) { override val configKeyDomain = ConfigKey.Domain("lugnica-scans.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaKawaii.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaKawaii.kt index de0ba2a4..0db76809 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaKawaii.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaKawaii.kt @@ -6,14 +6,14 @@ import okhttp3.Headers import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("MANGAKAWAII", "MangaKawaii Fr", "fr") internal class MangaKawaii(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANGAKAWAII, 50) { + PagedMangaParser(context, MangaParserSource.MANGAKAWAII, 50) { override val configKeyDomain = ConfigKey.Domain("www.mangakawaii.io") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaMana.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaMana.kt index 967ab452..358fde22 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaMana.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaMana.kt @@ -11,7 +11,7 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -23,7 +23,7 @@ import java.util.* @MangaSourceParser("MANGAMANA", "MangaMana", "fr") internal class MangaMana(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANGAMANA, 25) { + PagedMangaParser(context, MangaParserSource.MANGAMANA, 25) { override val configKeyDomain = ConfigKey.Domain("www.manga-mana.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/PhenixscansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/PhenixscansParser.kt index 6f71d190..6e9fb101 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/PhenixscansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/PhenixscansParser.kt @@ -5,7 +5,7 @@ import org.json.JSONArray import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.getFloatOrDefault @@ -18,7 +18,7 @@ import java.util.* @MangaSourceParser("PHENIXSCANS", "PhenixScans", "fr") internal class PhenixscansParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.PHENIXSCANS, 18) { + PagedMangaParser(context, MangaParserSource.PHENIXSCANS, 18) { override val configKeyDomain = ConfigKey.Domain("phenix-scans.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt index 499fb517..1915cd02 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt @@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -16,7 +16,7 @@ import java.util.* @Broken @MangaSourceParser("SCANS_MANGAS_ME", "ScansMangas.me", "fr") internal class ScansMangasMe(context: MangaLoaderContext) : - LegacySinglePageMangaParser(context, MangaParserSource.SCANS_MANGAS_ME) { + SinglePageMangaParser(context, MangaParserSource.SCANS_MANGAS_ME) { override val availableSortOrders: Set = EnumSet.of( SortOrder.ALPHABETICAL, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt index 1854e668..823f795b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.fr import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("SCANTRADUNION", "ScantradUnion", "fr") internal class ScantradUnion(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.SCANTRADUNION, 10) { + PagedMangaParser(context, MangaParserSource.SCANTRADUNION, 10) { override val configKeyDomain = ConfigKey.Domain("scantrad-union.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fuzzydoodle/FuzzyDoodleParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fuzzydoodle/FuzzyDoodleParser.kt index 8aad166f..b7b0440e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fuzzydoodle/FuzzyDoodleParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fuzzydoodle/FuzzyDoodleParser.kt @@ -8,7 +8,7 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -20,7 +20,7 @@ internal abstract class FuzzyDoodleParser( source: MangaParserSource, domain: String, pageSize: Int = 24, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gallery/GalleryParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gallery/GalleryParser.kt index bfe3ca0b..67573a44 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gallery/GalleryParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gallery/GalleryParser.kt @@ -2,129 +2,129 @@ package org.koitharu.kotatsu.parsers.site.gallery import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.* internal abstract class GalleryParser( - context: MangaLoaderContext, - source: MangaParserSource, - domain: String -) : LegacyMangaParser(context, source) { + context: MangaLoaderContext, + source: MangaParserSource, + domain: String, +) : AbstractMangaParser(context, source) { - override val configKeyDomain = ConfigKey.Domain(domain) + override val configKeyDomain = ConfigKey.Domain(domain) - override fun onCreateConfig(keys: MutableCollection>) { + override fun onCreateConfig(keys: MutableCollection>) { super.onCreateConfig(keys) keys.add(userAgentKey) } - override val availableSortOrders: Set - get() = EnumSet.of(SortOrder.NEWEST, SortOrder.POPULARITY) + override val availableSortOrders: Set + get() = EnumSet.of(SortOrder.NEWEST, SortOrder.POPULARITY) - override val filterCapabilities: MangaListFilterCapabilities - get() = MangaListFilterCapabilities( - isSearchSupported = true, - ) + override val filterCapabilities: MangaListFilterCapabilities + get() = MangaListFilterCapabilities( + isSearchSupported = true, + ) - override suspend fun getFilterOptions(): MangaListFilterOptions = MangaListFilterOptions() + override suspend fun getFilterOptions(): MangaListFilterOptions = MangaListFilterOptions() - override suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List { - val url = urlBuilder().apply { - when { - !filter.query.isNullOrEmpty() -> addQueryParameter("search", filter.query) - filter.tags.isNotEmpty() -> addPathSegments(filter.tags.first().key) - order == SortOrder.POPULARITY -> addPathSegment("hot") - } + override suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List { + val url = urlBuilder().apply { + when { + !filter.query.isNullOrEmpty() -> addQueryParameter("search", filter.query) + filter.tags.isNotEmpty() -> addPathSegments(filter.tags.first().key) + order == SortOrder.POPULARITY -> addPathSegment("hot") + } - addQueryParameter("start", offset.toString()) - }.build() + addQueryParameter("start", offset.toString()) + }.build() - val content = webClient.httpGet(url).parseHtml() - val currentPage = content.selectFirst("a.pagination-link.is-current")?.text()?.toIntOrNull() - val titlePage = content.selectFirst("head > title")?.text() - ?.substringAfter("page ", "") - ?.substringBefore(" ", "") - ?.toIntOrNull() + val content = webClient.httpGet(url).parseHtml() + val currentPage = content.selectFirst("a.pagination-link.is-current")?.text()?.toIntOrNull() + val titlePage = content.selectFirst("head > title")?.text() + ?.substringAfter("page ", "") + ?.substringBefore(" ", "") + ?.toIntOrNull() - if (titlePage != null && currentPage != titlePage) return emptyList() + if (titlePage != null && currentPage != titlePage) return emptyList() - return content.select("div.items-row").map { el -> - val titleEl = el.selectFirstOrThrow("div.page-header a.item-link") - val relUrl = titleEl.attrOrThrow("href") - Manga( - id = generateUid(relUrl), - url = relUrl, - title = titleEl.text(), - altTitles = emptySet(), - publicUrl = relUrl.toAbsoluteUrl(domain), - rating = RATING_UNKNOWN, - contentRating = ContentRating.ADULT, - coverUrl = el.selectFirst("div.item-thumb img")?.attr("src"), - tags = el.select("div.item-tags > a.tag").mapNotNullToSet { tagEl -> - MangaTag( - title = tagEl.text(), - key = tagEl.attrAsRelativeUrlOrNull("href") - ?.removePrefix("/") ?: return@mapNotNullToSet null, - source = source, - ) - }, - state = MangaState.FINISHED, - authors = emptySet(), - largeCoverUrl = null, - description = null, - chapters = null, - source = source, - ) - } - } + return content.select("div.items-row").map { el -> + val titleEl = el.selectFirstOrThrow("div.page-header a.item-link") + val relUrl = titleEl.attrOrThrow("href") + Manga( + id = generateUid(relUrl), + url = relUrl, + title = titleEl.text(), + altTitles = emptySet(), + publicUrl = relUrl.toAbsoluteUrl(domain), + rating = RATING_UNKNOWN, + contentRating = ContentRating.ADULT, + coverUrl = el.selectFirst("div.item-thumb img")?.attr("src"), + tags = el.select("div.item-tags > a.tag").mapNotNullToSet { tagEl -> + MangaTag( + title = tagEl.text(), + key = tagEl.attrAsRelativeUrlOrNull("href") + ?.removePrefix("/") ?: return@mapNotNullToSet null, + source = source, + ) + }, + state = MangaState.FINISHED, + authors = emptySet(), + largeCoverUrl = null, + description = null, + chapters = null, + source = source, + ) + } + } - override suspend fun getDetails(manga: Manga): Manga { - val content = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() - val description = content.selectFirst("div.article-info")?.text()?.trim() ?: "" - val df = SimpleDateFormat("HH:mm dd-MM-yyyy") - val time = content.selectFirst("div.article-info > small")?.text()?.trim() - val chapters = content.selectFirst("nav.pagination")?.select("a.pagination-link") - ?.mapChapters { index, element -> - val relUrl = element.attrAsRelativeUrl("href") - MangaChapter( - id = generateUid(relUrl), - title = null, - number = index + 1f, - volume = 0, - url = relUrl, - scanlator = null, - uploadDate = df.tryParse(time), - branch = null, - source = source, - ) - }.orEmpty() - return manga.copy(chapters = chapters, description = description) - } + override suspend fun getDetails(manga: Manga): Manga { + val content = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() + val description = content.selectFirst("div.article-info")?.text()?.trim() ?: "" + val df = SimpleDateFormat("HH:mm dd-MM-yyyy") + val time = content.selectFirst("div.article-info > small")?.text()?.trim() + val chapters = content.selectFirst("nav.pagination")?.select("a.pagination-link") + ?.mapChapters { index, element -> + val relUrl = element.attrAsRelativeUrl("href") + MangaChapter( + id = generateUid(relUrl), + title = null, + number = index + 1f, + volume = 0, + url = relUrl, + scanlator = null, + uploadDate = df.tryParse(time), + branch = null, + source = source, + ) + }.orEmpty() + return manga.copy(chapters = chapters, description = description) + } - override suspend fun getPages(chapter: MangaChapter): List { - val content = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() - return content.selectFirstOrThrow("div.article-fulltext").select("p > img").mapNotNull { el -> - val url = el.attrOrNull("src") ?: return@mapNotNull null - MangaPage( - id = generateUid(url), - url = url, - preview = null, - source = source, - ) - } - } + override suspend fun getPages(chapter: MangaChapter): List { + val content = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() + return content.selectFirstOrThrow("div.article-fulltext").select("p > img").mapNotNull { el -> + val url = el.attrOrNull("src") ?: return@mapNotNull null + MangaPage( + id = generateUid(url), + url = url, + preview = null, + source = source, + ) + } + } - protected suspend fun fetchTags(): Set { - val root = webClient.httpGet("https://$domain").parseHtml() - return root.select("div#navbar-main a.navbar-item").map { a -> - MangaTag( - title = a.text(), - key = a.attr("href").removePrefix("/"), - source = source, - ) - }.toSet() - } -} \ No newline at end of file + protected suspend fun fetchTags(): Set { + val root = webClient.httpGet("https://$domain").parseHtml() + return root.select("div#navbar-main a.navbar-item").map { a -> + MangaTag( + title = a.text(), + key = a.attr("href").removePrefix("/"), + source = source, + ) + }.toSet() + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt index 8e3e0505..f4624645 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt @@ -9,7 +9,7 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -19,7 +19,7 @@ internal abstract class GalleryAdultsParser( source: MangaParserSource, domain: String, pageSize: Int = 20, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/GattsuParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/GattsuParser.kt index 278df84e..9f5cedef 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/GattsuParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/GattsuParser.kt @@ -4,7 +4,7 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -14,7 +14,7 @@ internal abstract class GattsuParser( source: MangaParserSource, domain: String, pageSize: Int = 20, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt index 1caffa85..57b7b736 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.guya import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.generateUid import org.koitharu.kotatsu.parsers.util.parseJson @@ -15,7 +15,7 @@ internal abstract class GuyaParser( context: MangaLoaderContext, source: MangaParserSource, domain: String, -) : LegacySinglePageMangaParser(context, source) { +) : SinglePageMangaParser(context, source) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt index 302c61e1..eb998153 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt @@ -4,7 +4,7 @@ import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -16,7 +16,7 @@ internal abstract class HeanCms( source: MangaParserSource, domain: String, pageSize: Int = 20, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt index 52e68e7e..174034b9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.heancmsalt import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -17,7 +17,7 @@ internal abstract class HeanCmsAlt( source: MangaParserSource, domain: String, pageSize: Int = 18, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/HotComicsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/HotComicsParser.kt index b7cbaccf..a04477d9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/HotComicsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/HotComicsParser.kt @@ -8,7 +8,7 @@ import okhttp3.Headers import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -20,7 +20,7 @@ internal abstract class HotComicsParser( source: MangaParserSource, domain: String, pageSize: Int = 24, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt index 754b69bc..ba97e751 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt @@ -4,7 +4,7 @@ import okhttp3.Headers import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -12,7 +12,7 @@ import java.util.* @MangaSourceParser("DOUJINDESU", "DoujinDesu.tv", "id") internal class DoujinDesuParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.DOUJINDESU, pageSize = 18) { + PagedMangaParser(context, MangaParserSource.DOUJINDESU, pageSize = 18) { override val configKeyDomain: ConfigKey.Domain get() = ConfigKey.Domain("doujindesu.tv") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/HentaiCrot.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/HentaiCrot.kt index 6df85b69..2ec8f563 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/HentaiCrot.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/HentaiCrot.kt @@ -3,14 +3,14 @@ package org.koitharu.kotatsu.parsers.site.id import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("HENTAICROT", "HentaiCrot", "id", ContentType.HENTAI) internal class HentaiCrot(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.HENTAICROT, 8) { + PagedMangaParser(context, MangaParserSource.HENTAICROT, 8) { override val configKeyDomain = ConfigKey.Domain("hentaicrot.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/Kumapage.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/Kumapage.kt index 1283c327..924a6db9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/Kumapage.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/Kumapage.kt @@ -6,7 +6,7 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -16,7 +16,7 @@ import java.util.* @MangaSourceParser("KUMAPAGE", "Kumapage", "id") internal class Kumapage(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.KUMAPAGE, 14) { + PagedMangaParser(context, MangaParserSource.KUMAPAGE, 14) { override val configKeyDomain: ConfigKey.Domain get() = ConfigKey.Domain("www.kumapage.com") @@ -196,4 +196,4 @@ internal class Kumapage(context: MangaLoaderContext) : } }.toSet() } -} \ No newline at end of file +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/PixHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/PixHentai.kt index 0512718f..8d3bb33b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/PixHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/PixHentai.kt @@ -3,14 +3,14 @@ package org.koitharu.kotatsu.parsers.site.id import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("PIXHENTAI", "PixHentai", "id", ContentType.HENTAI) internal class PixHentai(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.PIXHENTAI, 8) { + PagedMangaParser(context, MangaParserSource.PIXHENTAI, 8) { override val configKeyDomain = ConfigKey.Domain("pixhentai.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/Shinigami.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/Shinigami.kt index d9cfc9dd..9352a4ed 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/Shinigami.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/Shinigami.kt @@ -4,7 +4,7 @@ import okhttp3.Headers import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("SHINIGAMI", "Shinigami", "id") internal class Shinigami(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.SHINIGAMI, 24) { + PagedMangaParser(context, MangaParserSource.SHINIGAMI, 24) { override val configKeyDomain = ConfigKey.Domain("id.shinigami.asia") private val apiSuffix = "api.shngm.io/v1" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/iken/IkenParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/iken/IkenParser.kt index f9dd847a..2429e153 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/iken/IkenParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/iken/IkenParser.kt @@ -1,13 +1,12 @@ package org.koitharu.kotatsu.parsers.site.iken -import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.json.JSONObject import org.json.JSONArray import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.exception.ParseException -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -20,7 +19,7 @@ internal abstract class IkenParser( domain: String, pageSize: Int = 18, protected val useAPI: Boolean = false -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) @@ -247,4 +246,4 @@ internal abstract class IkenParser( item.getString("url") } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt index 404676f4..aebb7ded 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt @@ -4,7 +4,7 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents @@ -16,7 +16,7 @@ private const val STATUS_FINISHED = "完結" @MangaSourceParser("NICOVIDEO_SEIGA", "NicoVideo Seiga", "ja") internal class NicovideoSeigaParser(context: MangaLoaderContext) : - LegacyMangaParser(context, MangaParserSource.NICOVIDEO_SEIGA), + AbstractMangaParser(context, MangaParserSource.NICOVIDEO_SEIGA), MangaParserAuthProvider { override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("nicovideo.jp") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/KeyoappParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/KeyoappParser.kt index 13224ea0..8f4a6b76 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/KeyoappParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/KeyoappParser.kt @@ -6,7 +6,7 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -17,7 +17,7 @@ internal abstract class KeyoappParser( context: MangaLoaderContext, source: MangaParserSource, domain: String, -) : LegacySinglePageMangaParser(context, source) { +) : SinglePageMangaParser(context, source) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt index febf15ff..7f8618ff 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt @@ -8,7 +8,7 @@ import org.json.JSONObject import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -20,7 +20,7 @@ internal abstract class LikeMangaParser( source: MangaParserSource, domain: String, pageSize: Int = 36, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/LilianaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/LilianaParser.kt index 648d4144..d49584c3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/LilianaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/LilianaParser.kt @@ -6,7 +6,7 @@ import org.jsoup.Jsoup import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.getBooleanOrDefault @@ -17,7 +17,7 @@ internal abstract class LilianaParser( source: MangaParserSource, domain: String, pageSize: Int = 24, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt index 3d15b85b..88a2b0e9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt @@ -9,7 +9,7 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* @@ -23,7 +23,7 @@ internal abstract class MadaraParser( source: MangaParserSource, domain: String, pageSize: Int = 12, -) : LegacyPagedMangaParser(context, source, pageSize), MangaParserAuthProvider { +) : PagedMangaParser(context, source, pageSize), MangaParserAuthProvider { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt index 634e5e33..391cda24 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -17,7 +17,7 @@ internal abstract class MadthemeParser( source: MangaParserSource, domain: String, pageSize: Int = 48, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt index b7e3f66c..c2d2a3cd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -16,7 +16,7 @@ internal abstract class Manga18Parser( source: MangaParserSource, domain: String, pageSize: Int = 20, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt index e8eac915..3fd314b1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.PagedMangaParser +import org.koitharu.kotatsu.parsers.core.FlexiblePagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.search.MangaSearchQuery import org.koitharu.kotatsu.parsers.model.search.MangaSearchQueryCapabilities @@ -22,7 +22,7 @@ internal abstract class MangaboxParser( context: MangaLoaderContext, source: MangaParserSource, pageSize: Int = 24, -) : PagedMangaParser(context, source, pageSize) { +) : FlexiblePagedMangaParser(context, source, pageSize) { override fun onCreateConfig(keys: MutableCollection>) { super.onCreateConfig(keys) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/MangAdventureParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/MangAdventureParser.kt index f969878c..f02d37ab 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/MangAdventureParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/MangAdventureParser.kt @@ -4,7 +4,7 @@ import okhttp3.HttpUrl import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.NotFoundException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents @@ -17,7 +17,7 @@ internal abstract class MangAdventureParser( source: MangaParserSource, domain: String, pageSize: Int = 25, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt index b7a0057b..1a08faa6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt @@ -13,7 +13,7 @@ import org.json.JSONObject import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -25,7 +25,7 @@ internal abstract class MangaReaderParser( domain: String, pageSize: Int, searchPageSize: Int, -) : LegacyPagedMangaParser(context, source, pageSize, searchPageSize), Interceptor { +) : PagedMangaParser(context, source, pageSize, searchPageSize), Interceptor { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangaworld/MangaWorldParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangaworld/MangaWorldParser.kt index 79e48e1b..cb3ef47b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangaworld/MangaWorldParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangaworld/MangaWorldParser.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.mangaworld import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -14,7 +14,7 @@ internal abstract class MangaWorldParser( source: MangaParserSource, domain: String, pageSize: Int = 16, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val availableSortOrders: Set = EnumSet.of( SortOrder.POPULARITY, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt index 544f201d..5d15331e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -16,7 +16,7 @@ internal abstract class MmrcmsParser( source: MangaParserSource, domain: String, pageSize: Int = 20, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt index 375afd1c..700fe683 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt @@ -4,7 +4,7 @@ import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -17,294 +17,294 @@ import java.util.* internal abstract class NepnepParser( - context: MangaLoaderContext, - source: MangaParserSource, - domain: String, -) : LegacyMangaParser(context, source) { - - override val configKeyDomain = ConfigKey.Domain(domain) - - override val userAgentKey = ConfigKey.UserAgent(UserAgents.CHROME_DESKTOP) - - override fun onCreateConfig(keys: MutableCollection>) { - super.onCreateConfig(keys) - keys.add(userAgentKey) - } - - override val availableSortOrders: Set = - EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.POPULARITY, SortOrder.UPDATED) - - private val searchDoc = suspendLazy(soft = true) { - webClient.httpGet("https://$domain/search/").parseHtml() - } - - override val filterCapabilities: MangaListFilterCapabilities - get() = MangaListFilterCapabilities( - isMultipleTagsSupported = true, - isTagsExclusionSupported = true, - isSearchSupported = true, - ) - - override suspend fun getFilterOptions() = MangaListFilterOptions( - availableTags = fetchAvailableTags(), - availableStates = EnumSet.allOf(MangaState::class.java), - ) - - data class MangaWithLastUpdate( - val manga: Manga, - val lastUpdate: Long, - val views: String, - ) - - override suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List { - val doc = searchDoc.get() - val json = JSONArray( - doc.selectFirstOrThrow("script:containsData(MainFunction)").data() - .substringAfter("vm.Directory = ") - .substringBefore("vm.GetIntValue") - .trim() - .replace(';', ' '), - ) - val mangaWithLastUpdateList = ArrayList(json.length()) - var sort = false - - for (i in 0 until json.length()) { - val m = json.getJSONObject(i) - val href = "/manga/" + m.getString("i") - val imgUrl = "https://temp.compsci88.com/cover/" + m.getString("i") + ".jpg" - val lastUpdate = m.getLong("lt") - val views = m.getString("v") - //val viewMonth = m.getString("vm") - - when { - !filter.query.isNullOrEmpty() -> { - if (m.getString("s").contains(filter.query, ignoreCase = true) || (m.getJSONArray("al") - .length() > 0 && m.getJSONArray("al").getString(0) - .contains(filter.query, ignoreCase = true)) - ) { - mangaWithLastUpdateList.add( - MangaWithLastUpdate(addManga(href, imgUrl, m), lastUpdate, views), - ) - } - } - - else -> { - val tags = filter.tags - val tagsExcluded = filter.tagsExclude - val tagsJson = m.getJSONArray("g").toString() - - val tagsMatched = - tags.isEmpty() || tags.all { tag -> tagsJson.contains(tag.key, ignoreCase = true) } - val tagsExcludeMatched = tagsExcluded.isEmpty() || tagsExcluded.none { tag -> - tagsJson.contains( - tag.key, - ignoreCase = true, - ) - } - val statesMatched = filter.states.isEmpty() || filter.states.any { state -> - m.getString("ps").contains( - when (state) { - MangaState.ONGOING -> "Ongoing" - MangaState.FINISHED -> "Complete" - MangaState.ABANDONED -> "Cancelled" - MangaState.PAUSED -> "Hiatus" - else -> "" - }, - ignoreCase = true, - ) - } - if (tagsMatched && tagsExcludeMatched && statesMatched) { - mangaWithLastUpdateList.add( - MangaWithLastUpdate(addManga(href, imgUrl, m), lastUpdate, views), - ) - - } - sort = true - } - } - } - if (sort) { - when (order) { - SortOrder.POPULARITY -> mangaWithLastUpdateList.sortByDescending { it.views } - SortOrder.UPDATED -> mangaWithLastUpdateList.sortByDescending { it.lastUpdate } - SortOrder.ALPHABETICAL -> {} - else -> throw IllegalArgumentException("Unsupported sort order: $order") - } - } - return mangaWithLastUpdateList.map { it.manga } - .subList(offset, (offset + 30).coerceAtMost(mangaWithLastUpdateList.size)) - } - - private fun addManga(href: String, imgUrl: String, m: JSONObject): Manga { - return Manga( - id = generateUid(href), - title = m.getString("i").replace('-', ' '), - altTitles = emptySet(), - url = href, - publicUrl = href.toAbsoluteUrl(domain), - rating = RATING_UNKNOWN, - contentRating = null, - coverUrl = imgUrl, - tags = emptySet(), - state = null, - authors = emptySet(), - source = source, - ) - } - - private suspend fun fetchAvailableTags(): Set { - val doc = searchDoc.get() - val tags = doc.selectFirstOrThrow("script:containsData(vm.AvailableFilters)").data() - .substringAfter("\"Genre\"") - .substringAfter('[') - .substringBefore(']') - .replace("'", "") - .split(',') - - return tags.mapToSet { tag -> - MangaTag( - key = tag, - title = tag, - source = source, - ) - } - } - - override suspend fun getDetails(manga: Manga): Manga { - val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() - - val chapter = JSONArray( - JSONArray( - doc.selectFirstOrThrow("script:containsData(MainFunction)").data() - .substringAfter("vm.Chapters = ") - .substringBefore(';'), - ).asTypedList().reversed(), - ) - - val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:SS", sourceLocale) - val author = doc.select(".list-group-item:contains(Author(s):) a").textOrNull() - - return manga.copy( - state = when (doc.selectFirstOrThrow(".list-group-item:contains(Status:) a").text()) { - "Ongoing (Scan)", "Ongoing (Publish)", - -> MangaState.ONGOING - - "Complete (Scan)", "Complete (Publish)", - -> MangaState.FINISHED - - "Cancelled (Scan)", "Cancelled (Publish)", - "Discontinued (Scan)", "Discontinued (Publish)", - -> MangaState.ABANDONED - - "Hiatus (Scan)", "Hiatus (Publish)", - -> MangaState.PAUSED - - else -> null - }, - tags = doc.select(".list-group-item:contains(Genre(s):) a").mapToSet { a -> - MangaTag( - key = a.attr("href").substringAfterLast('='), - title = a.text().toTitleCase(sourceLocale), - source = source, - ) - }, - authors = setOfNotNull(author), - description = doc.selectFirstOrThrow(".top-5.Content").textOrNull(), - - chapters = chapter.mapJSONIndexed { i, j -> - val indexChapter = j.getString("Chapter")!! - val url = "/read-online/" + manga.url.substringAfter("/manga/") + chapterURLEncode(indexChapter) - val name = j.getStringOrNull("ChapterName").let { - if (it.isNullOrEmpty() || it == "null") "${j.getString("Type")} ${ - chapterImage( - indexChapter, - true, - ) - }" else it - } - val date = j.getStringOrNull("Date") - MangaChapter( - id = generateUid(url), - title = name, - number = i + 1f, - volume = 0, - url = url, - scanlator = null, - uploadDate = dateFormat.tryParse(date), - branch = null, - source = source, - ) - }, - ) - } - - private fun chapterURLEncode(e: String): String { - var index = "" - val t = e.substring(0, 1).toInt() - if (1 != t) { - index = "-index-$t" - } - val ei = e.toInt() - val dgt = when { - ei < 100100 -> 4 - ei < 101000 -> 3 - ei < 110000 -> 2 - else -> 1 - } - val n = e.substring(dgt, e.length - 1) - var suffix = "" - val path = e.substring(e.length - 1).toInt() - if (0 != path) { - suffix = ".$path" - } - return "-chapter-$n$suffix$index.html" - } - - private val chapterImageRegex = Regex("""^0+""") - - private fun chapterImage(e: String, cleanString: Boolean = false): String { - // cleanString will result in an empty string if chapter number is 0, hence the else if below - val a = e.substring(1, e.length - 1).let { if (cleanString) it.replace(chapterImageRegex, "") else it } - // If b is not zero, indicates chapter has decimal numbering - val b = e.substring(e.length - 1).toInt() - return when { - b == 0 && a.isNotEmpty() -> a - b == 0 && a.isEmpty() -> "0" - else -> "$a.$b" - } - } - - override suspend fun getPages(chapter: MangaChapter): List { - val fullUrl = chapter.url.toAbsoluteUrl(domain) - val doc = webClient.httpGet(fullUrl).parseHtml() - val script = doc.selectFirstOrThrow("script:containsData(MainFunction)").data() - val curChapter = JSONObject( - doc.selectFirstOrThrow("script:containsData(MainFunction)").data() - .substringAfter("vm.CurChapter = ") - .substringBefore(';'), - ) - val pageTotal = curChapter.getString("Page")!!.toInt() - val host = "https://" + script - .substringAfter("vm.CurPathName = \"", "") - .substringBefore('"') - check(host.isNotEmpty()) { - "Manga4Life is overloaded and blocking Kotatsu right now. Wait for unblock." - } - val titleURI = script.substringAfter("vm.IndexName = \"").substringBefore("\"") - val seasonURI = curChapter.getString("Directory")!!.let { if (it.isEmpty()) "" else "$it/" } - val path = "$host/manga/$titleURI/$seasonURI" - val chNum = chapterImage(curChapter.getString("Chapter")!!) - - return IntRange(1, pageTotal).mapIndexed { i, _ -> - val imageNum = (i + 1).toString().let { "000$it" }.let { it.substring(it.length - 3) } - val url = "$path$chNum-$imageNum.png" - MangaPage( - id = generateUid(url), - url = url, - preview = null, - source = source, - ) - } - } + context: MangaLoaderContext, + source: MangaParserSource, + domain: String, +) : AbstractMangaParser(context, source) { + + override val configKeyDomain = ConfigKey.Domain(domain) + + override val userAgentKey = ConfigKey.UserAgent(UserAgents.CHROME_DESKTOP) + + override fun onCreateConfig(keys: MutableCollection>) { + super.onCreateConfig(keys) + keys.add(userAgentKey) + } + + override val availableSortOrders: Set = + EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.POPULARITY, SortOrder.UPDATED) + + private val searchDoc = suspendLazy(soft = true) { + webClient.httpGet("https://$domain/search/").parseHtml() + } + + override val filterCapabilities: MangaListFilterCapabilities + get() = MangaListFilterCapabilities( + isMultipleTagsSupported = true, + isTagsExclusionSupported = true, + isSearchSupported = true, + ) + + override suspend fun getFilterOptions() = MangaListFilterOptions( + availableTags = fetchAvailableTags(), + availableStates = EnumSet.allOf(MangaState::class.java), + ) + + data class MangaWithLastUpdate( + val manga: Manga, + val lastUpdate: Long, + val views: String, + ) + + override suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List { + val doc = searchDoc.get() + val json = JSONArray( + doc.selectFirstOrThrow("script:containsData(MainFunction)").data() + .substringAfter("vm.Directory = ") + .substringBefore("vm.GetIntValue") + .trim() + .replace(';', ' '), + ) + val mangaWithLastUpdateList = ArrayList(json.length()) + var sort = false + + for (i in 0 until json.length()) { + val m = json.getJSONObject(i) + val href = "/manga/" + m.getString("i") + val imgUrl = "https://temp.compsci88.com/cover/" + m.getString("i") + ".jpg" + val lastUpdate = m.getLong("lt") + val views = m.getString("v") + //val viewMonth = m.getString("vm") + + when { + !filter.query.isNullOrEmpty() -> { + if (m.getString("s").contains(filter.query, ignoreCase = true) || (m.getJSONArray("al") + .length() > 0 && m.getJSONArray("al").getString(0) + .contains(filter.query, ignoreCase = true)) + ) { + mangaWithLastUpdateList.add( + MangaWithLastUpdate(addManga(href, imgUrl, m), lastUpdate, views), + ) + } + } + + else -> { + val tags = filter.tags + val tagsExcluded = filter.tagsExclude + val tagsJson = m.getJSONArray("g").toString() + + val tagsMatched = + tags.isEmpty() || tags.all { tag -> tagsJson.contains(tag.key, ignoreCase = true) } + val tagsExcludeMatched = tagsExcluded.isEmpty() || tagsExcluded.none { tag -> + tagsJson.contains( + tag.key, + ignoreCase = true, + ) + } + val statesMatched = filter.states.isEmpty() || filter.states.any { state -> + m.getString("ps").contains( + when (state) { + MangaState.ONGOING -> "Ongoing" + MangaState.FINISHED -> "Complete" + MangaState.ABANDONED -> "Cancelled" + MangaState.PAUSED -> "Hiatus" + else -> "" + }, + ignoreCase = true, + ) + } + if (tagsMatched && tagsExcludeMatched && statesMatched) { + mangaWithLastUpdateList.add( + MangaWithLastUpdate(addManga(href, imgUrl, m), lastUpdate, views), + ) + + } + sort = true + } + } + } + if (sort) { + when (order) { + SortOrder.POPULARITY -> mangaWithLastUpdateList.sortByDescending { it.views } + SortOrder.UPDATED -> mangaWithLastUpdateList.sortByDescending { it.lastUpdate } + SortOrder.ALPHABETICAL -> {} + else -> throw IllegalArgumentException("Unsupported sort order: $order") + } + } + return mangaWithLastUpdateList.map { it.manga } + .subList(offset, (offset + 30).coerceAtMost(mangaWithLastUpdateList.size)) + } + + private fun addManga(href: String, imgUrl: String, m: JSONObject): Manga { + return Manga( + id = generateUid(href), + title = m.getString("i").replace('-', ' '), + altTitles = emptySet(), + url = href, + publicUrl = href.toAbsoluteUrl(domain), + rating = RATING_UNKNOWN, + contentRating = null, + coverUrl = imgUrl, + tags = emptySet(), + state = null, + authors = emptySet(), + source = source, + ) + } + + private suspend fun fetchAvailableTags(): Set { + val doc = searchDoc.get() + val tags = doc.selectFirstOrThrow("script:containsData(vm.AvailableFilters)").data() + .substringAfter("\"Genre\"") + .substringAfter('[') + .substringBefore(']') + .replace("'", "") + .split(',') + + return tags.mapToSet { tag -> + MangaTag( + key = tag, + title = tag, + source = source, + ) + } + } + + override suspend fun getDetails(manga: Manga): Manga { + val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() + + val chapter = JSONArray( + JSONArray( + doc.selectFirstOrThrow("script:containsData(MainFunction)").data() + .substringAfter("vm.Chapters = ") + .substringBefore(';'), + ).asTypedList().reversed(), + ) + + val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:SS", sourceLocale) + val author = doc.select(".list-group-item:contains(Author(s):) a").textOrNull() + + return manga.copy( + state = when (doc.selectFirstOrThrow(".list-group-item:contains(Status:) a").text()) { + "Ongoing (Scan)", "Ongoing (Publish)", + -> MangaState.ONGOING + + "Complete (Scan)", "Complete (Publish)", + -> MangaState.FINISHED + + "Cancelled (Scan)", "Cancelled (Publish)", + "Discontinued (Scan)", "Discontinued (Publish)", + -> MangaState.ABANDONED + + "Hiatus (Scan)", "Hiatus (Publish)", + -> MangaState.PAUSED + + else -> null + }, + tags = doc.select(".list-group-item:contains(Genre(s):) a").mapToSet { a -> + MangaTag( + key = a.attr("href").substringAfterLast('='), + title = a.text().toTitleCase(sourceLocale), + source = source, + ) + }, + authors = setOfNotNull(author), + description = doc.selectFirstOrThrow(".top-5.Content").textOrNull(), + + chapters = chapter.mapJSONIndexed { i, j -> + val indexChapter = j.getString("Chapter")!! + val url = "/read-online/" + manga.url.substringAfter("/manga/") + chapterURLEncode(indexChapter) + val name = j.getStringOrNull("ChapterName").let { + if (it.isNullOrEmpty() || it == "null") "${j.getString("Type")} ${ + chapterImage( + indexChapter, + true, + ) + }" else it + } + val date = j.getStringOrNull("Date") + MangaChapter( + id = generateUid(url), + title = name, + number = i + 1f, + volume = 0, + url = url, + scanlator = null, + uploadDate = dateFormat.tryParse(date), + branch = null, + source = source, + ) + }, + ) + } + + private fun chapterURLEncode(e: String): String { + var index = "" + val t = e.substring(0, 1).toInt() + if (1 != t) { + index = "-index-$t" + } + val ei = e.toInt() + val dgt = when { + ei < 100100 -> 4 + ei < 101000 -> 3 + ei < 110000 -> 2 + else -> 1 + } + val n = e.substring(dgt, e.length - 1) + var suffix = "" + val path = e.substring(e.length - 1).toInt() + if (0 != path) { + suffix = ".$path" + } + return "-chapter-$n$suffix$index.html" + } + + private val chapterImageRegex = Regex("""^0+""") + + private fun chapterImage(e: String, cleanString: Boolean = false): String { + // cleanString will result in an empty string if chapter number is 0, hence the else if below + val a = e.substring(1, e.length - 1).let { if (cleanString) it.replace(chapterImageRegex, "") else it } + // If b is not zero, indicates chapter has decimal numbering + val b = e.substring(e.length - 1).toInt() + return when { + b == 0 && a.isNotEmpty() -> a + b == 0 && a.isEmpty() -> "0" + else -> "$a.$b" + } + } + + override suspend fun getPages(chapter: MangaChapter): List { + val fullUrl = chapter.url.toAbsoluteUrl(domain) + val doc = webClient.httpGet(fullUrl).parseHtml() + val script = doc.selectFirstOrThrow("script:containsData(MainFunction)").data() + val curChapter = JSONObject( + doc.selectFirstOrThrow("script:containsData(MainFunction)").data() + .substringAfter("vm.CurChapter = ") + .substringBefore(';'), + ) + val pageTotal = curChapter.getString("Page")!!.toInt() + val host = "https://" + script + .substringAfter("vm.CurPathName = \"", "") + .substringBefore('"') + check(host.isNotEmpty()) { + "Manga4Life is overloaded and blocking Kotatsu right now. Wait for unblock." + } + val titleURI = script.substringAfter("vm.IndexName = \"").substringBefore("\"") + val seasonURI = curChapter.getString("Directory")!!.let { if (it.isEmpty()) "" else "$it/" } + val path = "$host/manga/$titleURI/$seasonURI" + val chNum = chapterImage(curChapter.getString("Chapter")!!) + + return IntRange(1, pageTotal).mapIndexed { i, _ -> + val imageNum = (i + 1).toString().let { "000$it" }.let { it.substring(it.length - 3) } + val url = "$path$chNum-$imageNum.png" + MangaPage( + id = generateUid(url), + url = url, + preview = null, + source = source, + ) + } + } } 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 index 8644d991..3752c0a3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/OneMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/OneMangaParser.kt @@ -2,7 +2,7 @@ package org.koitharu.kotatsu.parsers.site.onemanga import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -11,7 +11,7 @@ internal abstract class OneMangaParser( context: MangaLoaderContext, source: MangaParserSource, domain: String, -) : LegacySinglePageMangaParser(context, source) { +) : SinglePageMangaParser(context, source) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt index 8eb8ed33..9ffcdfc0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt @@ -4,7 +4,7 @@ import kotlinx.coroutines.coroutineScope import okhttp3.HttpUrl.Companion.toHttpUrl import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -16,7 +16,7 @@ internal abstract class OtakuSanctuaryParser( source: MangaParserSource, domain: String, pageSize: Int = 32, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pizzareader/PizzaReaderParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pizzareader/PizzaReaderParser.kt index 36b50225..4afecbb4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pizzareader/PizzaReaderParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pizzareader/PizzaReaderParser.kt @@ -5,7 +5,7 @@ import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -19,7 +19,7 @@ internal abstract class PizzaReaderParser( context: MangaLoaderContext, source: MangaParserSource, domain: String, -) : LegacySinglePageMangaParser(context, source) { +) : SinglePageMangaParser(context, source) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt index 31f11f29..4919d479 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt @@ -4,7 +4,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -12,7 +12,7 @@ import java.util.* @Broken @MangaSourceParser("BRMANGAS", "BrMangas", "pt") -internal class BrMangas(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.BRMANGAS, 25) { +internal class BrMangas(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.BRMANGAS, 25) { override val configKeyDomain = ConfigKey.Domain("www.brmangas.net") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt index 96d4225d..7b593424 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt @@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -13,7 +13,7 @@ import java.util.* @Broken @MangaSourceParser("LERMANGA", "LerManga", "pt") -internal class LerManga(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.LERMANGA, 24) { +internal class LerManga(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.LERMANGA, 24) { override val configKeyDomain = ConfigKey.Domain("lermanga.org") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt index 0b05b630..f01fe8fc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt @@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -14,7 +14,7 @@ import java.util.* @Broken @MangaSourceParser("LERMANGAONLINE", "LerMangaOnline", "pt") internal class LerMangaOnline(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.LERMANGAONLINE, 20) { + PagedMangaParser(context, MangaParserSource.LERMANGAONLINE, 20) { override val configKeyDomain = ConfigKey.Domain("lermangaonline.com.br") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LuratoonScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LuratoonScansParser.kt index b5eabf0b..630ddcf0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LuratoonScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LuratoonScansParser.kt @@ -11,7 +11,7 @@ import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -20,143 +20,143 @@ import java.util.zip.ZipInputStream @Broken // Not dead but changed template @MangaSourceParser("RANDOMSCANS", "LuratoonScan", "pt") internal class LuratoonScansParser(context: MangaLoaderContext) : - LegacySinglePageMangaParser(context, MangaParserSource.RANDOMSCANS), - Interceptor { + SinglePageMangaParser(context, MangaParserSource.RANDOMSCANS), + Interceptor { - override val configKeyDomain = ConfigKey.Domain("luratoons.net") + override val configKeyDomain = ConfigKey.Domain("luratoons.net") - override fun getRequestHeaders(): Headers = Headers.Builder().add("User-Agent", config[userAgentKey]).build() + override fun getRequestHeaders(): Headers = Headers.Builder().add("User-Agent", config[userAgentKey]).build() - override val availableSortOrders = setOf(SortOrder.ALPHABETICAL) + override val availableSortOrders = setOf(SortOrder.ALPHABETICAL) - override val filterCapabilities: MangaListFilterCapabilities - get() = MangaListFilterCapabilities() + override val filterCapabilities: MangaListFilterCapabilities + get() = MangaListFilterCapabilities() - override suspend fun getFilterOptions() = MangaListFilterOptions() + override suspend fun getFilterOptions() = MangaListFilterOptions() - override suspend fun getList(order: SortOrder, filter: MangaListFilter): List { - require(filter.query.isNullOrEmpty()) { ErrorMessages.SEARCH_NOT_SUPPORTED } - val url = urlBuilder() - val tag = filter.tags.oneOrThrowIfMany() - if (tag == null) { - url.addPathSegment("todas-as-obras") - } else { - url.addPathSegment("pesquisar").addQueryParameter("category", tag.key) - } - val doc = webClient.httpGet(url.build()).parseHtml() - return doc.selectFirstOrThrow(".todas__as__obras").select(".comics__all__box").map { div -> - val a = div.selectFirstOrThrow("a") - val href = a.attrAsRelativeUrl("href") - Manga( - id = generateUid(href), - url = href, - publicUrl = href.toAbsoluteUrl(div.host ?: domain), - coverUrl = div.selectFirst("img")?.src().orEmpty(), - title = div.text(), - altTitles = emptySet(), - rating = RATING_UNKNOWN, - tags = emptySet(), - authors = emptySet(), - state = null, - source = source, - contentRating = null, - ) - } - } + override suspend fun getList(order: SortOrder, filter: MangaListFilter): List { + require(filter.query.isNullOrEmpty()) { ErrorMessages.SEARCH_NOT_SUPPORTED } + val url = urlBuilder() + val tag = filter.tags.oneOrThrowIfMany() + if (tag == null) { + url.addPathSegment("todas-as-obras") + } else { + url.addPathSegment("pesquisar").addQueryParameter("category", tag.key) + } + val doc = webClient.httpGet(url.build()).parseHtml() + return doc.selectFirstOrThrow(".todas__as__obras").select(".comics__all__box").map { div -> + val a = div.selectFirstOrThrow("a") + val href = a.attrAsRelativeUrl("href") + Manga( + id = generateUid(href), + url = href, + publicUrl = href.toAbsoluteUrl(div.host ?: domain), + coverUrl = div.selectFirst("img")?.src().orEmpty(), + title = div.text(), + altTitles = emptySet(), + rating = RATING_UNKNOWN, + tags = emptySet(), + authors = emptySet(), + state = null, + source = source, + contentRating = null, + ) + } + } - override suspend fun getDetails(manga: Manga): Manga { - val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml().body() - val summaryContainer = doc.selectFirstOrThrow(".sumario__container") - // 1 de Maio de 2024 às 20:15 - val dateFormat = SimpleDateFormat("dd 'de' MMM 'de' YYYY 'às' HH:mm", sourceLocale) - val author = summaryContainer.getElementsContainingOwnText("Autor(es)").firstOrNull() - ?.nextElementSibling()?.textOrNull() - return manga.copy( - title = doc.selectFirst("h1.desc__titulo__comic")?.textOrNull() ?: manga.title, - altTitles = setOfNotNull( - summaryContainer.getElementsContainingOwnText("Alternativo").firstOrNull() - ?.nextElementSibling()?.textOrNull(), - ), - tags = summaryContainer.getElementsByAttributeValueContaining("href", "?category=").mapToSet { - MangaTag( - title = it.text().toTitleCase(sourceLocale), - key = it.attr("href").substringAfterLast('='), - source = source, - ) - }, - state = when (summaryContainer.getElementsContainingOwnText("Status").firstOrNull() - ?.nextElementSibling()?.text()?.lowercase()) { - "em lançamento" -> MangaState.ONGOING - "hiato" -> MangaState.PAUSED - "finalizado" -> MangaState.FINISHED - else -> null - }, - authors = setOfNotNull(author), - largeCoverUrl = doc.selectFirst("img.sumario__img")?.attrAsAbsoluteUrlOrNull("src"), - description = summaryContainer.selectFirst(".sumario__sinopse__texto")?.html(), - chapters = doc.selectFirstOrThrow("ul.capitulos__lista") - .select("li") - .mapChapters(reversed = true) { _, li -> - val href = li.parent()?.attrAsRelativeUrlOrNull("href") ?: return@mapChapters null - val span = li.selectFirstOrThrow(".numero__capitulo") - MangaChapter( - id = generateUid(href), - title = span.text(), - number = 0.0f, - volume = 0, - url = href, - scanlator = null, - uploadDate = dateFormat.tryParse(span.nextElementSibling()?.text()), - branch = null, - source = source, - ) - }, - ) - } + override suspend fun getDetails(manga: Manga): Manga { + val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml().body() + val summaryContainer = doc.selectFirstOrThrow(".sumario__container") + // 1 de Maio de 2024 às 20:15 + val dateFormat = SimpleDateFormat("dd 'de' MMM 'de' YYYY 'às' HH:mm", sourceLocale) + val author = summaryContainer.getElementsContainingOwnText("Autor(es)").firstOrNull() + ?.nextElementSibling()?.textOrNull() + return manga.copy( + title = doc.selectFirst("h1.desc__titulo__comic")?.textOrNull() ?: manga.title, + altTitles = setOfNotNull( + summaryContainer.getElementsContainingOwnText("Alternativo").firstOrNull() + ?.nextElementSibling()?.textOrNull(), + ), + tags = summaryContainer.getElementsByAttributeValueContaining("href", "?category=").mapToSet { + MangaTag( + title = it.text().toTitleCase(sourceLocale), + key = it.attr("href").substringAfterLast('='), + source = source, + ) + }, + state = when (summaryContainer.getElementsContainingOwnText("Status").firstOrNull() + ?.nextElementSibling()?.text()?.lowercase()) { + "em lançamento" -> MangaState.ONGOING + "hiato" -> MangaState.PAUSED + "finalizado" -> MangaState.FINISHED + else -> null + }, + authors = setOfNotNull(author), + largeCoverUrl = doc.selectFirst("img.sumario__img")?.attrAsAbsoluteUrlOrNull("src"), + description = summaryContainer.selectFirst(".sumario__sinopse__texto")?.html(), + chapters = doc.selectFirstOrThrow("ul.capitulos__lista") + .select("li") + .mapChapters(reversed = true) { _, li -> + val href = li.parent()?.attrAsRelativeUrlOrNull("href") ?: return@mapChapters null + val span = li.selectFirstOrThrow(".numero__capitulo") + MangaChapter( + id = generateUid(href), + title = span.text(), + number = 0.0f, + volume = 0, + url = href, + scanlator = null, + uploadDate = dateFormat.tryParse(span.nextElementSibling()?.text()), + branch = null, + source = source, + ) + }, + ) + } - override suspend fun getPages(chapter: MangaChapter): List { - val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() - val regex = Regex("const\\s+urls\\s*=\\s*(\\[.*])") - val urls = doc.select("script").firstNotNullOf { - regex.find(it.data())?.groupValues?.getOrNull(1) - } - val ja = JSONArray(urls) - return (0 until ja.length()).map { i -> - val url = ja.getString(i) - MangaPage( - id = generateUid(url), - url = url, - preview = null, - source = source, - ) - } - } + override suspend fun getPages(chapter: MangaChapter): List { + val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() + val regex = Regex("const\\s+urls\\s*=\\s*(\\[.*])") + val urls = doc.select("script").firstNotNullOf { + regex.find(it.data())?.groupValues?.getOrNull(1) + } + val ja = JSONArray(urls) + return (0 until ja.length()).map { i -> + val url = ja.getString(i) + MangaPage( + id = generateUid(url), + url = url, + preview = null, + source = source, + ) + } + } - override fun intercept(chain: Interceptor.Chain): Response { - val response = chain.proceed(chain.request()) - if (response.mimeType == "application/octet-stream") { - val (bytes, name) = response.use { resp -> - ZipInputStream(resp.requireBody().byteStream()).use { - val entry = it.nextEntry - it.readBytes() to entry?.name - } - } - val type = if (name?.endsWith(".avif", ignoreCase = true) == true) { - "image/avif" - } else { - "image/*" - }.toMediaTypeOrNull() - return response.newBuilder() - .setHeader("Content-Type", type?.toString()) - .body(bytes.toResponseBody(type)) - .build() - } else { - return response - } - } + override fun intercept(chain: Interceptor.Chain): Response { + val response = chain.proceed(chain.request()) + if (response.mimeType == "application/octet-stream") { + val (bytes, name) = response.use { resp -> + ZipInputStream(resp.requireBody().byteStream()).use { + val entry = it.nextEntry + it.readBytes() to entry?.name + } + } + val type = if (name?.endsWith(".avif", ignoreCase = true) == true) { + "image/avif" + } else { + "image/*" + }.toMediaTypeOrNull() + return response.newBuilder() + .setHeader("Content-Type", type?.toString()) + .body(bytes.toResponseBody(type)) + .build() + } else { + return response + } + } - override fun onCreateConfig(keys: MutableCollection>) { - super.onCreateConfig(keys) - keys.add(userAgentKey) - } + override fun onCreateConfig(keys: MutableCollection>) { + super.onCreateConfig(keys) + keys.add(userAgentKey) + } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt index d827a6dc..3f7df8ad 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.pt import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -11,7 +11,7 @@ import java.util.* @MangaSourceParser("MANGAONLINE", "MangaOnline.biz", "pt") internal class MangaOnline(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANGAONLINE, 20) { + PagedMangaParser(context, MangaParserSource.MANGAONLINE, 20) { override val configKeyDomain = ConfigKey.Domain("mangaonline.biz") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MuitoHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MuitoHentai.kt index d05ab250..a846a14f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MuitoHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MuitoHentai.kt @@ -3,14 +3,14 @@ package org.koitharu.kotatsu.parsers.site.pt import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("MUITOHENTAI", "MuitoHentai", "pt", ContentType.HENTAI) internal class MuitoHentai(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MUITOHENTAI, 24) { + PagedMangaParser(context, MangaParserSource.MUITOHENTAI, 24) { override val configKeyDomain = ConfigKey.Domain("www.muitohentai.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/OnePieceEx.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/OnePieceEx.kt index 61515a69..e1c81f7d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/OnePieceEx.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/OnePieceEx.kt @@ -4,7 +4,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -12,7 +12,7 @@ import java.util.* @Broken @MangaSourceParser("ONEPIECEEX", "OnePieceEx", "pt") internal class OnePieceEx(context: MangaLoaderContext) : - LegacySinglePageMangaParser(context, MangaParserSource.ONEPIECEEX) { + SinglePageMangaParser(context, MangaParserSource.ONEPIECEEX) { override val configKeyDomain = ConfigKey.Domain("onepieceex.net") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt index 0ec00ba5..4a28fd1d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt @@ -4,7 +4,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.getStringOrNull @@ -15,7 +15,7 @@ import java.util.* @MangaSourceParser("YUGENMANGAS", "YugenApp", "pt") internal class YugenMangas(context: MangaLoaderContext) : - LegacySinglePageMangaParser(context, MangaParserSource.YUGENMANGAS) { + SinglePageMangaParser(context, MangaParserSource.YUGENMANGAS) { override val configKeyDomain = ConfigKey.Domain("yugenmangasbr.voblog.xyz") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/AComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/AComics.kt index 9de1bad4..e61fc299 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/AComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/AComics.kt @@ -7,14 +7,14 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("ACOMICS", "AComics", "ru", ContentType.COMICS) internal class AComics(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.ACOMICS, pageSize = 10) { + PagedMangaParser(context, MangaParserSource.ACOMICS, pageSize = 10) { override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/ComXParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/ComXParser.kt index 4b421f68..db5fa596 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/ComXParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/ComXParser.kt @@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -19,7 +19,7 @@ import java.util.* @MangaSourceParser("COMX", "Com-X", "ru", ContentType.COMICS) internal class ComXParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.COMX, 20) { + PagedMangaParser(context, MangaParserSource.COMX, 20) { override val configKeyDomain = ConfigKey.Domain("comx.life") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/DesuMeParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/DesuMeParser.kt index 07ffc35f..834e6d65 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/DesuMeParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/DesuMeParser.kt @@ -6,7 +6,7 @@ import okhttp3.HttpUrl import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents @@ -18,7 +18,7 @@ import java.util.* @MangaSourceParser("DESUME", "Desu", "ru") internal class DesuMeParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.DESUME, 20) { + PagedMangaParser(context, MangaParserSource.DESUME, 20) { override val configKeyDomain = ConfigKey.Domain("desu.city", "desu.work", "desu.store", "desu.me", "desu.win") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/MangaWtfParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/MangaWtfParser.kt index 45a2c20f..d3f67be8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/MangaWtfParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/MangaWtfParser.kt @@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.InternalParsersApi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -18,7 +18,7 @@ import java.util.* @MangaSourceParser("MANGA_WTF", "MangaWtf", "ru") internal class MangaWtfParser( context: MangaLoaderContext, -) : LegacyPagedMangaParser(context, MangaParserSource.MANGA_WTF, pageSize = 20) { +) : PagedMangaParser(context, MangaParserSource.MANGA_WTF, pageSize = 20) { override val availableSortOrders: Set = EnumSet.of( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/NudeMoonParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/NudeMoonParser.kt index 89039f70..1310e8e0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/NudeMoonParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/NudeMoonParser.kt @@ -4,7 +4,7 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -14,7 +14,7 @@ import java.util.* @MangaSourceParser("NUDEMOON", "Nude-Moon", "ru", type = ContentType.HENTAI) internal class NudeMoonParser( context: MangaLoaderContext, -) : LegacyMangaParser(context, MangaParserSource.NUDEMOON), MangaParserAuthProvider { +) : AbstractMangaParser(context, MangaParserSource.NUDEMOON), MangaParserAuthProvider { override val configKeyDomain = ConfigKey.Domain( "b.nude-moon.fun", diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt index 5021ed51..e21044ce 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt @@ -11,7 +11,7 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ContentUnavailableException import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* @@ -29,7 +29,7 @@ private const val TOO_MANY_REQUESTS = 429 @MangaSourceParser("REMANGA", "Реманга", "ru") internal class RemangaParser( context: MangaLoaderContext, -) : LegacyPagedMangaParser(context, MangaParserSource.REMANGA, PAGE_SIZE), MangaParserAuthProvider, Interceptor { +) : PagedMangaParser(context, MangaParserSource.REMANGA, PAGE_SIZE), MangaParserAuthProvider, Interceptor { private val baseHeaders: Headers get() = Headers.Builder() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/WaMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/WaMangaParser.kt index e735ca87..d742a584 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/WaMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/WaMangaParser.kt @@ -4,7 +4,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -14,7 +14,7 @@ import java.util.* @MangaSourceParser("WAMANGA", "WaManga", "ru", type = ContentType.MANGA) internal class WaMangaParser( context: MangaLoaderContext, -) : LegacySinglePageMangaParser(context, MangaParserSource.WAMANGA) { +) : SinglePageMangaParser(context, MangaParserSource.WAMANGA) { override val configKeyDomain = ConfigKey.Domain("wamanga.me") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt index 456f2163..b4a38a3e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt @@ -19,7 +19,7 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* @@ -43,7 +43,7 @@ internal abstract class GroupleParser( context: MangaLoaderContext, source: MangaParserSource, private val siteId: Int, -) : LegacyMangaParser(context, source), MangaParserAuthProvider, Interceptor { +) : AbstractMangaParser(context, source), MangaParserAuthProvider, Interceptor { @Volatile private var cachedPagesServer: String? = null diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt index 74e2aac2..4f3003dc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt @@ -6,7 +6,7 @@ import org.jsoup.internal.StringUtil import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -16,7 +16,7 @@ import java.util.* internal abstract class ChanParser( context: MangaLoaderContext, source: MangaParserSource, -) : LegacyMangaParser(context, source), MangaParserAuthProvider { +) : AbstractMangaParser(context, source), MangaParserAuthProvider { override val availableSortOrders: Set = EnumSet.of( SortOrder.NEWEST, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt index d402e3c6..b2999e9b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt @@ -12,7 +12,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents @@ -27,7 +27,7 @@ internal abstract class LibSocialParser( source: MangaParserSource, protected val siteId: Int, siteDomains: Array, -) : LegacyPagedMangaParser(context, source, pageSize = 60), MangaParserAuthProvider { +) : PagedMangaParser(context, source, pageSize = 60), MangaParserAuthProvider { protected val apiHost = "api.cdnlibs.org" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt index 7eec3ae1..2e984f06 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt @@ -6,7 +6,7 @@ import kotlinx.coroutines.sync.withLock import org.jsoup.Jsoup import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.unescapeJson @@ -18,7 +18,7 @@ internal abstract class ScanParser( source: MangaParserSource, domain: String, pageSize: Int = 0, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt index deef1772..a0d65ce1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt @@ -4,7 +4,7 @@ import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -14,7 +14,7 @@ internal abstract class SinmhParser( source: MangaParserSource, domain: String, pageSize: Int = 36, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/ElderManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/ElderManga.kt index dc53d211..fb1e8101 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/ElderManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/ElderManga.kt @@ -4,7 +4,7 @@ import org.json.JSONArray import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("ELDERMANGA", "Elder Manga", "tr") internal class ElderManga(context: MangaLoaderContext): - LegacyPagedMangaParser(context, MangaParserSource.ELDERMANGA, 25) { + PagedMangaParser(context, MangaParserSource.ELDERMANGA, 25) { override val configKeyDomain = ConfigKey.Domain("eldermanga.com") private val cdnSuffix = "cdn1.$domain" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt index 5b4d3534..19ace2b6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt @@ -7,14 +7,14 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.* @MangaSourceParser("MANGAAY", "MangaAy", "tr") -internal class MangaAy(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.MANGAAY, 45) { +internal class MangaAy(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.MANGAAY, 45) { override val configKeyDomain = ConfigKey.Domain("manga-ay.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt index f3b1b91c..d30ed5fa 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.tr import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -11,7 +11,7 @@ import java.util.* @MangaSourceParser("SADSCANS", "SadScans", "tr") internal class SadScans(context: MangaLoaderContext) : - LegacySinglePageMangaParser(context, MangaParserSource.SADSCANS) { + SinglePageMangaParser(context, MangaParserSource.SADSCANS) { override val configKeyDomain = ConfigKey.Domain("sadscans.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TenshiManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TenshiManga.kt index c65eae79..be2fa7ed 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TenshiManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TenshiManga.kt @@ -4,7 +4,7 @@ import org.json.JSONArray import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("TENSHIMANGA", "Tenshi Manga", "tr") internal class TenshiManga(context: MangaLoaderContext): - LegacyPagedMangaParser(context, MangaParserSource.TENSHIMANGA, 25) { + PagedMangaParser(context, MangaParserSource.TENSHIMANGA, 25) { override val configKeyDomain = ConfigKey.Domain("tenshimanga.com") private val cdnSuffix = "cdn1.$domain" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt index 35982be1..32814e6e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt @@ -4,7 +4,7 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("TRWEBTOON", "TrWebtoon", "tr") internal class TrWebtoon(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.TRWEBTOON, pageSize = 21) { + PagedMangaParser(context, MangaParserSource.TRWEBTOON, pageSize = 21) { override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("trwebtoon.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/UzayManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/UzayManga.kt index c6af7c3d..8ab5a7d4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/UzayManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/UzayManga.kt @@ -4,7 +4,7 @@ import org.json.JSONArray import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("UZAYMANGA", "Uzay Manga", "tr") internal class UzayManga(context: MangaLoaderContext): - LegacyPagedMangaParser(context, MangaParserSource.UZAYMANGA, 25) { + PagedMangaParser(context, MangaParserSource.UZAYMANGA, 25) { override val configKeyDomain = ConfigKey.Domain("uzaymanga.com") private val cdnSuffix = "cdn1.$domain" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HentaiUkrParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HentaiUkrParser.kt index b5a9a515..38e5ea9a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HentaiUkrParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HentaiUkrParser.kt @@ -10,7 +10,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -25,174 +25,174 @@ private const val PAGE_SIZE = 60 // NOTE High profile focus @MangaSourceParser("HENTAIUKR", "HentaiUkr", "uk", ContentType.HENTAI) -internal class HentaiUkrParser(context: MangaLoaderContext) : LegacyMangaParser(context, MangaParserSource.HENTAIUKR), - Interceptor { - - private val date = SimpleDateFormat("yyyy-MM-dd", Locale.US) - - private val allManga = suspendLazy(soft = true) { - runCatchingCancellable { - webClient.httpGet("https://$domain/search/objects.json").parseJson() - }.recoverCatchingCancellable { - webClient.httpGet("https://$domain/search/objects2.json").parseJson() - }.recoverCatchingCancellable { - webClient.httpGet("https://$domain/search/objects69.json").parseJson() - }.getOrThrow().getJSONArray("manga").asTypedList() - } - - override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("hentaiukr.com") - - override val filterCapabilities: MangaListFilterCapabilities - get() = MangaListFilterCapabilities( - isMultipleTagsSupported = true, - isSearchSupported = true, - isSearchWithFiltersSupported = true, - ) - - override suspend fun getFilterOptions() = MangaListFilterOptions( - availableTags = fetchAvailableTags(), - ) - - override fun onCreateConfig(keys: MutableCollection>) { - super.onCreateConfig(keys) - keys.add(userAgentKey) - } - - override val availableSortOrders: Set = EnumSet.of( - SortOrder.NEWEST, - ) - - override suspend fun getDetails(manga: Manga): Manga = coroutineScope { - val jsonDeferred = async { allManga.get().first { it.getString("url") == manga.url } } - val htmlDeferred = async { webClient.httpGet("https://$domain${manga.url}").parseHtml() } - - val about = htmlDeferred.await().body().requireElementById("about").text() - - manga.copy( - description = about, - chapters = listOf( - MangaChapter( - id = generateUid(manga.id), - title = manga.title, - number = 1f, - volume = 0, - url = manga.url, - scanlator = null, - uploadDate = date.tryParse(jsonDeferred.await().getString("add_date")), - branch = null, - source = source, - ), - ), - ) - } - - override suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List { - // Get all manga - val json = allManga.get().toMutableList() - - if (!filter.query.isNullOrEmpty()) { - json.retainAll { item -> - item.getString("name").contains(filter.query, ignoreCase = true) || - item.getStringOrNull("eng_name")?.contains(filter.query, ignoreCase = true) == true || - item.getStringOrNull("orig_name")?.contains(filter.query, ignoreCase = true) == true || - item.getStringOrNull("author")?.contains(filter.query, ignoreCase = true) == true || - item.getStringOrNull("team")?.contains(filter.query, ignoreCase = true) == true - } - } - if (filter.tags.isNotEmpty()) { - val ids = filter.tags.mapToSet { it.key } - json.retainAll { item -> - item.getJSONArray("tags") - .mapJSON { it.getAsString() } - .any { x -> x in ids } - } - } - // Return to app - return json.drop(offset).take(PAGE_SIZE).map { jo -> - val id = jo.getAsLong() - val author = jo.getStringOrNull("author") - Manga( - id = generateUid(id), - title = jo.getString("name"), - altTitles = setOfNotNull(jo.getStringOrNull("eng_name")), - url = jo.getString("url"), - publicUrl = jo.getString("url").toAbsoluteUrl(domain), - rating = RATING_UNKNOWN, - contentRating = ContentRating.ADULT, - coverUrl = jo.getString("thumb").toAbsoluteUrl(domain), - tags = getTags(jo.optJSONArray("tags")), - state = null, - authors = setOfNotNull(author), - largeCoverUrl = null, - description = null, - chapters = null, - source = source, - ) - } - } - - override suspend fun getPages(chapter: MangaChapter): List { - val htmlPages = webClient.httpGet("https://$domain${chapter.url}vertical_reader.html").parseHtml() - return htmlPages.select("img.image").mapIndexed { i, page -> - MangaPage( - id = generateUid(i.toString()), - "https://$domain${page.attr("src")}", - null, - source, - ) - } - } - - private suspend fun fetchAvailableTags(): Set { - return allManga.get().flatMapTo(HashSet()) { x -> - x.getJSONArray("tags").mapJSON { t -> - MangaTag( - title = t.getString("name"), - key = t.getAsString(), - source = source, - ) - } - } - } - - private fun getTags(jsonTags: JSONArray): Set { - val tagsSet = ArraySet(jsonTags.length()) - repeat(jsonTags.length()) { i -> - val item = jsonTags.getJSONObject(i) - tagsSet.add( - MangaTag( - title = item.getString("name"), - key = item.getAsString(), - source = source, - ), - ) - } - return tagsSet - } - - // Need for disable encoding (with encoding not working) - override fun intercept(chain: Interceptor.Chain): Response { - val request = chain.request() - val newRequest = if (request.header(HEADER_ENCODING) != null) { - request.newBuilder().removeHeader(HEADER_ENCODING).build() - } else { - request - } - return chain.proceed(newRequest) - } - - private fun JSONObject.getAsLong(): Long { - val rawValue = opt("id") - return when (rawValue) { - null, JSONObject.NULL -> null - is Long -> rawValue - is Number -> rawValue.toLong() - is String -> rawValue.toLong() - else -> null - } ?: error("Cannot read value $rawValue as Long") - } - - private fun JSONObject.getAsString(): String { - return get("id").toString() - } +internal class HentaiUkrParser(context: MangaLoaderContext) : AbstractMangaParser(context, MangaParserSource.HENTAIUKR), + Interceptor { + + private val date = SimpleDateFormat("yyyy-MM-dd", Locale.US) + + private val allManga = suspendLazy(soft = true) { + runCatchingCancellable { + webClient.httpGet("https://$domain/search/objects.json").parseJson() + }.recoverCatchingCancellable { + webClient.httpGet("https://$domain/search/objects2.json").parseJson() + }.recoverCatchingCancellable { + webClient.httpGet("https://$domain/search/objects69.json").parseJson() + }.getOrThrow().getJSONArray("manga").asTypedList() + } + + override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("hentaiukr.com") + + override val filterCapabilities: MangaListFilterCapabilities + get() = MangaListFilterCapabilities( + isMultipleTagsSupported = true, + isSearchSupported = true, + isSearchWithFiltersSupported = true, + ) + + override suspend fun getFilterOptions() = MangaListFilterOptions( + availableTags = fetchAvailableTags(), + ) + + override fun onCreateConfig(keys: MutableCollection>) { + super.onCreateConfig(keys) + keys.add(userAgentKey) + } + + override val availableSortOrders: Set = EnumSet.of( + SortOrder.NEWEST, + ) + + override suspend fun getDetails(manga: Manga): Manga = coroutineScope { + val jsonDeferred = async { allManga.get().first { it.getString("url") == manga.url } } + val htmlDeferred = async { webClient.httpGet("https://$domain${manga.url}").parseHtml() } + + val about = htmlDeferred.await().body().requireElementById("about").text() + + manga.copy( + description = about, + chapters = listOf( + MangaChapter( + id = generateUid(manga.id), + title = manga.title, + number = 1f, + volume = 0, + url = manga.url, + scanlator = null, + uploadDate = date.tryParse(jsonDeferred.await().getString("add_date")), + branch = null, + source = source, + ), + ), + ) + } + + override suspend fun getList(offset: Int, order: SortOrder, filter: MangaListFilter): List { + // Get all manga + val json = allManga.get().toMutableList() + + if (!filter.query.isNullOrEmpty()) { + json.retainAll { item -> + item.getString("name").contains(filter.query, ignoreCase = true) || + item.getStringOrNull("eng_name")?.contains(filter.query, ignoreCase = true) == true || + item.getStringOrNull("orig_name")?.contains(filter.query, ignoreCase = true) == true || + item.getStringOrNull("author")?.contains(filter.query, ignoreCase = true) == true || + item.getStringOrNull("team")?.contains(filter.query, ignoreCase = true) == true + } + } + if (filter.tags.isNotEmpty()) { + val ids = filter.tags.mapToSet { it.key } + json.retainAll { item -> + item.getJSONArray("tags") + .mapJSON { it.getAsString() } + .any { x -> x in ids } + } + } + // Return to app + return json.drop(offset).take(PAGE_SIZE).map { jo -> + val id = jo.getAsLong() + val author = jo.getStringOrNull("author") + Manga( + id = generateUid(id), + title = jo.getString("name"), + altTitles = setOfNotNull(jo.getStringOrNull("eng_name")), + url = jo.getString("url"), + publicUrl = jo.getString("url").toAbsoluteUrl(domain), + rating = RATING_UNKNOWN, + contentRating = ContentRating.ADULT, + coverUrl = jo.getString("thumb").toAbsoluteUrl(domain), + tags = getTags(jo.optJSONArray("tags")), + state = null, + authors = setOfNotNull(author), + largeCoverUrl = null, + description = null, + chapters = null, + source = source, + ) + } + } + + override suspend fun getPages(chapter: MangaChapter): List { + val htmlPages = webClient.httpGet("https://$domain${chapter.url}vertical_reader.html").parseHtml() + return htmlPages.select("img.image").mapIndexed { i, page -> + MangaPage( + id = generateUid(i.toString()), + "https://$domain${page.attr("src")}", + null, + source, + ) + } + } + + private suspend fun fetchAvailableTags(): Set { + return allManga.get().flatMapTo(HashSet()) { x -> + x.getJSONArray("tags").mapJSON { t -> + MangaTag( + title = t.getString("name"), + key = t.getAsString(), + source = source, + ) + } + } + } + + private fun getTags(jsonTags: JSONArray): Set { + val tagsSet = ArraySet(jsonTags.length()) + repeat(jsonTags.length()) { i -> + val item = jsonTags.getJSONObject(i) + tagsSet.add( + MangaTag( + title = item.getString("name"), + key = item.getAsString(), + source = source, + ), + ) + } + return tagsSet + } + + // Need for disable encoding (with encoding not working) + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val newRequest = if (request.header(HEADER_ENCODING) != null) { + request.newBuilder().removeHeader(HEADER_ENCODING).build() + } else { + request + } + return chain.proceed(newRequest) + } + + private fun JSONObject.getAsLong(): Long { + val rawValue = opt("id") + return when (rawValue) { + null, JSONObject.NULL -> null + is Long -> rawValue + is Number -> rawValue.toLong() + is String -> rawValue.toLong() + else -> null + } ?: error("Cannot read value $rawValue as Long") + } + + private fun JSONObject.getAsString(): String { + return get("id").toString() + } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt index 4645c3c4..9571402e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt @@ -8,7 +8,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.getFloatOrDefault @@ -27,7 +27,7 @@ private const val IMAGE_BASEURL_FALLBACK = "https://hmvolumestorage.b-cdn.net/pu @MangaSourceParser("HONEYMANGA", "HoneyManga", "uk") internal class HoneyMangaParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.HONEYMANGA, PAGE_SIZE), + PagedMangaParser(context, MangaParserSource.HONEYMANGA, PAGE_SIZE), Interceptor { private val urlApi get() = "https://data.api.$domain" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/MangaInUaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/MangaInUaParser.kt index 4497bee9..fdab59f5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/MangaInUaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/MangaInUaParser.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.uk import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -12,7 +12,7 @@ import java.util.* private const val DEF_BRANCH_NAME = "Основний переклад" @MangaSourceParser("MANGAINUA", "MANGA/in/UA", "uk") -internal class MangaInUaParser(context: MangaLoaderContext) : LegacyPagedMangaParser( +internal class MangaInUaParser(context: MangaLoaderContext) : PagedMangaParser( context = context, source = MangaParserSource.MANGAINUA, pageSize = 24, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt index b90ea4fb..5932e1e9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt @@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -17,7 +17,7 @@ import java.util.* @Broken("Original site closed") @MangaSourceParser("BLOGTRUYEN", "Blog Truyện", "vi") internal class BlogTruyenParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.BLOGTRUYEN, pageSize = 20) { + PagedMangaParser(context, MangaParserSource.BLOGTRUYEN, pageSize = 20) { override val configKeyDomain: ConfigKey.Domain get() = ConfigKey.Domain("blogtruyenmoi.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenVN.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenVN.kt index c6aa80aa..a38c0f49 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenVN.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenVN.kt @@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -20,7 +20,7 @@ import java.util.* @Broken @MangaSourceParser("BLOGTRUYENVN", "BlogTruyen.vn (Unofficial)", "vi") internal class BlogTruyenVN(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.BLOGTRUYENVN, pageSize = 20) { + PagedMangaParser(context, MangaParserSource.BLOGTRUYENVN, pageSize = 20) { override val configKeyDomain: ConfigKey.Domain get() = ConfigKey.Domain("blogtruyenvn.org", "blogtruyenvn.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CMangaParser.kt index c6d6874b..53db64d0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CMangaParser.kt @@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -20,7 +20,7 @@ private const val PAGE_SIZE = 20 @MangaSourceParser("CMANGA", "CManga", "vi") internal class CMangaParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.CMANGA, PAGE_SIZE), MangaParserAuthProvider { + PagedMangaParser(context, MangaParserSource.CMANGA, PAGE_SIZE), MangaParserAuthProvider { override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("cmangax2.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CuuTruyenParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CuuTruyenParser.kt index 2ed06327..b37e0203 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CuuTruyenParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CuuTruyenParser.kt @@ -13,7 +13,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.bitmap.Bitmap import org.koitharu.kotatsu.parsers.bitmap.Rect import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -24,7 +24,7 @@ import java.util.* @MangaSourceParser("CUUTRUYEN", "Cứu Truyện", "vi") internal class CuuTruyenParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.CUUTRUYEN, 20) { + PagedMangaParser(context, MangaParserSource.CUUTRUYEN, 20) { override val userAgentKey = ConfigKey.UserAgent(UserAgents.KOTATSU) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DamCoNuong.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DamCoNuong.kt index 7fae206c..5a368da5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DamCoNuong.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DamCoNuong.kt @@ -5,7 +5,7 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -16,7 +16,7 @@ import java.util.* @MangaSourceParser("DAMCONUONG", "Dâm Cô Nương", "vi", type = ContentType.HENTAI) internal class DamCoNuong(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.DAMCONUONG, 30) { + PagedMangaParser(context, MangaParserSource.DAMCONUONG, 30) { override val configKeyDomain = ConfigKey.Domain("damconuong.cam") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DuaLeoTruyen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DuaLeoTruyen.kt index 18056181..40c2a606 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DuaLeoTruyen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DuaLeoTruyen.kt @@ -4,7 +4,7 @@ import okhttp3.internal.closeQuietly import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("DUALEOTRUYEN", "Dưa Leo Truyện", "vi", type = ContentType.HENTAI) internal class DuaLeoTruyen(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.DUALEOTRUYEN, 60) { + PagedMangaParser(context, MangaParserSource.DUALEOTRUYEN, 60) { override val configKeyDomain: ConfigKey.Domain get() = ConfigKey.Domain("dualeotruyenp.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/GocTruyenTranh.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/GocTruyenTranh.kt index 9a777af0..03de14d9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/GocTruyenTranh.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/GocTruyenTranh.kt @@ -4,7 +4,7 @@ import androidx.collection.arraySetOf import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("GOCTRUYENTRANH", "Góc Truyện Tranh", "vi") internal class GocTruyenTranh(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.GOCTRUYENTRANH, 30) { + PagedMangaParser(context, MangaParserSource.GOCTRUYENTRANH, 30) { override val configKeyDomain = ConfigKey.Domain("goctruyentranh.net") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HangTruyen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HangTruyen.kt index ca279012..7751360f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HangTruyen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HangTruyen.kt @@ -4,7 +4,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -12,7 +12,7 @@ import java.text.SimpleDateFormat import java.util.* @MangaSourceParser("HANGTRUYEN", "Hang Truyện", "vi") -internal class HangTruyen(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.HANGTRUYEN, 10) { +internal class HangTruyen(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.HANGTRUYEN, 10) { override val configKeyDomain = ConfigKey.Domain("hangtruyen.org") @@ -194,4 +194,4 @@ internal class HangTruyen(context: MangaLoaderContext) : LegacyPagedMangaParser( ) } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Hentai18VN.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Hentai18VN.kt index 9b860881..61ee8e34 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Hentai18VN.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Hentai18VN.kt @@ -6,7 +6,7 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -14,7 +14,7 @@ import java.util.* @MangaSourceParser("HENTAI18VN", "Hentai18VN", "vi", type = ContentType.HENTAI) internal class Hentai18VN(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.HENTAI18VN, 30) { + PagedMangaParser(context, MangaParserSource.HENTAI18VN, 30) { override val configKeyDomain = ConfigKey.Domain("hentai18vn.top") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt index 30f8a2d8..657af36d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt @@ -10,7 +10,7 @@ import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -21,7 +21,7 @@ private const val SEARCH_PAGE_SIZE = 10 @Broken @MangaSourceParser("HENTAIVN", "HentaiVN", "vi", type = ContentType.HENTAI) -internal class HentaiVNParser(context: MangaLoaderContext) : LegacyMangaParser(context, MangaParserSource.HENTAIVN) { +internal class HentaiVNParser(context: MangaLoaderContext) : AbstractMangaParser(context, MangaParserSource.HENTAIVN) { override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("hentaihvn.tv") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVnBuzz.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVnBuzz.kt index 7a016fcb..6d50d37e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVnBuzz.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVnBuzz.kt @@ -3,14 +3,14 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("HENTAIVNBUZZ", "HentaiVn.buzz", "vi", type = ContentType.HENTAI) internal class HentaiVnBuzz(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.HENTAIVNBUZZ, 60) { + PagedMangaParser(context, MangaParserSource.HENTAIVNBUZZ, 60) { override val configKeyDomain = ConfigKey.Domain("hentaivn.beer") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/KuroNeko.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/KuroNeko.kt index 01549dd0..59e2fa34 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/KuroNeko.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/KuroNeko.kt @@ -3,13 +3,13 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @MangaSourceParser("KURONEKO", "Việt Hentai - Kuro Neko", "vi", type = ContentType.HENTAI) -internal class KuroNeko(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.KURONEKO, 60) { +internal class KuroNeko(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.KURONEKO, 60) { override val configKeyDomain = ConfigKey.Domain("vi-hentai.moe") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt index 07319bf0..c734223d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt @@ -3,14 +3,14 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.* @MangaSourceParser("LXMANGA", "LXManga", "vi", type = ContentType.HENTAI) -internal class LxManga(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.LXMANGA, 60) { +internal class LxManga(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.LXMANGA, 60) { override val configKeyDomain = ConfigKey.Domain("lxmanga.blog") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/MimiHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/MimiHentai.kt index 519ef235..b1097a29 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/MimiHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/MimiHentai.kt @@ -4,7 +4,7 @@ import org.json.JSONArray import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("MIMIHENTAI", "MimiHentai", "vi", type = ContentType.HENTAI) internal class MimiHentai(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MIMIHENTAI, 18) { + PagedMangaParser(context, MangaParserSource.MIMIHENTAI, 18) { private val apiSuffix = "api/v1/manga" override val configKeyDomain = ConfigKey.Domain("mimihentai.com", "hentaihvn.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/NhentaiWorld.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/NhentaiWorld.kt index 378c33e9..daa8809c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/NhentaiWorld.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/NhentaiWorld.kt @@ -6,7 +6,7 @@ import org.json.JSONArray import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -16,7 +16,7 @@ import java.util.* @MangaSourceParser("NHENTAIWORLD", "Nhentai World", "vi", ContentType.HENTAI) internal class NhentaiWorld(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.NHENTAIWORLD, 24) { + PagedMangaParser(context, MangaParserSource.NHENTAIWORLD, 24) { override val configKeyDomain = ConfigKey.Domain("nhentaiworld-h1.art") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/SayHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/SayHentai.kt index f24b3764..6adede32 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/SayHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/SayHentai.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -11,7 +11,7 @@ import java.util.* @MangaSourceParser("SAYHENTAI", "SayHentai", "vi", ContentType.HENTAI) internal class SayHentai(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.SAYHENTAI, 20) { + PagedMangaParser(context, MangaParserSource.SAYHENTAI, 20) { override val configKeyDomain = ConfigKey.Domain("sayhentaii.art") override fun onCreateConfig(keys: MutableCollection>) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenGG.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenGG.kt index 5fad821e..2af87ba6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenGG.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenGG.kt @@ -3,14 +3,14 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.* @MangaSourceParser("TRUYENGG", "FoxTruyen", "vi") -internal class TruyenGG(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.TRUYENGG, 42) { +internal class TruyenGG(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.TRUYENGG, 42) { override val configKeyDomain = ConfigKey.Domain("foxtruyen.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentai18.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentai18.kt index f6914ce0..7987bb3a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentai18.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentai18.kt @@ -7,7 +7,7 @@ import org.jsoup.Jsoup import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -18,7 +18,7 @@ import org.koitharu.kotatsu.parsers.Broken @Broken @MangaSourceParser("TRUYENHENTAI18", "TruyenHentai18", "vi", ContentType.HENTAI) internal class TruyenHentai18(context: MangaLoaderContext): - LegacyPagedMangaParser(context, MangaParserSource.TRUYENHENTAI18, 18) { + PagedMangaParser(context, MangaParserSource.TRUYENHENTAI18, 18) { override val configKeyDomain = ConfigKey.Domain("truyenhentai18.app") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentaiVN.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentaiVN.kt index 939ea2c9..6faba378 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentaiVN.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentaiVN.kt @@ -4,7 +4,7 @@ import androidx.collection.ArrayMap import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("TRUYENHENTAIVN", "TruyenHentaiVN", "vi", type = ContentType.HENTAI) internal class TruyenHentaiVN(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.TRUYENHENTAIVN, 30) { + PagedMangaParser(context, MangaParserSource.TRUYENHENTAIVN, 30) { private var cacheTags = suspendLazy(initializer = ::fetchTags) override val configKeyDomain = ConfigKey.Domain("truyenhentaivn.club") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenQQ.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenQQ.kt index ff1a1264..3681c5c2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenQQ.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenQQ.kt @@ -3,14 +3,14 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.* @MangaSourceParser("TRUYENQQ", "TruyenQQ", "vi") -internal class TruyenQQ(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.TRUYENQQ, 42) { +internal class TruyenQQ(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.TRUYENQQ, 42) { override val configKeyDomain = ConfigKey.Domain("truyenqqgo.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenTranh3Q.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenTranh3Q.kt index 689f8e40..4386991a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenTranh3Q.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenTranh3Q.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -11,7 +11,7 @@ import java.util.* @MangaSourceParser("TRUYENTRANH3Q", "TruyenTranh3Q", "vi") internal class TruyenTranh3Q(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.TRUYENTRANH3Q, 42) { + PagedMangaParser(context, MangaParserSource.TRUYENTRANH3Q, 42) { private val relativeTimePattern = Regex("(\\d+)\\s*(phút|giờ|ngày|tuần) trước") private val absoluteTimePattern = Regex("(\\d{2}-\\d{2}-\\d{4})") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/VcomycsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/VcomycsParser.kt index 0195ae94..d72e1cac 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/VcomycsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/VcomycsParser.kt @@ -7,7 +7,7 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.mapJSONNotNull @@ -20,7 +20,7 @@ import javax.crypto.spec.SecretKeySpec @MangaSourceParser("VCOMYCS", "Vcomycs", "vi", ContentType.MANGA) internal class VcomycsParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.VCOMYCS, 36) { + PagedMangaParser(context, MangaParserSource.VCOMYCS, 36) { override val configKeyDomain: ConfigKey.Domain get() = ConfigKey.Domain("vivicomi5.info") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt index db6fc4dc..d64864d2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt @@ -4,7 +4,7 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -18,7 +18,7 @@ import org.koitharu.kotatsu.parsers.Broken @Broken("Original site closed") @MangaSourceParser("YURINEKO", "YuriNeko", "vi", ContentType.HENTAI) internal class YurinekoParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.YURINEKO, 20) { + PagedMangaParser(context, MangaParserSource.YURINEKO, 20) { override val configKeyDomain: ConfigKey.Domain get() = ConfigKey.Domain("yurineko.site") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/yurigarden/YuriGardenParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/yurigarden/YuriGardenParser.kt index b4a9a1b4..cdd40906 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/yurigarden/YuriGardenParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/yurigarden/YuriGardenParser.kt @@ -7,7 +7,7 @@ import okhttp3.Headers import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.network.UserAgents -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -20,7 +20,7 @@ internal abstract class YuriGardenParser( source: MangaParserSource, domain: String, protected val isR18Enable: Boolean = false -) : LegacyPagedMangaParser(context, source, 18) { +) : PagedMangaParser(context, source, 18) { private val availableTags = suspendLazy(initializer = ::fetchTags) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt index 582e84f8..20a97317 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.parsers.site.vmp import kotlinx.coroutines.coroutineScope import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -13,7 +13,7 @@ internal abstract class VmpParser( source: MangaParserSource, domain: String, pageSize: Int = 24, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt index a752e876..ea678031 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt @@ -11,7 +11,7 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.NotFoundException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -24,7 +24,7 @@ internal abstract class WpComicsParser( source: MangaParserSource, domain: String, pageSize: Int = 48, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { companion object { const val netDomain = "nettruyen1975.com" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ZeistMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ZeistMangaParser.kt index 5a93916b..12fc497b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ZeistMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ZeistMangaParser.kt @@ -9,7 +9,7 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -23,7 +23,7 @@ internal abstract class ZeistMangaParser( source: MangaParserSource, domain: String, pageSize: Int = 12, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt index d3cb9036..3be5286d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt @@ -6,7 +6,7 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -16,7 +16,7 @@ import java.util.* @MangaSourceParser("BAOZIMH", "Baozimh", "zh") internal class Baozimh(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.BAOZIMH, pageSize = 36) { + PagedMangaParser(context, MangaParserSource.BAOZIMH, pageSize = 36) { override val configKeyDomain = ConfigKey.Domain("www.baozimh.com") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/ManhuaguiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/ManhuaguiParser.kt index dfd8a364..ddb04da7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/ManhuaguiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/ManhuaguiParser.kt @@ -8,7 +8,7 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.ContentRating import org.koitharu.kotatsu.parsers.model.Demographic @@ -44,7 +44,7 @@ import java.util.Locale @MangaSourceParser("MANHUAGUI", "Manhuagui", "zh") internal class ManhuaguiParser(context: MangaLoaderContext) : - LegacyPagedMangaParser(context, MangaParserSource.MANHUAGUI, pageSize = 42) { + PagedMangaParser(context, MangaParserSource.MANHUAGUI, pageSize = 42) { override val configKeyDomain = ConfigKey.Domain("www.manhuagui.com") override val userAgentKey = ConfigKey.UserAgent(UserAgents.CHROME_DESKTOP) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt index 6e392f4f..c0fb016a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -17,7 +17,7 @@ internal abstract class ZMangaParser( source: MangaParserSource, domain: String, pageSize: Int = 16, -) : LegacyPagedMangaParser(context, source, pageSize) { +) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/LinkResolver.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/LinkResolver.kt index c92b7b43..cb542f7d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/LinkResolver.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/LinkResolver.kt @@ -6,7 +6,7 @@ import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParser -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -111,7 +111,7 @@ public class LinkResolver internal constructor( if (SortOrder.RELEVANCE in supported) { return SortOrder.RELEVANCE } - if (this is LegacyMangaParser) { + if (this is AbstractMangaParser) { return defaultSortOrder } return SortOrder.entries.first { it in supported } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/MangaParserEnv.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/MangaParserEnv.kt index bdf0e71f..7f34cd8d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/MangaParserEnv.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/MangaParserEnv.kt @@ -5,7 +5,7 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.InternalParsersApi import org.koitharu.kotatsu.parsers.MangaParser -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* @@ -83,7 +83,7 @@ private fun Set?.oneOrThrowIfMany(msg: String): T? = when { } @InternalParsersApi -public fun LegacyMangaParser.getDomain(subdomain: String): String { +public fun AbstractMangaParser.getDomain(subdomain: String): String { val domain = domain return subdomain + "." + domain.removePrefix("www.") } diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt index 2e619725..f1444c5b 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt @@ -5,8 +5,8 @@ import okhttp3.HttpUrl import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Disabled import org.junit.jupiter.params.ParameterizedTest -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser +import org.koitharu.kotatsu.parsers.core.PagedMangaParser +import org.koitharu.kotatsu.parsers.core.SinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.search.MangaSearchQuery import org.koitharu.kotatsu.parsers.model.search.QueryCriteria @@ -36,13 +36,13 @@ internal class MangaParserTest { @MangaSources fun pagination(source: MangaParserSource) = runTest(timeout = timeout) { val parser = context.newParserInstance(source) - if (parser is LegacySinglePageMangaParser) { + if (parser is SinglePageMangaParser) { return@runTest } val page1 = parser.getList(MangaSearchQuery.EMPTY) val page2 = parser.getList(MangaSearchQuery.Builder().offset(page1.size).build()) - if (parser is LegacyPagedMangaParser) { + if (parser is PagedMangaParser) { assert(parser.pageSize >= page1.size) { "Page size is ${page1.size} but ${parser.pageSize} expected" } diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/util/IntentFilterGenerator.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/util/IntentFilterGenerator.kt index e6fdecab..6b997776 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/util/IntentFilterGenerator.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/util/IntentFilterGenerator.kt @@ -1,7 +1,6 @@ package org.koitharu.kotatsu.parsers.util import org.junit.jupiter.api.Test -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.MangaLoaderContextMock import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.newParser