diff --git a/weboob/backends/kickass/pages/torrents.py b/weboob/backends/kickass/pages/torrents.py index abff9f3d..37c79a1b 100644 --- a/weboob/backends/kickass/pages/torrents.py +++ b/weboob/backends/kickass/pages/torrents.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2010-2011 Julien Veyssier +# Copyright(C) 2010-2011 Julien Veyssier, Laurent Bachelier # # This file is part of weboob. # @@ -18,6 +18,12 @@ # along with weboob. If not, see . +try: + from urlparse import parse_qs +except ImportError: + from cgi import parse_qs +from urlparse import urlsplit + from weboob.capabilities.torrent import Torrent from weboob.tools.browser import BasePage from weboob.tools.misc import get_bytes_size @@ -34,10 +40,7 @@ class TorrentsPage(BasePage): if not title: title = '' for red in tr.getchildren()[0].getchildren()[1].getchildren()[1].getchildren(): - if red.text: - title += red.text - if red.tail: - title += red.tail + title += red.text_content() idt = tr.getchildren()[0].getchildren()[1].getchildren()[1].attrib.get('href', '').replace('/', '') \ .replace('.html', '') @@ -57,6 +60,7 @@ class TorrentsPage(BasePage): yield Torrent(idt, title, url=url, + filename=parse_qs(urlsplit(url).query).get('title', [None])[0], size=get_bytes_size(size, u), seeders=int(seed), leechers=int(leech)) @@ -70,17 +74,17 @@ class TorrentPage(BasePage): url = 'No Url found' for div in self.document.getiterator('div'): if div.attrib.get('id', '') == 'desc': - description = div.text.strip() - for ch in div.getchildren(): - if ch.tail != None: - description += ' '+ch.tail.strip() + try: + description = div.text_content() + except UnicodeDecodeError: + description = 'Description with invalid UTF-8.' elif div.attrib.get('class', '') == 'seedBlock': - if div.getchildren()[1].text != None: + if div.getchildren()[1].text is not None: seed = int(div.getchildren()[1].text) else: seed = 0 elif div.attrib.get('class', '') == 'leechBlock': - if div.getchildren()[1].text != None: + if div.getchildren()[1].text is not None: leech = int(div.getchildren()[1].text) else: leech = 0 @@ -107,9 +111,9 @@ class TorrentPage(BasePage): if td.attrib.get('class', '') == 'torFileName': files.append(td.text) - torrent = Torrent(id, title) torrent = Torrent(id, title) torrent.url = url + torrent.filename = parse_qs(urlsplit(url).query).get('title', [None])[0] torrent.size = get_bytes_size(size, u) torrent.seeders = int(seed) torrent.leechers = int(leech) diff --git a/weboob/backends/kickass/test.py b/weboob/backends/kickass/test.py index 40f91d5b..4ce76f63 100644 --- a/weboob/backends/kickass/test.py +++ b/weboob/backends/kickass/test.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2010-2011 Julien Veyssier +# Copyright(C) 2010-2011 Julien Veyssier, Laurent Bachelier # # This file is part of weboob. # @@ -18,12 +18,33 @@ # along with weboob. If not, see . from weboob.tools.test import BackendTest +from weboob.capabilities.base import NotLoaded + +import urllib +from random import choice class KickassTest(BackendTest): BACKEND = 'kickass' def test_torrent(self): - l = list(self.backend.iter_torrents('debian')) - if len(l) > 0: - assert l[0].url.endswith('.torrent') - self.backend.get_torrent_file(l[0].id) + torrents = list(self.backend.iter_torrents('debian')) + for torrent in torrents: + path, qs = urllib.splitquery(torrent.url) + assert path.endswith('.torrent') + if qs: + assert torrent.filename + assert torrent.id + assert torrent.name + assert torrent.description is NotLoaded + full_torrent = self.backend.get_torrent(torrent.id) + # do not assert torrent.name is full_torrent.name + # (or even that one contains another), it isn't always true! + assert full_torrent.name + assert full_torrent.url + assert full_torrent.description is not NotLoaded + + # get the file of a random torrent + # from the list (getting them all would be too long) + if len(torrents): + torrent = choice(torrents) + self.backend.get_torrent_file(torrent.id) diff --git a/weboob/capabilities/torrent.py b/weboob/capabilities/torrent.py index 08e03f67..c50fc990 100644 --- a/weboob/capabilities/torrent.py +++ b/weboob/capabilities/torrent.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright(C) 2010-2011 Romain Bignon +# Copyright(C) 2010-2011 Romain Bignon, Laurent Bachelier # # This file is part of weboob. # @@ -28,7 +28,7 @@ __all__ = ['ICapTorrent', 'Torrent'] class Torrent(CapBaseObject): def __init__(self, id, name, date=NotLoaded, size=NotLoaded, url=NotLoaded, seeders=NotLoaded, leechers=NotLoaded, files=NotLoaded, - description=NotLoaded): + description=NotLoaded, filename=NotLoaded): CapBaseObject.__init__(self, id) self.add_field('name', basestring, name) self.add_field('size', (int,long,float), size) @@ -38,6 +38,7 @@ class Torrent(CapBaseObject): self.add_field('leechers', int, leechers) self.add_field('files', list, files) self.add_field('description', basestring, description) + self.add_field('filename', basestring, filename) # suggested name of the .torrent file class ICapTorrent(IBaseCap): def iter_torrents(self, pattern):