
(cherry picked from commit e36e9d9d5c1b2a7b55f28f2bf0ef064880cbac8f) # Conflicts: # app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt # app/src/main/java/eu/kanade/domain/manga/model/Manga.kt # app/src/main/java/eu/kanade/tachiyomi/data/database/models/Manga.kt # app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt # app/src/main/java/eu/kanade/tachiyomi/source/LocalSource.kt # app/src/main/java/eu/kanade/tachiyomi/source/Source.kt # app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt # app/src/main/java/eu/kanade/tachiyomi/source/model/SManga.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchPresenter.kt # app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt
67 lines
2.3 KiB
Kotlin
67 lines
2.3 KiB
Kotlin
package exh.md.handlers
|
|
|
|
import eu.kanade.tachiyomi.source.model.MetadataMangasPage
|
|
import eu.kanade.tachiyomi.source.model.SManga
|
|
import eu.kanade.tachiyomi.util.lang.withIOContext
|
|
import exh.md.dto.RelationListDto
|
|
import exh.md.dto.SimilarMangaDto
|
|
import exh.md.service.MangaDexService
|
|
import exh.md.service.SimilarService
|
|
import exh.md.utils.MangaDexRelation
|
|
import exh.md.utils.MdUtil
|
|
import exh.metadata.metadata.MangaDexSearchMetadata
|
|
|
|
class SimilarHandler(
|
|
private val lang: String,
|
|
private val service: MangaDexService,
|
|
private val similarService: SimilarService,
|
|
) {
|
|
|
|
suspend fun getSimilar(manga: SManga): MetadataMangasPage {
|
|
val similarDto = withIOContext { similarService.getSimilarManga(MdUtil.getMangaId(manga.url)) }
|
|
return similarDtoToMangaListPage(similarDto)
|
|
}
|
|
|
|
private suspend fun similarDtoToMangaListPage(
|
|
similarMangaDto: SimilarMangaDto,
|
|
): MetadataMangasPage {
|
|
val ids = similarMangaDto.matches.map {
|
|
it.id
|
|
}
|
|
|
|
val mangaList = service.viewMangas(ids).data.map {
|
|
MdUtil.createMangaEntry(it, lang)
|
|
}
|
|
|
|
return MetadataMangasPage(mangaList, false, List(mangaList.size) { MangaDexSearchMetadata().also { it.relation = MangaDexRelation.SIMILAR } })
|
|
}
|
|
|
|
suspend fun getRelated(manga: SManga): MetadataMangasPage {
|
|
val relatedListDto = withIOContext { service.relatedManga(MdUtil.getMangaId(manga.url)) }
|
|
return relatedDtoToMangaListPage(relatedListDto)
|
|
}
|
|
|
|
private suspend fun relatedDtoToMangaListPage(
|
|
relatedListDto: RelationListDto,
|
|
): MetadataMangasPage {
|
|
val ids = relatedListDto.data
|
|
.mapNotNull { it.relationships.firstOrNull() }
|
|
.map { it.id }
|
|
|
|
val mangaList = service.viewMangas(ids).data.map {
|
|
MdUtil.createMangaEntry(it, lang)
|
|
}
|
|
|
|
return MetadataMangasPage(
|
|
mangas = mangaList,
|
|
hasNextPage = false,
|
|
mangasMetadata = mangaList.map { manga ->
|
|
MangaDexSearchMetadata().also {
|
|
it.relation = relatedListDto.data.firstOrNull { it.relationships.any { it.id == MdUtil.getMangaId(manga.url) } }
|
|
?.attributes?.relation?.let(MangaDexRelation::fromDex)
|
|
}
|
|
},
|
|
)
|
|
}
|
|
}
|