Compare commits

..

1 Commits

Author SHA1 Message Date
54a3bb8cc7 fix downloads 2026-01-27 18:49:21 +00:00
5 changed files with 25 additions and 24 deletions

22
app.py
View File

@ -782,9 +782,15 @@ def serve_file(subpath):
root, *relative_parts = subpath.split('/')
dltoken = request.args.get('dltoken')
token_payload = None
if dltoken:
as_attachment = True
full_path = auth.decode_token(dltoken)['filename']
try:
token_payload = auth.decode_token(dltoken)
full_path = token_payload['filename']
except Exception as e:
app.logger.warning(f"Invalid dltoken: {e}")
return jsonify({'Unauthorized': 'Invalid token'}), 403
else:
as_attachment = False
base_path = session['folders'].get(root)
@ -811,6 +817,8 @@ def serve_file(subpath):
user_agent = request.headers.get('User-Agent')
range_header = request.headers.get('Range', '')
req_id = request.args.get('req') or request.headers.get('X-Request-Id')
token_device_id = token_payload.get('device_id') if token_payload else None
device_id = token_device_id or session.get('device_id')
def is_range_prefetch(header, ua):
"""
@ -932,7 +940,7 @@ def serve_file(subpath):
mime,
ip_address,
user_agent,
session['device_id'],
device_id,
cached_hit,
request.method
)
@ -995,7 +1003,7 @@ def serve_file(subpath):
mime,
ip_address,
user_agent,
session['device_id'],
device_id,
cached_hit,
request.method
)
@ -1145,6 +1153,11 @@ def create_dltoken(subpath):
root, *relative_parts = subpath.split('/')
base_path = session['folders'].get(root)
full_path = os.path.join(base_path or '', *relative_parts)
device_id = session.get('device_id')
if not device_id:
device_id = os.urandom(32).hex()
session['device_id'] = device_id
try:
full_path = check_path(full_path)
@ -1158,7 +1171,8 @@ def create_dltoken(subpath):
validity_date = datetime.now().strftime('%d.%m.%Y')
data = {
"validity": validity_date,
"filename": str(full_path)
"filename": str(full_path),
"device_id": device_id
}
token = auth.generate_token(data)

View File

@ -354,6 +354,8 @@ KEY_MAP = {
"folders": "f",
"foldername": "n",
"folderpath": "p",
"filename": "fn",
"device_id": "d",
}
# Build the inverse map automatically
INV_KEY_MAP = {short: long for long, short in KEY_MAP.items()}

View File

@ -1,4 +1,3 @@
import os
import sqlite3
from flask import Flask, render_template, request, request, jsonify, session
import random
@ -124,22 +123,8 @@ def searchcommand():
transcript.lower().count(w.lower()) for w in words
)
record.pop('transcript', None)
filetype = (record.get('filetype') or '').lower()
if filetype == '.sng':
record['fulltext_type'] = 'sng'
record['fulltext_url'] = f"/media/{quote(record.get('relative_path', ''), safe='/')}"
else:
record['fulltext_type'] = 'transcript'
relative_path = record.get('relative_path', '')
filename = record.get('filename', '')
name_root = os.path.splitext(filename)[0] if filename else os.path.splitext(os.path.basename(relative_path))[0]
parent = os.path.dirname(relative_path)
if parent:
transcript_rel_path = f"{parent}/Transkription/{name_root}.md"
else:
transcript_rel_path = f"Transkription/{name_root}.md"
record['fulltext_url'] = f"/transcript/{quote(transcript_rel_path, safe='/')}"
record['fulltext_url'] = f"/media/{quote(record.get('relative_path', ''), safe='/')}"
record['fulltext_type'] = 'sng' if (record.get('filetype') or '').lower() == '.sng' else 'transcript'
# convert date to TT.MM.YYYY format
if record.get('performance_date'):
try:

View File

@ -1338,6 +1338,6 @@ footer .audio-player-container {
}
.file-access-actions {
flex-wrap: wrap;
align-content: flex-start;
flex-wrap: nowrap;
white-space: nowrap;
}

View File

@ -1,4 +1,4 @@
const CACHE_NAME = 'gottesdienste-app-v1.3';
const CACHE_NAME = 'gottesdienste-app-v1.2';
const ASSETS = [
'/',
'/static/app.css',