Écouter des Podcasts MP3 en voiture

Pendant mes trajets en voiture, j'aime écouter des podcasts. Ma voiture supporte la connection Bluetooth avec un téléphone mais pour diverses raisons, je préfère utiliser une bonne vieille clé USB. Je récupère les épisodes à l'aide de l'application GNOME Podcast qui récupère les flux RSS/Atom.

Les scripts ci-dessous me permettent d'écouter La semaine des 5 heures pendant des heures, étant donné qu'ils sont passés à une formule quotidienne. J'écoute également d'excellents podcasts de France Inter: Blockbusters et La Science, CQFD sur France Culture.

RTBF AUVIO

Il y a quelques mois, le site Auvio de la RTBF a changé et les liens des podcasts n'étaient plus autant mis en avant. Je suis nénmoins tombé sur ce forum qui m'a aidé à trouver la solution:

Le nom du programme en toutes lettres est remplacé par des chiffres, identiques au code d'Auvio, la plateforme de Replay/Podcast de la RTBF.

Ainsi, la semaine de 5h, l'émission cinéma dont l'identifiant 1451 voit ses addresses évoluer comme ceci:

  • AUVIO https://auvio.rtbf.be/emission/la-semaine-des-5-heures-1451
  • Podcast http://rss.rtbf.be/media/rss/audio/1451.xml

Scripts de conversion et renommage

Par ailleurs, ma voiture ne sait pas lire les fichiers m2a récupérés par l'application. Je les convertis à l'aide de FFMPEG afin de les lire. J'utilise les scripts ci-dessous pour lire le tout.

Le premier converti les fichiers en mp3 et le second les renommes en fonction de la date de l'épisode.

Conversion en mp3

#!/bin/bash

EXT=".m2a"
FILES="$1"/*"$EXT"
DIRECTORY="$1"

/usr/bin/python3 podcast_rename.py "$DIRECTORY"
for filename in `find "$DIRECTORY" -name "*$EXT" -type f`; do
        echo "$filename"
        ffmpeg -i "$filename" -acodec mp3 "$filename".mp3
        rm "$filename"
done

exit 0

Renommage des fichiers mp3

Les fichiers téléchargés suivent une séquence propre au programme GNOME Podcast mais il est parfois intéressant de savoir à quelle date correspond ce fichier. C'est particulièrement utile pour suivre les sorties cinéma.

Pour cela, j'analyse les metadata des fichiers m2a et j'extrait la date à partir du titre ou du tag date.

Le programme suivant

  • recherche les fichiers m2a dans un dossier donné
  • renomme le fichier en se basant sur la date présente dans les métadata (titre ou champs date).
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from datetime import datetime

import ffmpeg
import glob
import logging
import os
import re
import sys



logging.basicConfig(level=logging.INFO)
logger = logging.getLogger()


def _get_date(input_str, datetime_format):
    """
    Return the datetime object from the string containing the date of the media file
    :param input_str: string to analyze
    :param: regex_date: regex format of the date
    :return: datetime object
    """
    match = re.search(r'(\d+(-|\/)\d+(-|\/)\d+)', input_str)
    date_str = match and match.group(1)
    return date_str and datetime.strptime(date_str, datetime_format)


def _rename_file(media_file, date_obj):
    """
    Rename media file based on datetime object
    :param media_file: input filename
    :param date_obj: datetime of the media file
    :return:
    """
    vals = media_file.rsplit('.', 1)
    res = False
    if vals and date_obj:
        dst_name = f"{vals[0]}-{date_obj.strftime('%d-%m-%Y')}.m2a"
        logger.info(f"Trying to rename {media_file} --> {dst_name}")
        os.rename(media_file, dst_name)
        res = True
    return res


def rename_on_title_date(media_file, metadata):
    """
    Rename a m2a file based on the date present in the title. Example:
    La Semaine des 5 Heures - TITLE OF THE DAY - 03/04/2023
    :param media_file: fullpath of the m2a filename
    :param metadata: metadata dictionary of the file
    :return: True if the file could be renamed. Otherwise False or None
    """
    tags = metadata.get('format', {}).get('tags')
    title = tags and tags.get('title')
    if not title:
        return
    date_obj = _get_date(title, "%d/%m/%Y")
    res = _rename_file(media_file, date_obj)
    return res


def rename_on_record_date(media_file, metadata):
    """
    Rename a m2a file based on the date present in the record date metadata.
    Example: 2023-03-23
    :param media_file: fullpath of the m2a filename
    :param metadata: metadata dictionary of the file
    :return: True if the file could be renamed. Otherwise False
    """
    tags = metadata.get('format', {}).get('tags')
    date_str = tags and tags.get('date')
    if not date_str:
        return
    date_obj = _get_date(date_str, "%Y-%m-%d")
    res = _rename_file(media_file, date_obj)
    return res


def launch(dir_name):
    path = os.path.join(dir_name, '*.m2a')
    files = glob.glob(path)
    for media_file in files:
        metadata = ffmpeg.probe(media_file)
        res = rename_on_title_date(media_file, metadata)
        if not res:
            res = rename_on_record_date(media_file, metadata)
            if not res:
                logger.error(f"The file could not be renamed {media_file}")


if __name__ == '__main__':
    if len(sys.argv) < 2:
        raise UserWarning("You need to provide a directory name")
    directory = sys.argv[1]
    launch(directory)

links

social