mirror of
https://git.mihon.tech/mihonapp/mihon
synced 2024-11-29 02:58:51 +03:00
Fix extracting ComicInfo.xml files in local source (#325)
This commit is contained in:
parent
0da7ad6f1a
commit
2ccff8cdde
2 changed files with 13 additions and 19 deletions
|
@ -41,7 +41,6 @@ import tachiyomi.source.local.io.Format
|
||||||
import tachiyomi.source.local.io.LocalSourceFileSystem
|
import tachiyomi.source.local.io.LocalSourceFileSystem
|
||||||
import tachiyomi.source.local.metadata.fillMetadata
|
import tachiyomi.source.local.metadata.fillMetadata
|
||||||
import uy.kohesive.injekt.injectLazy
|
import uy.kohesive.injekt.injectLazy
|
||||||
import java.io.File
|
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
import java.nio.charset.StandardCharsets
|
import java.nio.charset.StandardCharsets
|
||||||
import kotlin.time.Duration.Companion.days
|
import kotlin.time.Duration.Companion.days
|
||||||
|
@ -145,8 +144,8 @@ actual class LocalSource(
|
||||||
|
|
||||||
// Augment manga details based on metadata files
|
// Augment manga details based on metadata files
|
||||||
try {
|
try {
|
||||||
val mangaDir by lazy { fileSystem.getMangaDirectory(manga.url) }
|
val mangaDir = fileSystem.getMangaDirectory(manga.url) ?: error("${manga.url} is not a valid directory")
|
||||||
val mangaDirFiles = fileSystem.getFilesInMangaDirectory(manga.url)
|
val mangaDirFiles = mangaDir.listFiles().orEmpty()
|
||||||
|
|
||||||
val comicInfoFile = mangaDirFiles
|
val comicInfoFile = mangaDirFiles
|
||||||
.firstOrNull { it.name == COMIC_INFO_FILE }
|
.firstOrNull { it.name == COMIC_INFO_FILE }
|
||||||
|
@ -176,7 +175,7 @@ actual class LocalSource(
|
||||||
// Replace with ComicInfo.xml file
|
// Replace with ComicInfo.xml file
|
||||||
val comicInfo = manga.getComicInfo()
|
val comicInfo = manga.getComicInfo()
|
||||||
mangaDir
|
mangaDir
|
||||||
?.createFile(COMIC_INFO_FILE)
|
.createFile(COMIC_INFO_FILE)
|
||||||
?.openOutputStream()
|
?.openOutputStream()
|
||||||
?.use {
|
?.use {
|
||||||
val comicInfoString = xml.encodeToString(ComicInfo.serializer(), comicInfo)
|
val comicInfoString = xml.encodeToString(ComicInfo.serializer(), comicInfo)
|
||||||
|
@ -191,14 +190,12 @@ actual class LocalSource(
|
||||||
.filter(Archive::isSupported)
|
.filter(Archive::isSupported)
|
||||||
.toList()
|
.toList()
|
||||||
|
|
||||||
val folderPath = mangaDir?.filePath
|
val copiedFile = copyComicInfoFileFromArchive(chapterArchives, mangaDir)
|
||||||
|
|
||||||
val copiedFile = copyComicInfoFileFromArchive(chapterArchives, folderPath)
|
|
||||||
if (copiedFile != null) {
|
if (copiedFile != null) {
|
||||||
setMangaDetailsFromComicInfoFile(copiedFile.inputStream(), manga)
|
setMangaDetailsFromComicInfoFile(copiedFile.openInputStream(), manga)
|
||||||
} else {
|
} else {
|
||||||
// Avoid re-scanning
|
// Avoid re-scanning
|
||||||
mangaDir?.createFile(".noxml")
|
mangaDir.createFile(".noxml")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -209,14 +206,14 @@ actual class LocalSource(
|
||||||
return@withIOContext manga
|
return@withIOContext manga
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun copyComicInfoFileFromArchive(chapterArchives: List<UniFile>, folderPath: String?): File? {
|
private fun copyComicInfoFileFromArchive(chapterArchives: List<UniFile>, folder: UniFile): UniFile? {
|
||||||
for (chapter in chapterArchives) {
|
for (chapter in chapterArchives) {
|
||||||
when (Format.valueOf(chapter)) {
|
when (Format.valueOf(chapter)) {
|
||||||
is Format.Zip -> {
|
is Format.Zip -> {
|
||||||
ZipFile(chapter.openReadOnlyChannel(context)).use { zip: ZipFile ->
|
ZipFile(chapter.openReadOnlyChannel(context)).use { zip: ZipFile ->
|
||||||
zip.getEntry(COMIC_INFO_FILE)?.let { comicInfoFile ->
|
zip.getEntry(COMIC_INFO_FILE)?.let { comicInfoFile ->
|
||||||
zip.getInputStream(comicInfoFile).buffered().use { stream ->
|
zip.getInputStream(comicInfoFile).buffered().use { stream ->
|
||||||
return copyComicInfoFile(stream, folderPath)
|
return copyComicInfoFile(stream, folder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -225,7 +222,7 @@ actual class LocalSource(
|
||||||
JunrarArchive(chapter.openInputStream()).use { rar ->
|
JunrarArchive(chapter.openInputStream()).use { rar ->
|
||||||
rar.fileHeaders.firstOrNull { it.fileName == COMIC_INFO_FILE }?.let { comicInfoFile ->
|
rar.fileHeaders.firstOrNull { it.fileName == COMIC_INFO_FILE }?.let { comicInfoFile ->
|
||||||
rar.getInputStream(comicInfoFile).buffered().use { stream ->
|
rar.getInputStream(comicInfoFile).buffered().use { stream ->
|
||||||
return copyComicInfoFile(stream, folderPath)
|
return copyComicInfoFile(stream, folder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -236,9 +233,9 @@ actual class LocalSource(
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun copyComicInfoFile(comicInfoFileStream: InputStream, folderPath: String?): File {
|
private fun copyComicInfoFile(comicInfoFileStream: InputStream, folder: UniFile): UniFile? {
|
||||||
return File("$folderPath/$COMIC_INFO_FILE").apply {
|
return folder.createFile(COMIC_INFO_FILE)?.apply {
|
||||||
outputStream().use { outputStream ->
|
openOutputStream().use { outputStream ->
|
||||||
comicInfoFileStream.use { it.copyTo(outputStream) }
|
comicInfoFileStream.use { it.copyTo(outputStream) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,9 +22,6 @@ actual class LocalSourceFileSystem(
|
||||||
}
|
}
|
||||||
|
|
||||||
actual fun getFilesInMangaDirectory(name: String): List<UniFile> {
|
actual fun getFilesInMangaDirectory(name: String): List<UniFile> {
|
||||||
return getBaseDirectory()
|
return getMangaDirectory(name)?.listFiles().orEmpty().toList()
|
||||||
?.findFile(name, true)
|
|
||||||
?.takeIf { it.isDirectory }
|
|
||||||
?.listFiles().orEmpty().toList()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue