diff --git a/app.py b/app.py
index b180cc4..fbbe5a1 100644
--- a/app.py
+++ b/app.py
@@ -146,7 +146,17 @@ def local_video_file():
return jsonify(error=str(error)), 400
except FileNotFoundError:
return jsonify(error=f"Local video not found: {relative_path}"), 404
- return send_file(path, conditional=True, as_attachment=False)
+ as_attachment = request.args.get("download") == "1"
+ return send_file(path, conditional=True, as_attachment=as_attachment)
+
+@app.route('/api/dash/file/download')
+def dash_file_download():
+ relative_path = request.args.get("path", "")
+ try:
+ path = app_dash.safe_video_path(app_dash.DEFAULT_MOUNT_POINT, relative_path)
+ except (ValueError, FileNotFoundError) as error:
+ return jsonify(error=str(error)), 400
+ return send_file(path, as_attachment=True)
@app.route('/api/local-video/thumbnail')
def local_video_thumbnail():
diff --git a/static/js/local-videos.js b/static/js/local-videos.js
index 263b0d4..edc58ac 100644
--- a/static/js/local-videos.js
+++ b/static/js/local-videos.js
@@ -188,6 +188,13 @@
actionsDiv.appendChild(convertButton);
}
+ const downloadLink = document.createElement("a");
+ downloadLink.href = `/api/local-video/file?path=${encodeURIComponent(file.path)}&download=1`;
+ downloadLink.className = "btn btn-sm btn-outline-success btn-icon-mobile";
+ downloadLink.download = file.path.split("/").pop();
+ downloadLink.innerHTML = ' DL';
+ actionsDiv.appendChild(downloadLink);
+
const deleteButton = document.createElement("button");
deleteButton.type = "button";
deleteButton.className = "btn btn-sm btn-outline-danger btn-icon-mobile";