from flask import Flask, render_template, request, Response, redirect, url_for, send_file from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user import subprocess import os import shutil import zipfile from io import BytesIO app = Flask(__name__) app.secret_key = 'your_secret_key' # Configuration Flask-Login login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = 'login' # Utilisateur fictif class User(UserMixin): def __init__(self, id): self.id = id # Stockage simple d'utilisateurs (en production, utiliser une base de données) users = {'garfi': {'admin': 'password123'}} @login_manager.user_loader def load_user(user_id): return User(user_id) @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) return redirect(url_for('index')) else: return "Nom d'utilisateur ou mot de passe incorrect", 401 return render_template('login.html') @app.route('/logout') @login_required def logout(): logout_user() return redirect(url_for('login')) @app.route('/') @login_required def index(): return render_template('stream.html') @app.route('/download', methods=['POST']) @login_required def download(): url = request.form['url'] format_choice = request.form['format'] delete_choice = request.form['delete_choice'] copy_choice = request.form['copy_choice'] # Nouvelle option pour copier ou non def generate_output(): # Répertoires pour le téléchargement en fonction du format choisi output_dir = "/home/garfi/Musique/flac" if format_choice == "flac" else "/home/garfi/Musique/mp3" # Si l'utilisateur a choisi de supprimer les anciens répertoires if delete_choice == "1": yield "Suppression des anciens répertoires...\n" try: if os.path.exists("/home/garfi/Musique/flac"): shutil.rmtree("/home/garfi/Musique/flac") yield "Le répertoire /home/garfi/Musique/flac a été supprimé.\n" if os.path.exists("/home/garfi/Musique/mp3"): shutil.rmtree("/home/garfi/Musique/mp3") yield "Le répertoire /home/garfi/Musique/mp3 a été supprimé.\n" except FileNotFoundError as e: yield f"Erreur : {str(e)} - Le répertoire n'existe pas.\n" except Exception as e: yield f"Erreur inattendue lors de la suppression : {str(e)}\n" # Créer le répertoire pour stocker les nouveaux fichiers os.makedirs(output_dir, exist_ok=True) # Lancer le téléchargement avec spotdl command = f'spotdl --output "{{artist}}/{{album}}/{{track-number}} - {{title}}.{{output-ext}}" "{url}" --format={format_choice}' process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, cwd=output_dir) for line in process.stdout: yield line # Envoyer les lignes de la commande en temps réel process.wait() if process.returncode == 0: yield "\nTéléchargement terminé avec succès.\n" # Si l'utilisateur a choisi de copier vers /mnt/data/Musique/ if copy_choice == "1": share_dir = "/mnt/data/Musique/" try: shutil.copytree(output_dir, share_dir, dirs_exist_ok=True) yield f"\nLes fichiers ont été copiés vers {share_dir}.\n" except Exception as e: yield f"\nErreur lors de la copie des fichiers vers {share_dir} : {str(e)}\n" else: yield f"\nUne erreur est survenue avec le code {process.returncode}.\n" return Response(generate_output(), mimetype='text/plain') @app.route('/download_zip') @login_required def download_zip(): format_choice = request.args.get('format') output_dir = "/home/garfi/Musique/flac" if format_choice == "flac" else "/home/garfi/Musique/mp3" # Créer un fichier ZIP dans la mémoire memory_file = BytesIO() with zipfile.ZipFile(memory_file, 'w', zipfile.ZIP_DEFLATED) as zf: for root, dirs, files in os.walk(output_dir): for file in files: file_path = os.path.join(root, file) zf.write(file_path, arcname=os.path.relpath(file_path, output_dir)) memory_file.seek(0) # Télécharger le fichier ZIP return send_file(memory_file, mimetype='application/zip', as_attachment=True, download_name=f'musique_{format_choice}.zip') if __name__ == '__main__': app.run(debug=True)