Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -3,7 +3,7 @@ import subprocess
|
|
3 |
import os
|
4 |
from datetime import datetime, timedelta
|
5 |
from apscheduler.schedulers.background import BackgroundScheduler
|
6 |
-
import pytz # Für Zeitzonen-Management
|
7 |
|
8 |
# --- Konfiguration ---
|
9 |
OUTPUT_DIR = "recordings"
|
@@ -14,10 +14,6 @@ os.makedirs(OUTPUT_DIR, exist_ok=True)
|
|
14 |
scheduler = BackgroundScheduler()
|
15 |
scheduler.start()
|
16 |
|
17 |
-
# --- Globale Variable für laufende Prozesse (optional, aber nützlich für Stop-Funktionalität) ---
|
18 |
-
# Für dieses einfache Beispiel lassen wir das "Stoppen" über die Dauer von ffmpeg
|
19 |
-
# Wenn du eine "Sofort Stoppen"-Funktion bräuchtest, müsstest du ffmpeg-Prozesse speichern und killen.
|
20 |
-
|
21 |
# --- Funktionen für die Aufnahme und Planung ---
|
22 |
|
23 |
def record_radio_stream(stream_url: str, output_filename: str, duration_seconds: int):
|
@@ -57,31 +53,20 @@ def record_radio_stream(stream_url: str, output_filename: str, duration_seconds:
|
|
57 |
os.remove(full_output_path)
|
58 |
return None # Signalisiere Fehler
|
59 |
|
60 |
-
def schedule_recording(stream_url: str,
|
61 |
"""
|
62 |
Plant eine Webradio-Aufnahme basierend auf Start- und Endzeit.
|
63 |
-
Die Zeiten kommen als
|
64 |
"""
|
65 |
try:
|
66 |
-
# Gradio gibt Datetime-Strings im Format 'YYYY-MM-DD HH:MM:SS' zurück
|
67 |
-
# Konvertiere in datetime-Objekte
|
68 |
-
start_datetime = datetime.fromisoformat(start_datetime_str)
|
69 |
-
end_datetime = datetime.fromisoformat(end_datetime_str)
|
70 |
-
|
71 |
-
# Optional: Zeitzone explizit setzen (z.B. UTC), wenn du sicherstellen willst, dass es unabhängig vom Server läuft
|
72 |
-
# Du kannst hier auch die Zeitzone des Nutzers abfragen, wenn es komplizierter werden soll
|
73 |
-
# Für Hugging Face Spaces ist UTC oft eine gute Wahl für den Server.
|
74 |
-
# Wenn der Nutzer aber eine lokale Zeit eingibt, muss dies berücksichtigt werden.
|
75 |
-
# Hier gehen wir davon aus, dass die eingegebene Zeit auf dem Server interpretiert wird.
|
76 |
-
|
77 |
# Berechne die Dauer der Aufnahme in Sekunden
|
78 |
-
duration = (
|
79 |
|
80 |
if duration <= 0:
|
81 |
return "❌ Fehler: Die Endzeit muss nach der Startzeit liegen."
|
82 |
|
83 |
# Generiere einen eindeutigen Dateinamen
|
84 |
-
timestamp =
|
85 |
output_filename = f"radio_recording_{timestamp}.mp3"
|
86 |
|
87 |
# Füge den Job zum Scheduler hinzu
|
@@ -89,7 +74,7 @@ def schedule_recording(stream_url: str, start_datetime_str: str, end_datetime_st
|
|
89 |
scheduler.add_job(
|
90 |
record_radio_stream,
|
91 |
'date',
|
92 |
-
run_date=
|
93 |
args=[stream_url, output_filename, int(duration)] # Dauer als Integer übergeben
|
94 |
)
|
95 |
|
@@ -97,10 +82,8 @@ def schedule_recording(stream_url: str, start_datetime_str: str, end_datetime_st
|
|
97 |
# for job in scheduler.get_jobs():
|
98 |
# print(f"Geplanter Job: {job.id} - Nächste Ausführung: {job.next_run_time}")
|
99 |
|
100 |
-
return f"✅ Aufnahme von **{stream_url}** erfolgreich geplant.\nStart: **{
|
101 |
|
102 |
-
except ValueError as e:
|
103 |
-
return f"❌ Fehler beim Parsen der Daten/Uhrzeiten: {e}. Bitte stelle sicher, dass das Format korrekt ist."
|
104 |
except Exception as e:
|
105 |
return f"❌ Ein unerwarteter Fehler ist aufgetreten: {e}"
|
106 |
|
@@ -129,12 +112,14 @@ with gr.Blocks() as demo:
|
|
129 |
placeholder="z.B. http://stream.laut.fm/meinstream (MP3- oder AAC-Stream)"
|
130 |
)
|
131 |
with gr.Row():
|
132 |
-
|
|
|
133 |
label="Start Datum & Uhrzeit",
|
134 |
value=datetime.now() + timedelta(minutes=1), # Voreinstellung: 1 Minute in der Zukunft
|
135 |
info="Wähle das Datum und die Uhrzeit, wann die Aufnahme beginnen soll."
|
136 |
)
|
137 |
-
|
|
|
138 |
label="End Datum & Uhrzeit",
|
139 |
value=datetime.now() + timedelta(minutes=10), # Voreinstellung: 10 Minuten in der Zukunft
|
140 |
info="Wähle das Datum und die Uhrzeit, wann die Aufnahme enden soll."
|
|
|
3 |
import os
|
4 |
from datetime import datetime, timedelta
|
5 |
from apscheduler.schedulers.background import BackgroundScheduler
|
6 |
+
import pytz # Für Zeitzonen-Management (nicht direkt verwendet, aber gute Praxis)
|
7 |
|
8 |
# --- Konfiguration ---
|
9 |
OUTPUT_DIR = "recordings"
|
|
|
14 |
scheduler = BackgroundScheduler()
|
15 |
scheduler.start()
|
16 |
|
|
|
|
|
|
|
|
|
17 |
# --- Funktionen für die Aufnahme und Planung ---
|
18 |
|
19 |
def record_radio_stream(stream_url: str, output_filename: str, duration_seconds: int):
|
|
|
53 |
os.remove(full_output_path)
|
54 |
return None # Signalisiere Fehler
|
55 |
|
56 |
+
def schedule_recording(stream_url: str, start_datetime_obj: datetime, end_datetime_obj: datetime):
|
57 |
"""
|
58 |
Plant eine Webradio-Aufnahme basierend auf Start- und Endzeit.
|
59 |
+
Die Zeiten kommen direkt als datetime-Objekte von gr.DateTime.
|
60 |
"""
|
61 |
try:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
# Berechne die Dauer der Aufnahme in Sekunden
|
63 |
+
duration = (end_datetime_obj - start_datetime_obj).total_seconds()
|
64 |
|
65 |
if duration <= 0:
|
66 |
return "❌ Fehler: Die Endzeit muss nach der Startzeit liegen."
|
67 |
|
68 |
# Generiere einen eindeutigen Dateinamen
|
69 |
+
timestamp = start_datetime_obj.strftime("%Y%m%d_%H%M%S")
|
70 |
output_filename = f"radio_recording_{timestamp}.mp3"
|
71 |
|
72 |
# Füge den Job zum Scheduler hinzu
|
|
|
74 |
scheduler.add_job(
|
75 |
record_radio_stream,
|
76 |
'date',
|
77 |
+
run_date=start_datetime_obj,
|
78 |
args=[stream_url, output_filename, int(duration)] # Dauer als Integer übergeben
|
79 |
)
|
80 |
|
|
|
82 |
# for job in scheduler.get_jobs():
|
83 |
# print(f"Geplanter Job: {job.id} - Nächste Ausführung: {job.next_run_time}")
|
84 |
|
85 |
+
return f"✅ Aufnahme von **{stream_url}** erfolgreich geplant.\nStart: **{start_datetime_obj.strftime('%Y-%m-%d %H:%M:%S')}** | Ende: **{end_datetime_obj.strftime('%Y-%m-%d %H:%M:%S')}**.\nDatei: **{output_filename}**\nBitte aktualisiere die Dateiliste, nachdem die Aufnahme abgeschlossen ist."
|
86 |
|
|
|
|
|
87 |
except Exception as e:
|
88 |
return f"❌ Ein unerwarteter Fehler ist aufgetreten: {e}"
|
89 |
|
|
|
112 |
placeholder="z.B. http://stream.laut.fm/meinstream (MP3- oder AAC-Stream)"
|
113 |
)
|
114 |
with gr.Row():
|
115 |
+
# HIER WURDE GR.DATETIME VERWENDET
|
116 |
+
start_datetime_input = gr.DateTime(
|
117 |
label="Start Datum & Uhrzeit",
|
118 |
value=datetime.now() + timedelta(minutes=1), # Voreinstellung: 1 Minute in der Zukunft
|
119 |
info="Wähle das Datum und die Uhrzeit, wann die Aufnahme beginnen soll."
|
120 |
)
|
121 |
+
# HIER WURDE GR.DATETIME VERWENDET
|
122 |
+
end_datetime_input = gr.DateTime(
|
123 |
label="End Datum & Uhrzeit",
|
124 |
value=datetime.now() + timedelta(minutes=10), # Voreinstellung: 10 Minuten in der Zukunft
|
125 |
info="Wähle das Datum und die Uhrzeit, wann die Aufnahme enden soll."
|