X-Git-Url: http://gitweb.pimeys.fr/?a=blobdiff_plain;f=today_server.py;h=1c6e78734b3ad390f4df607bbcf5381f2b74c945;hb=d99dc87bf2ae3672cac54fae5e56a07467c0be8e;hp=3c7939380a6cf0cc28e61e616b0fe83a29c9e408;hpb=d4d18717b7d9b71374fe7bc8815bcaf04abd1df8;p=today.git diff --git a/today_server.py b/today_server.py index 3c79393..1c6e787 100755 --- a/today_server.py +++ b/today_server.py @@ -18,6 +18,8 @@ import sys import urllib import json import traceback +import inspect +import pprint os.chdir('/home/vincent/scripts/today/') sys.path.append("/home/vincent/scripts/dtc/") import dtc @@ -28,6 +30,9 @@ store_published_file = "lasts_published" #: Fichier où est stockée une copie de la liste des derniers IDs *lus* store_seen_file = "lasts_sync" +#: Afficher du garbage pour débuguer +DEBUG = False + def last_dtc(): """Vérifie si il y a des quotes DTC non lues""" return dtc.last_inserted() @@ -58,6 +63,29 @@ def last_visiteur(): nepisodes = len(episodes) return nsaisons * 100 + nepisodes +def parse_youtube(username): + """Récupère les vidéos d'une chaîne Youtube""" + link = "https://gdata.youtube.com/feeds/api/users/%s/uploads?start-index=1&max-results=50" % (username,) + entries = [] + while link: + p = urllib.urlopen(link) + t = p.read() + x = etree.fromstring(t) + # lxml ne supporte pas les namespaces vides dans les requêtes XPath + ns = x.nsmap + ns["default"] = ns[None] + ns.pop(None) + # Il y a potentiellement une suite + nextlinks = x.xpath("//default:link[@rel='next']", namespaces=ns) + if nextlinks: + link = nextlinks[0].attrib["href"] + else: + link = False + localentries = x.xpath("//default:entry", namespaces=ns) + entries.extend(localentries) + titles = [e.xpath(".//default:title", namespaces=ns)[0].text for e in entries] + return titles + def get_season_episode(title): """Récupère les numéros de la saison et de l'épisode. Crash si ne trouve pas.""" ep = int(re.findall("ep([0-9]*)", title)[0]) @@ -76,10 +104,15 @@ def last_noob_warpzone(): for serie in [noobs, warpzones]: # Les titres sont dans l'ordre antichronologique, on s'arrête donc au premier qu'on comprend for titre in serie: + if "noob le film" in titre or "making of" in titre or "noob versus rct" == titre or "extraits ost" in titre: + continue try: + if DEBUG: + print titre saison, ep = get_season_episode(titre) - except ValueError: - pass + except (ValueError, IndexError) as e: + print "%s sur un season_episode warpzone : %s\n" % (e, titre) + continue lasts.append([saison, ep]) del saison, ep break @@ -93,32 +126,33 @@ def last_noob(): def last_warpzone(): return last_noob_warpzone()[1] -def parse_youtube(username): - """Récupère les vidéos d'une chaîne Youtube""" - link = "https://gdata.youtube.com/feeds/api/users/%s/uploads?start-index=1&max-results=50" % (username,) - entries = [] - while link: - p = urllib.urlopen(link) - t = p.read() - x = etree.fromstring(t) - # lxml ne supporte pas les namespaces vides dans les requêtes XPath - ns = x.nsmap - ns["default"] = ns[None] - ns.pop(None) - # Il y a potentiellement une suite - nextlinks = x.xpath("//default:link[@rel='next']", namespaces=ns) - if nextlinks: - link = nextlinks[0].attrib["href"] - else: - link = False - localentries = x.xpath("//default:entry", namespaces=ns) - entries.extend(localentries) - titles = [e.xpath(".//default:title", namespaces=ns)[0].text for e in entries] - return titles +def last_hugo(): + titles = parse_youtube("HugoToutSeul") + return len(titles) + +def last_norman(): + titles = parse_youtube("NormanFaitDesVideos") + return len(titles) +def last_cyprien(): + titles = parse_youtube("MonsieurDream") + return len(titles) + +def last_grenier(): + titles = parse_youtube("joueurdugrenier") + return len(titles) + +def last_jl8(): + rss = urllib.urlopen("http://limbero.org/jl8/rss/") + t = rss.read() + x = etree.fromstring(t) + links = x.xpath("//link") + maxnum = links[1].text.split("/")[-1] + maxnum = int(maxnum) + return maxnum def get_file(): - """Récupère la liste des derniers ids de chaque truc, stockée dans le fichiers.""" + """Récupère la liste des derniers ids de chaque truc, stockée dans le fichier.""" f = open(store_published_file) news = json.load(f) f.close() @@ -137,6 +171,11 @@ FETCHS = { "visiteur" : last_visiteur, "noob" : last_noob, "warpzone" : last_warpzone, + "hugo" : last_hugo, + "norman" : last_norman, + "cyprien" : last_cyprien, + "grenier" : last_grenier, + "dc" : last_jl8, } def fetch_all(): @@ -146,8 +185,18 @@ def fetch_all(): try: news[k] = f() except Exception as e: - print "Erreur à la récupération de %s :" % k - traceback.print_exc() + errmsg = "Erreur à la récupération de %s :\n" % k + errmsg += traceback.format_exc() + # On dumpe le contenu local de la mémoire au moment de l'exception + fobj = inspect.trace()[-1][0] + # On fait un peu de ménage + d = {k:v for (k,v) in fobj.f_locals.iteritems() if not k.startswith("_")} + # On évite d'envoyer truckLoadsOfShit + d = {k: (v if len(str(v)) < 800 + else str(v)[:400] + "*" * 40 + "TRUNCATED OBJECT" + "*" * 40 + str(v)[-400:]) + for (k,v) in d.iteritems()} + errmsg += "\nContexte : %s\n\n" % (pprint.pformat(d)) + print errmsg return news def sync(): @@ -169,10 +218,15 @@ def sync(): print json.dumps(on_server) if __name__ == "__main__": + if "--debug" in sys.argv or "--verbose" in sys.argv: + DEBUG = True if sys.argv[1] == "check": news = fetch_all() - olds = get_file() - olds.update(news) + if "--init" in sys.argv: + olds = news + else: + olds = get_file() + olds.update(news) update_file(olds) elif sys.argv[1] == "whatsup": news = get_file()