mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Fix file deletion
This commit is contained in:
parent
abf3102fe6
commit
c728e70f2f
5 changed files with 45 additions and 9 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue