From dd81e5f2b9c58cfa6d64e159aab8fb205b2225af Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Fri, 7 May 2021 14:13:45 -0400 Subject: [PATCH] Add artist parsing, fix possibly broken author parsing --- .../java/exh/md/handlers/ApiMangaParser.kt | 34 +++++++++++++------ .../metadata/MangaDexSearchMetadata.kt | 6 +++- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/exh/md/handlers/ApiMangaParser.kt b/app/src/main/java/exh/md/handlers/ApiMangaParser.kt index b3e341d3f..6ba762acb 100644 --- a/app/src/main/java/exh/md/handlers/ApiMangaParser.kt +++ b/app/src/main/java/exh/md/handlers/ApiMangaParser.kt @@ -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) { + suspend fun parseIntoMetadata(metadata: MangaDexSearchMetadata, input: Response, coverUrls: List) { parseIntoMetadata(metadata, input.parseAs(MdUtil.jsonParser), coverUrls) } - fun parseIntoMetadata(metadata: MangaDexSearchMetadata, networkApiManga: MangaResponse, coverUrls: List) { + suspend fun parseIntoMetadata(metadata: MangaDexSearchMetadata, networkApiManga: MangaResponse, coverUrls: List) { 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(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() + 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() diff --git a/app/src/main/java/exh/metadata/metadata/MangaDexSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/MangaDexSearchMetadata.kt index 540e74dff..ba2bd7871 100644 --- a/app/src/main/java/exh/metadata/metadata/MangaDexSearchMetadata.kt +++ b/app/src/main/java/exh/metadata/metadata/MangaDexSearchMetadata.kt @@ -22,6 +22,7 @@ class MangaDexSearchMetadata : RaisedSearchMetadata() { var description: String? = null var authors: List? = null + var artists: List? = 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 }