filter by genres, tags and publishers (#4211)

This commit is contained in:
Gauthier 2020-08-26 18:20:47 +08:00 committed by GitHub
parent d7981d8b16
commit 6e5772ecfd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 96 additions and 3 deletions

View File

@ -1,3 +1,11 @@
## 1.2.16
Minimum Komga version required: `0.59.0`
### Features
* filter by genres, tags and publishers
## 1.2.15
Minimum Komga version required: `0.56.0`
@ -5,6 +13,7 @@ Minimum Komga version required: `0.56.0`
### Features
* remove the 1000 chapters limit
* display series description and tags (genres + tags)
## 1.2.14

View File

@ -5,7 +5,7 @@ ext {
extName = 'Komga'
pkgNameSuffix = 'all.komga'
extClass = '.KomgaFactory'
extVersionCode = 15
extVersionCode = 16
libVersion = '1.2'
}

View File

@ -95,6 +95,39 @@ open class Komga(suffix: String = "") : ConfigurableSource, HttpSource() {
url.addQueryParameter("status", statusToInclude.joinToString(","))
}
}
is GenreGroup -> {
val genreToInclude = mutableListOf<String>()
filter.state.forEach { content ->
if (content.state) {
genreToInclude.add(content.name)
}
}
if (genreToInclude.isNotEmpty()) {
url.addQueryParameter("genre", genreToInclude.joinToString(","))
}
}
is TagGroup -> {
val tagToInclude = mutableListOf<String>()
filter.state.forEach { content ->
if (content.state) {
tagToInclude.add(content.name)
}
}
if (tagToInclude.isNotEmpty()) {
url.addQueryParameter("tag", tagToInclude.joinToString(","))
}
}
is PublisherGroup -> {
val publisherToInclude = mutableListOf<String>()
filter.state.forEach { content ->
if (content.state) {
publisherToInclude.add(content.name)
}
}
if (publisherToInclude.isNotEmpty()) {
url.addQueryParameter("publisher", publisherToInclude.joinToString(","))
}
}
is Filter.Sort -> {
var sortCriteria = when (filter.state?.index) {
0 -> "metadata.titleSort"
@ -212,6 +245,12 @@ open class Komga(suffix: String = "") : ConfigurableSource, HttpSource() {
private class StatusFilter(name: String) : Filter.CheckBox(name, false)
private class StatusGroup(filters: List<StatusFilter>) : Filter.Group<StatusFilter>("Status", filters)
private class UnreadOnly : Filter.CheckBox("Unread only", false)
private class GenreFilter(genre: String) : Filter.CheckBox(genre, false)
private class GenreGroup(genres: List<GenreFilter>) : Filter.Group<GenreFilter>("Genres", genres)
private class TagFilter(tag: String) : Filter.CheckBox(tag, false)
private class TagGroup(tags: List<TagFilter>) : Filter.Group<TagFilter>("Tags", tags)
private class PublisherFilter(publisher: String) : Filter.CheckBox(publisher, false)
private class PublisherGroup(publishers: List<PublisherFilter>) : Filter.Group<PublisherFilter>("Publishers", publishers)
override fun getFilterList(): FilterList =
FilterList(
@ -219,11 +258,17 @@ open class Komga(suffix: String = "") : ConfigurableSource, HttpSource() {
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) }),
GenreGroup(genres.map { GenreFilter(it) }),
TagGroup(tags.map { TagFilter(it) }),
PublisherGroup(publishers.map { PublisherFilter(it) }),
SeriesSort()
)
private var libraries = emptyList<LibraryDto>()
private var collections = emptyList<CollectionDto>()
private var genres = emptySet<String>()
private var tags = emptySet<String>()
private var publishers = emptySet<String>()
override val name = "Komga${if (suffix.isNotBlank()) " ($suffix)" else ""}"
override val lang = "en"
@ -345,6 +390,45 @@ open class Komga(suffix: String = "") : ConfigurableSource, HttpSource() {
emptyList()
}
}, {})
Single.fromCallable {
client.newCall(GET("$baseUrl/api/v1/genres", headers)).execute()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ response ->
genres = try {
gson.fromJson(response.body()?.charStream()!!)
} catch (e: Exception) {
emptySet()
}
}, {})
Single.fromCallable {
client.newCall(GET("$baseUrl/api/v1/tags", headers)).execute()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ response ->
tags = try {
gson.fromJson(response.body()?.charStream()!!)
} catch (e: Exception) {
emptySet()
}
}, {})
Single.fromCallable {
client.newCall(GET("$baseUrl/api/v1/publishers", headers)).execute()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ response ->
publishers = try {
gson.fromJson(response.body()?.charStream()!!)
} catch (e: Exception) {
emptySet()
}
}, {})
}
companion object {

View File

@ -32,9 +32,9 @@ data class SeriesMetadataDto(
val ageRatingLock: Boolean,
val language: String,
val languageLock: Boolean,
val genres: Set<String>?, //TODO: remove optional in next iteration
val genres: Set<String>?, // TODO: remove optional in next iteration
val genresLock: Boolean,
val tags: Set<String>?, //TODO: remove optional in next iteration
val tags: Set<String>?, // TODO: remove optional in next iteration
val tagsLock: Boolean
)