Update parsers

This commit is contained in:
Koitharu
2025-02-25 12:48:25 +02:00
parent 21140986c8
commit 5f10ff91d0
6 changed files with 36 additions and 5 deletions

3
.idea/.gitignore generated vendored
View File

@@ -5,4 +5,5 @@ misc.xml
kotlinc.xml kotlinc.xml
vcs.xml vcs.xml
/inspectionProfiles/ /inspectionProfiles/
/artifacts/ /artifacts/
/kotlin-statistics.xml

View File

@@ -31,7 +31,7 @@ dependencies {
testImplementation(kotlin("test")) testImplementation(kotlin("test"))
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0")
implementation("com.github.ajalt.clikt:clikt-core:5.0.1") implementation("com.github.ajalt.clikt:clikt-core:5.0.1")
implementation("com.github.KotatsuApp:kotatsu-parsers:764c65563b") implementation("com.github.KotatsuApp:kotatsu-parsers:1.6")
implementation("com.squareup.okhttp3:okhttp:4.12.0") implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("com.squareup.okio:okio:3.9.0") implementation("com.squareup.okio:okio:3.9.0")
implementation("io.webfolder:quickjs:1.1.0") implementation("io.webfolder:quickjs:1.1.0")

View File

@@ -5,9 +5,9 @@ import kotlinx.coroutines.runInterruptible
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import okhttp3.internal.closeQuietly import okhttp3.internal.closeQuietly
import org.koitharu.kotatsu.dl.util.toFileNameSafe
import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaChapter
import org.koitharu.kotatsu.parsers.util.toFileNameSafe
import java.io.File import java.io.File
class LocalMangaDirOutput( class LocalMangaDirOutput(

View File

@@ -5,9 +5,9 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.runInterruptible
import okio.Closeable import okio.Closeable
import org.koitharu.kotatsu.dl.util.getNextAvailable import org.koitharu.kotatsu.dl.util.getNextAvailable
import org.koitharu.kotatsu.dl.util.toFileNameSafe
import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaChapter
import org.koitharu.kotatsu.parsers.util.toFileNameSafe
import java.io.File import java.io.File
sealed class LocalMangaOutput( sealed class LocalMangaOutput(

View File

@@ -64,7 +64,7 @@ class MangaDownloader(
val totalChapters = chaptersRange.size(chapters) val totalChapters = chaptersRange.size(chapters)
try { try {
val parser = context.newParserInstance(manga.source as MangaParserSource) val parser = context.newParserInstance(manga.source as MangaParserSource)
val coverUrl = manga.largeCoverUrl.ifNullOrEmpty { manga.coverUrl } val coverUrl = manga.largeCoverUrl.ifNullOrEmpty { manga.coverUrl.orEmpty() }
if (coverUrl.isNotEmpty()) { if (coverUrl.isNotEmpty()) {
downloadFile(coverUrl, tempDir, parser.source).let { file -> downloadFile(coverUrl, tempDir, parser.source).let { file ->
output.addCover(file, getFileExtensionFromUrl(coverUrl).orEmpty()) output.addCover(file, getFileExtensionFromUrl(coverUrl).orEmpty())

View File

@@ -1,6 +1,7 @@
package org.koitharu.kotatsu.dl.util package org.koitharu.kotatsu.dl.util
import androidx.collection.IntList import androidx.collection.IntList
import androidx.collection.arraySetOf
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Response import okhttp3.Response
import okhttp3.internal.closeQuietly import okhttp3.internal.closeQuietly
@@ -51,3 +52,32 @@ fun File.getNextAvailable(): File {
} }
} }
} }
fun String.transliterate(skipMissing: Boolean): String {
val cyr = charArrayOf(
'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п',
'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', 'ё', 'ў',
)
val lat = arrayOf(
"a", "b", "v", "g", "d", "e", "zh", "z", "i", "y", "k", "l", "m", "n", "o", "p",
"r", "s", "t", "u", "f", "h", "ts", "ch", "sh", "sch", "", "i", "", "e", "ju", "ja", "jo", "w",
)
return buildString(length + 5) {
for (c in this@transliterate) {
val p = cyr.binarySearch(c.lowercaseChar())
if (p in lat.indices) {
if (c.isUpperCase()) {
append(lat[p].uppercase())
} else {
append(lat[p])
}
} else if (!skipMissing) {
append(c)
}
}
}
}
fun String.toFileNameSafe(): String = this.transliterate(false)
.replace(Regex("[^a-z0-9_\\-]", arraySetOf(RegexOption.IGNORE_CASE)), " ")
.replace(Regex("\\s+"), "_")