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-websockets:2.1.2"
implementation "io.ktor:ktor-server-cors: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-auth:2.1.2")
implementation("io.ktor:ktor-server-partial-content:2.1.2")
testImplementation 'junit:junit:4.13.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.http.content.*
import io.ktor.server.netty.* import io.ktor.server.netty.*
import io.ktor.server.plugins.cors.routing.* import io.ktor.server.plugins.cors.routing.*
import io.ktor.server.plugins.partialcontent.*
import io.ktor.server.request.* import io.ktor.server.request.*
import io.ktor.server.response.* import io.ktor.server.response.*
import io.ktor.server.routing.* import io.ktor.server.routing.*
@ -178,7 +179,7 @@ class HttpSharingServer(context: Context) : PlaybackService.Callback {
allowHeader(HttpHeaders.ContentType) allowHeader(HttpHeaders.ContentType)
anyHost() anyHost()
} }
install(PartialContent)
routing { routing {
if (auth) authenticate("auth-basic") { if (auth) authenticate("auth-basic") {
setupRouting(context) setupRouting(context)
@ -395,6 +396,22 @@ class HttpSharingServer(context: Context) : PlaybackService.Callback {
} }
call.respond(HttpStatusCode.NotFound) 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") { get("/icon") {
val idString = call.request.queryParameters["id"] 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"> <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, 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="play(track, true, false)" class="dropdown-item">Append</span> </li>
<li> <span v-on:click="download(track)" class="dropdown-item">Download</span> </li>
</ul> </ul>
</div> </div>
</div> </div>
@ -81,6 +82,9 @@ export default {
component.playerStore.warning = { type: "warning", message: error.response.data } component.playerStore.warning = { type: "warning", message: error.response.data }
} }
}) })
},
download(media) {
window.open(API_URL + "download?id=" + media.id, '_blank', 'noreferrer');
} }
}, },
created: function () { 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, 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> <span v-on:click="play(video, false, true)" class="dropdown-item">Play as audio</span>
</li> </li>
<li> <span v-on:click="download(video)" class="dropdown-item">Download</span> </li>
</ul> </ul>
</div> </div>
</div> </div>
@ -89,6 +90,9 @@ export default {
component.playerStore.warning = { type: "warning", message: error.response.data } component.playerStore.warning = { type: "warning", message: error.response.data }
} }
}) })
},
download(media) {
window.open(API_URL + "download?id=" + media.id, '_blank', 'noreferrer');
} }
}, },
created: function () { created: function () {
@ -98,7 +102,6 @@ export default {
</script> </script>
<style> <style>
.ratio>.resolution { .ratio>.resolution {
position: absolute; position: absolute;
top: 8px; top: 8px;
@ -111,6 +114,4 @@ export default {
border-radius: 2px; border-radius: 2px;
font-size: 0.6rem; font-size: 0.6rem;
} }
</style> </style>

Loading…
Cancel
Save