Fix file deletion

This commit is contained in:
CranberrySoup 2024-02-04 16:32:01 +01:00
parent abf3102fe6
commit c728e70f2f
5 changed files with 45 additions and 9 deletions

View file

@ -61,6 +61,7 @@ import com.lagradost.cloudstream3.APIHolder.apis
import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings
import com.lagradost.cloudstream3.APIHolder.initAll import com.lagradost.cloudstream3.APIHolder.initAll
import com.lagradost.cloudstream3.APIHolder.updateHasTrailers import com.lagradost.cloudstream3.APIHolder.updateHasTrailers
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
import com.lagradost.cloudstream3.CommonActivity.loadThemes import com.lagradost.cloudstream3.CommonActivity.loadThemes
@ -287,9 +288,27 @@ var app = Requests(responseParser = object : ResponseParser {
class MainActivity : AppCompatActivity(), ColorPickerDialogListener { class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
companion object { companion object {
const val TAG = "MAINACT" const val TAG = "MAINACT"
const val ANIMATED_OUTLINE : Boolean = false const val ANIMATED_OUTLINE: Boolean = false
var lastError: String? = null var lastError: String? = null
private const val FILE_DELETE_KEY = "FILES_TO_DELETE_KEY"
/**
* Transient files to delete on application exit.
* Deletes files on onDestroy().
*/
private var filesToDelete: Set<String>
// This needs to be persistent because the application may exit without calling onDestroy.
get() = getKey<Set<String>>(FILE_DELETE_KEY) ?: setOf()
private set(value) = setKey(FILE_DELETE_KEY, value)
/**
* Add file to delete on Exit.
*/
fun deleteFileOnExit(file: File) {
filesToDelete = filesToDelete + file.path
}
/** /**
* Setting this will automatically enter the query in the search * Setting this will automatically enter the query in the search
* next time the search fragment is opened. * next time the search fragment is opened.
@ -676,6 +695,15 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
} }
override fun onDestroy() { override fun onDestroy() {
filesToDelete.forEach { path ->
val result = File(path).deleteRecursively()
if (result) {
Log.d(TAG, "Deleted temporary file: $path")
} else {
Log.d(TAG, "Failed to delete temporary file: $path")
}
}
filesToDelete = setOf()
val broadcastIntent = Intent() val broadcastIntent = Intent()
broadcastIntent.action = "restart_service" broadcastIntent.action = "restart_service"
broadcastIntent.setClass(this, VideoDownloadRestartReceiver::class.java) broadcastIntent.setClass(this, VideoDownloadRestartReceiver::class.java)
@ -1654,7 +1682,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
// this ensures that no unnecessary space is taken // this ensures that no unnecessary space is taken
loadCache() loadCache()
File(filesDir, "exoplayer").deleteRecursively() // old cache File(filesDir, "exoplayer").deleteRecursively() // old cache
File(cacheDir, "exoplayer").deleteOnExit() // current cache deleteFileOnExit(File(cacheDir, "exoplayer")) // current cache
} catch (e: Exception) { } catch (e: Exception) {
logError(e) logError(e)
} }

View file

@ -2,6 +2,7 @@ package com.lagradost.cloudstream3.subtitles
import androidx.annotation.WorkerThread import androidx.annotation.WorkerThread
import androidx.core.net.toUri import androidx.core.net.toUri
import com.lagradost.cloudstream3.MainActivity.Companion.deleteFileOnExit
import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.subtitles.AbstractSubtitleEntities.SubtitleEntity import com.lagradost.cloudstream3.subtitles.AbstractSubtitleEntities.SubtitleEntity
import com.lagradost.cloudstream3.subtitles.AbstractSubtitleEntities.SubtitleSearch import com.lagradost.cloudstream3.subtitles.AbstractSubtitleEntities.SubtitleSearch
@ -48,7 +49,7 @@ interface AbstractSubProvider {
class SubtitleResource { class SubtitleResource {
fun downloadFile(source: BufferedSource): File { fun downloadFile(source: BufferedSource): File {
val file = File.createTempFile("temp-subtitle", ".tmp").apply { val file = File.createTempFile("temp-subtitle", ".tmp").apply {
deleteOnExit() deleteFileOnExit(this)
} }
val sink = file.sink().buffer() val sink = file.sink().buffer()
sink.writeAll(source) sink.writeAll(source)
@ -66,7 +67,7 @@ class SubtitleResource {
while (zipEntry != null) { while (zipEntry != null) {
val tempFile = File.createTempFile("unzipped-subtitle", ".tmp").apply { val tempFile = File.createTempFile("unzipped-subtitle", ".tmp").apply {
deleteOnExit() deleteFileOnExit(this)
} }
entries.add(zipEntry.name to tempFile) entries.add(zipEntry.name to tempFile)
@ -103,13 +104,17 @@ class SubtitleResource {
this.resources.add( this.resources.add(
SingleSubtitleResource(name, file.toUri().toString(), SubtitleOrigin.DOWNLOADED_FILE) SingleSubtitleResource(name, file.toUri().toString(), SubtitleOrigin.DOWNLOADED_FILE)
) )
file.deleteOnExit() // Remove? deleteFileOnExit(file)
} }
suspend fun addZipUrl(url: String, nameGenerator: (String, File) -> String? = { _, _ -> null }) { suspend fun addZipUrl(
url: String,
nameGenerator: (String, File) -> String? = { _, _ -> null }
) {
val source = app.get(url).okhttpResponse.body.source() val source = app.get(url).okhttpResponse.body.source()
val zip = downloadFile(source) val zip = downloadFile(source)
val realFiles = unzip(zip) val realFiles = unzip(zip)
zip.deleteRecursively()
realFiles.forEach { (name, subtitleFile) -> realFiles.forEach { (name, subtitleFile) ->
addFile(subtitleFile, nameGenerator(name, subtitleFile)) addFile(subtitleFile, nameGenerator(name, subtitleFile))
} }

View file

@ -50,6 +50,7 @@ import androidx.preference.PreferenceManager
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
import com.lagradost.cloudstream3.MainActivity.Companion.deleteFileOnExit
import com.lagradost.cloudstream3.USER_AGENT import com.lagradost.cloudstream3.USER_AGENT
import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mvvm.debugAssert import com.lagradost.cloudstream3.mvvm.debugAssert
@ -657,7 +658,7 @@ class CS3IPlayer : IPlayer {
SimpleCache( SimpleCache(
File( File(
context.cacheDir, "exoplayer" context.cacheDir, "exoplayer"
).also { it.deleteOnExit() }, // Ensures always fresh file ).also { deleteFileOnExit(it) }, // Ensures always fresh file
LeastRecentlyUsedCacheEvictor(cacheSize), LeastRecentlyUsedCacheEvictor(cacheSize),
databaseProvider databaseProvider
) )

View file

@ -23,6 +23,7 @@ import okio.buffer
import okio.sink import okio.sink
import java.io.File import java.io.File
import android.text.TextUtils import android.text.TextUtils
import com.lagradost.cloudstream3.MainActivity.Companion.deleteFileOnExit
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
import java.io.BufferedReader import java.io.BufferedReader
import java.io.IOException import java.io.IOException
@ -213,7 +214,7 @@ class InAppUpdater {
this.cacheDir.listFiles()?.filter { this.cacheDir.listFiles()?.filter {
it.name.startsWith(appUpdateName) && it.extension == appUpdateSuffix it.name.startsWith(appUpdateName) && it.extension == appUpdateSuffix
}?.forEach { }?.forEach {
it.deleteOnExit() deleteFileOnExit(it)
} }
val downloadedFile = File.createTempFile(appUpdateName, ".$appUpdateSuffix") val downloadedFile = File.createTempFile(appUpdateName, ".$appUpdateSuffix")

View file

@ -12,6 +12,7 @@ import android.os.IBinder
import android.util.Log import android.util.Log
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import com.lagradost.cloudstream3.MainActivity import com.lagradost.cloudstream3.MainActivity
import com.lagradost.cloudstream3.MainActivity.Companion.deleteFileOnExit
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.AppUtils.createNotificationChannel import com.lagradost.cloudstream3.utils.AppUtils.createNotificationChannel
@ -75,7 +76,7 @@ class PackageInstallerService : Service() {
this@PackageInstallerService.cacheDir.listFiles()?.filter { this@PackageInstallerService.cacheDir.listFiles()?.filter {
it.name.startsWith(appUpdateName) && it.extension == appUpdateSuffix it.name.startsWith(appUpdateName) && it.extension == appUpdateSuffix
}?.forEach { }?.forEach {
it.deleteOnExit() deleteFileOnExit(it)
} }
} }