Improve chapter parsing + fix filters

This commit is contained in:
Mio.
2025-07-12 02:17:17 +02:00
parent cf3fca3653
commit d3695482f2
3 changed files with 63 additions and 40 deletions

View File

@@ -618,38 +618,57 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
}
}
is CollectionFilterGroup -> {
filter.state.forEach { collectionFilter ->
val collection = collectionsListMeta.find { it.title == (collectionFilter as Filter.TriState).name }
collection?.let {
when (collectionFilter.state) {
STATE_INCLUDE -> filterV2.addStatement(
FilterComparison.Contains,
FilterField.CollectionTags,
collection.id.toString(),
)
STATE_EXCLUDE -> filterV2.addStatement(
FilterComparison.NotContains,
FilterField.CollectionTags,
collection.id.toString(),
)
}
val included = filter.state
.filter { it.state == STATE_INCLUDE }
.mapNotNull { collectionFilter ->
collectionsListMeta.find { it.title == collectionFilter.name }?.id?.toString()
}
val excluded = filter.state
.filter { it.state == STATE_EXCLUDE }
.mapNotNull { collectionFilter ->
collectionsListMeta.find { it.title == collectionFilter.name }?.id?.toString()
}
if (included.isNotEmpty()) {
filterV2.addStatement(
FilterComparison.Contains,
FilterField.CollectionTags,
included.joinToString(","),
)
}
if (excluded.isNotEmpty()) {
filterV2.addStatement(
FilterComparison.NotContains,
FilterField.CollectionTags,
excluded.joinToString(","),
)
}
}
is LanguageFilterGroup -> {
filter.state.forEach { languageFilter ->
when ((languageFilter as Filter.TriState).state) {
STATE_INCLUDE -> filterV2.addStatement(
FilterComparison.Contains,
FilterField.Languages,
languageFilter.name,
)
STATE_EXCLUDE -> filterV2.addStatement(
FilterComparison.NotContains,
FilterField.Languages,
languageFilter.name,
)
val included = filter.state
.filter { it.state == STATE_INCLUDE }
.mapNotNull { languageFilter ->
languagesListMeta?.find { it.title == languageFilter.name }?.isoCode
}
val excluded = filter.state
.filter { it.state == STATE_EXCLUDE }
.mapNotNull { languageFilter ->
languagesListMeta?.find { it.title == languageFilter.name }?.isoCode
}
if (included.isNotEmpty()) {
filterV2.addStatement(
FilterComparison.Contains,
FilterField.Languages,
included.joinToString(","),
)
}
if (excluded.isNotEmpty()) {
filterV2.addStatement(
FilterComparison.NotContains,
FilterField.Languages,
excluded.joinToString(","),
)
}
}
is LibrariesFilterGroup -> {

View File

@@ -76,16 +76,14 @@ class KavitaHelper {
name = when (type) {
ChapterType.Regular -> {
val volumeNum = volume.number.toString().toIntOrNull()?.let {
it.toString().padStart(2, '0')
} ?: volume.number.toString()
val chapterNum = chapter.number.toIntOrNull()?.let {
it.toString().padStart(2, '0')
} ?: chapter.number
when {
chapter.titleName.isBlank() -> "Volume $volumeNum Chapter $chapterNum"
chapter.titleName.trim().matches(Regex("^\\d+$")) -> "Volume $volumeNum Chapter ${chapter.titleName.trim().padStart(2, '0')}"
else -> "Volume $volumeNum $chapterNum - ${chapter.titleName}"
chapter.titleName.isBlank() -> "Vol.${volume.number} Ch.$chapterNum"
chapter.titleName.trim().matches(Regex("^\\d+$")) ->
"Vol.${volume.number} Ch.${chapter.titleName.trim().padStart(2, '0')}"
else -> "Vol.${volume.number} Ch.$chapterNum - ${chapter.titleName}"
}
}
ChapterType.SingleFileVolume -> {
@@ -95,7 +93,13 @@ class KavitaHelper {
else -> "${volume.number} - ${volume.name}"
}
}
ChapterType.Special -> chapter.titleName.takeIf { it.isNotBlank() } ?: chapter.range
ChapterType.Special -> {
when {
chapter.title.isNotBlank() -> chapter.title
chapter.range.isNotBlank() -> chapter.range
else -> "Special"
}
}
ChapterType.Chapter -> {
val chapterNum = chapter.number.toIntOrNull()?.let {
it.toString().padStart(2, '0')
@@ -121,11 +125,9 @@ class KavitaHelper {
}
chapter_number = when {
// If this is a SingleFileVolume and we have an explicit number (from single-file processing)
type == ChapterType.SingleFileVolume && singleFileVolumeNumber != null ->
singleFileVolumeNumber.toFloat()
// If this is a regular chapter (not a volume)
type != ChapterType.SingleFileVolume ->
chapter.number.toFloatOrNull() ?: 0f
@@ -159,6 +161,7 @@ class KavitaHelper {
ChapterType.Issue -> "Issue"
ChapterType.Chapter -> "Chapter"
ChapterType.Regular -> "Chapter"
else -> "Chapter"
}
}

View File

@@ -216,16 +216,17 @@ enum class ChapterType {
fun of(chapter: ChapterDto, volume: VolumeDto, libraryType: LibraryTypeEnum? = null): ChapterType =
when {
// Special cases
// Special
volume.number == SPECIAL_NUMBER -> Special
// Issue
volume.number == UNNUMBERED_VOLUME_NUMBER -> when (libraryType) {
LibraryTypeEnum.Comic, LibraryTypeEnum.ComicVine -> Issue
else -> Chapter
}
// Single file volumes
// SingleFileVolume
chapter.number == KavitaConstants.UNNUMBERED_VOLUME_STR -> SingleFileVolume
// Regular volumes
volume.number > 0 -> SingleFileVolume
// Regular
volume.number > 0 -> Regular
// Everything else depends on library type
else -> when (libraryType) {
LibraryTypeEnum.Comic, LibraryTypeEnum.ComicVine -> Issue