Tracklist: crea sottocartella col nome del file caricato
Quando si carica un file .txt come tracklist, l'app ora scarica i brani in <output_dir>/<nome_file>/ anziche direttamente in output_dir. Es: 'Beatport Top 100 Melodic House & Techno.txt' -> cartella 'Beatport Top 100 Melodic House & Techno/' creata dentro la cartella output predefinita. - load_url_list ritorna 'name' (basename senza estensione) - start_tracks_download accetta 'subfolder' opzionale e fa os.path.join con sanitizzazione dei separatori - JS passa state.loaded.name come subfolder Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
1 parent
4b1524e5f7
commit
d8423ec215
2 files changed
+16
-2
No files matched your search
+15
-2
@@ -210,7 +210,11 @@ class Api:
|
|||||||
t = _parse_track_line(line)
|
t = _parse_track_line(line)
|
||||||
if t:
|
if t:
|
||||||
tracks.append(t)
|
tracks.append(t)
|
||||||
return {"ok": True, "kind": "tracks", "tracks": tracks, "count": len(tracks)}
|
name = os.path.splitext(os.path.basename(path))[0]
|
||||||
|
return {
|
||||||
|
"ok": True, "kind": "tracks", "tracks": tracks,
|
||||||
|
"count": len(tracks), "name": name,
|
||||||
|
}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return {"ok": False, "error": str(e)}
|
return {"ok": False, "error": str(e)}
|
||||||
|
|
||||||
@@ -257,17 +261,25 @@ class Api:
|
|||||||
|
|
||||||
def start_tracks_download(self, payload: dict) -> dict:
|
def start_tracks_download(self, payload: dict) -> dict:
|
||||||
"""Avvia il download di una tracklist gia parsata
|
"""Avvia il download di una tracklist gia parsata
|
||||||
(lista di {name, artist})."""
|
(lista di {name, artist}). Se 'subfolder' e presente,
|
||||||
|
scarica in output_dir/subfolder."""
|
||||||
if self._any_job_running():
|
if self._any_job_running():
|
||||||
return {"ok": False, "error": "Un download gia in corso"}
|
return {"ok": False, "error": "Un download gia in corso"}
|
||||||
|
|
||||||
tracks = payload.get("tracks") or []
|
tracks = payload.get("tracks") or []
|
||||||
output_dir = (payload.get("output_dir") or "").strip()
|
output_dir = (payload.get("output_dir") or "").strip()
|
||||||
|
subfolder = (payload.get("subfolder") or "").strip()
|
||||||
if not tracks:
|
if not tracks:
|
||||||
return {"ok": False, "error": "Nessuna traccia fornita"}
|
return {"ok": False, "error": "Nessuna traccia fornita"}
|
||||||
if not output_dir:
|
if not output_dir:
|
||||||
return {"ok": False, "error": "Cartella output non impostata"}
|
return {"ok": False, "error": "Cartella output non impostata"}
|
||||||
|
|
||||||
|
if subfolder:
|
||||||
|
# Sanitizza: rimuovi separatori di path
|
||||||
|
safe = subfolder.replace("/", "_").replace("\\", "_").strip()
|
||||||
|
if safe:
|
||||||
|
output_dir = os.path.join(output_dir, safe)
|
||||||
|
|
||||||
self._download_thread = threading.Thread(
|
self._download_thread = threading.Thread(
|
||||||
target=self._tracks_worker,
|
target=self._tracks_worker,
|
||||||
args=(list(tracks), output_dir),
|
args=(list(tracks), output_dir),
|
||||||
@@ -289,6 +301,7 @@ class Api:
|
|||||||
view = "download"
|
view = "download"
|
||||||
|
|
||||||
self._log(view, f"[INFO] Tracklist: {len(tracks)} brani da cercare su YouTube")
|
self._log(view, f"[INFO] Tracklist: {len(tracks)} brani da cercare su YouTube")
|
||||||
|
self._log(view, f"[INFO] Destinazione: {output_dir}")
|
||||||
|
|
||||||
_last = [0.0]
|
_last = [0.0]
|
||||||
_THROTTLE = 0.10
|
_THROTTLE = 0.10
|
||||||
|
|||||||
@@ -255,6 +255,7 @@ $("#downloadBtn").addEventListener("click", async () => {
|
|||||||
res = await window.pywebview.api.start_tracks_download({
|
res = await window.pywebview.api.start_tracks_download({
|
||||||
tracks: state.loaded.tracks,
|
tracks: state.loaded.tracks,
|
||||||
output_dir: state.dlOutputDir,
|
output_dir: state.dlOutputDir,
|
||||||
|
subfolder: state.loaded.name || "",
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
let urls = state.loaded && state.loaded.kind === "urls" ? state.loaded.urls : [];
|
let urls = state.loaded && state.loaded.kind === "urls" ? state.loaded.urls : [];
|
||||||
|
|||||||
Reference in new issue
Block a user