Load local manga pages directly #552
parent
0c839ce49a
commit
880dd6da27
@ -0,0 +1,50 @@
|
|||||||
|
package org.koitharu.kotatsu.core.util.ext
|
||||||
|
|
||||||
|
import android.net.Uri
|
||||||
|
import androidx.core.net.toFile
|
||||||
|
import okio.Source
|
||||||
|
import okio.source
|
||||||
|
import okio.use
|
||||||
|
import org.koitharu.kotatsu.local.data.util.withExtraCloseable
|
||||||
|
import java.io.File
|
||||||
|
import java.util.zip.ZipFile
|
||||||
|
|
||||||
|
const val URI_SCHEME_FILE = "file"
|
||||||
|
const val URI_SCHEME_ZIP = "file+zip"
|
||||||
|
|
||||||
|
fun Uri.exists(): Boolean = when (scheme) {
|
||||||
|
URI_SCHEME_FILE -> toFile().exists()
|
||||||
|
URI_SCHEME_ZIP -> {
|
||||||
|
val file = File(requireNotNull(schemeSpecificPart))
|
||||||
|
file.exists() && ZipFile(file).use { it.getEntry(fragment) != null }
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> unsupportedUri(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Uri.isTargetNotEmpty(): Boolean = when (scheme) {
|
||||||
|
URI_SCHEME_FILE -> toFile().isNotEmpty()
|
||||||
|
URI_SCHEME_ZIP -> {
|
||||||
|
val file = File(requireNotNull(schemeSpecificPart))
|
||||||
|
file.exists() && ZipFile(file).use { (it.getEntry(fragment)?.size ?: 0L) != 0L }
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> unsupportedUri(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Uri.source(): Source = when (scheme) {
|
||||||
|
URI_SCHEME_FILE -> toFile().source()
|
||||||
|
URI_SCHEME_ZIP -> {
|
||||||
|
val zip = ZipFile(schemeSpecificPart)
|
||||||
|
val entry = zip.getEntry(fragment)
|
||||||
|
zip.getInputStream(entry).source().withExtraCloseable(zip)
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> unsupportedUri(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun File.toZipUri(entryName: String): Uri = Uri.parse("$URI_SCHEME_ZIP://$absolutePath#$entryName")
|
||||||
|
|
||||||
|
private fun unsupportedUri(uri: Uri): Nothing {
|
||||||
|
throw IllegalArgumentException("Bad uri $uri: only schemes $URI_SCHEME_FILE and $URI_SCHEME_ZIP are supported")
|
||||||
|
}
|
||||||
@ -1,32 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.core.zip
|
|
||||||
|
|
||||||
import android.net.Uri
|
|
||||||
import androidx.annotation.WorkerThread
|
|
||||||
import androidx.collection.LruCache
|
|
||||||
import okhttp3.internal.closeQuietly
|
|
||||||
import okio.Source
|
|
||||||
import okio.source
|
|
||||||
import java.io.File
|
|
||||||
import java.util.zip.ZipFile
|
|
||||||
|
|
||||||
class ZipPool(maxSize: Int) : LruCache<String, ZipFile>(maxSize) {
|
|
||||||
|
|
||||||
override fun entryRemoved(evicted: Boolean, key: String, oldValue: ZipFile, newValue: ZipFile?) {
|
|
||||||
super.entryRemoved(evicted, key, oldValue, newValue)
|
|
||||||
oldValue.closeQuietly()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun create(key: String): ZipFile {
|
|
||||||
return ZipFile(File(key), ZipFile.OPEN_READ)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Synchronized
|
|
||||||
@WorkerThread
|
|
||||||
operator fun get(uri: Uri): Source {
|
|
||||||
val zip = requireNotNull(get(uri.schemeSpecificPart)) {
|
|
||||||
"Cannot obtain zip by \"$uri\""
|
|
||||||
}
|
|
||||||
val entry = zip.getEntry(uri.fragment)
|
|
||||||
return zip.getInputStream(entry).source()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue