]>
gitweb.pimeys.fr Git - today.git/blob - today_server.py
2 # -*- encoding: utf-8 -*-
5 script qui affiche des trucs à penser, des J-n des conneries
8 Partie serveur, prévue pour chercher périodiquement les trucs non lus
9 et répondre à un check.
15 from lxml
import etree
21 os
.chdir('/home/vincent/scripts/today/')
22 sys
.path
.append("/home/vincent/scripts/dtc/")
25 #: Fichier où sont stockés les derniers IDs des trucs
26 store_published_file
= "lasts_published"
28 #: Fichier où est stockée une copie de la liste des derniers IDs *lus*
29 store_seen_file
= "lasts_sync"
32 """Vérifie si il y a des quotes DTC non lues"""
33 return dtc
.last_inserted()
36 p
= urllib
.urlopen("http://xkcd.com")
38 current_id
= int(re
.findall("Permanent link to this comic: http://xkcd.com/(.*?)/", t
)[0])
42 p
= urllib
.urlopen("http://www.adoprixtoxis.com/lite/download/xantah_downloads.php")
44 ids
= re
.findall("""<div class="top">Xantah (.*?)</div>""", t
)
45 ids
= [int(i
) for i
in ids
]
49 p
= urllib
.urlopen("http://www.levisiteurdufutur.com/episodes.html")
52 soup
= BeautifulSoup
.BeautifulSoup(t
)
53 # On récupère les différentes saisons
54 saisons
= soup
.findAll("div", attrs
={"id" : "episodes_list"})
55 nsaisons
= len(saisons
)
56 # La saison en cours est la première dans la liste
57 episodes
= saisons
[0].findAll("div", attrs
={"class" : "thumbCaption"})
58 nepisodes
= len(episodes
)
59 return nsaisons
* 100 + nepisodes
61 def get_season_episode(title
):
62 """Récupère les numéros de la saison et de l'épisode. Crash si ne trouve pas."""
63 ep
= int(re
.findall("ep([0-9]*)", title
)[0])
64 saison
= int(re
.findall("s([0-9]*)", title
)[0])
67 def last_noob_warpzone():
70 if "last_nw" in globals().keys():
72 titles
= parse_youtube("Funglisoft")
73 noobs
= [t
.lower().strip() for t
in titles
if t
.lower().strip().startswith("noob")]
74 warpzones
= [t
.lower().strip() for t
in titles
if t
.lower().strip().startswith("warpzone project")]
76 for serie
in [noobs
, warpzones
]:
77 # Les titres sont dans l'ordre antichronologique, on s'arrête donc au premier qu'on comprend
80 saison
, ep
= get_season_episode(titre
)
83 lasts
.append([saison
, ep
])
86 last_noob
= lasts
[0][0]*100 + lasts
[0][1]
87 last_warp
= lasts
[1][0]*100 + lasts
[1][1]
88 last_nw
= [last_noob
, last_warp
]
92 return last_noob_warpzone()[0]
94 return last_noob_warpzone()[1]
96 def parse_youtube(username
):
97 """Récupère les vidéos d'une chaîne Youtube"""
98 link
= "https://gdata.youtube.com/feeds/api/users/%s/uploads?start-index=1&max-results=50" % (username
,)
101 p
= urllib
.urlopen(link
)
103 x
= etree
.fromstring(t
)
104 # lxml ne supporte pas les namespaces vides dans les requêtes XPath
106 ns
["default"] = ns
[None]
108 # Il y a potentiellement une suite
109 nextlinks
= x
.xpath("//default:link[@rel='next']", namespaces
=ns
)
111 link
= nextlinks
[0].attrib
["href"]
114 localentries
= x
.xpath("//default:entry", namespaces
=ns
)
115 entries
.extend(localentries
)
116 titles
= [e
.xpath(".//default:title", namespaces
=ns
)[0].text
for e
in entries
]
121 """Récupère la liste des derniers ids de chaque truc, stockée dans le fichiers."""
122 f
= open(store_published_file
)
127 def update_file(news
):
128 """Met à jour la liste des derniers ids dans le fichier."""
129 f
= open(store_published_file
, 'w')
136 "xantah" : last_xantah
,
137 "visiteur" : last_visiteur
,
139 "warpzone" : last_warpzone
,
143 """Va chercher sur les différents sites les nouveaux trucs."""
145 for (k
, f
) in FETCHS
.iteritems():
148 except Exception as e
:
149 print "Erreur à la récupération de %s :" % k
150 traceback
.print_exc()
154 """Reçoit une requête de synchronisation."""
155 # On récupère où en est le client sur stdin
157 on_client
= json
.loads(t
)
158 # On récupère où en est le serveur dans le fichier idoine
159 if os
.path
.isfile(store_seen_file
):
160 on_server
= json
.load(open(store_seen_file
))
163 # On garde le maximum
164 for k
in set(on_client
.keys() + on_server
.keys()):
165 on_server
[k
] = max(on_client
.get(k
, 0), on_server
.get(k
, 0))
166 # On enregistre ce nouveau dico
167 json
.dump(on_server
, open(store_seen_file
, "w"))
168 # On envoie au client ce nouveau dico
169 print json
.dumps(on_server
)
171 if __name__
== "__main__":
172 if sys
.argv
[1] == "check":
177 elif sys
.argv
[1] == "whatsup":
179 print json
.dumps(news
)
180 elif sys
.argv
[1] == "sync":