Respect thumbnailQuality and tryUsingFirstVolumeCover preferences. (MD) (#1260)

This commit is contained in:
NGB-Was-Taken
2024-09-01 20:30:01 +05:45
committed by GitHub
parent fbac29e0cd
commit bdb8553e28
6 changed files with 75 additions and 21 deletions
+2 -6
View File
@@ -104,16 +104,12 @@ data class ReadChapterDto(
@Serializable
data class CoverListDto(
val results: List<CoverDto>,
val data: List<CoverDto>,
)
@Serializable
data class CoverDto(
val data: CoverDataDto,
)
@Serializable
data class CoverDataDto(
val id: String,
val attributes: CoverAttributesDto,
val relationships: List<RelationshipDto>,
)
@@ -41,6 +41,8 @@ class ApiMangaParser(
input: MangaDto,
simpleChapters: List<String>,
statistics: StatisticsMangaDto?,
coverFileName: String?,
coverQuality: String,
): SManga {
val mangaId = getManga.await(manga.url, sourceId)?.id
val metadata = if (mangaId != null) {
@@ -50,7 +52,7 @@ class ApiMangaParser(
newMetaInstance()
}
parseIntoMetadata(metadata, input, simpleChapters, statistics)
parseIntoMetadata(metadata, input, simpleChapters, statistics, coverFileName, coverQuality)
if (mangaId != null) {
metadata.mangaId = mangaId
insertFlatMetadata.await(metadata.flatten())
@@ -64,6 +66,8 @@ class ApiMangaParser(
mangaDto: MangaDto,
simpleChapters: List<String>,
statistics: StatisticsMangaDto?,
coverFileName: String?,
coverQuality: String,
) {
with(metadata) {
try {
@@ -73,13 +77,17 @@ class ApiMangaParser(
altTitles = mangaAttributesDto.altTitles.mapNotNull { it[lang] }.nullIfEmpty()
val mangaRelationshipsDto = mangaDto.data.relationships
mangaRelationshipsDto
.firstOrNull { relationshipDto -> relationshipDto.type == MdConstants.Types.coverArt }
?.attributes
?.fileName
?.let { coverFileName ->
cover = MdUtil.cdnCoverUrl(mangaDto.data.id, coverFileName)
}
cover = if (!coverFileName.isNullOrEmpty()) {
MdUtil.cdnCoverUrl(mangaDto.data.id, "$coverFileName$coverQuality")
} else {
mangaRelationshipsDto
.firstOrNull { relationshipDto -> relationshipDto.type == MdConstants.Types.coverArt }
?.attributes
?.fileName
?.let { coverFileName ->
MdUtil.cdnCoverUrl(mangaDto.data.id, "$coverFileName$coverQuality")
}
}
description = MdUtil.cleanDescription(
MdUtil.getFromLangMap(
@@ -23,7 +23,12 @@ class MangaHandler(
private val apiMangaParser: ApiMangaParser,
private val followsHandler: FollowsHandler,
) {
suspend fun getMangaDetails(manga: SManga, sourceId: Long): SManga {
suspend fun getMangaDetails(
manga: SManga,
sourceId: Long,
coverQuality: String,
tryUsingFirstVolumeCover: Boolean,
): SManga {
return coroutineScope {
val mangaId = MdUtil.getMangaId(manga.url)
val response = async(Dispatchers.IO) { service.viewManga(mangaId) }
@@ -32,19 +37,29 @@ class MangaHandler(
async(Dispatchers.IO) {
kotlin.runCatching { service.mangasRating(mangaId) }.getOrNull()?.statistics?.get(mangaId)
}
val responseData = response.await()
val coverFileName = if (tryUsingFirstVolumeCover) {
async(Dispatchers.IO) {
service.fetchFirstVolumeCover(responseData)
}
} else {
null
}
apiMangaParser.parseToManga(
manga,
sourceId,
response.await(),
responseData,
simpleChapters.await(),
statistics.await(),
coverFileName?.await(),
coverQuality,
)
}
}
fun fetchMangaDetailsObservable(manga: SManga, sourceId: Long): Observable<SManga> {
fun fetchMangaDetailsObservable(manga: SManga, sourceId: Long, coverQuality: String, tryUsingFirstVolumeCover: Boolean): Observable<SManga> {
return runAsObservable {
getMangaDetails(manga, sourceId)
getMangaDetails(manga, sourceId, coverQuality, tryUsingFirstVolumeCover)
}
}
@@ -9,6 +9,7 @@ import exh.md.dto.AtHomeDto
import exh.md.dto.AtHomeImageReportDto
import exh.md.dto.ChapterDto
import exh.md.dto.ChapterListDto
import exh.md.dto.CoverListDto
import exh.md.dto.MangaDto
import exh.md.dto.MangaListDto
import exh.md.dto.RelationListDto
@@ -209,4 +210,23 @@ class MangaDexService(
).awaitSuccess().parseAs()
}
}
suspend fun fetchFirstVolumeCover(mangaDto: MangaDto): String? {
val mangaData = mangaDto.data
val result: CoverListDto = with(MdUtil.jsonParser) {
client.newCall(
GET(
MdApi.cover.toHttpUrl().newBuilder()
.apply {
addQueryParameter("order[volume]", "asc")
addQueryParameter("manga[]", mangaData.id)
addQueryParameter("locales[]", mangaData.attributes.originalLanguage)
addQueryParameter("limit", "1")
}
.build(),
),
).awaitSuccess().parseAs()
}
return result.data.firstOrNull()?.attributes?.fileName
}
}
+1
View File
@@ -3,6 +3,7 @@ package exh.md.utils
object MdApi {
const val baseUrl = "https://api.mangadex.org"
const val manga = "$baseUrl/manga"
const val cover = "$baseUrl/cover"
const val chapter = "$baseUrl/chapter"
const val group = "$baseUrl/group"
const val author = "$baseUrl/author"