File size: 3,705 Bytes
11fd592 7c806f5 11fd592 7c806f5 50c8ca2 11fd592 9a10296 7c806f5 11fd592 7c806f5 9a10296 7c806f5 1f317db 9a10296 1f317db 9a10296 c0153c3 9a10296 1f317db 7c806f5 1f317db 11fd592 9a10296 7c806f5 9a10296 7c806f5 9a10296 7c806f5 50c8ca2 7c806f5 9a10296 50c8ca2 7c806f5 9a10296 7c806f5 9a10296 7c806f5 9a10296 50c8ca2 7c806f5 9a10296 7c806f5 9a10296 7c806f5 9a10296 7c806f5 9a10296 7c806f5 11fd592 7c806f5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
import os
import re
import zipfile
import requests
import tempfile
import subprocess
import gradio as gr
import shutil
# Installation automatique des dépendances si nécessaire
try:
import bs4
except ImportError:
subprocess.run(["pip", "install", "-q", "gradio", "beautifulsoup4", "requests"])
def sanitize_filename(name):
# Rend le nom de fichier compatible avec tous les OS
return re.sub(r"[^\w\-_.]", "_", name.strip())[:50]
def extract_mp3_links_and_titles(html_text):
# Expression pour trouver les URL MP3
mp3_pattern = re.compile(r'https?://[^\s"\'<>]+\.mp3')
mp3_links = mp3_pattern.findall(html_text)
# Expression pour tenter d'extraire les titres associés
item_pattern = re.compile(
r'title:"\\?"([^"]+)\\?".*?url:"(https?://[^\s"\'<>]+\.mp3)"',
re.DOTALL
)
titled_links = {match[1]: match[0] for match in item_pattern.findall(html_text)}
results = []
for link in mp3_links:
title = titled_links.get(link, None)
results.append((link, title))
return results
def download_and_zip_mp3s(url):
try:
response = requests.get(url)
response.raise_for_status()
except Exception as e:
return f"Erreur de téléchargement de la page : {e}", None
html_text = response.text
mp3_entries = extract_mp3_links_and_titles(html_text)
if not mp3_entries:
return "Aucun lien .mp3 trouvé sur cette page.", None
# package dans Zip
def download_and_zip_mp3s(url):
try:
response = requests.get(url)
response.raise_for_status()
except Exception as e:
return f"Erreur de téléchargement de la page : {e}", None
html_text = response.text
mp3_entries = extract_mp3_links_and_titles(html_text)
if not mp3_entries:
return "Aucun lien .mp3 trouvé sur cette page.", None
temp_dir = tempfile.mkdtemp()
try:
zip_fd, zip_path = tempfile.mkstemp(suffix=".zip", prefix="episodes_")
os.close(zip_fd) # On ferme le descripteur immédiatement
with zipfile.ZipFile(zip_path, "w") as zipf:
for idx, (mp3_url, title) in enumerate(mp3_entries, 1):
if title:
filename = f"{idx:02d}-{sanitize_filename(title)}.mp3"
else:
filename = f"{idx:02d}-episode.mp3"
filepath = os.path.join(temp_dir, filename)
try:
print(f"Téléchargement : {mp3_url}")
audio_resp = requests.get(mp3_url)
audio_resp.raise_for_status()
if len(audio_resp.content) < 30_000:
print(f"Fichier trop petit, ignoré : {mp3_url}")
continue
with open(filepath, "wb") as f:
f.write(audio_resp.content)
zipf.write(filepath, arcname=filename)
except Exception as e:
print(f"Erreur lors du téléchargement de {mp3_url} : {e}")
return "Téléchargement terminé avec succès.", zip_path
finally:
shutil.rmtree(temp_dir)
def gradio_interface(url):
message, zip_file = download_and_zip_mp3s(url)
return message, zip_file
# Interface Gradio
demo = gr.Interface(
fn=gradio_interface,
inputs=gr.Textbox(label="URL de la page contenant des MP3"),
outputs=[
gr.Textbox(label="Message"),
gr.File(label="Fichier ZIP")
],
title="Extracteur MP3 Radio France (ou autre)",
description="Collez une URL contenant des fichiers MP3, et récupérez-les dans un ZIP avec titres et numérotation."
)
if __name__ == "__main__":
demo.launch()
|