[Android] Store files in zip for download
Robert Stone
git at videolan.org
Thu Dec 5 09:16:49 UTC 2024
vlc-android | branch: master | Robert Stone <rhstone at gmail.com> | Fri Nov 8 11:54:21 2024 -0800| [05592ca30302fb214f532e2978c402ad45c66396] | committer: Nicolas Pomepuy
Store files in zip for download
> https://code.videolan.org/videolan/vlc-android/commit/05592ca30302fb214f532e2978c402ad45c66396
---
.../src/org/videolan/vlc/util/FileUtils.kt | 27 ++++++++++++++++++++--
.../videolan/vlc/webserver/utils/MediaZipUtils.kt | 12 +++++-----
2 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/application/vlc-android/src/org/videolan/vlc/util/FileUtils.kt b/application/vlc-android/src/org/videolan/vlc/util/FileUtils.kt
index 1fb6a2ec00..da37b0b7d4 100644
--- a/application/vlc-android/src/org/videolan/vlc/util/FileUtils.kt
+++ b/application/vlc-android/src/org/videolan/vlc/util/FileUtils.kt
@@ -52,6 +52,7 @@ import org.videolan.vlc.media.MediaUtils
import java.io.*
import java.lang.Runnable
import java.util.*
+import java.util.zip.CRC32
import java.util.zip.ZipEntry
import java.util.zip.ZipInputStream
import java.util.zip.ZipOutputStream
@@ -489,15 +490,22 @@ object FileUtils {
}
}
- fun zipWithName(files: Array<Pair<String, String>>, zipFileName: String): Boolean {
+ fun zipWithName(files: Array<Pair<String, String>>, zipFileName: String, storeOnly: Boolean = false): Boolean {
return try {
File(zipFileName).parentFile?.mkdirs()
ZipOutputStream(BufferedOutputStream(FileOutputStream(zipFileName))).use { out ->
val data = ByteArray(BUFFER)
for (i in files.indices) {
+ val entry = ZipEntry(files[i].second).apply {
+ if (storeOnly) {
+ method = ZipEntry.STORED
+ size = File(files[i].first).length()
+ compressedSize = size
+ crc = computeZipChecksum(files[i].first)
+ }
+ }
val fi = FileInputStream(files[i].first)
BufferedInputStream(fi, BUFFER).use { origin ->
- val entry = ZipEntry(files[i].second)
out.putNextEntry(entry)
var count = origin.read(data, 0, BUFFER)
@@ -515,6 +523,21 @@ object FileUtils {
}
}
+ private fun computeZipChecksum(inputFile: String): Long {
+ val crc32 = CRC32()
+ val data = ByteArray(BUFFER)
+ val fi = FileInputStream(inputFile)
+ BufferedInputStream(fi, BUFFER).use { origin ->
+ var count = origin.read(data, 0, BUFFER)
+
+ while (count != -1) {
+ crc32.update(data, 0, count)
+ count = origin.read(data, 0, BUFFER)
+ }
+ }
+ return crc32.value
+ }
+
@Throws(Exception::class)
fun convertStreamToString(`is`: InputStream): String {
val reader = BufferedReader(InputStreamReader(`is`))
diff --git a/application/webserver/src/main/java/org/videolan/vlc/webserver/utils/MediaZipUtils.kt b/application/webserver/src/main/java/org/videolan/vlc/webserver/utils/MediaZipUtils.kt
index 3f3abf6595..3eedb7f056 100644
--- a/application/webserver/src/main/java/org/videolan/vlc/webserver/utils/MediaZipUtils.kt
+++ b/application/webserver/src/main/java/org/videolan/vlc/webserver/utils/MediaZipUtils.kt
@@ -42,7 +42,7 @@ object MediaZipUtils {
val filename = "${genre.title.slugify("_")}.zip"
val dst = File("$folder/$filename")
- FileUtils.zipWithName(files.toTypedArray(), dst.path)
+ FileUtils.zipWithName(files.toTypedArray(), dst.path, true)
return filename
}
@@ -57,7 +57,7 @@ object MediaZipUtils {
val filename = "${playlist.title.slugify("_")}.zip"
val dst = File("$folder/$filename")
- FileUtils.zipWithName(files.toTypedArray(), dst.path)
+ FileUtils.zipWithName(files.toTypedArray(), dst.path, true)
return filename
}
@@ -72,7 +72,7 @@ object MediaZipUtils {
val filename = "${videoGroup.title.slugify("_")}.zip"
val dst = File("$folder/$filename")
- FileUtils.zipWithName(files.toTypedArray(), dst.path)
+ FileUtils.zipWithName(files.toTypedArray(), dst.path, true)
return filename
}
@@ -88,7 +88,7 @@ object MediaZipUtils {
val filename = "${videoFolder.title.slugify("_")}.zip"
val dst = File("$folder/$filename")
- FileUtils.zipWithName(files.toTypedArray(), dst.path)
+ FileUtils.zipWithName(files.toTypedArray(), dst.path, true)
return filename
}
@@ -110,7 +110,7 @@ object MediaZipUtils {
val filename = "${artist.title.slugify("_")}.zip"
val dst = File("$folder/$filename")
- FileUtils.zipWithName(files.toTypedArray(), dst.path)
+ FileUtils.zipWithName(files.toTypedArray(), dst.path, true)
return filename
}
@@ -124,7 +124,7 @@ object MediaZipUtils {
val filename = "${album.title.slugify("_")}.zip"
val dst = File("$folder/$filename")
val files = generateAlbumFiles(album)
- FileUtils.zipWithName(files.toTypedArray(), dst.path)
+ FileUtils.zipWithName(files.toTypedArray(), dst.path, true)
return filename
}
More information about the Android
mailing list