mirror of
https://github.com/null2264/yokai.git
synced 2025-06-21 10:44:42 +00:00
feat(LocalSource): Also retrieve metadata from ComicInfo from archives
This commit is contained in:
parent
565bb2248f
commit
23401d33ed
1 changed files with 50 additions and 18 deletions
|
@ -87,6 +87,15 @@ class LocalSource(private val context: Context) : CatalogueSource, UnmeteredSour
|
||||||
return cover
|
return cover
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun updateMetadata(chapter: SChapter, manga: SManga, stream: InputStream) {
|
||||||
|
val comicInfo = decodeComicInfo(stream)
|
||||||
|
|
||||||
|
comicInfo.title?.let { chapter.name = it.value }
|
||||||
|
comicInfo.number?.value?.toFloatOrNull()?.let {
|
||||||
|
chapter.chapter_number = it
|
||||||
|
} ?: ChapterRecognition.parseChapterNumber(chapter, manga)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns valid cover file inside [parent] directory.
|
* Returns valid cover file inside [parent] directory.
|
||||||
*/
|
*/
|
||||||
|
@ -282,32 +291,17 @@ class LocalSource(private val context: Context) : CatalogueSource, UnmeteredSour
|
||||||
val chapters = getBaseDirectory().findFile(manga.url)?.listFiles().orEmpty()
|
val chapters = getBaseDirectory().findFile(manga.url)?.listFiles().orEmpty()
|
||||||
.filter { it.isDirectory || isSupportedFile(it.extension.orEmpty()) }
|
.filter { it.isDirectory || isSupportedFile(it.extension.orEmpty()) }
|
||||||
.map { chapterFile ->
|
.map { chapterFile ->
|
||||||
val chapterComicInfo =
|
|
||||||
if (chapterFile.isDirectory)
|
|
||||||
chapterFile.findFile(COMIC_INFO_FILE)?.let {
|
|
||||||
decodeComicInfo(it.openInputStream(), xml)
|
|
||||||
}
|
|
||||||
else null
|
|
||||||
|
|
||||||
SChapter.create().apply {
|
SChapter.create().apply {
|
||||||
url = "${manga.url}/${chapterFile.name}"
|
url = "${manga.url}/${chapterFile.name}"
|
||||||
name = if (chapterFile.isDirectory) {
|
name = if (chapterFile.isDirectory) {
|
||||||
chapterComicInfo?.title?.value ?: chapterFile.name.orEmpty()
|
chapterFile.name.orEmpty()
|
||||||
} else {
|
} else {
|
||||||
chapterFile.nameWithoutExtension.orEmpty()
|
chapterFile.nameWithoutExtension.orEmpty()
|
||||||
}
|
}
|
||||||
date_upload = chapterFile.lastModified()
|
date_upload = chapterFile.lastModified()
|
||||||
|
|
||||||
val format = getFormat(chapterFile)
|
val success = updateMetadata(this, manga, chapterFile)
|
||||||
if (format is Format.Epub) {
|
if (!success) ChapterRecognition.parseChapterNumber(this, manga)
|
||||||
EpubFile(format.file.openReadOnlyChannel(context)).use { epub ->
|
|
||||||
epub.fillChapterMetadata(this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chapterComicInfo?.number?.value?.toFloatOrNull()?.let {
|
|
||||||
chapter_number = it
|
|
||||||
} ?: ChapterRecognition.parseChapterNumber(this, manga)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.sortedWith { c1, c2 ->
|
.sortedWith { c1, c2 ->
|
||||||
|
@ -392,6 +386,44 @@ class LocalSource(private val context: Context) : CatalogueSource, UnmeteredSour
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun updateMetadata(chapter: SChapter, manga: SManga, chapterFile: UniFile? = null): Boolean {
|
||||||
|
return try {
|
||||||
|
when (val format = if (chapterFile != null) getFormat(chapterFile) else getFormat(chapter)) {
|
||||||
|
is Format.Directory -> {
|
||||||
|
val entry = format.file.findFile(COMIC_INFO_FILE) ?: return false
|
||||||
|
|
||||||
|
updateMetadata(chapter, manga, entry.openInputStream())
|
||||||
|
true
|
||||||
|
}
|
||||||
|
is Format.Epub -> {
|
||||||
|
EpubFile(format.file.openReadOnlyChannel(context)).use { epub ->
|
||||||
|
epub.fillChapterMetadata(chapter)
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
is Format.Rar -> Archive(format.file.openInputStream()).use { archive ->
|
||||||
|
val entry = archive.fileHeaders
|
||||||
|
.sortedWith { f1, f2 -> f1.fileName.compareToCaseInsensitiveNaturalOrder(f2.fileName) }
|
||||||
|
.find { !it.isDirectory && it.fileName == COMIC_INFO_FILE } ?: return false
|
||||||
|
|
||||||
|
updateMetadata(chapter, manga, archive.getInputStream(entry))
|
||||||
|
true
|
||||||
|
}
|
||||||
|
is Format.Zip -> format.file.openReadOnlyChannel(context).toZipFile().use { zip ->
|
||||||
|
val entry = zip.entries.toList()
|
||||||
|
.sortedWith { f1, f2 -> f1.name.compareToCaseInsensitiveNaturalOrder(f2.name) }
|
||||||
|
.find { !it.isDirectory && it.name == COMIC_INFO_FILE } ?: return false
|
||||||
|
|
||||||
|
updateMetadata(chapter, manga, zip.getInputStream(entry))
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
Timber.e(e, "Error updating a metadata")
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun getFilterList() = popularFilters
|
override fun getFilterList() = popularFilters
|
||||||
|
|
||||||
private val popularFilters = FilterList(OrderBy(context))
|
private val popularFilters = FilterList(OrderBy(context))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue