[cineoob] integration of ICapTorrent, new command search_movie_torrent
This commit is contained in:
parent
c1325fabe7
commit
e37dd25f07
2 changed files with 140 additions and 16 deletions
|
|
@ -18,7 +18,7 @@
|
||||||
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
|
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
from weboob.tools.browser import BaseBrowser
|
from weboob.tools.browser import BaseBrowser, BrowserHTTPNotFound
|
||||||
from weboob.capabilities.base import NotAvailable, NotLoaded
|
from weboob.capabilities.base import NotAvailable, NotLoaded
|
||||||
from weboob.capabilities.cinema import Movie, Person
|
from weboob.capabilities.cinema import Movie, Person
|
||||||
from weboob.tools.json import json
|
from weboob.tools.json import json
|
||||||
|
|
@ -100,6 +100,8 @@ class ImdbBrowser(BaseBrowser):
|
||||||
other_titles = []
|
other_titles = []
|
||||||
roles = {}
|
roles = {}
|
||||||
|
|
||||||
|
if not jres.has_key('title'):
|
||||||
|
return
|
||||||
title = unicode(jres['title'].strip())
|
title = unicode(jres['title'].strip())
|
||||||
if jres.has_key('directors'):
|
if jres.has_key('directors'):
|
||||||
short_description = unicode(', '.join(jres['directors']))
|
short_description = unicode(', '.join(jres['directors']))
|
||||||
|
|
@ -150,7 +152,10 @@ class ImdbBrowser(BaseBrowser):
|
||||||
return movie
|
return movie
|
||||||
|
|
||||||
def get_person(self, id):
|
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)
|
assert self.is_on_page(PersonPage)
|
||||||
return self.page.get_person(id)
|
return self.page.get_person(id)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,8 @@ from __future__ import with_statement
|
||||||
import sys
|
import sys
|
||||||
from datetime import datetime
|
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.cinema import ICapCinema
|
||||||
from weboob.capabilities.base import NotAvailable,NotLoaded
|
from weboob.capabilities.base import NotAvailable,NotLoaded
|
||||||
from weboob.tools.application.repl import ReplApplication
|
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 " \
|
", list persons related to a movie, list movies related to a person and list common movies " \
|
||||||
"of two persons."
|
"of two persons."
|
||||||
SHORT_DESCRIPTION = "search movies and persons around cinema"
|
SHORT_DESCRIPTION = "search movies and persons around cinema"
|
||||||
CAPS = ICapCinema
|
CAPS = (ICapCinema,ICapTorrent)
|
||||||
EXTRA_FORMATTERS = {'movie_list': MovieListFormatter,
|
EXTRA_FORMATTERS = {'movie_list': MovieListFormatter,
|
||||||
'movie_info': MovieInfoFormatter,
|
'movie_info': MovieInfoFormatter,
|
||||||
'person_list': PersonListFormatter,
|
'person_list': PersonListFormatter,
|
||||||
'person_info': PersonInfoFormatter,
|
'person_info': PersonInfoFormatter,
|
||||||
|
'torrent_list': TorrentListFormatter,
|
||||||
|
'torrent_info': TorrentInfoFormatter,
|
||||||
}
|
}
|
||||||
COMMANDS_FORMATTERS = {'search_movie': 'movie_list',
|
COMMANDS_FORMATTERS = {'search_movie': 'movie_list',
|
||||||
'info_movie': 'movie_info',
|
'info_movie': 'movie_info',
|
||||||
|
|
@ -159,7 +163,10 @@ class Cineoob(ReplApplication):
|
||||||
'casting': 'person_list',
|
'casting': 'person_list',
|
||||||
'filmography': 'movie_list',
|
'filmography': 'movie_list',
|
||||||
'movies_in_common':'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']
|
ROLE_LIST = ['actor','director','writer','composer','producer']
|
||||||
COUNTRY_LIST = ['us','fr','de','jp']
|
COUNTRY_LIST = ['us','fr','de','jp']
|
||||||
|
|
@ -193,11 +200,11 @@ class Cineoob(ReplApplication):
|
||||||
self.options.count = None
|
self.options.count = None
|
||||||
|
|
||||||
lid1 = []
|
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)
|
lid1.append(id)
|
||||||
self.flush()
|
self.flush()
|
||||||
lid2 = []
|
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)
|
lid2.append(id)
|
||||||
self.flush()
|
self.flush()
|
||||||
self.options.count = initial_count
|
self.options.count = initial_count
|
||||||
|
|
@ -230,11 +237,11 @@ class Cineoob(ReplApplication):
|
||||||
self.options.count = None
|
self.options.count = None
|
||||||
|
|
||||||
lid1 = []
|
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)
|
lid1.append(id)
|
||||||
self.flush()
|
self.flush()
|
||||||
lid2 = []
|
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)
|
lid2.append(id)
|
||||||
self.flush()
|
self.flush()
|
||||||
self.options.count = initial_count
|
self.options.count = initial_count
|
||||||
|
|
@ -255,7 +262,7 @@ class Cineoob(ReplApplication):
|
||||||
#movie = self.get_object(id, 'get_movie',['duration'])
|
#movie = self.get_object(id, 'get_movie',['duration'])
|
||||||
movie = None
|
movie = None
|
||||||
_id, backend = self.parse_id(id)
|
_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:
|
if result:
|
||||||
backend = _backend
|
backend = _backend
|
||||||
movie = result
|
movie = result
|
||||||
|
|
@ -280,7 +287,7 @@ class Cineoob(ReplApplication):
|
||||||
#person = self.get_object(id, 'get_person',None)
|
#person = self.get_object(id, 'get_person',None)
|
||||||
person = None
|
person = None
|
||||||
_id, backend = self.parse_id(id)
|
_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:
|
if result:
|
||||||
backend = _backend
|
backend = _backend
|
||||||
person = result
|
person = result
|
||||||
|
|
@ -306,7 +313,7 @@ class Cineoob(ReplApplication):
|
||||||
pattern = None
|
pattern = None
|
||||||
|
|
||||||
self.start_format(pattern=pattern)
|
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.cached_format(movie)
|
||||||
self.flush()
|
self.flush()
|
||||||
|
|
||||||
|
|
@ -321,7 +328,7 @@ class Cineoob(ReplApplication):
|
||||||
pattern = None
|
pattern = None
|
||||||
|
|
||||||
self.start_format(pattern=pattern)
|
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.cached_format(person)
|
||||||
self.flush()
|
self.flush()
|
||||||
|
|
||||||
|
|
@ -339,7 +346,7 @@ class Cineoob(ReplApplication):
|
||||||
print >>sys.stderr, 'Movie not found: %s' % id
|
print >>sys.stderr, 'Movie not found: %s' % id
|
||||||
return 3
|
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.cached_format(person)
|
||||||
self.flush()
|
self.flush()
|
||||||
|
|
||||||
|
|
@ -357,7 +364,7 @@ class Cineoob(ReplApplication):
|
||||||
print >>sys.stderr, 'Person not found: %s' % id
|
print >>sys.stderr, 'Person not found: %s' % id
|
||||||
return 3
|
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.cached_format(movie)
|
||||||
self.flush()
|
self.flush()
|
||||||
|
|
||||||
|
|
@ -372,7 +379,7 @@ class Cineoob(ReplApplication):
|
||||||
print >>sys.stderr, 'Person not found: %s' % id
|
print >>sys.stderr, 'Person not found: %s' % id
|
||||||
return 3
|
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)
|
print '%s :\n\n%s' % (person.name,bio)
|
||||||
if bio != NotAvailable:
|
if bio != NotAvailable:
|
||||||
self.flush()
|
self.flush()
|
||||||
|
|
@ -397,8 +404,120 @@ class Cineoob(ReplApplication):
|
||||||
print >>sys.stderr, 'Movie not found: %s' % id
|
print >>sys.stderr, 'Movie not found: %s' % id
|
||||||
return 3
|
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)
|
print '%s :\n\n%s' % (movie.original_title,release)
|
||||||
if release != NotAvailable:
|
if release != NotAvailable:
|
||||||
self.flush()
|
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()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue