diff --git a/src/all/komga/CHANGELOG.md b/src/all/komga/CHANGELOG.md new file mode 100644 index 000000000..ac5f9f374 --- /dev/null +++ b/src/all/komga/CHANGELOG.md @@ -0,0 +1,84 @@ +## [1.2.12] + +Requires Komga `0.41.0` + +### Features + +* filter by collection + +## [1.2.11] + +Requires Komga `0.35.2` + +### Features + +* Set password preferences inputTypes + +## [1.2.10] + +Requires Komga `0.35.2` + +### Features + +* unread only filter (closes gotson/komga#180) +* prefix book titles with number (closes gotson/komga#169) + +## [1.2.9] + +Requires Komga `0.22.0` + +### Features + +* use SourceFactory to have multiple Komga servers (3 for the moment) + +## [1.2.8] + +Requires Komga `0.22.0` + +### Features + +* use book metadata title for chapter display name +* use book metadata sort number for chapter number + +## [1.2.7] + +### Features + +* use series metadata title for display name +* filter on series status + +## [1.2.6] + +### Features + +* Add support for AndroidX preferences + +## [1.2.5] + +### Features + +* add sort options in filter + +## [1.2.4] + +### Features + +* better handling of authentication + +## [1.2.3] + +### Features + +* filters by library + +## [1.2.2] + +### Features + +* request converted image from server if format is not supported + +## [1.2.1] + +### Features + +* first version \ No newline at end of file diff --git a/src/all/komga/build.gradle b/src/all/komga/build.gradle index 9d76dffe7..e56739d40 100644 --- a/src/all/komga/build.gradle +++ b/src/all/komga/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'Komga' pkgNameSuffix = 'all.komga' extClass = '.KomgaFactory' - extVersionCode = 11 + extVersionCode = 12 libVersion = '1.2' } 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 4789293ce..d078dd31b 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 @@ -10,6 +10,7 @@ import com.github.salomonbrys.kotson.fromJson import com.google.gson.Gson import eu.kanade.tachiyomi.extension.BuildConfig import eu.kanade.tachiyomi.extension.all.komga.dto.BookDto +import eu.kanade.tachiyomi.extension.all.komga.dto.CollectionDto import eu.kanade.tachiyomi.extension.all.komga.dto.LibraryDto import eu.kanade.tachiyomi.extension.all.komga.dto.PageDto import eu.kanade.tachiyomi.extension.all.komga.dto.PageWrapperDto @@ -23,10 +24,6 @@ import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource -import java.text.DecimalFormat -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale import okhttp3.Credentials import okhttp3.Headers import okhttp3.HttpUrl @@ -38,6 +35,10 @@ import rx.android.schedulers.AndroidSchedulers import rx.schedulers.Schedulers import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.text.DecimalFormat +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale open class Komga(suffix: String = "") : ConfigurableSource, HttpSource() { override fun popularMangaRequest(page: Int): Request = @@ -73,6 +74,17 @@ open class Komga(suffix: String = "") : ConfigurableSource, HttpSource() { url.addQueryParameter("library_id", libraryToInclude.joinToString(",")) } } + is CollectionGroup -> { + val collectionToInclude = mutableListOf() + filter.state.forEach { content -> + if (content.state) { + collectionToInclude.add(content.id) + } + } + if (collectionToInclude.isNotEmpty()) { + url.addQueryParameter("collection_id", collectionToInclude.joinToString(",")) + } + } is StatusGroup -> { val statusToInclude = mutableListOf() filter.state.forEach { content -> @@ -187,6 +199,8 @@ open class Komga(suffix: String = "") : ConfigurableSource, HttpSource() { private class LibraryFilter(val id: Long, name: String) : Filter.CheckBox(name, false) private class LibraryGroup(libraries: List) : Filter.Group("Libraries", libraries) + private class CollectionFilter(val id: Long, name: String) : Filter.CheckBox(name, false) + private class CollectionGroup(collections: List) : Filter.Group("Collections", collections) private class SeriesSort : Filter.Sort("Sort", arrayOf("Alphabetically", "Date added", "Date updated"), Selection(0, true)) private class StatusFilter(name: String) : Filter.CheckBox(name, false) private class StatusGroup(filters: List) : Filter.Group("Status", filters) @@ -195,12 +209,14 @@ open class Komga(suffix: String = "") : ConfigurableSource, HttpSource() { override fun getFilterList(): FilterList = FilterList( UnreadOnly(), - LibraryGroup(libraries.map { LibraryFilter(it.id, it.name) }.sortedBy { it.name }), + LibraryGroup(libraries.map { LibraryFilter(it.id, it.name) }.sortedBy { it.name.toLowerCase() }), + CollectionGroup(collections.map { CollectionFilter(it.id, it.name) }.sortedBy { it.name.toLowerCase() }), StatusGroup(listOf("Ongoing", "Ended", "Abandoned", "Hiatus").map { StatusFilter(it) }), SeriesSort() ) private var libraries = emptyList() + private var collections = emptyList() override val name = "Komga${if (suffix.isNotBlank()) " ($suffix)" else ""}" override val lang = "en" @@ -311,6 +327,19 @@ open class Komga(suffix: String = "") : ConfigurableSource, HttpSource() { emptyList() } }, {}) + + Single.fromCallable { + client.newCall(GET("$baseUrl/api/v1/collections?unpaged=true", headers)).execute() + } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + collections = try { + gson.fromJson>(it.body()?.charStream()!!).content + } catch (e: Exception) { + emptyList() + } + }, {}) } companion object { 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 c001520a3..95b9435a1 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 @@ -75,3 +75,13 @@ data class AuthorDto( val name: String, val role: String ) + +data class CollectionDto( + val id: Long, + val name: String, + val ordered: Boolean, + val seriesIds: List, + val createdDate: String, + val lastModifiedDate: String, + val filtered: Boolean +)