Implement Completed and Cancelled statuses ()

* 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
This commit is contained in:
animusfracto 2021-06-15 12:39:38 -04:00 committed by GitHub
parent 6991d96d59
commit 16ffd5f695
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 58 additions and 7 deletions
src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex

@ -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<MangaDto>(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<String> {
val url = "${MDConstants.apiMangaUrl}/${manga.data.id}/aggregate?translatedLanguage[]=${langCode}"
val response = client.newCall(GET(url, headers)).execute()
val chapters = helper.json.decodeFromString<AggregateDto>(response.body!!.string())
return chapters.volumes.values.flatMap { it.chapters.values }.map { it.chapter }
}
// Chapter list section

@ -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<String>): 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<String>): 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<String>, 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) {

@ -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<String, AggregateVolume>
)
@Serializable
data class AggregateVolume(
val volume: String,
val count: String,
val chapters: Map<String, AggregateChapter>
)
@Serializable
data class AggregateChapter(
val chapter: String,
val count: String
)