Comick: Add preferred groups filter and it's localization (#10159)
* Add preferred groups filter and it's localization * stevenyomi changes * lint error * remove migrated preferred groups * ignoredGroups -> ignoredGroupsLowercase
This commit is contained in:
parent
3642771ba0
commit
8a3758959b
@ -1,5 +1,7 @@
|
|||||||
ignored_groups_title=Ignored Groups
|
ignored_groups_title=Ignored Groups
|
||||||
ignored_groups_summary=Chapters from these groups won't be shown.\nOne group name per line (case-insensitive)
|
ignored_groups_summary=Chapters from these groups won't be shown.\nOne group name per line (case-insensitive)
|
||||||
|
preferred_groups_title=Preferred Groups
|
||||||
|
preferred_groups_summary=Chapters from these groups will have priority over others (Even if lower score).\nOne group name per line (case-insensitive)
|
||||||
ignored_tags_title=Ignored Tags
|
ignored_tags_title=Ignored Tags
|
||||||
ignored_tags_summary=Manga with these tags won't show up when browsing.\nOne tag per line (case-insensitive)
|
ignored_tags_summary=Manga with these tags won't show up when browsing.\nOne tag per line (case-insensitive)
|
||||||
show_alternative_titles_title=Show Alternative Titles
|
show_alternative_titles_title=Show Alternative Titles
|
||||||
|
@ -1,17 +1,21 @@
|
|||||||
ignored_groups_title=Grupos Ignorados
|
ignored_groups_title=Grupos Ignorados
|
||||||
ignored_groups_summary=Capítulos desses grupos não aparecerão.\nUm grupo por linha
|
ignored_groups_summary=Capítulos desses grupos não serão mostrados.\nUm nome de grupo por linha (não diferencia maiúsculas de minúsculas)
|
||||||
|
preferred_groups_title=Grupos Preferidos
|
||||||
|
preferred_groups_summary=Capítulos desses grupos terão prioridade sobre os outros (Mesmo que com nota mais baixa).\nUm nome de grupo por linha (não diferencia maiúsculas de minúsculas)
|
||||||
|
ignored_tags_title=Tags Ignoradas
|
||||||
|
ignored_tags_summary=Mangás com essas tags não aparecerão ao navegar.\nUma tag por linha (não diferencia maiúsculas de minúsculas)
|
||||||
show_alternative_titles_title=Mostrar Títulos Alternativos
|
show_alternative_titles_title=Mostrar Títulos Alternativos
|
||||||
show_alternative_titles_on=Adiciona títulos alternativos à descrição
|
show_alternative_titles_on=Adiciona títulos alternativos à descrição
|
||||||
show_alternative_titles_off=Não mostra títulos alternativos na descrição
|
show_alternative_titles_off=Não mostra títulos alternativos na descrição
|
||||||
include_tags_title=Incluir Tags
|
include_tags_title=Incluir Tags
|
||||||
include_tags_on=Mais detalhadas, mas podem conter spoilers
|
include_tags_on=Mais específicas, mas podem conter spoilers!
|
||||||
include_tags_off=Apenas os gêneros básicos
|
include_tags_off=Apenas os gêneros básicos
|
||||||
group_tags_title=Agrupar Tags (necessário fork compatível)
|
group_tags_title=Agrupar Tags (necessário fork compatível)
|
||||||
group_tags_on=Prefixar tags com o respectivo tipo
|
group_tags_on=Irá prefixar tags com o respectivo tipo
|
||||||
group_tags_off=Listar todas as tags juntas
|
group_tags_off=Listar todas as tags juntas
|
||||||
update_cover_title=Atualizar Capas
|
update_cover_title=Atualizar Capas
|
||||||
update_cover_on=Manter capas atualizadas
|
update_cover_on=Manter capa atualizada
|
||||||
update_cover_off=Usar apenas a primeira capa
|
update_cover_off=Preferir a primeira capa
|
||||||
local_title_title=Título Traduzido
|
local_title_title=Título Traduzido
|
||||||
local_title_on=se disponível
|
local_title_on=se disponível
|
||||||
local_title_off=Usar o título padrão do site
|
local_title_off=Usar o título padrão do site
|
||||||
@ -19,4 +23,11 @@ score_position_title=Posição da Nota na Descrição
|
|||||||
score_position_top=Topo
|
score_position_top=Topo
|
||||||
score_position_middle=Meio
|
score_position_middle=Meio
|
||||||
score_position_bottom=Final
|
score_position_bottom=Final
|
||||||
score_position_none=Sem Nota
|
score_position_none=Esconder Nota
|
||||||
|
cover_quality_title=Qualidade da Capa
|
||||||
|
cover_quality_original=Original
|
||||||
|
cover_quality_compressed=Comprimida
|
||||||
|
cover_quality_web_default=Pequena (Padrão Web)
|
||||||
|
chapter_score_filtering_title=Desduplicar capítulos automaticamente
|
||||||
|
chapter_score_filtering_on=Para cada capítulo, exibe apenas o scanlator com a maior nota
|
||||||
|
chapter_score_filtering_off=Não filtra nenhum capítulo com base na nota (outros filtros de scanlator ainda se aplicarão)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
ext {
|
ext {
|
||||||
extName = 'Comick'
|
extName = 'Comick'
|
||||||
extClass = '.ComickFactory'
|
extClass = '.ComickFactory'
|
||||||
extVersionCode = 60
|
extVersionCode = 61
|
||||||
isNsfw = true
|
isNsfw = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,6 +79,18 @@ abstract class Comick(
|
|||||||
}
|
}
|
||||||
}.also(screen::addPreference)
|
}.also(screen::addPreference)
|
||||||
|
|
||||||
|
EditTextPreference(screen.context).apply {
|
||||||
|
key = PREFERRED_GROUPS_PREF
|
||||||
|
title = intl["preferred_groups_title"]
|
||||||
|
summary = intl["preferred_groups_summary"]
|
||||||
|
|
||||||
|
setOnPreferenceChangeListener { _, newValue ->
|
||||||
|
preferences.edit()
|
||||||
|
.putString(PREFERRED_GROUPS_PREF, newValue.toString())
|
||||||
|
.commit()
|
||||||
|
}
|
||||||
|
}.also(screen::addPreference)
|
||||||
|
|
||||||
EditTextPreference(screen.context).apply {
|
EditTextPreference(screen.context).apply {
|
||||||
key = IGNORED_TAGS_PREF
|
key = IGNORED_TAGS_PREF
|
||||||
title = intl["ignored_tags_title"]
|
title = intl["ignored_tags_title"]
|
||||||
@ -227,6 +239,16 @@ abstract class Comick(
|
|||||||
.orEmpty()
|
.orEmpty()
|
||||||
.toSet()
|
.toSet()
|
||||||
|
|
||||||
|
private val SharedPreferences.preferredGroups: Set<String>
|
||||||
|
get() = getString(PREFERRED_GROUPS_PREF, "")
|
||||||
|
?.lowercase()
|
||||||
|
?.split("\n")
|
||||||
|
?.map(String::trim)
|
||||||
|
?.filter(String::isNotEmpty)
|
||||||
|
?.sorted()
|
||||||
|
.orEmpty()
|
||||||
|
.toSet()
|
||||||
|
|
||||||
private val SharedPreferences.ignoredTags: String
|
private val SharedPreferences.ignoredTags: String
|
||||||
get() = getString(IGNORED_TAGS_PREF, "")
|
get() = getString(IGNORED_TAGS_PREF, "")
|
||||||
?.split("\n")
|
?.split("\n")
|
||||||
@ -593,13 +615,17 @@ abstract class Comick(
|
|||||||
override fun chapterListParse(response: Response): List<SChapter> {
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
val chapterListResponse = response.parseAs<ChapterList>()
|
val chapterListResponse = response.parseAs<ChapterList>()
|
||||||
|
|
||||||
|
val preferredGroups = preferences.preferredGroups
|
||||||
|
val ignoredGroupsLowercase = preferences.ignoredGroups.map { it.lowercase() }
|
||||||
|
|
||||||
val mangaUrl = response.request.url.toString()
|
val mangaUrl = response.request.url.toString()
|
||||||
.substringBefore("/chapters")
|
.substringBefore("/chapters")
|
||||||
.substringAfter(apiUrl)
|
.substringAfter(apiUrl)
|
||||||
|
|
||||||
val currentTimestamp = System.currentTimeMillis()
|
val currentTimestamp = System.currentTimeMillis()
|
||||||
|
|
||||||
return chapterListResponse.chapters
|
// First, apply the ignored groups filter to remove chapters from blocked groups
|
||||||
|
val filteredChapters = chapterListResponse.chapters
|
||||||
.filter {
|
.filter {
|
||||||
val publishTime = try {
|
val publishTime = try {
|
||||||
publishedDateFormat.parse(it.publishedAt)!!.time
|
publishedDateFormat.parse(it.publishedAt)!!.time
|
||||||
@ -610,13 +636,45 @@ abstract class Comick(
|
|||||||
val publishedChapter = publishTime <= currentTimestamp
|
val publishedChapter = publishTime <= currentTimestamp
|
||||||
|
|
||||||
val noGroupBlock = it.groups.map { g -> g.lowercase() }
|
val noGroupBlock = it.groups.map { g -> g.lowercase() }
|
||||||
.intersect(preferences.ignoredGroups)
|
.intersect(ignoredGroupsLowercase)
|
||||||
.isEmpty()
|
.isEmpty()
|
||||||
|
|
||||||
publishedChapter && noGroupBlock
|
publishedChapter && noGroupBlock
|
||||||
}
|
}
|
||||||
.filterOnScore(preferences.chapterScoreFiltering)
|
|
||||||
.map { it.toSChapter(mangaUrl) }
|
// Now apply the primary filtering logic based on user preferences
|
||||||
|
val finalChapters = if (preferredGroups.isEmpty()) {
|
||||||
|
// If preferredGroups is empty, fall back to the existing score filter
|
||||||
|
filteredChapters.filterOnScore(preferences.chapterScoreFiltering)
|
||||||
|
} else {
|
||||||
|
// If preferredGroups is not empty, use the list to grab chapters from those groups in order of preference
|
||||||
|
val chaptersByNumber = filteredChapters.groupBy { it.chap }
|
||||||
|
val preferredFilteredChapters = mutableListOf<Chapter>()
|
||||||
|
|
||||||
|
// Iterate through each chapter number's group of chapters
|
||||||
|
chaptersByNumber.forEach { (_, chaptersForNumber) ->
|
||||||
|
// Find the chapter from the most preferred group
|
||||||
|
val preferredChapter = preferredGroups.firstNotNullOfOrNull { preferredGroup ->
|
||||||
|
chaptersForNumber.find { chapter ->
|
||||||
|
chapter.groups.any { group ->
|
||||||
|
group.lowercase() == preferredGroup.lowercase()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preferredChapter != null) {
|
||||||
|
preferredFilteredChapters.add(preferredChapter)
|
||||||
|
} else {
|
||||||
|
// If no preferred group chapter was found, fall back to the score filter
|
||||||
|
val fallbackChapter = chaptersForNumber.filterOnScore(preferences.chapterScoreFiltering)
|
||||||
|
preferredFilteredChapters.addAll(fallbackChapter)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
preferredFilteredChapters
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally, map the filtered chapters to the SChapter model
|
||||||
|
return finalChapters.map { it.toSChapter(mangaUrl) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun List<Chapter>.filterOnScore(shouldFilter: Boolean): Collection<Chapter> {
|
private fun List<Chapter>.filterOnScore(shouldFilter: Boolean): Collection<Chapter> {
|
||||||
@ -691,6 +749,7 @@ abstract class Comick(
|
|||||||
const val SLUG_SEARCH_PREFIX = "id:"
|
const val SLUG_SEARCH_PREFIX = "id:"
|
||||||
private val SPACE_AND_SLASH_REGEX = Regex("[ /]")
|
private val SPACE_AND_SLASH_REGEX = Regex("[ /]")
|
||||||
private const val IGNORED_GROUPS_PREF = "IgnoredGroups"
|
private const val IGNORED_GROUPS_PREF = "IgnoredGroups"
|
||||||
|
private const val PREFERRED_GROUPS_PREF = "PreferredGroups"
|
||||||
private const val IGNORED_TAGS_PREF = "IgnoredTags"
|
private const val IGNORED_TAGS_PREF = "IgnoredTags"
|
||||||
private const val SHOW_ALTERNATIVE_TITLES_PREF = "ShowAlternativeTitles"
|
private const val SHOW_ALTERNATIVE_TITLES_PREF = "ShowAlternativeTitles"
|
||||||
const val SHOW_ALTERNATIVE_TITLES_DEFAULT = false
|
const val SHOW_ALTERNATIVE_TITLES_DEFAULT = false
|
||||||
|
Loading…
x
Reference in New Issue
Block a user