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()