Respect thumbnailQuality and tryUsingFirstVolumeCover preferences. (MD) (#1260)
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user