TachiyomiSY-Plus/data/src/main/java/tachiyomi/data/manga/CustomMangaRepositoryImpl.kt
Luqman c835140fe8
Add custom Thumbnail Url. Support backup & restore (#1059)
* Add custom thumbnail url. Support backup & restore

- add custom thumbnail url in edit info/custom
- include it in backup n restore

* increase chop char

* edit chop char again to match screenshoot

* tweak truncating middle part

* apply edited cover to history, updates , others

* simplify placeholder logic

---------

Co-authored-by: jobobby04 <jobobby04@users.noreply.github.com>
2024-02-17 15:50:00 -05:00

107 lines
3.2 KiB
Kotlin

package tachiyomi.data.manga
import android.content.Context
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import tachiyomi.domain.manga.model.CustomMangaInfo
import tachiyomi.domain.manga.repository.CustomMangaRepository
import java.io.File
class CustomMangaRepositoryImpl(context: Context) : CustomMangaRepository {
private val editJson = File(context.getExternalFilesDir(null), "edits.json")
private val customMangaMap = fetchCustomData()
override fun get(mangaId: Long) = customMangaMap[mangaId]
private fun fetchCustomData(): MutableMap<Long, CustomMangaInfo> {
if (!editJson.exists() || !editJson.isFile) return mutableMapOf()
val json = try {
Json.decodeFromString<MangaList>(
editJson.bufferedReader().use { it.readText() },
)
} catch (e: Exception) {
null
} ?: return mutableMapOf()
val mangasJson = json.mangas ?: return mutableMapOf()
return mangasJson
.mapNotNull { mangaJson ->
val id = mangaJson.id ?: return@mapNotNull null
id to mangaJson.toManga()
}
.toMap()
.toMutableMap()
}
override fun set(mangaInfo: CustomMangaInfo) {
if (
mangaInfo.title == null &&
mangaInfo.author == null &&
mangaInfo.artist == null &&
mangaInfo.thumbnailUrl == null &&
mangaInfo.description == null &&
mangaInfo.genre == null &&
mangaInfo.status == null
) {
customMangaMap.remove(mangaInfo.id)
} else {
customMangaMap[mangaInfo.id] = mangaInfo
}
saveCustomInfo()
}
private fun saveCustomInfo() {
val jsonElements = customMangaMap.values.map { it.toJson() }
if (jsonElements.isNotEmpty()) {
editJson.delete()
editJson.writeText(Json.encodeToString(MangaList(jsonElements)))
}
}
@Serializable
data class MangaList(
val mangas: List<MangaJson>? = null,
)
@Serializable
data class MangaJson(
var id: Long? = null,
val title: String? = null,
val author: String? = null,
val artist: String? = null,
val thumbnailUrl: String? = null,
val description: String? = null,
val genre: List<String>? = null,
val status: Long? = null,
) {
fun toManga() = CustomMangaInfo(
id = this@MangaJson.id!!,
title = this@MangaJson.title?.takeUnless { it.isBlank() },
author = this@MangaJson.author,
artist = this@MangaJson.artist,
thumbnailUrl = this@MangaJson.thumbnailUrl,
description = this@MangaJson.description,
genre = this@MangaJson.genre,
status = this@MangaJson.status?.takeUnless { it == 0L },
)
}
fun CustomMangaInfo.toJson(): MangaJson {
return MangaJson(
id,
title,
author,
artist,
thumbnailUrl,
description,
genre,
status,
)
}
}