diff --git a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt index 30ef9a2ef..8f6c5d63b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt +++ b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt @@ -11,6 +11,7 @@ import org.koin.android.ext.koin.androidLogger import org.koin.core.context.startKoin import org.koin.dsl.module import org.koitharu.kotatsu.core.db.MangaDatabase +import org.koitharu.kotatsu.core.local.CbzFetcher import org.koitharu.kotatsu.core.local.PagesCache import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.domain.MangaLoaderContext @@ -61,6 +62,9 @@ class KotatsuApp : Application() { .cache(CoilUtils.createDefaultCache(applicationContext)) .build() } + componentRegistry { + add(CbzFetcher()) + } }) } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/local/CbzFetcher.kt b/app/src/main/java/org/koitharu/kotatsu/core/local/CbzFetcher.kt new file mode 100644 index 000000000..64a5c46ea --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/local/CbzFetcher.kt @@ -0,0 +1,37 @@ +package org.koitharu.kotatsu.core.local + +import android.net.Uri +import android.webkit.MimeTypeMap +import coil.bitmappool.BitmapPool +import coil.decode.DataSource +import coil.decode.Options +import coil.fetch.FetchResult +import coil.fetch.Fetcher +import coil.fetch.SourceResult +import coil.size.Size +import okio.buffer +import okio.source +import java.util.zip.ZipFile + +class CbzFetcher : Fetcher { + + override suspend fun fetch( + pool: BitmapPool, + data: Uri, + size: Size, + options: Options + ): FetchResult { + val zip = ZipFile(data.schemeSpecificPart) + val entry = zip.getEntry(data.fragment) + val ext = MimeTypeMap.getFileExtensionFromUrl(entry.name) + return SourceResult( + source = zip.getInputStream(entry).source().buffer(), + mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext), + dataSource = DataSource.DISK + ) + } + + override fun key(data: Uri): String? = data.toString() + + override fun handles(data: Uri) = data.scheme == "cbz" +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt index efb25f9c8..aa240bdb8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt @@ -90,5 +90,5 @@ class LocalMangaRepository(loaderContext: MangaLoaderContext) : BaseMangaReposit } private fun zipUri(file: File, entryName: String) = - Uri.fromParts("zip", file.path, entryName).toString() + Uri.fromParts("cbz", file.path, entryName).toString() } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/local/MangaIndex.kt b/app/src/main/java/org/koitharu/kotatsu/domain/local/MangaIndex.kt index 28a940009..9a78c70cf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/local/MangaIndex.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/local/MangaIndex.kt @@ -69,7 +69,7 @@ class MangaIndex(source: String?) { jo.put("url", chapter.url) jo.put("name", chapter.name) jo.put("entries", "%03d\\d{3}".format(chapter.number)) - chapters.put(chapter.number.toString(), jo) + chapters.put(chapter.id.toString(), jo) } }