import os import shutil import subprocess from flask import Flask, render_template, request, redirect, url_for, flash, Response from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user import sys app = Flask(__name__) app.secret_key = 'votre_cle_secrete' # Clé secrète pour Flask # Gestion de l'authentification login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = 'login' # Rediriger ici si non connecté # Simuler une base de données utilisateur USERS = { "admin": {"password": "password123"} } # Classe utilisateur class User(UserMixin): def __init__(self, username): self.id = username @login_manager.user_loader def load_user(user_id): if user_id in USERS: return User(user_id) return None @app.route('/') @login_required def index(): return render_template('index.html') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] if username in USERS and USERS[username]['password'] == password: user = User(username) login_user(user) flash('Connexion réussie', 'success') return redirect(url_for('index')) # Redirection vers la page d'accueil else: flash('Nom d\'utilisateur ou mot de passe incorrect', 'danger') return redirect(url_for('login')) return render_template('login.html') @app.route('/logout') @login_required def logout(): logout_user() flash('Vous êtes déconnecté', 'info') return redirect(url_for('login')) # Fonction pour exécuter une commande en temps réel def run_command_live(command, cwd=None): process = subprocess.Popen(['stdbuf', '-oL'] + command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, cwd=cwd, bufsize=1) for stdout_line in iter(process.stdout.readline, ""): yield stdout_line sys.stdout.flush() process.stdout.close() process.wait() # Fonction pour copier les fichiers individuellement def copy_files(source, destination): try: if os.path.exists(source): if len(os.listdir(source)) > 0: # Vérifier si le répertoire contient des fichiers for root, dirs, files in os.walk(source): for file in files: file_source = os.path.join(root, file) file_destination = os.path.join(destination, os.path.relpath(file_source, source)) os.makedirs(os.path.dirname(file_destination), exist_ok=True) shutil.copy2(file_source, file_destination) return f"Fichiers copiés vers {destination}\n" else: return f"Le répertoire source ({source}) est vide. Aucune copie effectuée.\n" else: return f"Le répertoire source ({source}) n'existe pas. Aucune copie effectuée.\n" except Exception as e: return f"Erreur lors de la copie : {str(e)}\n" # Fonction pour gérer le téléchargement d'une seule URL @app.route('/download', methods=['POST']) @login_required def download(): url = request.form.get('url') # Récupérer une seule URL format_choice = request.form.get('format', 'mp3') # Par défaut à 'mp3' delete_old = request.form.get('delete_old', False) copy_choice = request.form.get('copy_choice', 'no') if not url: return "Aucune URL n'a été soumise.", 400 # Gérer le cas où aucune URL n'est soumise # Déterminer le répertoire de téléchargement en fonction du format if format_choice == 'flac': download_dir = "/home/jules/Musique/flac" format_type = 'flac' else: download_dir = "/home/jules/Musique/mp3" format_type = 'mp3' # Supprimer les anciens répertoires si l'utilisateur a choisi if delete_old: if os.path.exists(download_dir): shutil.rmtree(download_dir) # Créer le répertoire de téléchargement s'il n'existe pas os.makedirs(download_dir, exist_ok=True) # Commande pour télécharger la musique avec spotdl dans le répertoire correct spotdl_command = [ 'spotdl', '--output', '{artist}/{album}/{track-number} - {title}.{output-ext}', '--format', format_type, url ] def stream(): yield f"Téléchargement en cours dans {download_dir}...\n" for output in run_command_live(spotdl_command, cwd=download_dir): yield output # Exécuter sacad_r pour ajouter les couvertures sacad_command = ['sacad_r', download_dir, '900', 'cover.jpg'] yield "Ajout des couvertures...\n" for output in run_command_live(sacad_command): yield output # Copier les fichiers vers /mnt/data/Musique si l'utilisateur a choisi "Oui" if copy_choice == 'yes': yield f"Copie des fichiers depuis {download_dir} vers /mnt/data/Musique...\n" yield copy_files(download_dir, "/mnt/data/Musique") return Response(stream(), mimetype='text/plain') if __name__ == '__main__': app.run(debug=True)