Browse Source

Webserver: allow downloading media

transifex
Nicolas Pomepuy 3 years ago
parent
commit
86e63ec1ff
  1. 1
      application/webserver/build.gradle
  2. 19
      application/webserver/src/main/java/org/videolan/vlc/webserver/HttpSharingServer.kt
  3. 4
      buildsystem/network-sharing-server/src/pages/AudioTracks.vue
  4. 7
      buildsystem/network-sharing-server/src/pages/VideoList.vue

1
application/webserver/build.gradle

@ -54,6 +54,7 @@ dependencies {
implementation "io.ktor:ktor-server-websockets:2.1.2"
implementation "io.ktor:ktor-server-cors:2.1.2"
implementation("io.ktor:ktor-server-auth:2.1.2")
implementation("io.ktor:ktor-server-partial-content:2.1.2")
testImplementation 'junit:junit:4.13.2'

19
application/webserver/src/main/java/org/videolan/vlc/webserver/HttpSharingServer.kt

@ -41,6 +41,7 @@ import io.ktor.server.engine.*
import io.ktor.server.http.content.*
import io.ktor.server.netty.*
import io.ktor.server.plugins.cors.routing.*
import io.ktor.server.plugins.partialcontent.*
import io.ktor.server.request.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
@ -178,7 +179,7 @@ class HttpSharingServer(context: Context) : PlaybackService.Callback {
allowHeader(HttpHeaders.ContentType)
anyHost()
}
install(PartialContent)
routing {
if (auth) authenticate("auth-basic") {
setupRouting(context)
@ -395,6 +396,22 @@ class HttpSharingServer(context: Context) : PlaybackService.Callback {
}
call.respond(HttpStatusCode.NotFound)
}
get("/download") {
call.request.queryParameters["id"]?.let {
context.getFromMl { getMedia(it.toLong()) }?. let { media ->
media.uri.path?.let { path ->
val file = File(path)
call.response.header(
HttpHeaders.ContentDisposition,
ContentDisposition.Attachment.withParameter(ContentDisposition.Parameters.FileName, media.uri.lastPathSegment ?: "")
.toString()
)
call.respondFile(file)
}
}
}
call.respond(HttpStatusCode.NotFound)
}
get("/icon") {
val idString = call.request.queryParameters["id"]

4
buildsystem/network-sharing-server/src/pages/AudioTracks.vue

@ -25,6 +25,7 @@
<ul class="dropdown-menu media-more" aria-labelledby="dropdownMenuButton1">
<li> <span v-on:click="play(track, false, false)" class="dropdown-item">Play</span> </li>
<li> <span v-on:click="play(track, true, false)" class="dropdown-item">Append</span> </li>
<li> <span v-on:click="download(track)" class="dropdown-item">Download</span> </li>
</ul>
</div>
</div>
@ -81,6 +82,9 @@ export default {
component.playerStore.warning = { type: "warning", message: error.response.data }
}
})
},
download(media) {
window.open(API_URL + "download?id=" + media.id, '_blank', 'noreferrer');
}
},
created: function () {

7
buildsystem/network-sharing-server/src/pages/VideoList.vue

@ -28,6 +28,7 @@
<li> <span v-on:click="play(video, true, false)" class="dropdown-item">Append</span> </li>
<li> <span v-on:click="play(video, false, true)" class="dropdown-item">Play as audio</span>
</li>
<li> <span v-on:click="download(video)" class="dropdown-item">Download</span> </li>
</ul>
</div>
</div>
@ -89,6 +90,9 @@ export default {
component.playerStore.warning = { type: "warning", message: error.response.data }
}
})
},
download(media) {
window.open(API_URL + "download?id=" + media.id, '_blank', 'noreferrer');
}
},
created: function () {
@ -98,7 +102,6 @@ export default {
</script>
<style>
.ratio>.resolution {
position: absolute;
top: 8px;
@ -111,6 +114,4 @@ export default {
border-radius: 2px;
font-size: 0.6rem;
}
</style>

Loading…
Cancel
Save