X-Git-Url: http://gitweb.pimeys.fr/?p=today.git;a=blobdiff_plain;f=today_server.py;h=7e31652e9d049afb771de33c3857478d499db901;hp=209dd04b0e6bbc39f50c244ddf9feea62e1dcf91;hb=745bc217569cf2f81ecb74708c725b4ab53cdc25;hpb=e752abb6ffde566d0527ad46043fd6c9460d739a diff --git a/today_server.py b/today_server.py index 209dd04..7e31652 100755 --- a/today_server.py +++ b/today_server.py @@ -10,12 +10,14 @@ et répondre à un check. """ -import time, datetime import re +import BeautifulSoup +from lxml import etree import os import sys import urllib import json +import traceback os.chdir('/home/vincent/scripts/today/') sys.path.append("/home/vincent/scripts/dtc/") import dtc @@ -26,27 +28,128 @@ store_published_file = "lasts_published" #: Fichier où est stockée une copie de la liste des derniers IDs *lus* store_seen_file = "lasts_sync" -def get_now(): - """Obtenir la date actuelle sous le bon format""" - timestamp = time.time() - now = datetime.datetime(*time.localtime(timestamp)[:7]) - return now +#: 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(): - try: - p = urllib.urlopen("http://xkcd.com") - except IOError: - return "Impossible de se connecter à 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: + continue + try: + if DEBUG: + print titre + saison, ep = get_season_episode(titre) + except ValueError: + pass + 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 + 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() @@ -61,12 +164,26 @@ def update_file(news): 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(): - news[k] = f() + try: + news[k] = f() + except Exception as e: + print "Erreur à la récupération de %s :" % k + traceback.print_exc() return news def sync(): @@ -88,9 +205,13 @@ 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() - update_file(news) + olds = get_file() + olds.update(news) + update_file(olds) elif sys.argv[1] == "whatsup": news = get_file() print json.dumps(news)