From fcfa62f220d1bdf1736d5230bfcc0b22117e4c2c Mon Sep 17 00:00:00 2001 From: Shamicen <84282253+Shamicen@users.noreply.github.com> Date: Fri, 23 Jun 2023 23:56:01 +0200 Subject: [PATCH] Better handle decimal chapter numbers and add categories in ComicInfo.xml files (#9604) * Serialize whole chapter numbers without decimal point and add library categories to genre * added Tachiyomi specific ComicInfo Category field * lint * implemented requested changes --- .../main/java/eu/kanade/domain/manga/model/Manga.kt | 11 +++++++++-- .../eu/kanade/tachiyomi/data/download/Downloader.kt | 7 +++++-- .../tachiyomi/core/metadata/comicinfo/ComicInfo.kt | 7 ++++++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt b/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt index 50eb84be64..94c1353f97 100644 --- a/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt +++ b/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt @@ -95,10 +95,16 @@ fun Manga.hasCustomCover(coverCache: CoverCache = Injekt.get()): Boolean { /** * Creates a ComicInfo instance based on the manga and chapter metadata. */ -fun getComicInfo(manga: Manga, chapter: Chapter, chapterUrl: String) = ComicInfo( +fun getComicInfo(manga: Manga, chapter: Chapter, chapterUrl: String, categories: List?) = ComicInfo( title = ComicInfo.Title(chapter.name), series = ComicInfo.Series(manga.title), - number = chapter.chapterNumber.takeIf { it >= 0 }?.let { ComicInfo.Number(it.toString()) }, + number = chapter.chapterNumber.takeIf { it >= 0 }?.let { + if ((it.rem(1) == 0.0F)) { + ComicInfo.Number(it.toInt().toString()) + } else { + ComicInfo.Number(it.toString()) + } + }, web = ComicInfo.Web(chapterUrl), summary = manga.description?.let { ComicInfo.Summary(it) }, writer = manga.author?.let { ComicInfo.Writer(it) }, @@ -108,6 +114,7 @@ fun getComicInfo(manga: Manga, chapter: Chapter, chapterUrl: String) = ComicInfo publishingStatus = ComicInfo.PublishingStatusTachiyomi( ComicInfoPublishingStatus.toComicInfoValue(manga.status), ), + categories = categories?.let { ComicInfo.CategoriesTachiyomi(it.joinToString()) }, inker = null, colorist = null, letterer = null, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt index 49cc985347..4ae5cfade1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt @@ -50,6 +50,7 @@ import tachiyomi.core.util.lang.withIOContext import tachiyomi.core.util.lang.withUIContext import tachiyomi.core.util.system.ImageUtil import tachiyomi.core.util.system.logcat +import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.manga.model.Manga @@ -75,6 +76,7 @@ class Downloader( private val chapterCache: ChapterCache = Injekt.get(), private val downloadPreferences: DownloadPreferences = Injekt.get(), private val xml: XML = Injekt.get(), + private val getCategories: GetCategories = Injekt.get(), ) { /** @@ -621,14 +623,15 @@ class Downloader( /** * Creates a ComicInfo.xml file inside the given directory. */ - private fun createComicInfoFile( + private suspend fun createComicInfoFile( dir: UniFile, manga: Manga, chapter: Chapter, source: HttpSource, ) { val chapterUrl = source.getChapterUrl(chapter.toSChapter()) - val comicInfo = getComicInfo(manga, chapter, chapterUrl) + val categories = getCategories.await(manga.id).map { it.name.trim() }.takeUnless { it.isEmpty() } + val comicInfo = getComicInfo(manga, chapter, chapterUrl, categories) // Remove the old file dir.findFile(COMIC_INFO_FILE)?.delete() dir.createFile(COMIC_INFO_FILE).openOutputStream().use { diff --git a/core-metadata/src/main/java/tachiyomi/core/metadata/comicinfo/ComicInfo.kt b/core-metadata/src/main/java/tachiyomi/core/metadata/comicinfo/ComicInfo.kt index b215b49936..76186216d3 100644 --- a/core-metadata/src/main/java/tachiyomi/core/metadata/comicinfo/ComicInfo.kt +++ b/core-metadata/src/main/java/tachiyomi/core/metadata/comicinfo/ComicInfo.kt @@ -16,8 +16,8 @@ fun SManga.copyFromComicInfo(comicInfo: ComicInfo) { listOfNotNull( comicInfo.genre?.value, comicInfo.tags?.value, + comicInfo.categories?.value, ) - .flatMap { it.split(", ") } .distinct() .joinToString(", ") { it.trim() } .takeIf { it.isNotEmpty() } @@ -57,6 +57,7 @@ data class ComicInfo( val tags: Tags?, val web: Web?, val publishingStatus: PublishingStatusTachiyomi?, + val categories: CategoriesTachiyomi?, ) { @Suppress("UNUSED") @XmlElement(false) @@ -128,6 +129,10 @@ data class ComicInfo( @Serializable @XmlSerialName("PublishingStatusTachiyomi", "http://www.w3.org/2001/XMLSchema", "ty") data class PublishingStatusTachiyomi(@XmlValue(true) val value: String = "") + + @Serializable + @XmlSerialName("Categories", "http://www.w3.org/2001/XMLSchema", "ty") + data class CategoriesTachiyomi(@XmlValue(true) val value: String = "") } enum class ComicInfoPublishingStatus(