PrinzPesia commited on
Commit
b5b7a62
·
verified ·
1 Parent(s): 1ab95bd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +11 -26
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, start_datetime_str: str, end_datetime_str: str):
61
  """
62
  Plant eine Webradio-Aufnahme basierend auf Start- und Endzeit.
63
- Die Zeiten kommen als String von Gradio und müssen geparst werden.
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 = (end_datetime - start_datetime).total_seconds()
79
 
80
  if duration <= 0:
81
  return "❌ Fehler: Die Endzeit muss nach der Startzeit liegen."
82
 
83
  # Generiere einen eindeutigen Dateinamen
84
- timestamp = start_datetime.strftime("%Y%m%d_%H%M%S")
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=start_datetime,
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: **{start_datetime}** | Ende: **{end_datetime}**.\nDatei: **{output_filename}**\nBitte aktualisiere die Dateiliste, nachdem die Aufnahme abgeschlossen ist."
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
- start_datetime_input = gr.Datetime(
 
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
- end_datetime_input = gr.Datetime(
 
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."