spotdl / app.py
user010846d's picture
Update app.py
47d60d7 verified
Raw
History Blame Contribute Delete
2.4 kB
import os
import shutil
import subprocess
import gradio as def_gradio # Import standard
import gradio as gr
def download_playlist(spotify_url):
if not spotify_url:
return "Veuillez entrer un lien Spotify valide."
# Dossier temporaire pour stocker les mp3
output_dir = "mes_musiques"
if os.path.exists(output_dir):
shutil.rmtree(output_dir)
os.makedirs(output_dir)
try:
# Exécution de spotDL dans le dossier temporaire
gr.Info("Téléchargement en cours... Cela peut prendre quelques minutes selon la taille.")
subprocess.run(["spotdl", "download", spotify_url], cwd=output_dir, check=True)
# Vérifie si des fichiers ont bien été téléchargés
files = os.listdir(output_dir)
if not files:
return "Aucun morceau trouvé ou erreur lors du téléchargement.", None
# On compresse le tout en un fichier ZIP
zip_path = "ma_playlist"
shutil.make_archive(zip_path, 'zip', output_dir)
final_zip = f"{zip_path}.zip"
# Nettoyage du dossier temporaire
shutil.rmtree(output_dir)
return "Téléchargement réussi ! Cliquez ci-dessous pour récupérer votre ZIP.", final_zip
except subprocess.CalledProcessError as e:
return f"Erreur lors de l'exécution de spotDL : {str(e)}", None
except Exception as e:
return f"Une erreur est survenue : {str(e)}", None
# Interface Graphique (Style épuré / Dark Mode par défaut)
with gr.Blocks(theme=gr.themes.Soft(primary_hue="green", neutral_hue="slate")) as demo:
gr.Markdown("# 🎵 Mon spotDL Privé")
gr.Markdown("Entre le lien d'une musique, d'un album ou d'une playlist Spotify pour générer un fichier ZIP.")
with gr.Row():
url_input = gr.Textbox(
label="Lien Spotify",
placeholder="https://open.spotify.com/playlist/...",
lines=1
)
status_output = gr.Markdown("Statut : En attente...")
file_output = gr.File(label="Télécharger le package ZIP")
download_btn = gr.Button("Lancer le téléchargement", variant="primary")
# Action du bouton
download_btn.click(
fn=download_playlist,
inputs=url_input,
outputs=[status_output, file_output]
)
if __name__ == "__main__":
demo.launch()