]>
gitweb.pimeys.fr Git - today.git/blob - today_server.py
8c251db13ad34dee94f63cec00ab1b913f2e0c32
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
23 os
.chdir('/home/vincent/scripts/today/')
24 sys
.path
.append("/home/vincent/scripts/dtc/")
31 """Vérifie si il y a des quotes DTC non lues"""
32 return dtc
.last_inserted()
35 p
= urllib
.urlopen("http://xkcd.com")
37 current_id
= int(re
.findall("Permanent link to this comic: http://xkcd.com/(.*?)/", t
)[0])
41 p
= urllib
.urlopen("http://www.adoprixtoxis.com/lite/download/xantah_downloads.php")
43 ids
= re
.findall("""<div class="top">Xantah (.*?)</div>""", t
)
44 ids
= [int(i
) for i
in ids
]
48 p
= urllib
.urlopen("http://www.levisiteurdufutur.com/episodes.html")
51 soup
= BeautifulSoup
.BeautifulSoup(t
)
52 # On récupère les différentes saisons
53 saisons
= soup
.findAll("div", attrs
={"id" : "episodes_list"})
54 nsaisons
= len(saisons
)
55 # La saison en cours est la première dans la liste
56 episodes
= saisons
[0].findAll("div", attrs
={"class" : "thumbCaption"})
57 nepisodes
= len(episodes
)
58 return nsaisons
* 100 + nepisodes
60 def parse_youtube(username
):
61 """Récupère les vidéos d'une chaîne Youtube"""
62 link
= "https://gdata.youtube.com/feeds/api/users/%s/uploads?start-index=1&max-results=50" % (username
,)
65 p
= urllib
.urlopen(link
)
67 x
= etree
.fromstring(t
)
68 # lxml ne supporte pas les namespaces vides dans les requêtes XPath
70 ns
["default"] = ns
[None]
72 # Il y a potentiellement une suite
73 nextlinks
= x
.xpath("//default:link[@rel='next']", namespaces
=ns
)
75 link
= nextlinks
[0].attrib
["href"]
78 localentries
= x
.xpath("//default:entry", namespaces
=ns
)
79 entries
.extend(localentries
)
80 titles
= [e
.xpath(".//default:title", namespaces
=ns
)[0].text
for e
in entries
]
83 def get_season_episode(title
):
84 """Récupère les numéros de la saison et de l'épisode. Crash si ne trouve pas."""
85 ep
= int(re
.findall("ep([0-9]*)", title
)[0])
86 saison
= int(re
.findall("s([0-9]*)", title
)[0])
89 def last_noob_warpzone():
92 if "last_nw" in globals().keys():
94 titles
= parse_youtube("Funglisoft")
95 noobs
= [t
.lower().strip() for t
in titles
if t
.lower().strip().startswith("noob")]
96 warpzones
= [t
.lower().strip() for t
in titles
if t
.lower().strip().startswith("warpzone project")]
98 for serie
in [noobs
, warpzones
]:
99 # Les titres sont dans l'ordre antichronologique, on s'arrête donc au premier qu'on comprend
101 if "noob le film" in titre
or "making of" in titre
or "noob versus rct" == titre
or "extraits ost" in titre
:
106 saison
, ep
= get_season_episode(titre
)
107 except (ValueError, IndexError) as e
:
108 print "%s sur un season_episode warpzone : %s\n" % (e
, titre
)
110 lasts
.append([saison
, ep
])
113 last_noob
= lasts
[0][0]*100 + lasts
[0][1]
114 last_warp
= lasts
[1][0]*100 + lasts
[1][1]
115 last_nw
= [last_noob
, last_warp
]
119 return last_noob_warpzone()[0]
121 return last_noob_warpzone()[1]
124 titles
= parse_youtube("HugoToutSeul")
128 titles
= parse_youtube("NormanFaitDesVideos")
132 titles
= parse_youtube("MonsieurDream")
136 titles
= parse_youtube("joueurdugrenier")
140 rss
= urllib
.urlopen("http://limbero.org/jl8/rss/")
142 x
= etree
.fromstring(t
)
143 links
= x
.xpath("//link")
144 maxnum
= links
[1].text
.split("/")[-1]
149 """Récupère la liste des derniers ids de chaque truc, stockée dans le fichier."""
150 f
= open(serverconfig
.store_published_file
)
155 def update_file(news
):
156 """Met à jour la liste des derniers ids dans le fichier."""
157 f
= open(serverconfig
.store_published_file
, 'w')
164 "xantah" : last_xantah
,
165 "visiteur" : last_visiteur
,
167 "warpzone" : last_warpzone
,
169 "norman" : last_norman
,
170 "cyprien" : last_cyprien
,
171 "grenier" : last_grenier
,
176 """Va chercher sur les différents sites les nouveaux trucs."""
178 for (k
, f
) in FETCHS
.iteritems():
181 except Exception as e
:
182 errmsg
= "Erreur à la récupération de %s :\n" % k
183 errmsg
+= traceback
.format_exc()
184 # On dumpe le contenu local de la mémoire au moment de l'exception
185 fobj
= inspect
.trace()[-1][0]
186 # On fait un peu de ménage
187 d
= {k
:v
for (k
,v
) in fobj
.f_locals
.iteritems() if not k
.startswith("_")}
188 # On évite d'envoyer truckLoadsOfShit
189 d
= {k
: (v
if len(str(v
)) < 800
190 else str(v
)[:400] + "*" * 40 + "TRUNCATED OBJECT" + "*" * 40 + str(v
)[-400:])
191 for (k
,v
) in d
.iteritems()}
192 errmsg
+= "\nContexte : %s\n\n" % (pprint
.pformat(d
))
197 """Reçoit une requête de synchronisation."""
198 # On récupère où en est le client sur stdin
200 on_client
= json
.loads(t
)
201 # On récupère où en est le serveur dans le fichier idoine
202 if os
.path
.isfile(serverconfig
.store_seen_file
):
203 on_server
= json
.load(open(serverconfig
.store_seen_file
))
206 # On garde le maximum
207 for k
in set(on_client
.keys() + on_server
.keys()):
208 on_server
[k
] = max(on_client
.get(k
, 0), on_server
.get(k
, 0))
209 # On enregistre ce nouveau dico
210 json
.dump(on_server
, open(serverconfig
.store_seen_file
, "w"))
211 # On envoie au client ce nouveau dico
212 print json
.dumps(on_server
)
214 if __name__
== "__main__":
215 DEBUG
= ("--debug" in sys
.argv
) or ("--verbose" in sys
.argv
) or serverconfig
.DEBUG
216 if sys
.argv
[1] == "check":
218 if "--init" in sys
.argv
:
224 elif sys
.argv
[1] == "whatsup":
226 print json
.dumps(news
)
227 elif sys
.argv
[1] == "sync":