Improve chapter parsing + fix filters
This commit is contained in:
@@ -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(
|
|
||||||
FilterComparison.Contains,
|
|
||||||
FilterField.CollectionTags,
|
|
||||||
collection.id.toString(),
|
|
||||||
)
|
|
||||||
STATE_EXCLUDE -> filterV2.addStatement(
|
|
||||||
FilterComparison.NotContains,
|
|
||||||
FilterField.CollectionTags,
|
|
||||||
collection.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 -> {
|
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 ->
|
||||||
FilterComparison.Contains,
|
languagesListMeta?.find { it.title == languageFilter.name }?.isoCode
|
||||||
FilterField.Languages,
|
|
||||||
languageFilter.name,
|
|
||||||
)
|
|
||||||
STATE_EXCLUDE -> filterV2.addStatement(
|
|
||||||
FilterComparison.NotContains,
|
|
||||||
FilterField.Languages,
|
|
||||||
languageFilter.name,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
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 -> {
|
is LibrariesFilterGroup -> {
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user