komikku/app/src/main/java/exh/md/handlers/MangaHandler.kt

119 lines
4.3 KiB
Kotlin
Raw Normal View History

package exh.md.handlers
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.model.toMangaInfo
2021-01-16 04:29:57 +01:00
import eu.kanade.tachiyomi.source.model.toSChapter
import eu.kanade.tachiyomi.source.model.toSManga
import eu.kanade.tachiyomi.util.lang.runAsObservable
import eu.kanade.tachiyomi.util.lang.withIOContext
import exh.md.dto.ChapterDataDto
2021-07-06 00:31:30 +02:00
import exh.md.service.MangaDexService
import exh.md.utils.MdConstants
import exh.md.utils.MdUtil
2021-05-11 19:06:55 +02:00
import exh.md.utils.mdListCall
import exh.metadata.metadata.MangaDexSearchMetadata
2021-11-14 04:46:03 +01:00
import kotlinx.coroutines.CancellationException
2021-12-27 22:18:02 +01:00
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
2021-12-27 22:18:02 +01:00
import kotlinx.coroutines.coroutineScope
import rx.Observable
2021-01-16 04:29:57 +01:00
import tachiyomi.source.model.ChapterInfo
import tachiyomi.source.model.MangaInfo
2021-05-17 18:45:33 +02:00
class MangaHandler(
private val lang: String,
2021-07-06 00:31:30 +02:00
private val service: MangaDexService,
2021-05-17 18:45:33 +02:00
private val apiMangaParser: ApiMangaParser,
private val followsHandler: FollowsHandler
) {
2021-12-03 02:54:54 +01:00
suspend fun getMangaDetails(manga: MangaInfo, sourceId: Long): MangaInfo {
2021-12-27 22:18:02 +01:00
return coroutineScope {
val mangaId = MdUtil.getMangaId(manga.key)
val response = async(Dispatchers.IO) { service.viewManga(mangaId) }
val simpleChapters = async(Dispatchers.IO) { getSimpleChapters(manga) }
val statistics = async(Dispatchers.IO) { service.mangasRating(mangaId).statistics[mangaId] }
apiMangaParser.parseToManga(
manga,
sourceId,
response.await(),
simpleChapters.await(),
statistics.await()
)
}
}
2021-12-03 02:54:54 +01:00
fun fetchMangaDetailsObservable(manga: SManga, sourceId: Long): Observable<SManga> {
2021-12-03 02:44:05 +01:00
return runAsObservable {
2021-12-03 02:54:54 +01:00
getMangaDetails(manga.toMangaInfo(), sourceId).toSManga()
2021-12-03 02:44:05 +01:00
}
}
2021-12-03 02:44:05 +01:00
fun fetchChapterListObservable(manga: SManga): Observable<List<SChapter>> = runAsObservable {
2021-05-11 19:06:55 +02:00
getChapterList(manga.toMangaInfo()).map { it.toSChapter() }
2021-12-03 02:44:05 +01:00
}
2021-01-16 04:29:57 +01:00
suspend fun getChapterList(manga: MangaInfo): List<ChapterInfo> {
return withIOContext {
2021-07-06 00:31:30 +02:00
val results = mdListCall {
service.viewChapters(MdUtil.getMangaId(manga.key), lang, it)
}
val groupMap = getGroupMap(results)
2021-05-17 18:45:33 +02:00
apiMangaParser.chapterListParse(results, groupMap)
}
}
private fun getGroupMap(results: List<ChapterDataDto>): Map<String, String> {
return results.map { chapter -> chapter.relationships }
2021-07-06 00:31:30 +02:00
.flatten()
.filter { it.type == MdConstants.Types.scanlator }
.map { it.id to it.attributes!!.name!! }
.toMap()
}
2020-12-26 20:22:55 +01:00
suspend fun fetchRandomMangaId(): String {
return withIOContext {
2021-07-06 00:31:30 +02:00
service.randomManga().data.id
}
}
2021-05-26 05:34:56 +02:00
suspend fun getTrackingInfo(track: Track): Pair<Track, MangaDexSearchMetadata?> {
return withIOContext {
/*val metadata = async {
2021-05-17 18:45:33 +02:00
val mangaUrl = MdUtil.buildMangaUrl(MdUtil.getMangaId(track.tracking_url))
val manga = MangaInfo(mangaUrl, track.title)
val response = client.newCall(mangaRequest(manga)).await()
val metadata = MangaDexSearchMetadata()
2021-05-17 18:45:33 +02:00
apiMangaParser.parseIntoMetadata(metadata, response, emptyList())
metadata
}*/
val remoteTrack = async {
2021-05-17 18:45:33 +02:00
followsHandler.fetchTrackingInfo(track.tracking_url)
}
2021-05-07 19:41:33 +02:00
remoteTrack.await() to null
}
}
2021-07-06 22:57:26 +02:00
suspend fun getMangaFromChapterId(chapterId: String): String? {
return withIOContext {
apiMangaParser.chapterParseForMangaId(service.viewChapter(chapterId))
}
}
2021-11-14 04:46:03 +01:00
private suspend fun getSimpleChapters(manga: MangaInfo): List<String> {
return runCatching { service.aggregateChapters(MdUtil.getMangaId(manga.key), lang) }
.onFailure {
if (it is CancellationException) throw it
}
.map { dto ->
dto.volumes.values
.flatMap { it.chapters.values }
.map { it.chapter }
}
2021-12-11 20:58:23 +01:00
.getOrElse { emptyList() }
2021-11-14 04:46:03 +01:00
}
}