Add artist parsing, fix possibly broken author parsing

This commit is contained in:
Jobobby04 2021-05-07 14:13:45 -04:00
parent c3be087472
commit dd81e5f2b9
2 changed files with 29 additions and 11 deletions

View File

@ -3,6 +3,7 @@ package exh.md.handlers
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.parseAs
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
@ -61,11 +62,11 @@ class ApiMangaParser(val client: OkHttpClient, private val lang: String) {
/**
* Parse the manga details json into metadata object
*/
fun parseIntoMetadata(metadata: MangaDexSearchMetadata, input: Response, coverUrls: List<String>) {
suspend fun parseIntoMetadata(metadata: MangaDexSearchMetadata, input: Response, coverUrls: List<String>) {
parseIntoMetadata(metadata, input.parseAs<MangaResponse>(MdUtil.jsonParser), coverUrls)
}
fun parseIntoMetadata(metadata: MangaDexSearchMetadata, networkApiManga: MangaResponse, coverUrls: List<String>) {
suspend fun parseIntoMetadata(metadata: MangaDexSearchMetadata, networkApiManga: MangaResponse, coverUrls: List<String>) {
with(metadata) {
try {
val networkManga = networkApiManga.data.attributes
@ -80,16 +81,29 @@ class ApiMangaParser(val client: OkHttpClient, private val lang: String) {
// networkManga.mainCover
}
description = MdUtil.cleanDescription(networkManga.description["en"]!!)
description = MdUtil.cleanDescription(networkManga.description[lang] ?: networkManga.description["en"]!!)
val authorIds = networkApiManga.relationships.filter { it.type.equals("author", true) }.distinct()
// get authors ignore if they error, artists are labelled as authors currently
val authorIds = networkApiManga.relationships.filter { relationship ->
relationship.type.equals("author", true)
}.map { relationship -> relationship.id }
.distinct()
val artistIds = networkApiManga.relationships.filter { relationship ->
relationship.type.equals("artist", true)
}.map { relationship -> relationship.id }
.distinct()
authors = runCatching {
val ids = authorIds.joinToString("&ids[]=", "?ids[]=")
val response = client.newCall(GET("${MdUtil.authorUrl}$ids")).execute()
val json = response.parseAs<AuthorResponseList>(MdUtil.jsonParser)
json.results.map { MdUtil.cleanString(it.data.attributes.name) }.takeUnless { it.isEmpty() }
}.getOrNull()
val authorMap = runCatching {
val ids = (authorIds + artistIds).distinct().joinToString("&ids[]=", "?ids[]=")
val response = client.newCall(GET("${MdUtil.authorUrl}$ids")).await()
.parseAs<AuthorResponseList>()
response.results.map {
it.data.id to MdUtil.cleanString(it.data.attributes.name)
}.toMap()
}.getOrNull() ?: emptyMap()
authors = authorIds.mapNotNull { authorMap[it] }.takeUnless { it.isEmpty() }
artists = artistIds.mapNotNull { authorMap[it] }.takeUnless { it.isEmpty() }
langFlag = networkManga.originalLanguage
val lastChapter = networkManga.lastChapter.toFloatOrNull()

View File

@ -22,6 +22,7 @@ class MangaDexSearchMetadata : RaisedSearchMetadata() {
var description: String? = null
var authors: List<String>? = null
var artists: List<String>? = null
var langFlag: String? = null
@ -52,6 +53,8 @@ class MangaDexSearchMetadata : RaisedSearchMetadata() {
val author = authors?.joinToString()?.let { MdUtil.cleanString(it) }
val artist = artists?.joinToString()?.let { MdUtil.cleanString(it) }
val status = status
val genres = tagsToGenreList()
@ -63,6 +66,7 @@ class MangaDexSearchMetadata : RaisedSearchMetadata() {
title = title ?: manga.title,
cover = cover ?: manga.cover,
author = author ?: manga.author,
artist = artist ?: manga.artist,
status = status ?: manga.status,
genres = genres,
description = description ?: manga.description
@ -76,7 +80,7 @@ class MangaDexSearchMetadata : RaisedSearchMetadata() {
cover?.let { pairs += context.getString(R.string.thumbnail_url) to it }
title?.let { pairs += context.getString(R.string.title) to it }
authors?.let { pairs += context.getString(R.string.author) to it.joinToString() }
// artist?.let { pairs += context.getString(R.string.artist) to it }
artists?.let { pairs += context.getString(R.string.artist) to it.joinToString() }
langFlag?.let { pairs += context.getString(R.string.language) to it }
lastChapterNumber?.let { pairs += context.getString(R.string.last_chapter_number) to it.toString() }
// rating?.let { pairs += context.getString(R.string.average_rating) to it }