Support new E-H/Exh search engine
This commit is contained in:
@@ -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 ->
|
||||
|
||||
Reference in New Issue
Block a user