Support new E-H/Exh search engine

This commit is contained in:
Jobobby04
2022-11-16 13:07:38 -05:00
parent eedfa44ec8
commit 797a9e6b4e
7 changed files with 210 additions and 168 deletions
@@ -3,68 +3,43 @@ package eu.kanade.data.source
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.MetadataMangasPage
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.all.EHentai
import eu.kanade.tachiyomi.util.lang.awaitSingle
import exh.metadata.metadata.EHentaiSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata
abstract class EHentaiPagingSource(override val source: EHentai) : SourcePagingSource(source) {
private var lastMangaLink: String? = null
override fun getPageLoadResult(
params: LoadParams<Long>,
mangasPage: MangasPage,
): LoadResult.Page<Long, Pair<SManga, RaisedSearchMetadata?>> {
mangasPage as MetadataMangasPage
val metadata = mangasPage.mangasMetadata
abstract suspend fun fetchNextPage(currentPage: Int): MangasPage
override suspend fun requestNextPage(currentPage: Int): MangasPage {
val lastMangaLink = lastMangaLink
val gid = if (lastMangaLink != null && source.exh) {
EHentaiSearchMetadata.galleryId(lastMangaLink).toInt()
} else {
null
}
val mangasPage = fetchNextPage(gid ?: currentPage)
mangasPage.mangas.lastOrNull()?.let {
this.lastMangaLink = it.url
}
return if (lastMangaLink != null) {
val index = mangasPage.mangas.indexOfFirst { it.url == lastMangaLink }
if (index != -1) {
val lastIndex = mangasPage.mangas.size
val startIndex = (index + 1).coerceAtMost(mangasPage.mangas.lastIndex)
if (mangasPage is MetadataMangasPage) {
mangasPage.copy(
mangas = mangasPage.mangas.subList(startIndex, lastIndex),
mangasMetadata = mangasPage.mangasMetadata.subList(startIndex, lastIndex),
)
} else {
mangasPage.copy(
mangas = mangasPage.mangas.subList(startIndex, lastIndex),
)
}
} else {
mangasPage
}
} else {
mangasPage
}
return LoadResult.Page(
data = mangasPage.mangas
.mapIndexed { index, sManga -> sManga to metadata.getOrNull(index) },
prevKey = null,
nextKey = mangasPage.nextKey,
)
}
}
class EHentaiSearchPagingSource(source: EHentai, val query: String, val filters: FilterList) : EHentaiPagingSource(source) {
override suspend fun fetchNextPage(currentPage: Int): MangasPage {
override suspend fun requestNextPage(currentPage: Int): MangasPage {
return source.fetchSearchManga(currentPage, query, filters).awaitSingle()
}
}
class EHentaiPopularPagingSource(source: EHentai) : EHentaiPagingSource(source) {
override suspend fun fetchNextPage(currentPage: Int): MangasPage {
override suspend fun requestNextPage(currentPage: Int): MangasPage {
return source.fetchPopularManga(currentPage).awaitSingle()
}
}
class EHentaiLatestPagingSource(source: EHentai) : EHentaiPagingSource(source) {
override suspend fun fetchNextPage(currentPage: Int): MangasPage {
override suspend fun requestNextPage(currentPage: Int): MangasPage {
return source.fetchLatestUpdates(currentPage).awaitSingle()
}
}
@@ -29,6 +29,16 @@ abstract class SourcePagingSource(
} catch (e: Exception) {
return LoadResult.Error(e)
}
// SY -->
return getPageLoadResult(params, mangasPage)
// SY <--
}
// SY -->
open fun getPageLoadResult(params: LoadParams<Long>, mangasPage: MangasPage): LoadResult.Page<Long, /*SY --> */ Pair<SManga, RaisedSearchMetadata?>/*SY <-- */> {
val page = params.key ?: 1
// SY -->
val metadata = if (mangasPage is MetadataMangasPage) {
mangasPage.mangasMetadata
@@ -46,6 +56,7 @@ abstract class SourcePagingSource(
nextKey = if (mangasPage.hasNextPage) page + 1 else null,
)
}
// SY <--
override fun getRefreshKey(state: PagingState<Long, /*SY --> */ Pair<SManga, RaisedSearchMetadata?>/*SY <-- */>): Long? {
return state.anchorPosition?.let { anchorPosition ->