Fix Library filter (#22)

This commit is contained in:
Mio.
2025-07-10 20:17:57 +02:00
parent 90520c556e
commit 7b103b2476
2 changed files with 126 additions and 174 deletions

View File

@@ -7,6 +7,7 @@ import android.text.InputType
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.preference.EditTextPreference import androidx.preference.EditTextPreference
import androidx.preference.MultiSelectListPreference
import androidx.preference.SwitchPreferenceCompat import androidx.preference.SwitchPreferenceCompat
import eu.kanade.tachiyomi.AppInfo import eu.kanade.tachiyomi.AppInfo
import eu.kanade.tachiyomi.extension.all.kavita.dto.AuthenticationDto import eu.kanade.tachiyomi.extension.all.kavita.dto.AuthenticationDto
@@ -659,20 +660,23 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
} }
is LibrariesFilterGroup -> { is LibrariesFilterGroup -> {
filter.state.forEach { libraryFilter -> filter.state.forEach { libraryFilter ->
when ((libraryFilter as Filter.TriState).state) { val library = libraryListMeta.find { it.name == (libraryFilter as Filter.TriState).name }
library?.let {
when (libraryFilter.state) {
STATE_INCLUDE -> filterV2.addStatement( STATE_INCLUDE -> filterV2.addStatement(
FilterComparison.Contains, FilterComparison.Contains,
FilterField.Libraries, FilterField.Libraries,
libraryFilter.name, library.id.toString(),
) )
STATE_EXCLUDE -> filterV2.addStatement( STATE_EXCLUDE -> filterV2.addStatement(
FilterComparison.NotContains, FilterComparison.NotContains,
FilterField.Libraries, FilterField.Libraries,
libraryFilter.name, library.id.toString(),
) )
} }
} }
} }
}
is PubStatusFilterGroup -> { is PubStatusFilterGroup -> {
filter.state.forEach { pubStatusFilter -> filter.state.forEach { pubStatusFilter ->
if ((pubStatusFilter as Filter.CheckBox).state) { if ((pubStatusFilter as Filter.CheckBox).state) {
@@ -1014,17 +1018,6 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
val volumes = client.newCall(volumesRequest).execute().parseAs<List<VolumeDto>>() val volumes = client.newCall(volumesRequest).execute().parseAs<List<VolumeDto>>()
Log.d(LOG_TAG, "Found ${volumes.size} volumes for series ${result.seriesId}") Log.d(LOG_TAG, "Found ${volumes.size} volumes for series ${result.seriesId}")
// volumes.forEachIndexed { index, volume ->
// Log.d(
// LOG_TAG,
// "Volume #${index + 1}: " +
// "id=${volume.id}, " +
// "number=${volume.number}, " +
// "name=${volume.name}, " +
// "cover=${volume.coverImage.isNotBlank()}, " +
// "chapters=${volume.chapters.size}",
// )
// }
// Find all volumes that have SingleFileVolume chapters and valid covers // Find all volumes that have SingleFileVolume chapters and valid covers
val validVolumes = volumes.filter { volume -> val validVolumes = volumes.filter { volume ->
@@ -1032,19 +1025,11 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
ChapterType.of(chapter, volume) == ChapterType.SingleFileVolume ChapterType.of(chapter, volume) == ChapterType.SingleFileVolume
} }
val hasCover = volume.coverImage.isNotBlank() val hasCover = volume.coverImage.isNotBlank()
// Log.d(
// LOG_TAG,
// "Volume ${volume.number} - " +
// "hasSingleFile: $hasSingleFile, " +
// "hasCover: $hasCover",
// )
hasSingleFile && hasCover hasSingleFile && hasCover
} }
Log.d(LOG_TAG, "Found ${validVolumes.size} valid volumes with covers") Log.d(LOG_TAG, "Found ${validVolumes.size} valid volumes with covers")
// validVolumes.forEach { volume ->
// Log.d(LOG_TAG, "Valid volume: #${volume.number} (id=${volume.id})")
// }
// Get the last volume with a valid cover // Get the last volume with a valid cover
val lastValidVolume = validVolumes.maxByOrNull { it.number } val lastValidVolume = validVolumes.maxByOrNull { it.number }
@@ -1493,99 +1478,99 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
/** /**
* Loads the enabled filters if they are not empty so tachiyomi can show them to the user * Loads the enabled filters if they are not empty so tachiyomi can show them to the user
*/ */
// override fun getFilterList(): FilterList { override fun getFilterList(): FilterList {
// val toggledFilters = getToggledFilters() val toggledFilters = getToggledFilters()
//
// val filters = try { val filters = try {
// val filtersLoaded = mutableListOf<Filter<*>>() val filtersLoaded = mutableListOf<Filter<*>>()
//
// filtersLoaded.add(SortFilter(sortableList.map { it.first }.toTypedArray())) filtersLoaded.add(SortFilter(sortableList.map { it.first }.toTypedArray()))
//
// if (smartFilters.isNotEmpty()) { if (smartFilters.isNotEmpty()) {
// filtersLoaded.add(SmartFiltersFilter(smartFilters.map { it.name }.toTypedArray())) filtersLoaded.add(SmartFiltersFilter(smartFilters.map { it.name }.toTypedArray()))
// } }
//
// filtersLoaded.add(SpecialListFilter()) filtersLoaded.add(SpecialListFilter())
//
// if (toggledFilters.contains("Read Status")) { if (toggledFilters.contains("Read Status")) {
// filtersLoaded.add( filtersLoaded.add(
// StatusFilterGroup( StatusFilterGroup(
// listOf( listOf(
// "notRead", "notRead",
// "inProgress", "inProgress",
// "read", "read",
// ).map { StatusFilter(it) }, ).map { StatusFilter(it) },
// ), ),
// ) )
// } }
// if (toggledFilters.contains("ReleaseYearRange")) { if (toggledFilters.contains("ReleaseYearRange")) {
// filtersLoaded.add( filtersLoaded.add(
// ReleaseYearRangeGroup( ReleaseYearRangeGroup(
// listOf("Min", "Max").map { ReleaseYearRange(it) }, listOf("Min", "Max").map { ReleaseYearRange(it) },
// ), ),
// ) )
// } }
//
// if (genresListMeta.isNotEmpty() and toggledFilters.contains("Genres")) { if (genresListMeta.isNotEmpty() and toggledFilters.contains("Genres")) {
// filtersLoaded.add( filtersLoaded.add(
// GenreFilterGroup(genresListMeta.map { GenreFilter(it.title) }), GenreFilterGroup(genresListMeta.map { GenreFilter(it.title) }),
// ) )
// } }
// if (tagsListMeta.isNotEmpty() and toggledFilters.contains("Tags")) { if (tagsListMeta.isNotEmpty() and toggledFilters.contains("Tags")) {
// filtersLoaded.add( filtersLoaded.add(
// TagFilterGroup(tagsListMeta.map { TagFilter(it.title) }), TagFilterGroup(tagsListMeta.map { TagFilter(it.title) }),
// ) )
// } }
// if (ageRatingsListMeta.isNotEmpty() and toggledFilters.contains("Age Rating")) { if (ageRatingsListMeta.isNotEmpty() and toggledFilters.contains("Age Rating")) {
// filtersLoaded.add( filtersLoaded.add(
// AgeRatingFilterGroup(ageRatingsListMeta.map { AgeRatingFilter(it.title) }), AgeRatingFilterGroup(ageRatingsListMeta.map { AgeRatingFilter(it.title) }),
// ) )
// } }
// if (toggledFilters.contains("Format")) { if (toggledFilters.contains("Format")) {
// filtersLoaded.add( filtersLoaded.add(
// FormatsFilterGroup( FormatsFilterGroup(
// listOf( listOf(
// "Image", "Image",
// "Archive", "Archive",
// "Pdf", "Pdf",
// "Unknown", "Unknown",
// ).map { FormatFilter(it) }, ).map { FormatFilter(it) },
// ), ),
// ) )
// } }
// if (collectionsListMeta.isNotEmpty() and toggledFilters.contains("Collections")) { if (collectionsListMeta.isNotEmpty() and toggledFilters.contains("Collections")) {
// filtersLoaded.add( filtersLoaded.add(
// CollectionFilterGroup(collectionsListMeta.map { CollectionFilter(it.title) }), CollectionFilterGroup(collectionsListMeta.map { CollectionFilter(it.title) }),
// ) )
// } }
// if (languagesListMeta.isNotEmpty() and toggledFilters.contains("Languages")) { if (languagesListMeta.isNotEmpty() and toggledFilters.contains("Languages")) {
// filtersLoaded.add( filtersLoaded.add(
// LanguageFilterGroup(languagesListMeta.map { LanguageFilter(it.title) }), LanguageFilterGroup(languagesListMeta.map { LanguageFilter(it.title) }),
// ) )
// } }
// if (libraryListMeta.isNotEmpty() and toggledFilters.contains("Libraries")) { if (libraryListMeta.isNotEmpty() and toggledFilters.contains("Libraries")) {
// filtersLoaded.add( filtersLoaded.add(
// LibrariesFilterGroup(libraryListMeta.map { LibraryFilter(it.name) }), LibrariesFilterGroup(libraryListMeta.map { LibraryFilter(it.name) }),
// ) )
// } }
// if (pubStatusListMeta.isNotEmpty() and toggledFilters.contains("Publication Status")) { if (pubStatusListMeta.isNotEmpty() and toggledFilters.contains("Publication Status")) {
// filtersLoaded.add( filtersLoaded.add(
// PubStatusFilterGroup(pubStatusListMeta.map { PubStatusFilter(it.title) }), PubStatusFilterGroup(pubStatusListMeta.map { PubStatusFilter(it.title) }),
// ) )
// } }
// if (pubStatusListMeta.isNotEmpty() and toggledFilters.contains("Rating")) { if (pubStatusListMeta.isNotEmpty() and toggledFilters.contains("Rating")) {
// filtersLoaded.add( filtersLoaded.add(
// UserRating(), UserRating(),
// ) )
// } }
//
// filtersLoaded filtersLoaded
// } catch (e: Exception) { } catch (e: Exception) {
// Log.e(LOG_TAG, "[FILTERS] Error while creating filter list", e) Log.e(LOG_TAG, "[FILTERS] Error while creating filter list", e)
// FilterList(emptyList()) FilterList(emptyList())
// } }
// return FilterList(filters) return FilterList(filters)
// } }
class LoginErrorException(message: String? = null, cause: Throwable? = null) : Exception(message, cause) { class LoginErrorException(message: String? = null, cause: Throwable? = null) : Exception(message, cause) {
constructor(cause: Throwable) : this(null, cause) constructor(cause: Throwable) : this(null, cause)
@@ -1629,21 +1614,21 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
helper.intl["pref_opds_summary"], helper.intl["pref_opds_summary"],
) )
// val enabledFiltersPref = MultiSelectListPreference(screen.context).apply { val enabledFiltersPref = MultiSelectListPreference(screen.context).apply {
// key = KavitaConstants.toggledFiltersPref key = KavitaConstants.toggledFiltersPref
// title = helper.intl["pref_filters_title"] title = helper.intl["pref_filters_title"]
// summary = helper.intl["pref_filters_summary"] summary = helper.intl["pref_filters_summary"]
// entries = KavitaConstants.filterPrefEntries entries = KavitaConstants.filterPrefEntries
// entryValues = KavitaConstants.filterPrefEntriesValue entryValues = KavitaConstants.filterPrefEntriesValue
// setDefaultValue(KavitaConstants.defaultFilterPrefEntries) setDefaultValue(KavitaConstants.defaultFilterPrefEntries)
// setOnPreferenceChangeListener { _, newValue -> setOnPreferenceChangeListener { _, newValue ->
// @Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
// val checkValue = newValue as Set<String> val checkValue = newValue as Set<String>
// preferences.edit() preferences.edit()
// .putStringSet(KavitaConstants.toggledFiltersPref, checkValue) .putStringSet(KavitaConstants.toggledFiltersPref, checkValue)
// .commit() .commit()
// } }
// } }
val customSourceNamePref = EditTextPreference(screen.context).apply { val customSourceNamePref = EditTextPreference(screen.context).apply {
key = KavitaConstants.customSourceNamePref key = KavitaConstants.customSourceNamePref
title = helper.intl["pref_customsource_title"] title = helper.intl["pref_customsource_title"]
@@ -1742,7 +1727,7 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
} }
}.also(screen::addPreference) }.also(screen::addPreference)
// screen.addPreference(enabledFiltersPref) screen.addPreference(enabledFiltersPref)
} }
private fun androidx.preference.PreferenceScreen.editTextPreference( private fun androidx.preference.PreferenceScreen.editTextPreference(
@@ -1804,7 +1789,7 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
private fun getPrefBaseUrl(): String = preferences.getString("BASEURL", "")!! private fun getPrefBaseUrl(): String = preferences.getString("BASEURL", "")!!
private fun getPrefApiUrl(): String = preferences.getString("APIURL", "")!! private fun getPrefApiUrl(): String = preferences.getString("APIURL", "")!!
private fun getPrefKey(): String = preferences.getString("APIKEY", "")!! private fun getPrefKey(): String = preferences.getString("APIKEY", "")!!
// private fun getToggledFilters() = preferences.getStringSet(KavitaConstants.toggledFiltersPref, KavitaConstants.defaultFilterPrefEntries)!! private fun getToggledFilters() = preferences.getStringSet(KavitaConstants.toggledFiltersPref, KavitaConstants.defaultFilterPrefEntries)!!
private val SharedPreferences.score: Boolean private val SharedPreferences.score: Boolean
get() = getBoolean(SCORE_PREF, SCORE_DEFAULT) get() = getBoolean(SCORE_PREF, SCORE_DEFAULT)

View File

@@ -23,18 +23,7 @@ object KavitaConstants {
"Publication Status", "Publication Status",
"Rating", "Rating",
"Age Rating", "Age Rating",
"Writers",
"Penciller",
"Inker",
"Colorist",
"Letterer",
"Cover Artist",
"Editor",
"Publisher",
"Character",
"Translators",
"ReleaseYearRange", "ReleaseYearRange",
"Average Rating",
"Random", "Random",
"Read Progress", "Read Progress",
) )
@@ -51,18 +40,7 @@ object KavitaConstants {
"Publication Status", "Publication Status",
"Rating", "Rating",
"Age Rating", "Age Rating",
"Writers",
"Penciller",
"Inker",
"Colorist",
"Letterer",
"CoverArtist",
"Editor",
"Publisher",
"Character",
"Translators",
"ReleaseYearRange", "ReleaseYearRange",
"Average Rating",
"Random", "Random",
"Read Progress", "Read Progress",
) )
@@ -79,18 +57,7 @@ object KavitaConstants {
"Publication Status", "Publication Status",
"Rating", "Rating",
"Age Rating", "Age Rating",
"Writers",
"Penciller",
"Inker",
"Colorist",
"Letterer",
"CoverArtist",
"Editor",
"Publisher",
"Character",
"Translators",
"ReleaseYearRange", "ReleaseYearRange",
"Average Rating",
"Random", "Random",
"Read Progress", "Read Progress",
) )