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
This commit is contained in:
parent
6991d96d59
commit
16ffd5f695
@ -5,6 +5,7 @@ import android.content.SharedPreferences
|
|||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import androidx.preference.SwitchPreferenceCompat
|
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.ChapterDto
|
||||||
import eu.kanade.tachiyomi.extension.all.mangadex.dto.ChapterListDto
|
import eu.kanade.tachiyomi.extension.all.mangadex.dto.ChapterListDto
|
||||||
import eu.kanade.tachiyomi.extension.all.mangadex.dto.MangaDto
|
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 {
|
override fun mangaDetailsParse(response: Response): SManga {
|
||||||
val manga = helper.json.decodeFromString<MangaDto>(response.body!!.string())
|
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
|
// Chapter list section
|
||||||
|
@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.extension.all.mangadex
|
|||||||
import android.util.Log
|
import android.util.Log
|
||||||
import eu.kanade.tachiyomi.extension.all.mangadex.dto.AtHomeDto
|
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.ChapterDto
|
||||||
|
import eu.kanade.tachiyomi.extension.all.mangadex.dto.MangaAttributesDto
|
||||||
import eu.kanade.tachiyomi.extension.all.mangadex.dto.MangaDto
|
import eu.kanade.tachiyomi.extension.all.mangadex.dto.MangaDto
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
@ -69,18 +70,30 @@ class MangaDexHelper() {
|
|||||||
return Parser.unescapeEntities(intermediate, false)
|
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 {
|
fun getPublicationStatus(attr: MangaAttributesDto, chapters: List<String>): Int {
|
||||||
return when (dexStatus) {
|
return when (attr.status) {
|
||||||
null -> SManga.UNKNOWN
|
null -> SManga.UNKNOWN
|
||||||
"ongoing" -> SManga.ONGOING
|
"ongoing" -> SManga.ONGOING
|
||||||
|
"completed", "cancelled" -> doubleCheckChapters(attr, chapters)
|
||||||
"hiatus" -> SManga.ONGOING
|
"hiatus" -> SManga.ONGOING
|
||||||
else -> SManga.UNKNOWN
|
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 =
|
fun parseDate(dateAsString: String): Long =
|
||||||
MDConstants.dateFormatter.parse(dateAsString)?.time ?: 0
|
MDConstants.dateFormatter.parse(dateAsString)?.time ?: 0
|
||||||
|
|
||||||
@ -145,7 +158,7 @@ class MangaDexHelper() {
|
|||||||
/**
|
/**
|
||||||
* Create an SManga from json element with all details
|
* 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 {
|
try {
|
||||||
val data = mangaDto.data
|
val data = mangaDto.data
|
||||||
val attr = data.attributes
|
val attr = data.attributes
|
||||||
@ -197,7 +210,7 @@ class MangaDexHelper() {
|
|||||||
description = cleanString(attr.description[lang] ?: attr.description["en"] ?: "")
|
description = cleanString(attr.description[lang] ?: attr.description["en"] ?: "")
|
||||||
author = authors.joinToString(", ")
|
author = authors.joinToString(", ")
|
||||||
artist = artists.joinToString(", ")
|
artist = artists.joinToString(", ")
|
||||||
status = getPublicationStatus(attr.status)
|
status = getPublicationStatus(attr, chapters)
|
||||||
genre = genreList.joinToString(", ")
|
genre = genreList.joinToString(", ")
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} 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
|
||||||
|
)
|
Loading…
x
Reference in New Issue
Block a user