diff --git a/editor.py b/editor.py index 36a9d09..3aa587d 100644 --- a/editor.py +++ b/editor.py @@ -64,6 +64,77 @@ def safe_filename(filename): return filename +def clean_new_filename(filename): + """Validate and normalize a user-supplied MP3 filename.""" + if not isinstance(filename, str): + return None + filename = filename.strip() + if not filename: + return None + if Path(filename).name != filename: + return None + if filename.lower().endswith(".mp3"): + filename = filename[:-4] + if not filename or filename in {".", ".."}: + return None + if any(ch in filename for ch in '/\\\x00'): + return None + return filename + ".mp3" + + +def directory_for_kind(kind): + if kind == "recording": + return RECORDINGS_DIR + if kind == "finished": + return FINISHED_DIR + return None + + +def path_for_kind(kind, filename): + filename = safe_filename(filename) + directory = directory_for_kind(kind) + if filename is None or directory is None: + return None + return directory / filename + + +def rename_file(kind, old_filename, new_filename): + old_path = path_for_kind(kind, old_filename) + new_filename = clean_new_filename(new_filename) + if old_path is None or new_filename is None or not old_path.is_file(): + raise ValueError("Ungültiger Dateiname") + + new_path = old_path.with_name(new_filename) + if new_path.exists(): + raise ValueError("Eine Datei mit diesem Namen existiert bereits") + + old_waveform = waveform_path(old_path.name) if kind == "recording" else None + new_waveform = waveform_path(new_path.name) if kind == "recording" else None + + old_path.rename(new_path) + if old_waveform and old_waveform.is_file(): + try: + old_waveform.rename(new_waveform) + except OSError: + # The audio file was renamed successfully; an old waveform cache + # is harmless and will be regenerated under the new name. + pass + return new_path + + +def delete_file(kind, filename): + path = path_for_kind(kind, filename) + if path is None or not path.is_file(): + raise ValueError("Datei nicht gefunden") + + path.unlink() + if kind == "recording": + try: + waveform_path(path.name).unlink(missing_ok=True) + except OSError: + pass + + def source_path(filename): filename = safe_filename(filename) if filename is None: @@ -221,6 +292,9 @@ h1 { margin:0 0 6px; font-size:28px; } .controls { display:flex; flex-wrap:wrap; gap:8px; align-items:center; margin-top:18px; } button, a.button { border:0; border-radius:6px; padding:11px 16px; background:#333; color:#fff; cursor:pointer; text-decoration:none; font-size:15px; } button:hover, a.button:hover { background:#444; } +.button.danger { background:#4a2020; } +.button.danger:hover { background:#6a2b2b; } +.actions { display:flex; gap:6px; flex-wrap:wrap; } button.primary { background:#1769aa; } button.danger { background:#8b0000; } button:disabled { opacity:.45; cursor:not-allowed; } @@ -289,8 +363,9 @@ button:disabled { opacity:.45; cursor:not-allowed; }
-