[2/5] Suivre les chaînes Youtube avec RSS
Ce billet fait suite à mon premier billet sur le tipsing : Les flux RSS, mon premier tips numérique.
Parmi mes flux RSS, je suis des chaîne Youtube. Cependant, Youtube ne propose pas par défaut des flux RSS pour les chaînes. C’est caché.
L’astuce
Un identifiant existe pour chaque chaine. On le trouve assez souvent à la fin de l’URL :
https://www.youtube.com/channel/UCQ3Qf6WcYjpt85296w-LfsA
Or, pour obtenir le flux RSS d’une chaîne, nous avons juste besoin de l’identifiant :
https://www.youtube.com/feeds/videos.xml?channel_id=IDENTIFIANT_DE_LA_CHAINE
Et hop ça roule, mais il y a un problème : les chaîne qui ne possèdent pas d’identifiant visible dans l’URL.
Eh bien on retrouve cet ID dans la page de la chaîne, bien caché sur une ligne bien longue. C’est fatiguant de le faire à la main.
La bidouille
Comme je veux gagner un maximum de temps, j’ai écrit un script qui reçoit une URL et retourne le flux RSS de la chaîne. Le script reçoit une ou plusieurs URL en argument depuis la ligne de commande :
python3 yt2rss.py url ...
Le script regarde si l’identifiant est dans l’URL (vive les regex), sinon il recherche dans le code source de la page web (fonction get_channel_id
).
Une version qui sera mise à jour est disponible et téléchargeable sur Github.
from sys import argv
from re import match, search
from urllib.request import urlopen
from bs4 import BeautifulSoupdef get_channel_id(url):
""" From Youtube, get the channel_id """
page = urlopen(url)
page = BeautifulSoup(page, 'lxml')
# Channel_id is in <meta> tag with "property" attributes and "og:url" as value
id_channel = page.find(property="og:url")
# Get the url as value of the "content" attribute
if id_channel: # If page is no empty
return page.get('content')[-24:] # 24 is the size of the id_channel
return Falseargv = argv[1:]
for arg in argv:
id_in_url = match(r'(http[s]?://)?(www\.)?youtube\.com/channel/(?P<id>[\w]*)(/videos)?', arg)
# Pick the id in the url, else in the webpage
channel_id = id_in_url.group('id') if id_in_url else get_channel_id(arg)
if channel_id:
print(f'https://www.youtube.com/feeds/videos.xml?channel_id={channel_id}')
else:
print(f"Any channel id found :'( for {arg}")
Couplé avec un alias bash, c’est encore mieux :
alias yt2rss='python3 PATH_TO_SCRIPT'