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 -> { is CollectionFilterGroup -> {
filter.state.forEach { collectionFilter -> val included = filter.state
val collection = collectionsListMeta.find { it.title == (collectionFilter as Filter.TriState).name } .filter { it.state == STATE_INCLUDE }
collection?.let { .mapNotNull { collectionFilter ->
when (collectionFilter.state) { collectionsListMeta.find { it.title == collectionFilter.name }?.id?.toString()
STATE_INCLUDE -> filterV2.addStatement( }
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, FilterComparison.Contains,
FilterField.CollectionTags, FilterField.CollectionTags,
collection.id.toString(), included.joinToString(","),
) )
STATE_EXCLUDE -> filterV2.addStatement( }
if (excluded.isNotEmpty()) {
filterV2.addStatement(
FilterComparison.NotContains, FilterComparison.NotContains,
FilterField.CollectionTags, FilterField.CollectionTags,
collection.id.toString(), excluded.joinToString(","),
) )
} }
} }
}
}
is LanguageFilterGroup -> { is LanguageFilterGroup -> {
filter.state.forEach { languageFilter -> val included = filter.state
when ((languageFilter as Filter.TriState).state) { .filter { it.state == STATE_INCLUDE }
STATE_INCLUDE -> filterV2.addStatement( .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, FilterComparison.Contains,
FilterField.Languages, FilterField.Languages,
languageFilter.name, included.joinToString(","),
)
STATE_EXCLUDE -> filterV2.addStatement(
FilterComparison.NotContains,
FilterField.Languages,
languageFilter.name,
) )
} }
if (excluded.isNotEmpty()) {
filterV2.addStatement(
FilterComparison.NotContains,
FilterField.Languages,
excluded.joinToString(","),
)
} }
} }
is LibrariesFilterGroup -> { is LibrariesFilterGroup -> {

View File

@@ -76,16 +76,14 @@ class KavitaHelper {
name = when (type) { name = when (type) {
ChapterType.Regular -> { ChapterType.Regular -> {
val volumeNum = volume.number.toString().toIntOrNull()?.let {
it.toString().padStart(2, '0')
} ?: volume.number.toString()
val chapterNum = chapter.number.toIntOrNull()?.let { val chapterNum = chapter.number.toIntOrNull()?.let {
it.toString().padStart(2, '0') it.toString().padStart(2, '0')
} ?: chapter.number } ?: chapter.number
when { when {
chapter.titleName.isBlank() -> "Volume $volumeNum Chapter $chapterNum" chapter.titleName.isBlank() -> "Vol.${volume.number} Ch.$chapterNum"
chapter.titleName.trim().matches(Regex("^\\d+$")) -> "Volume $volumeNum Chapter ${chapter.titleName.trim().padStart(2, '0')}" chapter.titleName.trim().matches(Regex("^\\d+$")) ->
else -> "Volume $volumeNum $chapterNum - ${chapter.titleName}" "Vol.${volume.number} Ch.${chapter.titleName.trim().padStart(2, '0')}"
else -> "Vol.${volume.number} Ch.$chapterNum - ${chapter.titleName}"
} }
} }
ChapterType.SingleFileVolume -> { ChapterType.SingleFileVolume -> {
@@ -95,7 +93,13 @@ class KavitaHelper {
else -> "${volume.number} - ${volume.name}" 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 -> { ChapterType.Chapter -> {
val chapterNum = chapter.number.toIntOrNull()?.let { val chapterNum = chapter.number.toIntOrNull()?.let {
it.toString().padStart(2, '0') it.toString().padStart(2, '0')
@@ -121,11 +125,9 @@ class KavitaHelper {
} }
chapter_number = when { chapter_number = when {
// If this is a SingleFileVolume and we have an explicit number (from single-file processing)
type == ChapterType.SingleFileVolume && singleFileVolumeNumber != null -> type == ChapterType.SingleFileVolume && singleFileVolumeNumber != null ->
singleFileVolumeNumber.toFloat() singleFileVolumeNumber.toFloat()
// If this is a regular chapter (not a volume)
type != ChapterType.SingleFileVolume -> type != ChapterType.SingleFileVolume ->
chapter.number.toFloatOrNull() ?: 0f chapter.number.toFloatOrNull() ?: 0f
@@ -159,6 +161,7 @@ class KavitaHelper {
ChapterType.Issue -> "Issue" ChapterType.Issue -> "Issue"
ChapterType.Chapter -> "Chapter" ChapterType.Chapter -> "Chapter"
ChapterType.Regular -> "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 = fun of(chapter: ChapterDto, volume: VolumeDto, libraryType: LibraryTypeEnum? = null): ChapterType =
when { when {
// Special cases // Special
volume.number == SPECIAL_NUMBER -> Special volume.number == SPECIAL_NUMBER -> Special
// Issue
volume.number == UNNUMBERED_VOLUME_NUMBER -> when (libraryType) { volume.number == UNNUMBERED_VOLUME_NUMBER -> when (libraryType) {
LibraryTypeEnum.Comic, LibraryTypeEnum.ComicVine -> Issue LibraryTypeEnum.Comic, LibraryTypeEnum.ComicVine -> Issue
else -> Chapter else -> Chapter
} }
// Single file volumes // SingleFileVolume
chapter.number == KavitaConstants.UNNUMBERED_VOLUME_STR -> SingleFileVolume chapter.number == KavitaConstants.UNNUMBERED_VOLUME_STR -> SingleFileVolume
// Regular volumes // Regular
volume.number > 0 -> SingleFileVolume volume.number > 0 -> Regular
// Everything else depends on library type // Everything else depends on library type
else -> when (libraryType) { else -> when (libraryType) {
LibraryTypeEnum.Comic, LibraryTypeEnum.ComicVine -> Issue LibraryTypeEnum.Comic, LibraryTypeEnum.ComicVine -> Issue