Skip to content

Commit 4a656f3

Browse files
NGB-Was-Takencuong-tran
authored andcommitted
Respect thumbnailQuality and tryUsingFirstVolumeCover preferences. (MD) (jobobby04/TachiyomiSY#1260)
(cherry picked from commit bdb8553)
1 parent 76c4f68 commit 4a656f3

File tree

6 files changed

+75
-21
lines changed

6 files changed

+75
-21
lines changed

app/src/main/java/eu/kanade/tachiyomi/source/online/all/MangaDex.kt

+17-3
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ class MangaDex(delegate: HttpSource, val context: Context) :
8787
private fun usePort443Only() = sourcePreferences.getBoolean(getStandardHttpsPreferenceKey(mdLang.lang), false)
8888
private fun blockedGroups() = sourcePreferences.getString(getBlockedGroupsPrefKey(mdLang.lang), "").orEmpty()
8989
private fun blockedUploaders() = sourcePreferences.getString(getBlockedUploaderPrefKey(mdLang.lang), "").orEmpty()
90+
private fun coverQuality() = sourcePreferences.getString(getCoverQualityPrefKey(mdLang.lang), "").orEmpty()
91+
private fun tryUsingFirstVolumeCover() = sourcePreferences.getBoolean(getTryUsingFirstVolumeCoverKey(mdLang.lang), false)
9092

9193
private val mangadexService by lazy {
9294
MangaDexService(client)
@@ -189,11 +191,11 @@ class MangaDex(delegate: HttpSource, val context: Context) :
189191

190192
@Deprecated("Use the 1.x API instead", replaceWith = ReplaceWith("getMangaDetails"))
191193
override fun fetchMangaDetails(manga: SManga): Observable<SManga> {
192-
return mangaHandler.fetchMangaDetailsObservable(manga, id)
194+
return mangaHandler.fetchMangaDetailsObservable(manga, id, coverQuality(), tryUsingFirstVolumeCover())
193195
}
194196

195197
override suspend fun getMangaDetails(manga: SManga): SManga {
196-
return mangaHandler.getMangaDetails(manga, id)
198+
return mangaHandler.getMangaDetails(manga, id, coverQuality(), tryUsingFirstVolumeCover())
197199
}
198200

199201
@Deprecated("Use the 1.x API instead", replaceWith = ReplaceWith("getChapterList"))
@@ -239,7 +241,7 @@ class MangaDex(delegate: HttpSource, val context: Context) :
239241
override fun newMetaInstance() = MangaDexSearchMetadata()
240242

241243
override suspend fun parseIntoMetadata(metadata: MangaDexSearchMetadata, input: Triple<MangaDto, List<String>, StatisticsMangaDto>) {
242-
apiMangaParser.parseIntoMetadata(metadata, input.first, input.second, input.third)
244+
apiMangaParser.parseIntoMetadata(metadata, input.first, input.second, input.third, null, coverQuality())
243245
}
244246

245247
// LoginSource methods
@@ -334,5 +336,17 @@ class MangaDex(delegate: HttpSource, val context: Context) :
334336
fun getBlockedUploaderPrefKey(dexLang: String): String {
335337
return "${blockedUploaderPref}_$dexLang"
336338
}
339+
340+
private const val coverQualityPref = "thumbnailQuality"
341+
342+
fun getCoverQualityPrefKey(dexLang: String): String {
343+
return "${coverQualityPref}_$dexLang"
344+
}
345+
346+
private const val tryUsingFirstVolumeCover = "tryUsingFirstVolumeCover"
347+
348+
fun getTryUsingFirstVolumeCoverKey(dexLang: String): String {
349+
return "${tryUsingFirstVolumeCover}_$dexLang"
350+
}
337351
}
338352
}

app/src/main/java/exh/md/dto/MangaDto.kt

+2-6
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,12 @@ data class ReadChapterDto(
104104

105105
@Serializable
106106
data class CoverListDto(
107-
val results: List<CoverDto>,
107+
val data: List<CoverDto>,
108108
)
109109

110110
@Serializable
111111
data class CoverDto(
112-
val data: CoverDataDto,
113-
)
114-
115-
@Serializable
116-
data class CoverDataDto(
112+
val id: String,
117113
val attributes: CoverAttributesDto,
118114
val relationships: List<RelationshipDto>,
119115
)

app/src/main/java/exh/md/handlers/ApiMangaParser.kt

+16-8
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ class ApiMangaParser(
4141
input: MangaDto,
4242
simpleChapters: List<String>,
4343
statistics: StatisticsMangaDto?,
44+
coverFileName: String?,
45+
coverQuality: String,
4446
): SManga {
4547
val mangaId = getManga.await(manga.url, sourceId)?.id
4648
val metadata = if (mangaId != null) {
@@ -50,7 +52,7 @@ class ApiMangaParser(
5052
newMetaInstance()
5153
}
5254

53-
parseIntoMetadata(metadata, input, simpleChapters, statistics)
55+
parseIntoMetadata(metadata, input, simpleChapters, statistics, coverFileName, coverQuality)
5456
if (mangaId != null) {
5557
metadata.mangaId = mangaId
5658
insertFlatMetadata.await(metadata.flatten())
@@ -64,6 +66,8 @@ class ApiMangaParser(
6466
mangaDto: MangaDto,
6567
simpleChapters: List<String>,
6668
statistics: StatisticsMangaDto?,
69+
coverFileName: String?,
70+
coverQuality: String,
6771
) {
6872
with(metadata) {
6973
try {
@@ -73,13 +77,17 @@ class ApiMangaParser(
7377
altTitles = mangaAttributesDto.altTitles.mapNotNull { it[lang] }.nullIfEmpty()
7478

7579
val mangaRelationshipsDto = mangaDto.data.relationships
76-
mangaRelationshipsDto
77-
.firstOrNull { relationshipDto -> relationshipDto.type == MdConstants.Types.coverArt }
78-
?.attributes
79-
?.fileName
80-
?.let { coverFileName ->
81-
cover = MdUtil.cdnCoverUrl(mangaDto.data.id, coverFileName)
82-
}
80+
cover = if (!coverFileName.isNullOrEmpty()) {
81+
MdUtil.cdnCoverUrl(mangaDto.data.id, "$coverFileName$coverQuality")
82+
} else {
83+
mangaRelationshipsDto
84+
.firstOrNull { relationshipDto -> relationshipDto.type == MdConstants.Types.coverArt }
85+
?.attributes
86+
?.fileName
87+
?.let { coverFileName ->
88+
MdUtil.cdnCoverUrl(mangaDto.data.id, "$coverFileName$coverQuality")
89+
}
90+
}
8391

8492
description = MdUtil.cleanDescription(
8593
MdUtil.getFromLangMap(

app/src/main/java/exh/md/handlers/MangaHandler.kt

+19-4
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@ class MangaHandler(
2323
private val apiMangaParser: ApiMangaParser,
2424
private val followsHandler: FollowsHandler,
2525
) {
26-
suspend fun getMangaDetails(manga: SManga, sourceId: Long): SManga {
26+
suspend fun getMangaDetails(
27+
manga: SManga,
28+
sourceId: Long,
29+
coverQuality: String,
30+
tryUsingFirstVolumeCover: Boolean,
31+
): SManga {
2732
return coroutineScope {
2833
val mangaId = MdUtil.getMangaId(manga.url)
2934
val response = async(Dispatchers.IO) { service.viewManga(mangaId) }
@@ -32,19 +37,29 @@ class MangaHandler(
3237
async(Dispatchers.IO) {
3338
kotlin.runCatching { service.mangasRating(mangaId) }.getOrNull()?.statistics?.get(mangaId)
3439
}
40+
val responseData = response.await()
41+
val coverFileName = if (tryUsingFirstVolumeCover) {
42+
async(Dispatchers.IO) {
43+
service.fetchFirstVolumeCover(responseData)
44+
}
45+
} else {
46+
null
47+
}
3548
apiMangaParser.parseToManga(
3649
manga,
3750
sourceId,
38-
response.await(),
51+
responseData,
3952
simpleChapters.await(),
4053
statistics.await(),
54+
coverFileName?.await(),
55+
coverQuality,
4156
)
4257
}
4358
}
4459

45-
fun fetchMangaDetailsObservable(manga: SManga, sourceId: Long): Observable<SManga> {
60+
fun fetchMangaDetailsObservable(manga: SManga, sourceId: Long, coverQuality: String, tryUsingFirstVolumeCover: Boolean): Observable<SManga> {
4661
return runAsObservable {
47-
getMangaDetails(manga, sourceId)
62+
getMangaDetails(manga, sourceId, coverQuality, tryUsingFirstVolumeCover)
4863
}
4964
}
5065

app/src/main/java/exh/md/service/MangaDexService.kt

+20
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import exh.md.dto.AtHomeDto
99
import exh.md.dto.AtHomeImageReportDto
1010
import exh.md.dto.ChapterDto
1111
import exh.md.dto.ChapterListDto
12+
import exh.md.dto.CoverListDto
1213
import exh.md.dto.MangaDto
1314
import exh.md.dto.MangaListDto
1415
import exh.md.dto.RelationListDto
@@ -209,4 +210,23 @@ class MangaDexService(
209210
).awaitSuccess().parseAs()
210211
}
211212
}
213+
214+
suspend fun fetchFirstVolumeCover(mangaDto: MangaDto): String? {
215+
val mangaData = mangaDto.data
216+
val result: CoverListDto = with(MdUtil.jsonParser) {
217+
client.newCall(
218+
GET(
219+
MdApi.cover.toHttpUrl().newBuilder()
220+
.apply {
221+
addQueryParameter("order[volume]", "asc")
222+
addQueryParameter("manga[]", mangaData.id)
223+
addQueryParameter("locales[]", mangaData.attributes.originalLanguage)
224+
addQueryParameter("limit", "1")
225+
}
226+
.build(),
227+
),
228+
).awaitSuccess().parseAs()
229+
}
230+
return result.data.firstOrNull()?.attributes?.fileName
231+
}
212232
}

app/src/main/java/exh/md/utils/MdApi.kt

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package exh.md.utils
33
object MdApi {
44
const val baseUrl = "https://api.mangadex.org"
55
const val manga = "$baseUrl/manga"
6+
const val cover = "$baseUrl/cover"
67
const val chapter = "$baseUrl/chapter"
78
const val group = "$baseUrl/group"
89
const val author = "$baseUrl/author"

0 commit comments

Comments
 (0)