Improve chapter parsing + fix filters
This commit is contained in:
@@ -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(
|
||||
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,
|
||||
collection.id.toString(),
|
||||
included.joinToString(","),
|
||||
)
|
||||
STATE_EXCLUDE -> filterV2.addStatement(
|
||||
}
|
||||
if (excluded.isNotEmpty()) {
|
||||
filterV2.addStatement(
|
||||
FilterComparison.NotContains,
|
||||
FilterField.CollectionTags,
|
||||
collection.id.toString(),
|
||||
excluded.joinToString(","),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
is LanguageFilterGroup -> {
|
||||
filter.state.forEach { languageFilter ->
|
||||
when ((languageFilter as Filter.TriState).state) {
|
||||
STATE_INCLUDE -> filterV2.addStatement(
|
||||
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,
|
||||
languageFilter.name,
|
||||
)
|
||||
STATE_EXCLUDE -> filterV2.addStatement(
|
||||
FilterComparison.NotContains,
|
||||
FilterField.Languages,
|
||||
languageFilter.name,
|
||||
included.joinToString(","),
|
||||
)
|
||||
}
|
||||
if (excluded.isNotEmpty()) {
|
||||
filterV2.addStatement(
|
||||
FilterComparison.NotContains,
|
||||
FilterField.Languages,
|
||||
excluded.joinToString(","),
|
||||
)
|
||||
}
|
||||
}
|
||||
is LibrariesFilterGroup -> {
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user