Le module Python conçu pour télécharger des fichiers à partir de flux RSS donnés, particulièrement destiné aux podcasts. Il n'utilise aucune sorte de base de données mais nécessite un fichier de configuration.
Le script est destiné à être exécuté périodiquement. Au démarrage, il analyse le répertoire dans lequel il a précédemment stocké les fichiers téléchargés. Il compare ensuite ces fichiers avec ceux répertoriés dans le flux RSS, identifie ceux qui manquent et les télécharge.
Les fichiers recherchés par défaut sont mp3
.
Le résultat de l'utilisation de l'exemple ci-dessous, sur des répertoires vides, sera :
dplocki@ghost-wheel:~$ python -m podcast_downloader
[2024-04-08 21:19:10] Loading configuration (from file: "~/.podcast_downloader_config.json")
[2024-04-08 21:19:15] Checking "The Skeptic Guide"
[2024-04-08 21:19:15] Last downloaded file ""
[2024-04-08 21:19:15] The Skeptic Guide: Downloading file: "https://traffic.libsyn.com/secure/skepticsguide/skepticast2024-04-06.mp3" saved as "skepticast2024-04-06.mp3"
[2024-04-08 21:19:41] Checking "The Real Python Podcast"
[2024-04-08 21:19:41] Last downloaded file ""
[2024-04-08 21:19:41] The Real Python Podcast: Downloading file: "https://chtbl.com/track/92DB94/files.realpython.com/podcasts/RPP_E199_03_Calvin.eef1db4d6679.mp3" saved as "[20240405] rpp_e199_03_calvin.eef1db4d6679.mp3"
[2024-04-08 21:20:04] Finished
Le résultat :
dplocki@ghost-wheel:~$ tree podcasts/
podcasts/
├── RealPython
│ └── [20240405] rpp_e199_03_calvin.eef1db4d6679.mp3
└── SGTTU
└── skepticast2024-04-06.mp3
2 directories, 2 files
Installation depuis PyPI :
pip install podcast_downloader
Le script nécessite un fichier de configuration pour fonctionner. Après l'installation, le script peut être exécuté comme n'importe quel module Python :
python -m podcast_downloader
Il est également possible d'exécuter le script avec le fichier de configuration donné :
python -m podcast_downloader --config my_config.json
Un exemple de fichier de configuration
{
"if_directory_empty" : " download_from_4_days " ,
"podcasts" : [
{
"name" : " The Skeptic Guide " ,
"rss_link" : " https://feed.theskepticsguide.org/feed/rss.aspx " ,
"path" : " ~/podcasts/SGTTU "
},
{
"rss_link" : " https://realpython.com/podcasts/rpp/feed " ,
"path" : " ~/podcasts/RealPython " ,
"file_name_template" : " [%publish_date%] %file_name%.%file_extension% "
}
]
}
Par défaut, le fichier de configuration est placé dans le répertoire personnel. Son nom de fichier est : .podcast_downloader_config.json
.
Le fichier de configuration est au format JSON. Le codage attendu est utf-8.
Le chemin d'accès au fichier de configuration peut être spécifié par un argument de script.
Le script remplace les valeurs par défaut par celles lues dans le fichier de configuration. Ceux-ci seront surchargés par les valeurs données depuis la ligne de commande.
command line parameters > configuration file > default values
Propriété | Taper | Requis? | Défaut | Note |
---|---|---|---|---|
downloads_limit | nombre | Non | infini | |
if_directory_empty | chaîne | Non | téléchargement_dernier | Voir En cas de répertoire vide |
podcast_extensions | valeur-clé | Non | {".mp3": "audio/mpeg"} | Voir Filtre Types de fichiers |
podcasts | sous-section | Oui | [] | Voir la sous-catégorie Podcasts |
http_headers | valeur-clé | Non | {"User-Agent": "podcast-downloader"} | Voir les en-têtes de requête HTTP |
fill_up_gaps | booléen | Non | FAUX | Voir Télécharger des fichiers à partir des lacunes |
download_delay | nombre | Non | 0 | Voir Délai de téléchargement |
Le segment podcasts
est la partie du fichier de configuration dans laquelle vous fournissez le tableau d'objets avec le contenu suivant :
Propriété | Taper | Requis | Défaut | Note |
---|---|---|---|---|
name | chaîne | Oui | - | Le nom du canal (à utiliser dans l'enregistreur) |
rss_link | chaîne | Oui | - | L'URL du flux RSS |
path | chaîne | Oui | - | Le chemin d'accès au répertoire dans lequel les podcasts sont stockés sera téléchargé |
file_name_template | chaîne | Non | %file_name%.%file_extension% | Le modèle pour les fichiers téléchargés, voir Modèle de nom de fichier |
disable | booléen | Non | false | Ce podcast sera ignoré |
podcast_extensions | valeur-clé | Non | {".mp3": "audio/mpeg"} | Le filtre de fichiers |
if_directory_empty | chaîne | Non | download_last | Voir En cas de répertoire vide |
require_date | booléen | Non | false | Obsolète La date du podcast doit-elle être ajoutée au nom du fichier - utilisez le file_name_template : [%publish_date%] %file_name%.%file_extension%" |
http_headers | valeur-clé | Non | {"User-Agent": "podcast-downloader"} | Voir les en-têtes de requête HTTP |
fill_up_gaps | booléen | Non | FAUX | Voir Télécharger des fichiers à partir des lacunes |
Certains serveurs peuvent ne pas aimer la façon dont l'urllib se présente à eux (l'en-tête HTTP User-Agent). Cela peut entraîner des problèmes tels que : urllib.error.HTTPError: HTTP Error 403: Forbidden
. C'est pourquoi, il est possible que le script se fasse passer pour autre chose : en spécifiant les en-têtes HTTP lors du téléchargement des fichiers.
Utilisez l'option http_headers
dans le fichier de configuration. La valeur doit être un objet de dictionnaire où chaque en-tête est présenté sous forme de paire clé-valeur. La clé étant le titre de l'en-tête et la valeur étant la valeur de l'en-tête.
Par défaut, la valeur est : {"User-Agent": "podcast-downloader"}
. Fournir autre chose pour http_headers
remplacera toutes les valeurs par défaut (elles ne fusionneront pas).
En revanche dans la sous-configuration podcast, les http_headers
seront fusionnés avec les http_headers
globaux. En cas de conflit (même nom de clé), la valeur de la sous-configuration du podcast remplacera la valeur globale.
Exemple:
{
"http_headers" : {
"User-Agent" : " podcast-downloader "
},
"podcasts" : [
{
"name" : " Unua Podcast " ,
"rss_link" : " http://www.unuapodcast.org/feed.rss " ,
"path" : " ~/podcasts/unua_podcast " ,
"https_headers" : {
"User-Agent" : " Mozilla/5.0 "
}
},
{
"name" : " Dua Podcast " ,
"rss_link" : " http://www.duapodcast.org/feed.rss " ,
"path" : " ~/podcasts/dua_podcast " ,
"https_headers" : {
"Authorization" : " Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== "
}
}
]
}
Dans cet exemple, le podcast Unua sera téléchargé uniquement avec l'en-tête : User-Agent: Mozilla/5.0
, et le podcast Dua avec : User-Agent: podcast-downloader
et Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
.
Lorsque vous avez beaucoup de fichiers à télécharger depuis un seul serveur, il peut être préférable de configurer un petit délai entre les téléchargements pour éviter d'être reconnu comme un attaquant par le serveur. Dans le script, il existe une option appelée download_delay
, qui représente le nombre de secondes pendant lesquelles le script attendra entre les téléchargements.
La valeur par défaut est 0
.
Remarques :
Le script accepte les arguments de ligne de commande suivants :
Version courte | Nom long | Paramètre | Défaut | Note |
---|---|---|---|---|
--config | chaîne | ~/.podcast_downloader_config.json | L'emplacement du fichier de configuration | |
--downloads_limit | nombre | infini | Le nombre maximum de fichiers mp3 téléchargés | |
--if_directory_empty | chaîne | download_last | L'approche générale sur le répertoire vide | |
--download_delay | nombre | 0 | Le temps d'attente (secondes) entre les téléchargements |
Utilisez pour ajuster le nom du fichier après le téléchargement.
La valeur par défaut (le %file_name%.%file_extension%
) enregistrera simplement le fichier tel qu'il a été téléchargé par le créateur d'origine. Le nom du fichier et son extension sont basés sur le lien vers le fichier podcast.
Valeurs du modèle :
Nom | Remarques |
---|---|
%file_name% | Le nom du fichier du lien, sans extension |
%file_extension% | L'extension du fichier, à partir du lien |
%publish_date% | La date de publication de l'entrée RSS |
%title% | Le titre de l'entrée RSS |
Le %publish_date%
donne par défaut le résultat au format YEARMMDD
. Afin de le changer vous pouvez fournir le nouveau après les deux points ( :
caractère :). Le script respecte les codes de la norme C 1989, mais le signe pour cent ( %
) doit être remplacé par le signe dollar ( $
). Cela est dû à ma malheureuse décision d'utiliser le caractère pourcentage comme marqueur du code.
Le code standard | Le code du script | Remarques |
---|---|---|
%Y%m%d | $Y$m$d | La valeur par défaut du %publish_date% |
%A | $A | Ajoute le jour de la semaine (paramètres de langue locale) |
%x | $x | La date locale représente. Attention : dans certains paramètres, le / est utilisé ici, cela peut donc poser un problème dans le nom du fichier |
[%publish_date%] %file_name%.%file_extension%
[%publish_date%] %title%.%file_extension%
Les podcasts sont principalement stockés sous forme de fichiers *.mp3
. Par défaut, Podcast Downloader les recherche uniquement, ignorant tous les autres types.
Si votre podcast prend en charge d'autres types de fichiers multimédias, vous pouvez spécifier les filtres de fichiers. Fournissez l'extension du fichier (comme .mp3
) et le type de lien dans le flux RSS lui-même (pour mp3
il s'agit audio/mpeg
).
Si vous ne connaissez pas le type du fichier, vous pouvez le rechercher dans le fichier RSS. Recherchez les balises enclosure
, cela devrait ressembler à ceci :
< enclosure url = " https://www.vidocast.url/podcast/episode23.m4a " length = " 14527149 " type = " audio/x-m4a " />
Remarque : le point sur l'extension du fichier est obligatoire.
"podcast_extensions" : {
".mp3" : " audio/mpeg " ,
".m4a" : " audio/x-m4a "
}
Si un répertoire de podcast est vide, le script doit savoir quoi faire. Faute de base de données, vous pouvez :
Le comportement par défaut est : download_last
Le script téléchargera tous les épisodes du flux.
Défini par download_all_from_feed
.
Le script téléchargera uniquement le dernier épisode du flux. C'est également l'approche par défaut du script.
Défini par download_last
.
Le script téléchargera exactement le nombre d'épisodes donné à partir du flux.
Défini par download_last_n_episodes
. Le n doit être remplacé par un certain nombre d'épisodes que vous souhaitez télécharger. Par exemple : download_last_5_episodes
signifie que les cinq épisodes les plus récents seront téléchargés.
Le script téléchargera tous les épisodes apparus au cours des n derniers jours. Il peut être utilisé lorsque vous téléchargez régulièrement. Le nombre n est donné dans la valeur de configuration : download_from_n_days
. Par exemple : download_from_3_days
signifie télécharger tous les épisodes des 3 derniers jours.
Le script téléchargera tous les épisodes qui apparaissent après le jour de sortie du dernier épisode.
Le nombre n est le jour de l'épisode normal. Vous pouvez indiquer ici les jours de la semaine sous forme de mot (la taille des lettres est ignorée)
Journée complète de la semaine | Raccourcir le nom |
---|---|
Lundi | Lun |
Mardi | mardi |
Mercredi | Les mariés |
Jeudi | jeudi |
Vendredi | Ven |
Samedi | Assis |
Dimanche | Soleil |
Vous pouvez fournir le numéro, cela signifiera le jour du mois. Le script n'accepte que les nombres de 1 à 28.
Défini par download_from_
.
Exemples :
Exemple de valeur | Signification |
---|---|
download_from_monday | De nouveaux épisodes apparaissent lundi. Le script téléchargera tous les épisodes depuis mardi dernier (y compris celui-ci) |
download_from_Fri | De nouveaux épisodes apparaissent vendredi. Le script téléchargera tous les épisodes depuis samedi dernier (y compris celui-ci) |
download_from_12 | De nouveaux épisodes apparaissent chaque 12 du mois. Le script téléchargera tous les épisodes depuis 13 mois avant |
Une fois que vous avez établi le fichier totem, le script peut l'utiliser pour stocker la date de sa dernière exécution. Ensuite, en fonction de cette date, le script téléchargera tous les nouveaux épisodes apparus depuis.
Défini par download_since_last_run
. Nécessite d'établir le fichier de magasin par last_run_mark_file_path
.
{
"last_run_mark_file_path" : " ~/.totem.json " ,
"podcasts" : [
{
"name" : " The Skeptic Guide " ,
"rss_link" : " https://feed.theskepticsguide.org/feed/rss.aspx " ,
"path" : " ~/podcasts/SGTTU "
}
]
}
Le script lit la date de dernière modification du fichier. La date de modification du fichier est mise à jour par le script.
Le script reconnaît le flux de fichiers téléchargés (en fonction des données du flux). Par défaut, le dernier fichier téléchargé (selon le flux) marque le début du téléchargement. En cas de lacunes, situation où il manque des fichiers avant le dernier téléchargé, le script les ignorera par défaut. Cependant, il est possible de modifier ce comportement pour télécharger tous les fichiers manquants entre ceux déjà téléchargés. Pour activer cela, vous devez définir la valeur fill_up_gaps
sur true . Il est important de noter que le script ne téléchargera pas les fichiers avant le premier (selon le flux), l'épisode le plus ancien.
Valeur par défaut : false
.
Le script parcourt tous les nœuds items
du fichier RSS. Le nœud item
peut contenir le nœud enclosure
. Ces nœuds sont utilisés pour transmettre les fichiers. Selon la convention, l' item
unique ne doit contenir qu'une seule enclosure
, mais le script (comme la bibliothèque utilisée en dessous) peut gérer les multiples fichiers joints à item
podcast.
Les fichiers OPML peuvent être convertis en configuration. Le fichier de sortie doit être ajusté (manque le path
).
import json
import sys
import xml . etree . ElementTree as ET
def build_podcast ( node_rss ):
return {
"name" : node_rss . attrib [ "title" ],
"rss_link" : node_rss . attrib [ "xmlUrl" ],
"path" : "" ,
}
tree = ET . parse ( sys . argv [ 1 ])
podcasts = list ( map ( build_podcast , tree . findall ( "body/outline[@type='rss']" )))
result = json . dumps ({ "podcasts" : podcasts }, sort_keys = True , indent = 4 )
print ( result )
Exemple d'utilisation (après l'avoir enregistré sous opml_converter.py
) :
python opml_converter.py example.opml > podcast_downloader_config.json