From 384a10c1be1df0b37a99161f0b67552e29cba60c Mon Sep 17 00:00:00 2001 From: garfi Date: Sun, 8 Sep 2024 01:21:06 +0200 Subject: [PATCH] 1.0.0.0 --- README.md | 7 +++ app.py | 129 ++++++++++++++++++++++++++++++++++++++++++ run.sh | 2 + templates/login.html | 36 ++++++++++++ templates/stream.html | 105 ++++++++++++++++++++++++++++++++++ 5 files changed, 279 insertions(+) create mode 100644 README.md create mode 100644 app.py create mode 100755 run.sh create mode 100644 templates/login.html create mode 100644 templates/stream.html diff --git a/README.md b/README.md new file mode 100644 index 0000000..d6a0e65 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +Petit applicatif pour télécharger depuis des url Spotify à l'aide de Youtube-music +backend: spotdl, falsk , flask-login + +Pour le lancer: python3 app.py +Ou avec le run.sh pour modifier le port + +Demo diff --git a/app.py b/app.py new file mode 100644 index 0000000..290fd9a --- /dev/null +++ b/app.py @@ -0,0 +1,129 @@ +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) diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..1bf5b9b --- /dev/null +++ b/run.sh @@ -0,0 +1,2 @@ +cd /home/garfi/sys/spotdl-py +flask run --host=192.168.1.10 --port=5024 diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 0000000..2b0c577 --- /dev/null +++ b/templates/login.html @@ -0,0 +1,36 @@ + + + + + + + Connexion + + + + +
+
+
+
+
+

Connexion

+
+
+ + +
+
+ + +
+ +
+
+
+
+
+
+ + + diff --git a/templates/stream.html b/templates/stream.html new file mode 100644 index 0000000..ff11f13 --- /dev/null +++ b/templates/stream.html @@ -0,0 +1,105 @@ + + + + + + Téléchargement en temps réel + + + + +
+
+
+
+
+

Télécharger Musique Spotify

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
+

Output :

+
+
+
+ + +
+
+
+ + +