""" Pour récupérer tous les .torrents déjà téléchargés sur t411.me """
-import urllib
-import urllib2
+import requests
import getpass
+import re
-#: url de login sur t411
-login_url = u"https://t411.me/users/login"
+DEBUG = True
-# Pour récupérer la liste des torrents quand t est le contenu d'une page
-# d'historique
-#re.findall('href="(//www.t411.me/torrents/.*?)"', t)
+#: URL principale de t411
+main_url = "https://www.t411.me/"
+#: Page de login
+login_url = main_url + u"users/login/"
+#: Page de profil utilisateur
+profile_url = main_url + u"users/profile/"
+#: Page d'historique
+history_url = main_url + u"users/history/"
+#: Page de download de .torrent
+torrent_url = main_url + u"torrents/download/?id=%(torrentid)s"
-def getid(url):
- """Récupère l'id du torrent à partir de l'``url`` de sa page."""
- p=urllib.urlopen(url)
- t=p.read()
- id=re.findall('a href="/torrents/download/\?id=(\d*)"', t)
- print id; return id
-
-def post(url, data):
- """Poste les ``data`` sur l'``url`` et renvoie la page obtenue."""
- data = urllib.urlencode(data)
- request = urllib2.Request("http://www.t411.me/users/login", data)
- response = urllib2.urlopen(request)
- return response
+#: Regex pour trouver l'id du torrent
+torrentid_pattern = ur'<a href="/torrents/download/\?id=(\d+)"'
+torrentid_regex = re.compile(torrentid_pattern)
+
+#: Dossier où enregistrer les .torrent
+torrent_folder = u"/home/vincent/Vidéos/torrents/"
def do_connect(login, password):
- """Se logue et renvoie le cookie."""
- response = post(login_url, {"login": login, "password": password})
- cookie = response.headers["set-cookie"]
- return cookie
+ """Se logue et renvoie les cookies."""
+ response = requests.post(login_url, data={"login": login, "password": password})
+ return response.cookies
def connect():
"""Demande login/password à l'utilisateur et se connecte."""
password = getpass.getpass()
return do_connect(login, password)
+def generator_torrent_links(cookies, urlpattern):
+ """Ouvre successivement les pages d'url ``urlpattern % n`
+ jusqu'à ce qu'il n'y ait plus de torrents. Ça donne un generator."""
+ n = 0
+ while True:
+ url = urlpattern % n
+ if DEBUG:
+ print url
+ response = requests.get(url, cookies=cookies)
+ torrent_links = re.findall('href="(//www.t411.me/torrents/.*?)"', response.content)
+ torrent_links = ["https:" + i for i in torrent_links]
+ if len(torrent_links) == 0:
+ raise StopIteration
+ yield torrent_links
+ n += 1
+
+def crawl_history(cookies):
+ """Récupère la liste des liens vers les torrents dans l'historique."""
+ urlpattern = history_url
+ urlpattern += "?page=%s"
+ liste = sum(generator_torrent_links(cookies, urlpattern), [])
+ return liste
+
+def get_torrentid(url, cookies):
+ """Récupère l'id du torrent à partir de l'``url`` de sa page."""
+ response = requests.get(url, cookies=cookies)
+ ids = torrentid_regex.findall(response.content)
+ if DEBUG:
+ print url
+ #print ids
+ return ids[0]
+
+def get_torrentids(cookies, torrentlinks):
+ """Récupère les ids de tous les torrents de l'historique."""
+ return [get_torrentid(url, cookies) for url in torrentlinks]
+
+def get_torrent(cookies, id):
+ """Récupère le .torrent n°``id``."""
+ url = torrent_url % {"torrentid" : id}
+ if DEBUG:
+ print url
+ response = requests.get(url, cookies=cookies)
+ raw_torrent_file = response.content
+ return raw_torrent_file
+
+def save_torrent_file(filename, raw):
+ """Sauvegarde un fichier torrent."""
+ with open(torrent_folder + filename, "w") as f:
+ f.write(raw)
+
+def do_all():
+ """Fait tout."""
+ cookies = connect()
+ linkslist = crawl_history(cookies)
+ idslist = get_torrentids(cookies, linkslist)
+ for id in idslist:
+ raw = get_torrent(cookies, id)
+ save_torrent_file(id + ".torrent", raw)
+ print "Torrents downloaded in %s" % torrent_folder
+
if __name__ == "__main__":
- print connect()
+ do_all()