[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