(cherry picked from commit 1730dd6af1f5a9e6f8752a2350b1bd153262a751) # Conflicts: # app/src/main/java/eu/kanade/data/source/SourcePagingSource.kt # app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt # app/src/main/java/eu/kanade/domain/library/service/LibraryPreferences.kt # app/src/main/java/eu/kanade/domain/manga/interactor/GetManga.kt # app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt # app/src/main/java/eu/kanade/presentation/more/settings/screen/AboutScreen.kt # app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt # app/src/main/java/eu/kanade/tachiyomi/App.kt # app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt # app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt # app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt # app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt # app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateChecker.kt # app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesScreenModel.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt # app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt # app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt # app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt # app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreTab.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt # app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesScreenModel.kt # app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt # data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt
120 lines
4.2 KiB
Kotlin
120 lines
4.2 KiB
Kotlin
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 exh.md.dto.ChapterDataDto
|
|
import exh.md.service.MangaDexService
|
|
import exh.md.utils.MdConstants
|
|
import exh.md.utils.MdUtil
|
|
import exh.md.utils.mdListCall
|
|
import exh.metadata.metadata.MangaDexSearchMetadata
|
|
import kotlinx.coroutines.CancellationException
|
|
import kotlinx.coroutines.Dispatchers
|
|
import kotlinx.coroutines.async
|
|
import kotlinx.coroutines.coroutineScope
|
|
import rx.Observable
|
|
import tachiyomi.core.util.lang.runAsObservable
|
|
import tachiyomi.core.util.lang.withIOContext
|
|
|
|
class MangaHandler(
|
|
private val lang: String,
|
|
private val service: MangaDexService,
|
|
private val apiMangaParser: ApiMangaParser,
|
|
private val followsHandler: FollowsHandler,
|
|
) {
|
|
suspend fun getMangaDetails(manga: SManga, sourceId: Long): SManga {
|
|
return coroutineScope {
|
|
val mangaId = MdUtil.getMangaId(manga.url)
|
|
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(),
|
|
)
|
|
}
|
|
}
|
|
|
|
fun fetchMangaDetailsObservable(manga: SManga, sourceId: Long): Observable<SManga> {
|
|
return runAsObservable {
|
|
getMangaDetails(manga, sourceId)
|
|
}
|
|
}
|
|
|
|
fun fetchChapterListObservable(manga: SManga, blockedGroups: String, blockedUploaders: String): Observable<List<SChapter>> = runAsObservable {
|
|
getChapterList(manga, blockedGroups, blockedUploaders)
|
|
}
|
|
|
|
suspend fun getChapterList(manga: SManga, blockedGroups: String, blockedUploaders: String): List<SChapter> {
|
|
return withIOContext {
|
|
val results = mdListCall {
|
|
service.viewChapters(
|
|
MdUtil.getMangaId(manga.url),
|
|
lang,
|
|
it,
|
|
blockedGroups,
|
|
blockedUploaders,
|
|
)
|
|
}
|
|
|
|
val groupMap = getGroupMap(results)
|
|
|
|
apiMangaParser.chapterListParse(results, groupMap)
|
|
}
|
|
}
|
|
|
|
private fun getGroupMap(results: List<ChapterDataDto>): Map<String, String> {
|
|
return results.map { chapter -> chapter.relationships }
|
|
.flatten()
|
|
.filter { it.type == MdConstants.Types.scanlator }
|
|
.map { it.id to it.attributes!!.name!! }
|
|
.toMap()
|
|
}
|
|
|
|
suspend fun fetchRandomMangaId(): String {
|
|
return withIOContext {
|
|
service.randomManga().data.id
|
|
}
|
|
}
|
|
|
|
suspend fun getTrackingInfo(track: Track): Pair<Track, MangaDexSearchMetadata?> {
|
|
return withIOContext {
|
|
/*val metadata = async {
|
|
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()
|
|
apiMangaParser.parseIntoMetadata(metadata, response, emptyList())
|
|
metadata
|
|
}*/
|
|
val remoteTrack = async {
|
|
followsHandler.fetchTrackingInfo(track.tracking_url)
|
|
}
|
|
remoteTrack.await() to null
|
|
}
|
|
}
|
|
|
|
suspend fun getMangaFromChapterId(chapterId: String): String? {
|
|
return withIOContext {
|
|
apiMangaParser.chapterParseForMangaId(service.viewChapter(chapterId))
|
|
}
|
|
}
|
|
|
|
private suspend fun getSimpleChapters(manga: SManga): List<String> {
|
|
return runCatching { service.aggregateChapters(MdUtil.getMangaId(manga.url), lang) }
|
|
.onFailure {
|
|
if (it is CancellationException) throw it
|
|
}
|
|
.map { dto ->
|
|
dto.volumes.values
|
|
.flatMap { it.chapters.values }
|
|
.map { it.chapter }
|
|
}
|
|
.getOrElse { emptyList() }
|
|
}
|
|
}
|