]>
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.
17 from lxml
import etree
23 os
.chdir('/home/vincent/scripts/today/')
24 sys
.path
.append("/home/vincent/scripts/dtc/")
27 #: Fichier où sont stockés les derniers IDs des trucs
28 store_published_file
= "lasts_published"
30 #: Fichier où est stockée une copie de la liste des derniers IDs *lus*
31 store_seen_file
= "lasts_sync"
34 """Obtenir la date actuelle sous le bon format"""
35 timestamp
= time
.time()
36 now
= datetime
.datetime(*time
.localtime(timestamp
)[:7])
39 def parse_date(s
, french
=True):
40 """Essaye d'obtenir une date à partir du string fourni"""
42 if isinstance(s
, unicode):
44 if s
.startswith("le "):
47 s
= re
.sub(" +", " ", s
)
48 # Pour avoir les noms de dates en Français
50 locale
.setlocale(locale
.LC_ALL
, 'fr_FR.UTF-8')
51 for format
in ["%d %B %Y"]:
53 struct
= time
.strptime(s
, format
)
54 return datetime
.datetime(*struct
[:7])
57 raise ValueError("%r : Didn't manage to convert as date, sorry." % (s
,))
60 """Vérifie si il y a des quotes DTC non lues"""
61 return dtc
.last_inserted()
64 p
= urllib
.urlopen("http://xkcd.com")
66 current_id
= int(re
.findall("Permanent link to this comic: http://xkcd.com/(.*?)/", t
)[0])
70 p
= urllib
.urlopen("http://www.adoprixtoxis.com/lite/download/xantah_downloads.php")
72 ids
= re
.findall("""<div class="top">Xantah (.*?)</div>""", t
)
73 ids
= [int(i
) for i
in ids
]
77 p
= urllib
.urlopen("http://www.levisiteurdufutur.com/episodes.html")
80 soup
= BeautifulSoup
.BeautifulSoup(t
)
81 # On récupère les différentes saisons
82 saisons
= soup
.findAll("div", attrs
={"id" : "episodes_list"})
83 nsaisons
= len(saisons
)
84 # La saison en cours est la première dans la liste
85 episodes
= saisons
[0].findAll("div", attrs
={"class" : "thumbCaption"})
86 nepisodes
= len(episodes
)
87 return nsaisons
* 100 + nepisodes
89 def last_noob_warpzone():
90 p
= urllib
.urlopen("http://noob-tv.com/agenda01.html")
93 soup
= BeautifulSoup
.BeautifulSoup(t
)
94 # On récupère tous les évènements
95 garbage
= soup
.findAll("strong")
98 l
= o
.findAll("span", attrs
={"class":"Style31"})
100 events
.append([o
.text
[:o
.text
.index(":")].strip(), l
[0].string
.lower().strip()]) # la date, l'event
101 # On garde que les "sorties"
102 events
= [o
for o
in events
if "sortie" in o
[1]]
104 events
= [[o
[0].replace(u
"û", u
"û").replace(u
"é", u
"é"), o
[1]] for o
in events
]
107 for i
in range(len(events
)):
108 raw_date
, event
= events
[i
]
110 eventss
.append([parse_date(raw_date
), event
])
115 noobs
= [ev
for ev
in events
if "noob" in ev
[1]]
116 warpzones
= [ev
for ev
in events
if "warpzone" in ev
[1]]
117 # On prend en considération le dernier évènement qui a eu lieu
120 ###### RHÂ, shit, y'a des fuckings trucs du genre "1er" dans les dates… :/
121 return noobs
, warpzones
123 def parse_youtube(username
):
124 """Récupère les vidéos d'une chaîne Youtube"""
125 link
= "https://gdata.youtube.com/feeds/api/users/%s/uploads?start-index=1&max-results=50" % (username
,)
128 p
= urllib
.urlopen(link
)
130 x
= etree
.fromstring(t
)
131 # lxml ne supporte pas les namespaces vides dans les requêtes XPath
133 ns
["default"] = ns
[None]
135 # Il y a potentiellement une suite
136 nextlinks
= x
.xpath("//default:link[@rel='next']", namespaces
=ns
)
138 link
= nextlinks
[0].attrib
["href"]
141 localentries
= x
.xpath("//default:entry", namespaces
=ns
)
142 entries
.extend(localentries
)
143 titles
= [e
.xpath(".//default:title", namespaces
=ns
)[0].text
for e
in entries
]
148 """Récupère la liste des derniers ids de chaque truc, stockée dans le fichiers."""
149 f
= open(store_published_file
)
154 def update_file(news
):
155 """Met à jour la liste des derniers ids dans le fichier."""
156 f
= open(store_published_file
, 'w')
163 "xantah" : last_xantah
,
164 "visiteur" : last_visiteur
,
168 """Va chercher sur les différents sites les nouveaux trucs."""
170 for (k
, f
) in FETCHS
.iteritems():
173 except Exception as e
:
174 print "Erreur à la récupération de %s :" % k
175 traceback
.print_exc()
179 """Reçoit une requête de synchronisation."""
180 # On récupère où en est le client sur stdin
182 on_client
= json
.loads(t
)
183 # On récupère où en est le serveur dans le fichier idoine
184 if os
.path
.isfile(store_seen_file
):
185 on_server
= json
.load(open(store_seen_file
))
188 # On garde le maximum
189 for k
in set(on_client
.keys() + on_server
.keys()):
190 on_server
[k
] = max(on_client
.get(k
, 0), on_server
.get(k
, 0))
191 # On enregistre ce nouveau dico
192 json
.dump(on_server
, open(store_seen_file
, "w"))
193 # On envoie au client ce nouveau dico
194 print json
.dumps(on_server
)
196 if __name__
== "__main__":
197 if sys
.argv
[1] == "check":
202 elif sys
.argv
[1] == "whatsup":
204 print json
.dumps(news
)
205 elif sys
.argv
[1] == "sync":