Files
TachiyomiSY/app/src/main/java/exh/md/handlers/FollowsHandler.kt
T
arkon bd0eda0c65 Move more things around
(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
2023-02-09 18:08:07 -05:00

165 lines
5.5 KiB
Kotlin

package exh.md.handlers
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.model.MetadataMangasPage
import eu.kanade.tachiyomi.source.model.SManga
import exh.md.dto.MangaDataDto
import exh.md.dto.PersonalRatingDto
import exh.md.dto.ReadingStatusDto
import exh.md.service.MangaDexAuthService
import exh.md.utils.FollowStatus
import exh.md.utils.MdUtil
import exh.md.utils.asMdMap
import exh.md.utils.mdListCall
import exh.metadata.metadata.MangaDexSearchMetadata
import exh.util.under
import kotlinx.coroutines.async
import tachiyomi.core.util.lang.withIOContext
class FollowsHandler(
private val lang: String,
private val service: MangaDexAuthService,
) {
/**
* fetch follows page
*/
suspend fun fetchFollows(page: Int): MetadataMangasPage {
return withIOContext {
val follows = service.userFollowList(MdUtil.mangaLimit * page)
if (follows.data.isEmpty()) {
return@withIOContext MetadataMangasPage(emptyList(), false, emptyList())
}
val hasMoreResults = follows.limit + follows.offset under follows.total
val statusListResponse = service.readingStatusAllManga()
val results = followsParseMangaPage(follows.data, statusListResponse.statuses)
MetadataMangasPage(results.map { it.first }, hasMoreResults, results.map { it.second })
}
}
/**
* Parse follows api to manga page
* used when multiple follows
*/
private fun followsParseMangaPage(
response: List<MangaDataDto>,
statuses: Map<String, String?>,
): List<Pair<SManga, MangaDexSearchMetadata>> {
val comparator = compareBy<Pair<SManga, MangaDexSearchMetadata>> { it.second.followStatus }
.thenBy { it.first.title }
return response.map {
MdUtil.createMangaEntry(
it,
lang,
) to MangaDexSearchMetadata().apply {
followStatus = FollowStatus.fromDex(statuses[it.id]).int
}
}.sortedWith(comparator)
}
/**
* Change the status of a manga
*/
suspend fun updateFollowStatus(mangaId: String, followStatus: FollowStatus): Boolean {
return withIOContext {
val status = when (followStatus == FollowStatus.UNFOLLOWED) {
true -> null
false -> followStatus.toDex()
}
val readingStatusDto = ReadingStatusDto(status)
if (followStatus == FollowStatus.UNFOLLOWED) {
service.unfollowManga(mangaId)
} else {
service.followManga(mangaId)
}
service.updateReadingStatusForManga(mangaId, readingStatusDto).result == "ok"
}
}
/*suspend fun updateReadingProgress(track: Track): Boolean {
return true
return withIOContext {
val mangaID = getMangaId(track.tracking_url)
val formBody = FormBody.Builder()
.add("volume", "0")
.add("chapter", track.last_chapter_read.toString())
XLog.d("chapter to update %s", track.last_chapter_read.toString())
val result = runCatching {
client.newCall(
POST(
"$baseUrl/ajax/actions.ajax.php?function=edit_progress&id=$mangaID",
headers,
formBody.build()
)
).execute()
}
result.exceptionOrNull()?.let {
if (it is EOFException) {
return@withIOContext true
} else {
XLog.e("error updating reading progress", it)
return@withIOContext false
}
}
result.isSuccess
}
}*/
suspend fun updateRating(track: Track): Boolean {
return withIOContext {
val mangaId = MdUtil.getMangaId(track.tracking_url)
val result = runCatching {
if (track.score == 0f) {
service.deleteMangaRating(mangaId)
} else {
service.updateMangaRating(mangaId, track.score.toInt())
}.result == "ok"
}
result.getOrDefault(false)
}
}
/**
* fetch all manga from all possible pages
*/
suspend fun fetchAllFollows(): List<Pair<SManga, MangaDexSearchMetadata>> {
return withIOContext {
val results = async {
mdListCall {
service.userFollowList(it)
}
}
val readingStatusResponse = async { service.readingStatusAllManga().statuses }
followsParseMangaPage(results.await(), readingStatusResponse.await())
}
}
suspend fun fetchTrackingInfo(url: String): Track {
return withIOContext {
val mangaId = MdUtil.getMangaId(url)
val followStatusDef = async {
FollowStatus.fromDex(service.readingStatusForManga(mangaId).status)
}
val ratingDef = async {
service.mangasRating(mangaId).ratings.asMdMap<PersonalRatingDto>()[mangaId]
}
val (followStatus, rating) = followStatusDef.await() to ratingDef.await()
Track.create(TrackManager.MDLIST).apply {
title = ""
status = followStatus.int
tracking_url = url
score = rating?.rating?.toFloat() ?: 0F
}
}
}
}