From 16ffd5f6955bcf23f59fd6690e30d74cb7d582ad Mon Sep 17 00:00:00 2001 From: animusfracto <50589737+animusfracto@users.noreply.github.com> Date: Tue, 15 Jun 2021 12:39:38 -0400 Subject: [PATCH] Implement Completed and Cancelled statuses (#7671) * add checks to the uploaded chapters in order to determine if the (publication) completed manga has been fully scanlated * consolidate case entries * Add language to aggregate call --- .../extension/all/mangadex/MangaDex.kt | 18 ++++++++++++- .../extension/all/mangadex/MangaDexHelper.kt | 25 ++++++++++++++----- .../all/mangadex/dto/AggregateDto.kt | 22 ++++++++++++++++ 3 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/dto/AggregateDto.kt diff --git a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt index 5ba7af6c7..92bc7ae8f 100644 --- a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt +++ b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt @@ -5,6 +5,7 @@ import android.content.SharedPreferences import android.util.Log import androidx.preference.PreferenceScreen import androidx.preference.SwitchPreferenceCompat +import eu.kanade.tachiyomi.extension.all.mangadex.dto.AggregateDto import eu.kanade.tachiyomi.extension.all.mangadex.dto.ChapterDto import eu.kanade.tachiyomi.extension.all.mangadex.dto.ChapterListDto import eu.kanade.tachiyomi.extension.all.mangadex.dto.MangaDto @@ -183,7 +184,22 @@ abstract class MangaDex(override val lang: String, val dexLang: String) : override fun mangaDetailsParse(response: Response): SManga { val manga = helper.json.decodeFromString(response.body!!.string()) - return helper.createManga(manga, lang.substringBefore("-")) + val shortLang = lang.substringBefore("-") + return helper.createManga(manga, fetchSimpleChapterList(manga, shortLang), shortLang) + } + + /** + * get a quick-n-dirty list of the chapters to be used in determining the manga status. + * uses the 'aggregate' endpoint + * @see MangaDexHelper.getPublicationStatus + * @see MangaDexHelper.doubleCheckChapters + * @see AggregateDto + */ + private fun fetchSimpleChapterList(manga: MangaDto, langCode: String): List { + val url = "${MDConstants.apiMangaUrl}/${manga.data.id}/aggregate?translatedLanguage[]=${langCode}" + val response = client.newCall(GET(url, headers)).execute() + val chapters = helper.json.decodeFromString(response.body!!.string()) + return chapters.volumes.values.flatMap { it.chapters.values }.map { it.chapter } } // Chapter list section diff --git a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexHelper.kt b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexHelper.kt index d969bb651..39b741cf0 100644 --- a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexHelper.kt +++ b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexHelper.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.extension.all.mangadex import android.util.Log import eu.kanade.tachiyomi.extension.all.mangadex.dto.AtHomeDto import eu.kanade.tachiyomi.extension.all.mangadex.dto.ChapterDto +import eu.kanade.tachiyomi.extension.all.mangadex.dto.MangaAttributesDto import eu.kanade.tachiyomi.extension.all.mangadex.dto.MangaDto import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.Page @@ -69,18 +70,30 @@ class MangaDexHelper() { return Parser.unescapeEntities(intermediate, false) } - /**Maps dex status to tachi status - * abandoned and completed statuses's need addition checks with chapter info if we are to be accurate + /** + * Maps dex status to tachi status */ - fun getPublicationStatus(dexStatus: String?): Int { - return when (dexStatus) { + fun getPublicationStatus(attr: MangaAttributesDto, chapters: List): Int { + return when (attr.status) { null -> SManga.UNKNOWN "ongoing" -> SManga.ONGOING + "completed", "cancelled" -> doubleCheckChapters(attr, chapters) "hiatus" -> SManga.ONGOING else -> SManga.UNKNOWN } } + /** + * if the manga is 'completed' or 'cancelled' then it'll have a lastChapter in the manga obj. + * if the simple list of chapters contains that lastChapter, then we can consider it completed. + */ + private fun doubleCheckChapters(attr: MangaAttributesDto, chapters: List): Int { + return if (chapters.contains(attr.lastChapter)) + SManga.COMPLETED + else + SManga.UNKNOWN + } + fun parseDate(dateAsString: String): Long = MDConstants.dateFormatter.parse(dateAsString)?.time ?: 0 @@ -145,7 +158,7 @@ class MangaDexHelper() { /** * Create an SManga from json element with all details */ - fun createManga(mangaDto: MangaDto, lang: String): SManga { + fun createManga(mangaDto: MangaDto, chapters: List, lang: String): SManga { try { val data = mangaDto.data val attr = data.attributes @@ -197,7 +210,7 @@ class MangaDexHelper() { description = cleanString(attr.description[lang] ?: attr.description["en"] ?: "") author = authors.joinToString(", ") artist = artists.joinToString(", ") - status = getPublicationStatus(attr.status) + status = getPublicationStatus(attr, chapters) genre = genreList.joinToString(", ") } } catch (e: Exception) { diff --git a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/dto/AggregateDto.kt b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/dto/AggregateDto.kt new file mode 100644 index 000000000..0e8fdb0dd --- /dev/null +++ b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/dto/AggregateDto.kt @@ -0,0 +1,22 @@ +package eu.kanade.tachiyomi.extension.all.mangadex.dto + +import kotlinx.serialization.Serializable + +@Serializable +data class AggregateDto( + val result: String, + val volumes: Map +) + +@Serializable +data class AggregateVolume( + val volume: String, + val count: String, + val chapters: Map +) + +@Serializable +data class AggregateChapter( + val chapter: String, + val count: String +)