-
Notifications
You must be signed in to change notification settings - Fork 573
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(en/mangafire): rework mangafire extension (#7625)
* fix(en/mangafire): rework mangafire extension * oops * remove non-null assert * small fixes
- Loading branch information
Showing
3 changed files
with
345 additions
and
332 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
324 changes: 174 additions & 150 deletions
324
src/all/mangafire/src/eu/kanade/tachiyomi/extension/all/mangafire/Filters.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,166 +1,190 @@ | ||
package eu.kanade.tachiyomi.extension.all.mangafire | ||
|
||
import eu.kanade.tachiyomi.source.model.Filter | ||
import okhttp3.HttpUrl | ||
import java.util.Calendar | ||
|
||
class Entry(name: String, val id: String) : Filter.CheckBox(name) { | ||
constructor(name: String) : this(name, name) | ||
interface UriFilter { | ||
fun addToUri(builder: HttpUrl.Builder) | ||
} | ||
|
||
sealed class Group( | ||
open class UriPartFilter( | ||
name: String, | ||
val param: String, | ||
values: List<Entry>, | ||
) : Filter.Group<Entry>(name, values) | ||
private val param: String, | ||
private val vals: Array<Pair<String, String>>, | ||
defaultValue: String? = null, | ||
) : Filter.Select<String>( | ||
name, | ||
vals.map { it.first }.toTypedArray(), | ||
vals.indexOfFirst { it.second == defaultValue }.takeIf { it != -1 } ?: 0, | ||
), | ||
UriFilter { | ||
override fun addToUri(builder: HttpUrl.Builder) { | ||
builder.addQueryParameter(param, vals[state].second) | ||
} | ||
} | ||
|
||
open class UriMultiSelectOption(name: String, val value: String) : Filter.CheckBox(name) | ||
|
||
open class UriMultiSelectFilter( | ||
name: String, | ||
private val param: String, | ||
private val vals: Array<Pair<String, String>>, | ||
) : Filter.Group<UriMultiSelectOption>(name, vals.map { UriMultiSelectOption(it.first, it.second) }), UriFilter { | ||
override fun addToUri(builder: HttpUrl.Builder) { | ||
val checked = state.filter { it.state } | ||
|
||
checked.forEach { | ||
builder.addQueryParameter(param, it.value) | ||
} | ||
} | ||
} | ||
|
||
open class UriTriSelectOption(name: String, val value: String) : Filter.TriState(name) | ||
|
||
sealed class Select( | ||
open class UriTriSelectFilter( | ||
name: String, | ||
val param: String, | ||
private val valuesMap: Map<String, String>, | ||
) : Filter.Select<String>(name, valuesMap.keys.toTypedArray()) { | ||
open val selection: String | ||
get() = valuesMap[values[state]]!! | ||
private val param: String, | ||
private val vals: Array<Pair<String, String>>, | ||
) : Filter.Group<UriTriSelectOption>(name, vals.map { UriTriSelectOption(it.first, it.second) }), UriFilter { | ||
override fun addToUri(builder: HttpUrl.Builder) { | ||
state.forEach { s -> | ||
when (s.state) { | ||
TriState.STATE_INCLUDE -> builder.addQueryParameter(param, s.value) | ||
TriState.STATE_EXCLUDE -> builder.addQueryParameter(param, "-${s.value}") | ||
} | ||
} | ||
} | ||
} | ||
|
||
class TypeFilter : UriPartFilter( | ||
"Type", | ||
"type", | ||
arrayOf( | ||
Pair("Manga", "manga"), | ||
Pair("One-Shot", "one_shot"), | ||
Pair("Doujinshi", "doujinshi"), | ||
Pair("Novel", "novel"), | ||
Pair("Manhwa", "manhwa"), | ||
Pair("Manhua", "manhua"), | ||
), | ||
) | ||
|
||
class GenreFilter : UriTriSelectFilter( | ||
"Genres", | ||
"genre[]", | ||
arrayOf( | ||
Pair("Action", "1"), | ||
Pair("Adventure", "78"), | ||
Pair("Avant Garde", "3"), | ||
Pair("Boys Love", "4"), | ||
Pair("Comedy", "5"), | ||
Pair("Demons", "77"), | ||
Pair("Drama", "6"), | ||
Pair("Ecchi", "7"), | ||
Pair("Fantasy", "79"), | ||
Pair("Girls Love", "9"), | ||
Pair("Gourmet", "10"), | ||
Pair("Harem", "11"), | ||
Pair("Horror", "530"), | ||
Pair("Isekai", "13"), | ||
Pair("Iyashikei", "531"), | ||
Pair("Josei", "15"), | ||
Pair("Kids", "532"), | ||
Pair("Magic", "539"), | ||
Pair("Mahou Shoujo", "533"), | ||
Pair("Martial Arts", "534"), | ||
Pair("Mecha", "19"), | ||
Pair("Military", "535"), | ||
Pair("Music", "21"), | ||
Pair("Mystery", "22"), | ||
Pair("Parody", "23"), | ||
Pair("Psychological", "536"), | ||
Pair("Reverse Harem", "25"), | ||
Pair("Romance", "26"), | ||
Pair("School", "73"), | ||
Pair("Sci-Fi", "28"), | ||
Pair("Seinen", "537"), | ||
Pair("Shoujo", "30"), | ||
Pair("Shounen", "31"), | ||
Pair("Slice of Life", "538"), | ||
Pair("Space", "33"), | ||
Pair("Sports", "34"), | ||
Pair("Super Power", "75"), | ||
Pair("Supernatural", "76"), | ||
Pair("Suspense", "37"), | ||
Pair("Thriller", "38"), | ||
Pair("Vampire", "39"), | ||
), | ||
) | ||
|
||
class GenreModeFilter : Filter.CheckBox("Must have all the selected genres"), UriFilter { | ||
override fun addToUri(builder: HttpUrl.Builder) { | ||
if (state) { | ||
builder.addQueryParameter("genre_mode", "and") | ||
} | ||
} | ||
} | ||
|
||
class TypeFilter : Group("Type", "type[]", types) | ||
|
||
private val types: List<Entry> | ||
get() = listOf( | ||
Entry("Manga", "manga"), | ||
Entry("One-Shot", "one_shot"), | ||
Entry("Doujinshi", "doujinshi"), | ||
Entry("Light-Novel", "light_novel"), | ||
Entry("Novel", "novel"), | ||
Entry("Manhwa", "manhwa"), | ||
Entry("Manhua", "manhua"), | ||
) | ||
|
||
class Genre(name: String, val id: String) : Filter.TriState(name) { | ||
val selection: String | ||
get() = (if (isExcluded()) "-" else "") + id | ||
class StatusFilter : UriMultiSelectFilter( | ||
"Status", | ||
"status[]", | ||
arrayOf( | ||
Pair("Completed", "completed"), | ||
Pair("Releasing", "releasing"), | ||
Pair("On Hiatus", "on_hiatus"), | ||
Pair("Discontinued", "discontinued"), | ||
Pair("Not Yet Published", "info"), | ||
), | ||
) | ||
|
||
class YearFilter : UriMultiSelectFilter( | ||
"Year", | ||
"year[]", | ||
years, | ||
) { | ||
companion object { | ||
private val currentYear by lazy { | ||
Calendar.getInstance()[Calendar.YEAR] | ||
} | ||
|
||
private val years: Array<Pair<String, String>> = buildList(29) { | ||
addAll( | ||
(currentYear downTo (currentYear - 20)).map(Int::toString), | ||
) | ||
|
||
addAll( | ||
(2000 downTo 1930 step 10).map { "${it}s" }, | ||
) | ||
}.map { Pair(it, it) }.toTypedArray() | ||
} | ||
} | ||
|
||
class GenresFilter : Filter.Group<Genre>("Genre", genres) { | ||
val param = "genre[]" | ||
class MinChapterFilter : Filter.Text("Minimum chapter length"), UriFilter { | ||
override fun addToUri(builder: HttpUrl.Builder) { | ||
if (state.isNotEmpty()) { | ||
val value = state.toIntOrNull()?.takeIf { it > 0 } | ||
?: throw IllegalArgumentException("Minimum chapter length must be a positive integer greater than 0") | ||
|
||
val combineMode: Boolean | ||
get() = state.filter { !it.isIgnored() }.size > 1 | ||
builder.addQueryParameter("minchap", value.toString()) | ||
} | ||
} | ||
} | ||
|
||
private val genres: List<Genre> | ||
get() = listOf( | ||
Genre("Action", "1"), | ||
Genre("Adventure", "78"), | ||
Genre("Avant Garde", "3"), | ||
Genre("Boys Love", "4"), | ||
Genre("Comedy", "5"), | ||
Genre("Demons", "77"), | ||
Genre("Drama", "6"), | ||
Genre("Ecchi", "7"), | ||
Genre("Fantasy", "79"), | ||
Genre("Girls Love", "9"), | ||
Genre("Gourmet", "10"), | ||
Genre("Harem", "11"), | ||
Genre("Horror", "530"), | ||
Genre("Isekai", "13"), | ||
Genre("Iyashikei", "531"), | ||
Genre("Josei", "15"), | ||
Genre("Kids", "532"), | ||
Genre("Magic", "539"), | ||
Genre("Mahou Shoujo", "533"), | ||
Genre("Martial Arts", "534"), | ||
Genre("Mecha", "19"), | ||
Genre("Military", "535"), | ||
Genre("Music", "21"), | ||
Genre("Mystery", "22"), | ||
Genre("Parody", "23"), | ||
Genre("Psychological", "536"), | ||
Genre("Reverse Harem", "25"), | ||
Genre("Romance", "26"), | ||
Genre("School", "73"), | ||
Genre("Sci-Fi", "28"), | ||
Genre("Seinen", "537"), | ||
Genre("Shoujo", "30"), | ||
Genre("Shounen", "31"), | ||
Genre("Slice of Life", "538"), | ||
Genre("Space", "33"), | ||
Genre("Sports", "34"), | ||
Genre("Super Power", "75"), | ||
Genre("Supernatural", "76"), | ||
Genre("Suspense", "37"), | ||
Genre("Thriller", "38"), | ||
Genre("Vampire", "39"), | ||
) | ||
|
||
class StatusFilter : Group("Status", "status[]", statuses) | ||
|
||
private val statuses: List<Entry> | ||
get() = listOf( | ||
Entry("Completed", "completed"), | ||
Entry("Releasing", "releasing"), | ||
Entry("On Hiatus", "on_hiatus"), | ||
Entry("Discontinued", "discontinued"), | ||
Entry("Not Yet Published", "info"), | ||
) | ||
|
||
class YearFilter : Group("Year", "year[]", years) | ||
|
||
private val years: List<Entry> | ||
get() = listOf( | ||
Entry("2023"), | ||
Entry("2022"), | ||
Entry("2021"), | ||
Entry("2020"), | ||
Entry("2019"), | ||
Entry("2018"), | ||
Entry("2017"), | ||
Entry("2016"), | ||
Entry("2015"), | ||
Entry("2014"), | ||
Entry("2013"), | ||
Entry("2012"), | ||
Entry("2011"), | ||
Entry("2010"), | ||
Entry("2009"), | ||
Entry("2008"), | ||
Entry("2007"), | ||
Entry("2006"), | ||
Entry("2005"), | ||
Entry("2004"), | ||
Entry("2003"), | ||
Entry("2000s"), | ||
Entry("1990s"), | ||
Entry("1980s"), | ||
Entry("1970s"), | ||
Entry("1960s"), | ||
Entry("1950s"), | ||
Entry("1940s"), | ||
) | ||
|
||
class ChapterCountFilter : Select("Chapter Count", "minchap", chapterCounts) | ||
|
||
private val chapterCounts | ||
get() = mapOf( | ||
"Any" to "", | ||
"At least 1 chapter" to "1", | ||
"At least 3 chapters" to "3", | ||
"At least 5 chapters" to "5", | ||
"At least 10 chapters" to "10", | ||
"At least 20 chapters" to "20", | ||
"At least 30 chapters" to "30", | ||
"At least 50 chapters" to "50", | ||
) | ||
|
||
class SortFilter : Select("Sort", "sort", orders) | ||
|
||
private val orders | ||
get() = mapOf( | ||
"Trending" to "trending", | ||
"Recently updated" to "recently_updated", | ||
"Recently added" to "recently_added", | ||
"Release date" to "release_date", | ||
"Name A-Z" to "title_az", | ||
"Score" to "scores", | ||
"MAL score" to "mal_scores", | ||
"Most viewed" to "most_viewed", | ||
"Most favourited" to "most_favourited", | ||
) | ||
class SortFilter(defaultValue: String? = null) : UriPartFilter( | ||
"Sort", | ||
"sort", | ||
arrayOf( | ||
Pair("Most relevance", "most_relevance"), | ||
Pair("Recently updated", "recently_updated"), | ||
Pair("Recently added", "recently_added"), | ||
Pair("Release date", "release_date"), | ||
Pair("Trending", "trending"), | ||
Pair("Name A-Z", "title_az"), | ||
Pair("Scores", "scores"), | ||
Pair("MAL scores", "mal_scores"), | ||
Pair("Most viewed", "most_viewed"), | ||
Pair("Most favourited", "most_favourited"), | ||
), | ||
defaultValue, | ||
) |
Oops, something went wrong.