|
|
|
@ -24,43 +24,41 @@ class PageLoader(
|
|
|
|
private val tasks = ArrayMap<String, Deferred<File>>()
|
|
|
|
private val tasks = ArrayMap<String, Deferred<File>>()
|
|
|
|
private val convertLock = Mutex()
|
|
|
|
private val convertLock = Mutex()
|
|
|
|
|
|
|
|
|
|
|
|
suspend fun loadFile(url: String, force: Boolean): File {
|
|
|
|
suspend fun loadFile(url: String, referer: String, force: Boolean): File {
|
|
|
|
if (!force) {
|
|
|
|
if (!force) {
|
|
|
|
cache[url]?.let {
|
|
|
|
cache[url]?.let {
|
|
|
|
return it
|
|
|
|
return it
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
val task = tasks[url]?.takeUnless { it.isCancelled || (force && it.isCompleted) }
|
|
|
|
val task = tasks[url]?.takeUnless { it.isCancelled || (force && it.isCompleted) }
|
|
|
|
return (task ?: loadAsync(url).also { tasks[url] = it }).await()
|
|
|
|
return (task ?: loadAsync(url, referer).also { tasks[url] = it }).await()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private fun loadAsync(url: String) = async(Dispatchers.IO) {
|
|
|
|
private fun loadAsync(url: String, referer: String) = async(Dispatchers.IO) {
|
|
|
|
val uri = Uri.parse(url)
|
|
|
|
val uri = Uri.parse(url)
|
|
|
|
if (uri.scheme == "cbz") {
|
|
|
|
if (uri.scheme == "cbz") {
|
|
|
|
val zip = ZipFile(uri.schemeSpecificPart)
|
|
|
|
val zip = ZipFile(uri.schemeSpecificPart)
|
|
|
|
val entry = zip.getEntry(uri.fragment)
|
|
|
|
val entry = zip.getEntry(uri.fragment)
|
|
|
|
zip.getInputStream(entry).use {
|
|
|
|
zip.getInputStream(entry).use {
|
|
|
|
cache.put(url) { out ->
|
|
|
|
cache.put(url, it)
|
|
|
|
it.copyTo(out)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
val request = Request.Builder()
|
|
|
|
val request = Request.Builder()
|
|
|
|
.url(url)
|
|
|
|
.url(url)
|
|
|
|
.get()
|
|
|
|
.get()
|
|
|
|
.header("Accept", "image/webp,image/png;q=0.9,image/jpeg,*/*;q=0.8")
|
|
|
|
.header("Accept", "image/webp,image/png;q=0.9,image/jpeg,*/*;q=0.8")
|
|
|
|
|
|
|
|
.header("Referer", referer)
|
|
|
|
.cacheControl(CacheUtils.CONTROL_DISABLED)
|
|
|
|
.cacheControl(CacheUtils.CONTROL_DISABLED)
|
|
|
|
.build()
|
|
|
|
.build()
|
|
|
|
okHttp.newCall(request).await().use { response ->
|
|
|
|
okHttp.newCall(request).await().use { response ->
|
|
|
|
val body = response.body
|
|
|
|
|
|
|
|
check(response.isSuccessful) {
|
|
|
|
check(response.isSuccessful) {
|
|
|
|
"Invalid response: ${response.code} ${response.message}"
|
|
|
|
"Invalid response: ${response.code} ${response.message}"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
checkNotNull(body) {
|
|
|
|
val body = checkNotNull(response.body) {
|
|
|
|
"Null response"
|
|
|
|
"Null response"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
cache.put(url) { out ->
|
|
|
|
body.byteStream().use {
|
|
|
|
body.byteStream().use { it.copyTo(out) }
|
|
|
|
cache.put(url, it)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|