]> gitweb.pimeys.fr Git - today.git/blob - youtube.py
[gather] Soyons un peu plus clairs sur le cahier des charges
[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 def load_channels():
41 """Récupère les chaînes à surveiller à partir du fichier de conf."""
42 with open(serverconfig.youtube_channels_file) as f:
43 channels = [l.strip("\n") for l in f.readlines()]
44 channels = [l for l in channels if not (l.startswith("#") or l.strip() == "")]
45 channels = [l.split("\t") for l in channels]
46 # Il peut y avoir plusieurs tabulations de suite, donc on enlève les chaînes vides
47 channels = [[i for i in l if not i == ''] for l in channels]
48 # [id, username, regexp]
49 # channels = [{"id" : l[0], "username" : l[1], "regexp" : l[2]} for l in channels]
50 return channels
51
52
53 def get_parser(username, regexp=None):
54 """ Renvoie un parseur de chaîne youtube prêt à être appelé """
55 def local_parser():
56 return parse_youtube(username, regexp, length=True)
57 return local_parser
58
59 channels = load_channels()
60 functions = {id : get_parser(username, regexp) for (id, username, regexp) in channels}