]> gitweb.pimeys.fr Git - today.git/blob - youtube.py
La futurs annivs affichés le sont sur un espace temporel connexe
[today.git] / youtube.py
1 #!/usr/bin/python
2 # -*- encoding: utf-8 -*-
3
4 """ Gestion des chaînes Youtube """
5
6 import re
7 from lxml import etree
8 import urllib
9
10 # Config serveur
11 import serverconfig
12
13 def parse_youtube(username, regexp=None, length=False):
14 """Récupère les vidéos d'une chaîne Youtube"""
15 link = "https://gdata.youtube.com/feeds/api/users/%s/uploads?start-index=1&max-results=50" % (username,)
16 entries = []
17 while link:
18 p = urllib.urlopen(link)
19 t = p.read()
20 x = etree.fromstring(t)
21 # lxml ne supporte pas les namespaces vides dans les requêtes XPath
22 ns = x.nsmap
23 ns["default"] = ns[None]
24 ns.pop(None)
25 # Il y a potentiellement une suite
26 nextlinks = x.xpath("//default:link[@rel='next']", namespaces=ns)
27 if nextlinks:
28 link = nextlinks[0].attrib["href"]
29 else:
30 link = False
31 localentries = x.xpath("//default:entry", namespaces=ns)
32 entries.extend(localentries)
33 titles = [e.xpath(".//default:title", namespaces=ns)[0].text for e in entries]
34 if not regexp is None: # On ne garde que les titres qui matchent la regexp
35 titles = [t for t in titles if re.match(regexp, t)]
36 if length: # On n'est intéressés que par le nombre
37 titles = len(titles)
38 return titles
39
40
41 def get_parser(username, regexp=None):
42 """ Renvoie un parseur de chaîne youtube prêt à être appelé """
43 def local_parser():
44 return parse_youtube(username, regexp, length=True)
45 return local_parser
46
47 channels = serverconfig.load_file(serverconfig.youtube_channels_file)
48 functions = {id : get_parser(username, regexp) for (id, username, regexp) in channels}