Repository: yt-dlp/yt-dlp
File: yt_dlp/extractor/francaisfacile.py (Python)

Code before:
from .common import InfoExtractor
from ..utils import float_or_none, url_or_none
from ..utils.traversal import traverse_obj


class FrancaisFacileIE(InfoExtractor):
    _VALID_URL = r'https?://francaisfacile\.rfi\.fr/fr/(actualit%C3%A9|podcasts/[^/#?]+)/(?P<id>\d+)-'
    IE_NAME = 'francaisfacile'
    _TESTS = [{
        'url': 'https://francaisfacile.rfi.fr/fr/actualit%C3%A9/20250305-r%C3%A9concilier-les-jeunes-avec-la-lecture-gr%C3%A2ce-aux-r%C3%A9seaux-sociaux',
        'md5': '4f33674cb205744345cc835991100afa',
        'info_dict': {
            'id': 'WBMZ58952-FLE-FR-20250305',
            'title': 'Réconcilier les jeunes avec la lecture grâce aux réseaux sociaux',
            'url': 'https://aod-fle.akamaized.net/fle/sounds/fr/2025/03/05/6b6af52a-f9ba-11ef-a1f8-005056a97652.mp3',
            'ext': 'mp3',
            'description': 'md5:b903c63d8585bd59e8cc4d5f80c4272d',
            'duration': 103.15,
            'timestamp': 1741177984,
            'upload_date': '20250305',
        },
    }, {
        'url': 'https://francaisfacile.rfi.fr/fr/actualit%C3%A9/20250307-argentine-le-sac-d-un-alpiniste-retrouv%C3%A9-40-ans-apr%C3%A8s-sa-mort',
        'md5': 'b8c3a63652d4ae8e8092dda5700c1cd9',
        'info_dict': {
            'id': 'WBMZ59102-FLE-FR-20250307',
            'title': 'Argentine: le sac d\'un alpiniste retrouvé 40 ans après sa mort',
            'url': 'https://aod-fle.akamaized.net/fle/sounds/fr/2025/03/07/8edf4082-fb46-11ef-8a37-005056bf762b.mp3',
            'ext': 'mp3',
            'description': 'md5:7fd088fbdf4a943bb68cf82462160dca',
            'duration': 117.74,
            'timestamp': 1741352789,

Review comment (suggestion):
```suggestion
    _VALID_URL = r'https?://francaisfacile\.rfi\.fr/fr/(actualit%C3%A9|podcasts/[^/#?]+)/(?P<id>[^/#?]+)'
```

Code after:
import urllib.parse

from .common import InfoExtractor
from ..networking.exceptions import HTTPError
from ..utils import (
    ExtractorError,
    float_or_none,
    url_or_none,
)
from ..utils.traversal import traverse_obj


class FrancaisFacileIE(InfoExtractor):
    _VALID_URL = r'https?://francaisfacile\.rfi\.fr/[a-z]{2}/(?:actualit%C3%A9|podcasts/[^/#?]+)/(?P<id>[^/#?]+)'
    _TESTS = [{
        'url': 'https://francaisfacile.rfi.fr/fr/actualit%C3%A9/20250305-r%C3%A9concilier-les-jeunes-avec-la-lecture-gr%C3%A2ce-aux-r%C3%A9seaux-sociaux',
        'md5': '4f33674cb205744345cc835991100afa',
        'info_dict': {
            'id': 'WBMZ58952-FLE-FR-20250305',
            'display_id': '20250305-réconcilier-les-jeunes-avec-la-lecture-grâce-aux-réseaux-sociaux',
            'title': 'Réconcilier les jeunes avec la lecture grâce aux réseaux sociaux',
            'url': 'https://aod-fle.akamaized.net/fle/sounds/fr/2025/03/05/6b6af52a-f9ba-11ef-a1f8-005056a97652.mp3',
            'ext': 'mp3',
            'description': 'md5:b903c63d8585bd59e8cc4d5f80c4272d',
            'duration': 103.15,
            'timestamp': 1741177984,
            'upload_date': '20250305',
        },
    }, {
        'url': 'https://francaisfacile.rfi.fr/fr/actualit%C3%A9/20250307-argentine-le-sac-d-un-alpiniste-retrouv%C3%A9-40-ans-apr%C3%A8s-sa-mort',
        'md5': 'b8c3a63652d4ae8e8092dda5700c1cd9',
        'info_dict': {