[cineoob] new command 'releases' showing releases dates

This commit is contained in:
Julien Veyssier 2013-03-07 21:24:58 +01:00
commit 79192e288c
7 changed files with 72 additions and 8 deletions

View file

@ -56,6 +56,10 @@ List persons in common between two movies.
\fBbiography\fR \fIID\fR \fBbiography\fR \fIID\fR
.br .br
Show the complete biography of a person. Show the complete biography of a person.
.TP
\fBreleases\fR \fIID\fR \fI[COUNTRY]\fR
.br
Get releases dates of a movie. If COUNTRY is given, show release in this country.
.SH WEBOOB COMMANDS .SH WEBOOB COMMANDS
.TP .TP
\fBbackends\fR [\fIACTION\fR] [\fIBACKEND_NAME\fR]... \fBbackends\fR [\fIACTION\fR] [\fIBACKEND_NAME\fR]...

View file

@ -63,9 +63,12 @@ class ImdbBackend(BaseBackend, ICapCinema):
def iter_movie_persons_ids(self, id): def iter_movie_persons_ids(self, id):
return self.browser.iter_movie_persons_ids(id) return self.browser.iter_movie_persons_ids(id)
def get_person_biography(self,id): def get_person_biography(self, id):
return self.browser.get_person_biography(id) return self.browser.get_person_biography(id)
def get_movie_releases(self, id, country=None):
return self.browser.get_movie_releases(id,country)
def fill_person(self, person, fields): def fill_person(self, person, fields):
if 'real_name' in fields or 'birth_place' in fields\ if 'real_name' in fields or 'birth_place' in fields\
or 'death_date' in fields or 'nationality' in fields\ or 'death_date' in fields or 'nationality' in fields\

View file

@ -23,7 +23,7 @@ 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
from .pages import PersonPage, MovieCrewPage, BiographyPage, FilmographyPage from .pages import PersonPage, MovieCrewPage, BiographyPage, FilmographyPage, ReleasePage
from datetime import datetime from datetime import datetime
@ -37,6 +37,7 @@ class ImdbBrowser(BaseBrowser):
USER_AGENT = BaseBrowser.USER_AGENTS['wget'] USER_AGENT = BaseBrowser.USER_AGENTS['wget']
PAGES = { PAGES = {
'http://www.imdb.com/title/tt[0-9]*/fullcredits.*': MovieCrewPage, 'http://www.imdb.com/title/tt[0-9]*/fullcredits.*': MovieCrewPage,
'http://www.imdb.com/title/tt[0-9]*/releaseinfo.*': ReleasePage,
'http://www.imdb.com/name/nm[0-9]*/*': PersonPage, 'http://www.imdb.com/name/nm[0-9]*/*': PersonPage,
'http://www.imdb.com/name/nm[0-9]*/bio.*': BiographyPage, 'http://www.imdb.com/name/nm[0-9]*/bio.*': BiographyPage,
'http://www.imdb.com/name/nm[0-9]*/filmo.*': FilmographyPage, 'http://www.imdb.com/name/nm[0-9]*/filmo.*': FilmographyPage,
@ -181,6 +182,11 @@ class ImdbBrowser(BaseBrowser):
for person in self.page.iter_persons_ids(): for person in self.page.iter_persons_ids():
yield person yield person
def get_movie_releases(self,id, country):
self.location('http://www.imdb.com/title/%s/releaseinfo'%id)
assert self.is_on_page(ReleasePage)
return self.page.get_movie_releases(country)
dict_hex = {'á': u'á', dict_hex = {'á': u'á',
'é': u'é', 'é': u'é',
@ -191,6 +197,7 @@ dict_hex = {'á': u'á',
'ú': u'ú', 'ú': u'ú',
'ü': u'ü', 'ü': u'ü',
'&': u'&', '&': u'&',
''': u"'",
'ç': u'ç' 'ç': u'ç'
} }
def latin2unicode(word): def latin2unicode(word):

View file

@ -25,7 +25,25 @@ from weboob.tools.browser import BasePage
from datetime import datetime from datetime import datetime
__all__ = ['PersonPage','MovieCrewPage','BiographyPage','FilmographyPage'] __all__ = ['PersonPage','MovieCrewPage','BiographyPage','FilmographyPage','ReleasePage']
class ReleasePage(BasePage):
''' Page containing releases of a movie
'''
def get_movie_releases(self,country_filter):
result = unicode()
links = self.parser.select(self.document.getroot(),'b a')
for a in links:
href = a.attrib.get('href','')
if href.strip('/').split('/')[0] == 'calendar' and\
(country_filter == None or href.split('region=')[-1].lower() == country_filter):
country = a.text
date = self.parser.select(a.getparent().getparent().getparent(),'td')[1].text_content()
result += '%s : %s\n' % (country,date)
if result == u'':
result = NotAvailable
return result.strip()
class BiographyPage(BasePage): class BiographyPage(BasePage):

View file

@ -59,3 +59,8 @@ class ImdbTest(BackendTest):
bio = self.backend.get_person_biography('nm0223033') bio = self.backend.get_person_biography('nm0223033')
assert bio != '' assert bio != ''
assert bio != None assert bio != None
def test_get_movie_releases(self):
rel = self.backend.get_movie_releases('tt0079980')
assert rel != ''
assert rel != None

View file

@ -162,6 +162,7 @@ class Cineoob(ReplApplication):
'persons_in_common':'person_list' 'persons_in_common':'person_list'
} }
ROLE_LIST = ['actor','director','writer','composer','producer'] ROLE_LIST = ['actor','director','writer','composer','producer']
COUNTRY_LIST = ['us','fr','de','jp']
def complete_filmography(self, text, line, *ignored): def complete_filmography(self, text, line, *ignored):
args = line.split(' ') args = line.split(' ')
@ -375,3 +376,29 @@ class Cineoob(ReplApplication):
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()
def complete_releases(self, text, line, *ignored):
args = line.split(' ')
if len(args) == 3:
return self.COUNTRY_LIST
def do_releases(self, line):
"""
releases movie_ID [COUNTRY]
Get releases dates of a movie.
If COUNTRY is given, show release in this country.
"""
id, country = self.parse_command_args(line, 2, 1)
# TODO try without getting object
movie = self.get_object(id, 'get_movie')
if not movie:
print >>sys.stderr, 'Movie not found: %s' % id
return 3
for backend, release in self.do('get_movie_releases', movie.id, country):
print '%s :\n\n%s' % (movie.original_title,release)
if release != NotAvailable:
self.flush()

View file

@ -87,17 +87,17 @@ class ICapCinema(IBaseCap):
""" """
raise NotImplementedError() raise NotImplementedError()
def get_movie_persons(self, _id): def get_movie_releases(self, _id, country=None):
""" """
Get the list of persons who are actors in a movie. Get a list of a movie releases from an ID.
:param _id: ID of movie :param _id: ID of movie
:type _id: str :type _id: str
:rtype: iter[:class:`Person`] :rtype: :class:`String`
""" """
raise NotImplementedError() raise NotImplementedError()
def iter_movie_persons(self, _id): def iter_movie_persons(self, _id, role=None):
""" """
Get the list of persons who are related to a movie. Get the list of persons who are related to a movie.
@ -127,7 +127,7 @@ class ICapCinema(IBaseCap):
""" """
raise NotImplementedError() raise NotImplementedError()
def iter_person_movies(self, _id): def iter_person_movies(self, _id, role=None):
""" """
Get the list of movies related to a person. Get the list of movies related to a person.