Improve extension discovery. Fix #542

This commit is contained in:
len 2016-11-22 20:49:57 +01:00
parent 830f792824
commit 0db1a3167d
2 changed files with 24 additions and 11 deletions

View File

@ -25,6 +25,7 @@ import rx.subjects.BehaviorSubject
import rx.subscriptions.CompositeSubscription import rx.subscriptions.CompositeSubscription
import timber.log.Timber import timber.log.Timber
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.net.URLConnection
/** /**
* This class is the one in charge of downloading chapters. * This class is the one in charge of downloading chapters.
@ -366,19 +367,22 @@ class Downloader(private val context: Context, private val provider: DownloadPro
/** /**
* Returns the extension of the downloaded image from the network response, or if it's null, * Returns the extension of the downloaded image from the network response, or if it's null,
* analyze the file. If both fail, assume it's a jpg. * analyze the file. If everything fails, assume it's a jpg.
* *
* @param response the network response of the image. * @param response the network response of the image.
* @param file the file where the image is already downloaded. * @param file the file where the image is already downloaded.
*/ */
private fun getImageExtension(response: Response, file: UniFile): String { private fun getImageExtension(response: Response, file: UniFile): String {
val contentType = response.body().contentType() // Read content type if available.
val mimeStr = if (contentType != null) { val mime = response.body().contentType()?.let { ct -> "${ct.type()}/${ct.subtype()}" }
"${contentType.type()}/${contentType.subtype()}" // Else guess from the uri.
} else { ?: context.contentResolver.getType(file.uri)
context.contentResolver.getType(file.uri) // Else read magic numbers.
?: file.openInputStream().buffered().use {
URLConnection.guessContentTypeFromStream(it)
} }
return MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeStr) ?: "jpg"
return MimeTypeMap.getSingleton().getExtensionFromMimeType(mime) ?: "jpg"
} }
/** /**

View File

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.reader
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import android.webkit.MimeTypeMap
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.cache.ChapterCache import eu.kanade.tachiyomi.data.cache.ChapterCache
import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.cache.CoverCache
@ -29,6 +30,7 @@ import rx.schedulers.Schedulers
import timber.log.Timber import timber.log.Timber
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.io.File import java.io.File
import java.net.URLConnection
import java.util.* import java.util.*
/** /**
@ -563,14 +565,21 @@ class ReaderPresenter : BasePresenter<ReaderActivity>() {
// Copy file in background. // Copy file in background.
Observable Observable
.fromCallable { .fromCallable {
// File where the image will be saved. // Folder where the image will be saved.
val destDir = File(pictureDirectory) val destDir = File(pictureDirectory)
destDir.mkdirs() destDir.mkdirs()
val destFile = File(destDir, manga.title + " - " + chapter.name + // Find out file extension.
" - " + (page.index + 1)) val mime = context.contentResolver.getType(page.uri)
?: context.contentResolver.openInputStream(page.uri).buffered().use {
URLConnection.guessContentTypeFromStream(it)
}
val ext = MimeTypeMap.getSingleton().getExtensionFromMimeType(mime) ?: "jpg"
// Destination file.
val destFile = File(destDir, manga.title + " - " + chapter.name +
" - " + (page.index + 1) + ".$ext")
// Location of image file.
context.contentResolver.openInputStream(page.uri).use { input -> context.contentResolver.openInputStream(page.uri).use { input ->
destFile.outputStream().use { output -> destFile.outputStream().use { output ->
input.copyTo(output) input.copyTo(output)