Compare commits
2 Commits
d3743d2685
...
311fd89a54
| Author | SHA1 | Date | |
|---|---|---|---|
| 311fd89a54 | |||
| 5015075694 |
35
analytics.py
35
analytics.py
@ -249,20 +249,33 @@ def return_folder_yesterday():
|
||||
|
||||
|
||||
def return_file_access():
|
||||
"""Return recent file access logs from memory (the last 10 minutes)."""
|
||||
"""Return recent audio file access logs from memory (the last 10 minutes)."""
|
||||
global file_access_temp
|
||||
if file_access_temp:
|
||||
# Create a timezone-aware cutoff time
|
||||
cutoff_time = datetime.now(timezone.utc).astimezone() - timedelta(minutes=10)
|
||||
# Only keep entries with timestamps greater than or equal to cutoff_time
|
||||
file_access_temp[:] = [
|
||||
entry for entry in file_access_temp
|
||||
if datetime.fromisoformat(entry[0]) >= cutoff_time
|
||||
]
|
||||
return file_access_temp
|
||||
else:
|
||||
|
||||
def is_audio(entry):
|
||||
"""Check whether a log entry references an audio file."""
|
||||
mime_val = (entry[3] or "").lower()
|
||||
if mime_val.startswith("audio/"):
|
||||
return True
|
||||
path_val = (entry[1] or "").lower()
|
||||
return path_val.endswith((
|
||||
".mp3", ".wav", ".flac", ".m4a", ".aac",
|
||||
".ogg", ".wma", ".aiff", ".alac", ".opus"
|
||||
))
|
||||
|
||||
if not file_access_temp:
|
||||
return []
|
||||
|
||||
# Create a timezone-aware cutoff time
|
||||
cutoff_time = datetime.now(timezone.utc).astimezone() - timedelta(minutes=10)
|
||||
# Only keep entries with timestamps greater than or equal to cutoff_time
|
||||
file_access_temp[:] = [
|
||||
entry for entry in file_access_temp
|
||||
if datetime.fromisoformat(entry[0]) >= cutoff_time
|
||||
]
|
||||
# Only expose audio file accesses to the UI
|
||||
return [entry for entry in file_access_temp if is_audio(entry)]
|
||||
|
||||
|
||||
def return_file_access_with_geo():
|
||||
"""Return recent file access logs with geographic coordinates from the database."""
|
||||
|
||||
10
app.py
10
app.py
@ -799,6 +799,16 @@ def serve_file(subpath):
|
||||
else:
|
||||
cache = cache_other
|
||||
|
||||
# Plain HEAD requests (without X-Cache-Request) should not populate the cache.
|
||||
# They are just probes and would otherwise turn the first real GET into a “cached hit”.
|
||||
if request.method == 'HEAD' and not is_cache_request:
|
||||
response = make_response('', 200)
|
||||
response.headers['Content-Type'] = mime
|
||||
response.headers['Content-Length'] = str(filesize)
|
||||
response.headers['Accept-Ranges'] = 'bytes'
|
||||
response.headers['Cache-Control'] = 'public, max-age=86400'
|
||||
return response
|
||||
|
||||
# 4) Image and thumbnail handling first
|
||||
if mime.startswith('image/'):
|
||||
small = request.args.get('thumbnail') == 'true'
|
||||
|
||||
@ -101,7 +101,8 @@
|
||||
{% block content %}
|
||||
<div class="page-content">
|
||||
<div class="section-header">
|
||||
<h2 style="margin: 0;">Verbindungen der letzten 10 Minuten</h2>
|
||||
<h2 style="margin: 0;">Verbindungen der letzten 10 Minuten (nur Audio)</h2>
|
||||
<p class="text-muted" style="margin: 4px 0 0 0;">Diese Ansicht listet ausschließlich Zugriffe auf Audio-Dateien.</p>
|
||||
<div class="stats">
|
||||
<div class="stat-item">
|
||||
<div class="stat-label">Last Connection</div>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user