extract apk icon (#1966)
This commit is contained in:
@@ -14,6 +14,8 @@ import eu.kanade.tachiyomi.source.CatalogueSource
|
|||||||
import eu.kanade.tachiyomi.source.Source
|
import eu.kanade.tachiyomi.source.Source
|
||||||
import eu.kanade.tachiyomi.source.SourceFactory
|
import eu.kanade.tachiyomi.source.SourceFactory
|
||||||
import io.github.oshai.kotlinlogging.KotlinLogging
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
||||||
|
import net.dongliu.apk.parser.ApkFile
|
||||||
|
import net.dongliu.apk.parser.bean.Icon
|
||||||
import okhttp3.CacheControl
|
import okhttp3.CacheControl
|
||||||
import okio.buffer
|
import okio.buffer
|
||||||
import okio.sink
|
import okio.sink
|
||||||
@@ -37,7 +39,9 @@ import suwayomi.tachidesk.manga.impl.util.PackageTools.getPackageInfo
|
|||||||
import suwayomi.tachidesk.manga.impl.util.PackageTools.loadExtensionSources
|
import suwayomi.tachidesk.manga.impl.util.PackageTools.loadExtensionSources
|
||||||
import suwayomi.tachidesk.manga.impl.util.network.await
|
import suwayomi.tachidesk.manga.impl.util.network.await
|
||||||
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource
|
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource
|
||||||
|
import suwayomi.tachidesk.manga.impl.util.storage.ImageResponse.clearCachedImage
|
||||||
import suwayomi.tachidesk.manga.impl.util.storage.ImageResponse.getImageResponse
|
import suwayomi.tachidesk.manga.impl.util.storage.ImageResponse.getImageResponse
|
||||||
|
import suwayomi.tachidesk.manga.impl.util.storage.ImageResponse.saveImage
|
||||||
import suwayomi.tachidesk.manga.model.table.ExtensionTable
|
import suwayomi.tachidesk.manga.model.table.ExtensionTable
|
||||||
import suwayomi.tachidesk.manga.model.table.SourceTable
|
import suwayomi.tachidesk.manga.model.table.SourceTable
|
||||||
import suwayomi.tachidesk.server.ApplicationDirs
|
import suwayomi.tachidesk.server.ApplicationDirs
|
||||||
@@ -155,6 +159,7 @@ object Extension {
|
|||||||
|
|
||||||
dex2jar(apkFilePath, jarFilePath, fileNameWithoutType)
|
dex2jar(apkFilePath, jarFilePath, fileNameWithoutType)
|
||||||
extractAssetsFromApk(apkFilePath, jarFilePath)
|
extractAssetsFromApk(apkFilePath, jarFilePath)
|
||||||
|
extractAndCacheApkIcon(apkFilePath, apkName)
|
||||||
|
|
||||||
// clean up
|
// clean up
|
||||||
File(apkFilePath).delete()
|
File(apkFilePath).delete()
|
||||||
@@ -228,6 +233,33 @@ object Extension {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun extractAndCacheApkIcon(
|
||||||
|
apkFilePath: String,
|
||||||
|
apkName: String,
|
||||||
|
) {
|
||||||
|
val iconCacheDir = "${applicationDirs.extensionsRoot}/icon"
|
||||||
|
try {
|
||||||
|
val iconData =
|
||||||
|
ApkFile(File(apkFilePath)).use { apk ->
|
||||||
|
apk.allIcons
|
||||||
|
.filterIsInstance<Icon>()
|
||||||
|
.mapNotNull { it.data?.let { data -> data to it.density } }
|
||||||
|
.maxByOrNull { (_, density) -> density }
|
||||||
|
?.first
|
||||||
|
}
|
||||||
|
if (iconData == null) {
|
||||||
|
logger.warn { "No icon found in APK $apkName" }
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
File(iconCacheDir).mkdirs()
|
||||||
|
clearCachedImage(iconCacheDir, apkName)
|
||||||
|
saveImage("$iconCacheDir/$apkName", iconData.inputStream(), null)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
logger.warn(e) { "Failed to extract icon from APK $apkName" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun extractAssetsFromApk(
|
private fun extractAssetsFromApk(
|
||||||
apkPath: String,
|
apkPath: String,
|
||||||
jarPath: String,
|
jarPath: String,
|
||||||
|
|||||||
Reference in New Issue
Block a user