From e37dd25f073b0801d5c575e9311a7b007ee0a19f Mon Sep 17 00:00:00 2001 From: Julien Veyssier Date: Sat, 9 Mar 2013 01:20:31 +0100 Subject: [PATCH] [cineoob] integration of ICapTorrent, new command search_movie_torrent --- modules/imdb/browser.py | 9 +- weboob/applications/cineoob/cineoob.py | 147 ++++++++++++++++++++++--- 2 files changed, 140 insertions(+), 16 deletions(-) diff --git a/modules/imdb/browser.py b/modules/imdb/browser.py index 9df14ecb..3d9bf2c6 100644 --- a/modules/imdb/browser.py +++ b/modules/imdb/browser.py @@ -18,7 +18,7 @@ # along with weboob. If not, see . -from weboob.tools.browser import BaseBrowser +from weboob.tools.browser import BaseBrowser, BrowserHTTPNotFound from weboob.capabilities.base import NotAvailable, NotLoaded from weboob.capabilities.cinema import Movie, Person from weboob.tools.json import json @@ -100,6 +100,8 @@ class ImdbBrowser(BaseBrowser): other_titles = [] roles = {} + if not jres.has_key('title'): + return title = unicode(jres['title'].strip()) if jres.has_key('directors'): short_description = unicode(', '.join(jres['directors'])) @@ -150,7 +152,10 @@ class ImdbBrowser(BaseBrowser): return movie def get_person(self, id): - self.location('http://www.imdb.com/name/%s' % id) + try: + self.location('http://www.imdb.com/name/%s' % id) + except BrowserHTTPNotFound: + return assert self.is_on_page(PersonPage) return self.page.get_person(id) diff --git a/weboob/applications/cineoob/cineoob.py b/weboob/applications/cineoob/cineoob.py index e078c43b..067114f1 100644 --- a/weboob/applications/cineoob/cineoob.py +++ b/weboob/applications/cineoob/cineoob.py @@ -22,6 +22,8 @@ from __future__ import with_statement import sys from datetime import datetime +from weboob.applications.weboorrents.weboorrents import TorrentInfoFormatter, TorrentListFormatter +from weboob.capabilities.torrent import ICapTorrent from weboob.capabilities.cinema import ICapCinema from weboob.capabilities.base import NotAvailable,NotLoaded from weboob.tools.application.repl import ReplApplication @@ -146,11 +148,13 @@ class Cineoob(ReplApplication): ", list persons related to a movie, list movies related to a person and list common movies " \ "of two persons." SHORT_DESCRIPTION = "search movies and persons around cinema" - CAPS = ICapCinema + CAPS = (ICapCinema,ICapTorrent) EXTRA_FORMATTERS = {'movie_list': MovieListFormatter, 'movie_info': MovieInfoFormatter, 'person_list': PersonListFormatter, 'person_info': PersonInfoFormatter, + 'torrent_list': TorrentListFormatter, + 'torrent_info': TorrentInfoFormatter, } COMMANDS_FORMATTERS = {'search_movie': 'movie_list', 'info_movie': 'movie_info', @@ -159,7 +163,10 @@ class Cineoob(ReplApplication): 'casting': 'person_list', 'filmography': 'movie_list', 'movies_in_common':'movie_list', - 'persons_in_common':'person_list' + 'persons_in_common':'person_list', + 'search_torrent': 'torrent_list', + 'search_movie_torrent': 'torrent_list', + 'info_torrent': 'torrent_info', } ROLE_LIST = ['actor','director','writer','composer','producer'] COUNTRY_LIST = ['us','fr','de','jp'] @@ -193,11 +200,11 @@ class Cineoob(ReplApplication): self.options.count = None lid1 = [] - for backend, id in self.do('iter_person_movies_ids', person1.id): + for backend, id in self.do('iter_person_movies_ids', person1.id, caps=ICapCinema): lid1.append(id) self.flush() lid2 = [] - for backend, id in self.do('iter_person_movies_ids', person2.id): + for backend, id in self.do('iter_person_movies_ids', person2.id, caps=ICapCinema): lid2.append(id) self.flush() self.options.count = initial_count @@ -230,11 +237,11 @@ class Cineoob(ReplApplication): self.options.count = None lid1 = [] - for backend, id in self.do('iter_movie_persons_ids', movie1.id): + for backend, id in self.do('iter_movie_persons_ids', movie1.id, caps=ICapCinema): lid1.append(id) self.flush() lid2 = [] - for backend, id in self.do('iter_movie_persons_ids', movie2.id): + for backend, id in self.do('iter_movie_persons_ids', movie2.id, caps=ICapCinema): lid2.append(id) self.flush() self.options.count = initial_count @@ -255,7 +262,7 @@ class Cineoob(ReplApplication): #movie = self.get_object(id, 'get_movie',['duration']) movie = None _id, backend = self.parse_id(id) - for _backend, result in self.do('get_movie', _id, backends=backend): + for _backend, result in self.do('get_movie', _id, backends=backend, caps=ICapCinema): if result: backend = _backend movie = result @@ -280,7 +287,7 @@ class Cineoob(ReplApplication): #person = self.get_object(id, 'get_person',None) person = None _id, backend = self.parse_id(id) - for _backend, result in self.do('get_person', _id, backends=backend): + for _backend, result in self.do('get_person', _id, backends=backend, caps=ICapCinema): if result: backend = _backend person = result @@ -306,7 +313,7 @@ class Cineoob(ReplApplication): pattern = None self.start_format(pattern=pattern) - for backend, movie in self.do('iter_movies', pattern=pattern): + for backend, movie in self.do('iter_movies', pattern=pattern, caps=ICapCinema): self.cached_format(movie) self.flush() @@ -321,7 +328,7 @@ class Cineoob(ReplApplication): pattern = None self.start_format(pattern=pattern) - for backend, person in self.do('iter_persons', pattern=pattern): + for backend, person in self.do('iter_persons', pattern=pattern, caps=ICapCinema): self.cached_format(person) self.flush() @@ -339,7 +346,7 @@ class Cineoob(ReplApplication): print >>sys.stderr, 'Movie not found: %s' % id return 3 - for backend, person in self.do('iter_movie_persons', movie.id, role): + for backend, person in self.do('iter_movie_persons', movie.id, role, caps=ICapCinema): self.cached_format(person) self.flush() @@ -357,7 +364,7 @@ class Cineoob(ReplApplication): print >>sys.stderr, 'Person not found: %s' % id return 3 - for backend, movie in self.do('iter_person_movies', person.id, role): + for backend, movie in self.do('iter_person_movies', person.id, role, caps=ICapCinema): self.cached_format(movie) self.flush() @@ -372,7 +379,7 @@ class Cineoob(ReplApplication): print >>sys.stderr, 'Person not found: %s' % id return 3 - for backend, bio in self.do('get_person_biography', person.id): + for backend, bio in self.do('get_person_biography', person.id, caps=ICapCinema): print '%s :\n\n%s' % (person.name,bio) if bio != NotAvailable: self.flush() @@ -397,8 +404,120 @@ class Cineoob(ReplApplication): print >>sys.stderr, 'Movie not found: %s' % id return 3 - for backend, release in self.do('get_movie_releases', movie.id, country): + for backend, release in self.do('get_movie_releases', movie.id, country, caps=ICapCinema): print '%s :\n\n%s' % (movie.original_title,release) if release != NotAvailable: self.flush() + #================== TORRENT ================== + + def complete_info_torrent(self, text, line, *ignored): + args = line.split(' ') + if len(args) == 2: + return self._complete_object() + + def do_info_torrent(self, id): + """ + info_torrent ID + + Get information about a torrent. + """ + + torrent = self.get_object(id, 'get_torrent') + if not torrent: + print >>sys.stderr, 'Torrent not found: %s' % id + return 3 + + self.start_format() + self.format(torrent) + self.flush() + + def complete_getfile_torrent(self, text, line, *ignored): + args = line.split(' ', 2) + if len(args) == 2: + return self._complete_object() + elif len(args) >= 3: + return self.path_completer(args[2]) + + def do_getfile_torrent(self, line): + """ + getfile_torrent ID [FILENAME] + + Get the .torrent file. + FILENAME is where to write the file. If FILENAME is '-', + the file is written to stdout. + """ + id, dest = self.parse_command_args(line, 2, 1) + + _id, backend_name = self.parse_id(id) + + if dest is None: + dest = '%s.torrent' % _id + + try: + for backend, buf in self.do('get_torrent_file', _id, backends=backend_name, caps=ICapTorrent): + if buf: + if dest == '-': + print buf + else: + try: + with open(dest, 'w') as f: + f.write(buf) + except IOError, e: + print >>sys.stderr, 'Unable to write .torrent in "%s": %s' % (dest, e) + return 1 + return + except CallErrors, errors: + for backend, error, backtrace in errors: + if isinstance(error, MagnetOnly): + print >>sys.stderr, u'Error(%s): No direct URL available, ' \ + u'please provide this magnet URL ' \ + u'to your client:\n%s' % (backend, error.magnet) + return 4 + else: + self.bcall_error_handler(backend, error, backtrace) + + print >>sys.stderr, 'Torrent "%s" not found' % id + return 3 + + def do_search_torrent(self, pattern): + """ + search_torrent [PATTERN] + + Search torrents. + """ + self.change_path([u'search torrent']) + if not pattern: + pattern = None + + self.start_format(pattern=pattern) + for backend, torrent in self.do('iter_torrents', pattern=pattern, caps=ICapTorrent): + self.cached_format(torrent) + self.flush() + + def do_search_movie_torrent(self, id): + """ + search_movie_torrent movie_ID + + Search torrents of movie_ID. + """ + movie = None + _id, backend = self.parse_id(id) + for _backend, result in self.do('get_movie', _id, backends=backend, caps=ICapCinema): + if result: + backend = _backend + movie = result + if not movie: + print >>sys.stderr, 'Movie not found: %s' % id + return 3 + + pattern = movie.original_title + + self.change_path([u'search torrent']) + if not pattern: + pattern = None + + self.start_format(pattern=pattern) + for backend, torrent in self.do('iter_torrents', pattern=pattern, caps=ICapTorrent): + self.cached_format(torrent) + self.flush()