X-Git-Url: http://gitweb.pimeys.fr/?p=today.git;a=blobdiff_plain;f=today_server.py;h=ec60fe4ee9da16af02ca44b5266cc654507257d0;hp=80407293c42286e7a0e39749790f934aa847ea71;hb=HEAD;hpb=6f28d79c1a3532cd94daea5220be5239e71c9510 diff --git a/today_server.py b/today_server.py index 8040729..ec60fe4 100755 --- a/today_server.py +++ b/today_server.py @@ -11,193 +11,32 @@ et répondre à un check. """ import re -import BeautifulSoup from lxml import etree import os 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 -#: Fichier où sont stockés les derniers IDs des trucs -store_published_file = "lasts_published" +#: Config serveur +import serverconfig -#: 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() - -def last_xkcd(): - p = urllib.urlopen("http://xkcd.com") - t = p.read() - current_id = int(re.findall("Permanent link to this comic: http://xkcd.com/(.*?)/", t)[0]) - return current_id - -def last_xantah(): - p = urllib.urlopen("http://www.adoprixtoxis.com/lite/download/xantah_downloads.php") - t = p.read() - ids = re.findall("""
Xantah (.*?)
""", t) - ids = [int(i) for i in ids] - return max(ids) - -def last_visiteur(): - p = urllib.urlopen("http://www.levisiteurdufutur.com/episodes.html") - t = p.read() - # On parse - soup = BeautifulSoup.BeautifulSoup(t) - # On récupère les différentes saisons - saisons = soup.findAll("div", attrs={"id" : "episodes_list"}) - nsaisons = len(saisons) - # La saison en cours est la première dans la liste - episodes = saisons[0].findAll("div", attrs={"class" : "thumbCaption"}) - 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]) - saison = int(re.findall("s([0-9]*)", title)[0]) - return saison, ep - -def last_noob_warpzone(): - global last_nw - # GRUIK - if "last_nw" in globals().keys(): - return last_nw - titles = parse_youtube("Funglisoft") - noobs = [t.lower().strip() for t in titles if t.lower().strip().startswith("noob")] - warpzones = [t.lower().strip() for t in titles if t.lower().strip().startswith("warpzone project")] - lasts = [] - 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: - continue - try: - if DEBUG: - print titre - saison, ep = get_season_episode(titre) - 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 - last_noob = lasts[0][0]*100 + lasts[0][1] - last_warp = lasts[1][0]*100 + lasts[1][1] - last_nw = [last_noob, last_warp] - return last_nw - -def last_noob(): - return last_noob_warpzone()[0] -def last_warpzone(): - return last_noob_warpzone()[1] - -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 +#: Récupération de toutes les nouveautés +import gather def get_file(): """Récupère la liste des derniers ids de chaque truc, stockée dans le fichier.""" - f = open(store_published_file) + f = open(serverconfig.store_published_file) news = json.load(f) f.close() return news def update_file(news): """Met à jour la liste des derniers ids dans le fichier.""" - f = open(store_published_file, 'w') + f = open(serverconfig.store_published_file, 'w') json.dump(news, f) f.close() -FETCHS = { - "xkcd" : last_xkcd, - "dtc" : last_dtc, - "xantah" : last_xantah, - "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(): - """Va chercher sur les différents sites les nouveaux trucs.""" - news = {} - for (k, f) in FETCHS.iteritems(): - try: - news[k] = f() - except Exception as e: - 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(): """Reçoit une requête de synchronisation.""" @@ -205,23 +44,22 @@ def sync(): t = sys.stdin.read() on_client = json.loads(t) # On récupère où en est le serveur dans le fichier idoine - if os.path.isfile(store_seen_file): - on_server = json.load(open(store_seen_file)) + if os.path.isfile(serverconfig.store_seen_file): + on_server = json.load(open(serverconfig.store_seen_file)) else: on_server = {} # On garde le maximum for k in set(on_client.keys() + on_server.keys()): on_server[k] = max(on_client.get(k, 0), on_server.get(k, 0)) # On enregistre ce nouveau dico - json.dump(on_server, open(store_seen_file, "w")) + json.dump(on_server, open(serverconfig.store_seen_file, "w")) # On envoie au client ce nouveau dico print json.dumps(on_server) if __name__ == "__main__": - if "--debug" in sys.argv or "--verbose" in sys.argv: - DEBUG = True + DEBUG = ("--debug" in sys.argv) or ("--verbose" in sys.argv) or serverconfig.DEBUG if sys.argv[1] == "check": - news = fetch_all() + news = gather.gather() if "--init" in sys.argv: olds = news else: