Skip to content
Snippets Groups Projects
Commit b843e7cb authored by Nicolas Pomepuy's avatar Nicolas Pomepuy
Browse files

Remote access: allow download of video groups and video folders

parent f72a1f0d
No related branches found
No related tags found
1 merge request!1848Remote access:dark theme
Pipeline #443266 passed with stages
in 16 minutes and 25 seconds
......@@ -888,6 +888,18 @@ fun Route.setupRouting(appContext: Context, scope: CoroutineScope) {
call.respondText(dst)
return@get
}
"video-group" -> {
val videoGroup = appContext.getFromMl { getVideoGroup(id.toLong()) }
val dst = MediaZipUtils.generateVideoGroupZip(videoGroup, RemoteAccessServer.getInstance(appContext).downloadFolder)
call.respondText(dst)
return@get
}
"video-folder" -> {
val videoFolder = appContext.getFromMl { getFolder(Folder.TYPE_FOLDER_VIDEO, id.toLong()) }
val dst = MediaZipUtils.generateVideoGroupZip(videoFolder, RemoteAccessServer.getInstance(appContext).downloadFolder)
call.respondText(dst)
return@get
}
else -> {
//simple media. It's a direct download
appContext.getFromMl { getMedia(id.toLong()) }?.let { media ->
......
......@@ -24,6 +24,7 @@
package org.videolan.vlc.webserver.utils
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.media.*
import org.videolan.vlc.util.FileUtils
import org.videolan.vlc.util.slugify
......@@ -60,6 +61,37 @@ object MediaZipUtils {
return filename
}
/**
* Generate a zip file for a [VideoGroup]
*
* @param videoGroup the video group to zip
* @return the filename
*/
fun generateVideoGroupZip(videoGroup: VideoGroup, folder:String): String {
val files = videoGroup.media(Medialibrary.SORT_DEFAULT, false, false, false, videoGroup.mediaCount(), 0).mapNotNull { prepareTrackForZip(it, -1) }
val filename = "${videoGroup.title.slugify("_")}.zip"
val dst = File("$folder/$filename")
FileUtils.zipWithName(files.toTypedArray(), dst.path)
return filename
}
/**
* Generate a zip file for a [Folder]
*
* @param videoFolder the video folder to zip
* @return the filename
*/
fun generateVideoGroupZip(videoFolder: Folder, folder:String): String {
val files = videoFolder.media(Folder.TYPE_FOLDER_VIDEO, Medialibrary.SORT_DEFAULT, false, false, false, videoFolder.mediaCount(Folder.TYPE_FOLDER_VIDEO), 0).mapNotNull { prepareTrackForZip(it, -1) }
val filename = "${videoFolder.title.slugify("_")}.zip"
val dst = File("$folder/$filename")
FileUtils.zipWithName(files.toTypedArray(), dst.path)
return filename
}
/**
* Generate a zip file for a [Artist]
*
......
......@@ -2,12 +2,12 @@
<div v-if="loaded && this.videos.length !== 0" class="container">
<div v-if="this.appStore.displayType[this.$route.name]" class="row gx-3 gy-3 media-list">
<template v-for="video in videos" :key="video.id">
<MediaItem :isCard="false" :media="video" :downloadable="true" :mediaType="getMediaType(video)" />
<MediaItem :isCard="false" :media="video" :downloadable="getMediaType(video) == 'video'" :mediaType="getMediaType(video)" />
</template>
</div>
<div v-else class="row gx-3 gy-3 media-content">
<div class="col-md-3 col-sm-4 col-6" v-for="video in videos" :key="video.id">
<MediaItem :isCard="true" :media="video" :downloadable="true" :mediaType="getMediaType(video)" />
<MediaItem :isCard="true" :media="video" :downloadable="getMediaType(video) == 'video'" :mediaType="getMediaType(video)" />
</div>
</div>
</div>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment