From 31524247823e84a497b11efd5c33264e628c4990 Mon Sep 17 00:00:00 2001 From: Gauthier Date: Tue, 5 Nov 2019 11:03:19 +0800 Subject: [PATCH] [Komga] add filters by library (#1638) * add filters by library * add custom User-Agent, Komga server can log it to identify clients * use BuildConfig for version name in User-Agent * add file size to chapter name --- src/all/komga/build.gradle | 4 +- .../tachiyomi/extension/all/komga/Komga.kt | 76 +++++++++++++++---- .../tachiyomi/extension/all/komga/dto/Dto.kt | 9 ++- 3 files changed, 73 insertions(+), 16 deletions(-) diff --git a/src/all/komga/build.gradle b/src/all/komga/build.gradle index 1265ae482..e8693f8c5 100644 --- a/src/all/komga/build.gradle +++ b/src/all/komga/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: Komga' pkgNameSuffix = 'all.komga' extClass = '.Komga' - extVersionCode = 2 + extVersionCode = 3 libVersion = '1.2' } @@ -14,6 +14,8 @@ dependencies { compileOnly 'com.google.code.gson:gson:2.8.5' compileOnly 'com.github.salomonbrys.kotson:kotson:2.5.0' compileOnly 'com.github.inorichi.injekt:injekt-core:65b0440' + implementation 'io.reactivex:rxandroid:1.2.1' + implementation 'io.reactivex:rxjava:1.3.6' } apply from: "$rootDir/common.gradle" diff --git a/src/all/komga/src/eu/kanade/tachiyomi/extension/all/komga/Komga.kt b/src/all/komga/src/eu/kanade/tachiyomi/extension/all/komga/Komga.kt index 9f397b12f..5b6920a84 100644 --- a/src/all/komga/src/eu/kanade/tachiyomi/extension/all/komga/Komga.kt +++ b/src/all/komga/src/eu/kanade/tachiyomi/extension/all/komga/Komga.kt @@ -7,15 +7,16 @@ import android.support.v7.preference.PreferenceScreen import android.widget.Toast import com.github.salomonbrys.kotson.fromJson import com.google.gson.Gson -import eu.kanade.tachiyomi.extension.all.komga.dto.BookDto -import eu.kanade.tachiyomi.extension.all.komga.dto.PageDto -import eu.kanade.tachiyomi.extension.all.komga.dto.PageWrapperDto -import eu.kanade.tachiyomi.extension.all.komga.dto.SerieDto +import eu.kanade.tachiyomi.extension.BuildConfig +import eu.kanade.tachiyomi.extension.all.komga.dto.* import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.model.* import eu.kanade.tachiyomi.source.online.HttpSource import okhttp3.* +import rx.Single +import rx.android.schedulers.AndroidSchedulers +import rx.schedulers.Schedulers import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.text.SimpleDateFormat @@ -35,8 +36,27 @@ open class Komga : ConfigurableSource, HttpSource() { override fun latestUpdatesParse(response: Response): MangasPage = processSeriePage(response) - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = - GET("$baseUrl/api/v1/series?search=$query&page=${page - 1}", headers) + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = HttpUrl.parse("$baseUrl/api/v1/series?search=$query&page=${page - 1}")!!.newBuilder() + + filters.forEach { filter -> + when (filter) { + is LibraryGroup -> { + val libraryToInclude = mutableListOf() + filter.state.forEach { content -> + if (content.state) { + libraryToInclude.add(content.id) + } + } + if (libraryToInclude.isNotEmpty()) { + url.addQueryParameter("library_id", libraryToInclude.joinToString(",")) + } + } + } + } + + return GET(url.toString(), headers) + } override fun searchMangaParse(response: Response): MangasPage = processSeriePage(response) @@ -45,8 +65,8 @@ open class Komga : ConfigurableSource, HttpSource() { GET(baseUrl + manga.url, headers) override fun mangaDetailsParse(response: Response): SManga { - val serie = gson.fromJson(response.body()?.charStream()!!) - return serie.toSManga() + val series = gson.fromJson(response.body()?.charStream()!!) + return series.toSManga() } override fun chapterListRequest(manga: SManga): Request = @@ -60,7 +80,7 @@ open class Komga : ConfigurableSource, HttpSource() { return page.content.mapIndexed { i, book -> SChapter.create().apply { chapter_number = (i + 1).toFloat() - name = book.name + name = "${book.name} (${book.size})" url = "$chapterListUrl/${book.id}" date_upload = parseDate(book.lastModified) } @@ -87,14 +107,14 @@ open class Komga : ConfigurableSource, HttpSource() { } private fun processSeriePage(response: Response): MangasPage { - val page = gson.fromJson>(response.body()?.charStream()!!) + val page = gson.fromJson>(response.body()?.charStream()!!) val mangas = page.content.map { it.toSManga() } return MangasPage(mangas, !page.last) } - private fun SerieDto.toSManga(): SManga = + private fun SeriesDto.toSManga(): SManga = SManga.create().apply { title = this@toSManga.name url = "/api/v1/series/${this@toSManga.id}" @@ -119,19 +139,47 @@ open class Komga : ConfigurableSource, HttpSource() { override fun imageUrlParse(response: Response): String = "" - override val name = "Komga" - override val lang = "en" + private class LibraryFilter(val id: Long, name: String) : Filter.CheckBox(name, false) + private class LibraryGroup(libraries: List) : Filter.Group("Libraries", libraries) + override fun getFilterList(): FilterList = + FilterList( + LibraryGroup(libraries.map { LibraryFilter(it.id, it.name) }.sortedBy { it.name }) + ) + + private var libraries = emptyList() + + + override val name = "Komga" + + override val lang = "en" override val supportsLatest = true + override val baseUrl by lazy { getPrefBaseUrl() } private val username by lazy { getPrefUsername() } private val password by lazy { getPrefPassword() } - private val gson by lazy { Gson() } + init { + Single.fromCallable { + client.newCall(GET("$baseUrl/api/v1/libraries", headers)).execute() + } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + libraries = try { + gson.fromJson(it.body()?.charStream()!!) + } catch (e: Exception) { + emptyList() + } + }, {}) + + } + override fun headersBuilder(): Headers.Builder = Headers.Builder() .add("Authorization", Credentials.basic(username, password)) + .add("User-Agent", "Tachiyomi Komga v${BuildConfig.VERSION_NAME}") private val preferences: SharedPreferences by lazy { Injekt.get().getSharedPreferences("source_$id", 0x0000) diff --git a/src/all/komga/src/eu/kanade/tachiyomi/extension/all/komga/dto/Dto.kt b/src/all/komga/src/eu/kanade/tachiyomi/extension/all/komga/dto/Dto.kt index d7b283f5d..62c48ea6f 100644 --- a/src/all/komga/src/eu/kanade/tachiyomi/extension/all/komga/dto/Dto.kt +++ b/src/all/komga/src/eu/kanade/tachiyomi/extension/all/komga/dto/Dto.kt @@ -1,6 +1,11 @@ package eu.kanade.tachiyomi.extension.all.komga.dto -data class SerieDto( +data class LibraryDto( + val id: Long, + val name: String +) + +data class SeriesDto( val id: Long, val name: String, val lastModified: String? @@ -10,6 +15,8 @@ data class BookDto( val id: Long, val name: String, val lastModified: String?, + val sizeBytes: Long, + val size: String, val metadata: BookMetadataDto )