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

92 lines
3.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
2021-07-06 00:31:30 +02:00
import exh.md.dto.ChapterDto
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
import kotlinx.coroutines.async
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
) {
suspend fun getMangaDetails(manga: MangaInfo, sourceId: Long, forceLatestCovers: Boolean): MangaInfo {
2021-07-06 00:31:30 +02:00
val response = withIOContext { service.viewManga(MdUtil.getMangaId(manga.key)) }
2021-06-03 22:28:38 +02:00
return apiMangaParser.parseToManga(manga, response, sourceId)
}
2021-05-17 18:45:33 +02:00
fun fetchMangaDetailsObservable(manga: SManga, sourceId: Long, forceLatestCovers: Boolean): Observable<SManga> {
2021-05-11 19:06:55 +02:00
return runAsObservable({
2021-05-17 18:45:33 +02:00
getMangaDetails(manga.toMangaInfo(), sourceId, forceLatestCovers).toSManga()
2021-05-11 19:06:55 +02:00
})
}
2021-05-11 19:06:55 +02:00
fun fetchChapterListObservable(manga: SManga): Observable<List<SChapter>> = runAsObservable({
getChapterList(manga.toMangaInfo()).map { it.toSChapter() }
})
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)
}
}
2021-07-06 00:31:30 +02:00
private fun getGroupMap(results: List<ChapterDto>): Map<String, String> {
return results.map { chapter -> chapter.data.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))
}
}
}