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