File size: 2,867 Bytes
eeae908
734bffb
c77e282
734bffb
6ca2249
88da9f3
6ca2249
96682d9
88da9f3
 
c77e282
0a6bdb5
88da9f3
c77e282
 
734bffb
c77e282
88da9f3
c77e282
 
0a6bdb5
c77e282
 
 
 
 
0a6bdb5
c77e282
 
 
734bffb
6ca2249
c77e282
734bffb
c77e282
88da9f3
 
0a6bdb5
c77e282
6ca2249
0a6bdb5
 
 
 
 
 
 
c77e282
 
0a6bdb5
 
c77e282
88da9f3
734bffb
88da9f3
c77e282
734bffb
c77e282
 
0a6bdb5
88da9f3
6ca2249
734bffb
0a6bdb5
734bffb
88da9f3
 
 
 
 
734bffb
88da9f3
 
c77e282
 
0a6bdb5
 
 
c77e282
 
88da9f3
11fd592
88da9f3
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
import gradio as gr
import requests
import re
import os
import zipfile
import tempfile
from urllib.parse import urljoin

def process_url(url):
    try:
        headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'}
        response = requests.get(url, headers=headers)
        response.raise_for_status()
    except Exception as e:
        return None, f"Erreur de connexion : {str(e)}"

    # Recherche approfondie dans les scripts
    mp3_links = []
    pattern = r'(?:contentUrl|url)"\s*:\s*"([^"]+?\.mp3)(?:[^"]*)"'  # Capture les URLs .mp3 dans les objets JS
    matches = re.findall(pattern, response.text)
    
    for match in matches:
        # Nettoyage de l'URL
        clean_url = match.split('";')[0] if '";' in match else match
        absolute_url = urljoin(response.url, clean_url)
        mp3_links.append(absolute_url)

    # Dédoublonnage tout en conservant l'ordre
    seen = set()
    mp3_links = [x for x in mp3_links if not (x in seen or seen.add(x))]

    if not mp3_links:
        return None, "Aucun lien MP3 détecté dans le code source"

    # Téléchargement des fichiers
    temp_dir = tempfile.mkdtemp()
    filenames = []
    
    for idx, mp3_url in enumerate(mp3_links, 1):
        try:
            filename = f"{idx:02d}_{os.path.basename(mp3_url).split('?')[0]}"
            filepath = os.path.join(temp_dir, filename)
            
            with requests.get(mp3_url, headers=headers, stream=True) as r:
                r.raise_for_status()
                with open(filepath, 'wb') as f:
                    for chunk in r.iter_content(chunk_size=8192):
                        if chunk:
                            f.write(chunk)
            filenames.append(filepath)
        except Exception as e:
            print(f"Échec du téléchargement {mp3_url} : {str(e)}")
            continue

    if not filenames:
        return None, "Échec de tous les téléchargements"

    # Création du ZIP
    zip_path = os.path.join(temp_dir, 'episodes.zip')
    with zipfile.ZipFile(zip_path, 'w') as zipf:
        for file in filenames:
            zipf.write(file, arcname=os.path.basename(file))

    return zip_path, None

def download_podcast(url):
    zip_path, error = process_url(url)
    if error:
        raise gr.Error(error)
    return zip_path

iface = gr.Interface(
    fn=download_podcast,
    inputs=gr.Textbox(label="URL Radio France", placeholder="Collez l'URL ici..."),
    outputs=gr.File(label="Épisodes téléchargés"),
    examples=[[
        "https://www.radiofrance.fr/franceculture/podcasts/serie-le-secret-de-la-licorne-les-aventures-de-tintin"
    ]],
    title="Extracteur MP3 Radio France",
    description="Téléchargez les épisodes MP3 des podcasts Radio France directement depuis l'URL de la série"
)

iface.launch()