diff --git a/app.py b/app.py index 2325b7c..6a9d2d4 100644 --- a/app.py +++ b/app.py @@ -108,127 +108,128 @@ def validate_spotify_url(url): def run_download(download_id, urls, format_type, delete_old, copy_choice): - download = Download.query.get(download_id) - if not download: - return + with app.app_context(): + download = Download.query.get(download_id) + if not download: + return - download.status = 'running' - db.session.commit() + download.status = 'running' + db.session.commit() - if format_type == 'flac': - download_dir = os.getenv('DOWNLOAD_DIR_FLAC', '/home/jules/Musique/flac') - else: - download_dir = os.getenv('DOWNLOAD_DIR_MP3', '/home/jules/Musique/mp3') + if format_type == 'flac': + download_dir = os.getenv('DOWNLOAD_DIR_FLAC', '/home/jules/Musique/flac') + else: + download_dir = os.getenv('DOWNLOAD_DIR_MP3', '/home/jules/Musique/mp3') - copy_destination = os.getenv('COPY_DESTINATION', '/mnt/data/Musique') + copy_destination = os.getenv('COPY_DESTINATION', '/mnt/data/Musique') - if delete_old and os.path.exists(download_dir): - shutil.rmtree(download_dir) + if delete_old and os.path.exists(download_dir): + shutil.rmtree(download_dir) - os.makedirs(download_dir, exist_ok=True) + os.makedirs(download_dir, exist_ok=True) - total_urls = len(urls) - - try: - for idx, url in enumerate(urls, 1): - download.append_log(f"[{idx}/{total_urls}] Téléchargement: {url}") + total_urls = len(urls) + + try: + for idx, url in enumerate(urls, 1): + download.append_log(f"[{idx}/{total_urls}] Téléchargement: {url}") + db.session.commit() + + spotdl_command = [ + 'spotdl', + '--output', '{artist}/{album}/{track-number} - {title}.{output-ext}', + '--format', format_type, + url + ] + + process = subprocess.Popen( + ['stdbuf', '-oL'] + spotdl_command, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True, + cwd=download_dir, + bufsize=1 + ) + download_processes[download_id] = process + download.process_id = process.pid + db.session.commit() + + for line in iter(process.stdout.readline, ""): + if download_id not in download_processes: + process.terminate() + break + line = line.strip() + if line: + download.append_log(line) + if 'Downloaded' in line or '100%' in line: + progress = int((idx / total_urls) * 100) + download.progress = progress + db.session.commit() + + process.stdout.close() + process.wait() + + if process.returncode != 0: + stderr = process.stderr.read() + download.append_log(f"Erreur: {stderr}") + db.session.commit() + + download.progress = int((idx / total_urls) * 100) + db.session.commit() + + download.append_log("Ajout des couvertures...") db.session.commit() - spotdl_command = [ - 'spotdl', - '--output', '{artist}/{album}/{track-number} - {title}.{output-ext}', - '--format', format_type, - url - ] - - process = subprocess.Popen( - ['stdbuf', '-oL'] + spotdl_command, + sacad_command = ['sacad_r', download_dir, '900', 'cover.jpg'] + sacad_process = subprocess.Popen( + ['stdbuf', '-oL'] + sacad_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, - cwd=download_dir, bufsize=1 ) - download_processes[download_id] = process - download.process_id = process.pid - db.session.commit() - for line in iter(process.stdout.readline, ""): + for line in iter(sacad_process.stdout.readline, ""): if download_id not in download_processes: - process.terminate() + sacad_process.terminate() break line = line.strip() if line: download.append_log(line) - if 'Downloaded' in line or '100%' in line: - progress = int((idx / total_urls) * 100) - download.progress = progress db.session.commit() - process.stdout.close() - process.wait() + sacad_process.wait() - if process.returncode != 0: - stderr = process.stderr.read() - download.append_log(f"Erreur: {stderr}") + if copy_choice == 'yes': + download.append_log(f"Copie vers {copy_destination}...") db.session.commit() + + if os.path.exists(download_dir) and os.listdir(download_dir): + for root, dirs, files in os.walk(download_dir): + for file in files: + src = os.path.join(root, file) + dst = os.path.join(copy_destination, os.path.relpath(src, download_dir)) + os.makedirs(os.path.dirname(dst), exist_ok=True) + shutil.copy2(src, dst) + download.append_log("Copie terminée.") + else: + download.append_log("Aucune copie - répertoire vide.") - download.progress = int((idx / total_urls) * 100) + download.status = 'completed' + download.progress = 100 + download.completed_at = datetime.utcnow() + download.append_log("=== Téléchargement terminé ===") db.session.commit() - download.append_log("Ajout des couvertures...") - db.session.commit() - - sacad_command = ['sacad_r', download_dir, '900', 'cover.jpg'] - sacad_process = subprocess.Popen( - ['stdbuf', '-oL'] + sacad_command, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - universal_newlines=True, - bufsize=1 - ) - - for line in iter(sacad_process.stdout.readline, ""): - if download_id not in download_processes: - sacad_process.terminate() - break - line = line.strip() - if line: - download.append_log(line) - db.session.commit() - - sacad_process.wait() - - if copy_choice == 'yes': - download.append_log(f"Copie vers {copy_destination}...") + except Exception as e: + download.status = 'error' + download.error = str(e) + download.append_log(f"Erreur critique: {e}") db.session.commit() - - if os.path.exists(download_dir) and os.listdir(download_dir): - for root, dirs, files in os.walk(download_dir): - for file in files: - src = os.path.join(root, file) - dst = os.path.join(copy_destination, os.path.relpath(src, download_dir)) - os.makedirs(os.path.dirname(dst), exist_ok=True) - shutil.copy2(src, dst) - download.append_log("Copie terminée.") - else: - download.append_log("Aucune copie - répertoire vide.") - download.status = 'completed' - download.progress = 100 - download.completed_at = datetime.utcnow() - download.append_log("=== Téléchargement terminé ===") - db.session.commit() - - except Exception as e: - download.status = 'error' - download.error = str(e) - download.append_log(f"Erreur critique: {e}") - db.session.commit() - - finally: - if download_id in download_processes: - del download_processes[download_id] + finally: + if download_id in download_processes: + del download_processes[download_id] @app.route('/')