def test_no_year(self): # Make sure parser doesn't crash for movies with no year parser = ImdbParser() parser.parse('tt3303790') assert parser.name == 'Master of None' # There is no year assert not parser.year
def parse_what(self, what): """Given an imdb id or movie title, looks up from imdb and returns a dict with imdb_id and title keys""" imdb_id = extract_id(what) title = what if imdb_id: # Given an imdb id, find title parser = ImdbParser() try: parser.parse('http://www.imdb.com/title/%s' % imdb_id) except Exception: raise QueueError('Error parsing info from imdb for %s' % imdb_id) if parser.name: title = parser.name else: # Given a title, try to do imdb search for id console('Searching imdb for %s' % what) search = ImdbSearch() result = search.smart_match(what) if not result: raise QueueError( 'ERROR: Unable to find any such movie from imdb, use imdb url instead.' ) imdb_id = extract_id(result['url']) title = result['name'] self.options['imdb_id'] = imdb_id self.options['title'] = title return {'title': title, 'imdb_id': imdb_id}
def test_no_plot(self): # Make sure parser doesn't crash for movies with no plot parser = ImdbParser() parser.parse('tt1300562') assert parser.name == 'Goodbye Mothers' # There is no plot assert not parser.plot_outline
def test_no_plot(self): # Make sure parser doesn't crash for movies with no plot parser = ImdbParser() parser.parse('tt0245062') assert parser.name == 'The Magnet' # There is no plot assert not parser.plot_outline
def test_plot_with_links(self): """Make sure plot doesn't terminate at the first link. GitHub #756""" parser = ImdbParser() parser.parse('tt2503944') assert parser.plot_outline == ("Chef Adam Jones (Bradley Cooper) had it all - and lost it. A two-star Michelin " "rockstar with the bad habits to match, the former enfant terrible of the Paris " "restaurant scene did everything different every time out, and only ever cared " "about the thrill of creating explosions of taste. To land his own kitchen and " "that third elusive Michelin star though, he'll need the best of the best on " "his side, including the beautiful Helene (Sienna Miller).")
def upgrade(ver, session): if ver == 0: # Translate old qualities into new quality requirements movie_table = table_schema('movie_queue', session) for row in session.execute( select([movie_table.c.id, movie_table.c.quality])): # Webdl quality no longer has dash new_qual = row['quality'].replace('web-dl', 'webdl') if new_qual.lower() != 'any': # Old behavior was to get specified quality or greater, approximate that with new system new_qual = ' '.join(qual + '+' for qual in new_qual.split(' ')) session.execute( update(movie_table, movie_table.c.id == row['id'], {'quality': new_qual})) ver = 1 if ver == 1: # Bad upgrade left some qualities as 'ANY+' movie_table = table_schema('movie_queue', session) for row in session.execute( select([movie_table.c.id, movie_table.c.quality])): if row['quality'].lower() == 'any+': session.execute( update(movie_table, movie_table.c.id == row['id'], {'quality': 'ANY'})) ver = 2 if ver == 2: from flexget.utils.imdb import ImdbParser # Corrupted movie titles may be in the queue due to imdb layout changes. GitHub #729 movie_table = table_schema('movie_queue', session) queue_base_table = table_schema('queue', session) query = select([ movie_table.c.id, movie_table.c.imdb_id, queue_base_table.c.title ]) query = query.where(movie_table.c.id == queue_base_table.c.id) for row in session.execute(query): if row['imdb_id'] and (not row['title'] or row['title'] == 'None' or '\n' in row['title']): log.info('Fixing movie_queue title for %s' % row['imdb_id']) parser = ImdbParser() parser.parse(row['imdb_id']) if parser.name: session.execute( update(queue_base_table, queue_base_table.c.id == row['id'], {'title': parser.name})) ver = 3 if ver == 3: # adding queue_name column to movie_queue table and setting initial value to default) table_add_column('movie_queue', 'queue_name', Unicode, session, default='default') ver = 4 return ver
def _parse_new_movie(self, imdb_url, session): """ Get Movie object by parsing imdb page and save movie into the database. :param imdb_url: IMDB url :param session: Session to be used :return: Newly added Movie """ parser = ImdbParser() parser.parse(imdb_url) # store to database movie = Movie() movie.photo = parser.photo movie.title = parser.name movie.original_title = parser.original_name movie.score = parser.score movie.votes = parser.votes movie.meta_score = parser.meta_score movie.year = parser.year movie.mpaa_rating = parser.mpaa_rating movie.plot_outline = parser.plot_outline movie.url = imdb_url for name in parser.genres: genre = session.query(Genre).filter(Genre.name == name).first() if not genre: genre = Genre(name) movie.genres.append(genre) # pylint:disable=E1101 for index, name in enumerate(parser.languages): language = session.query(Language).filter( Language.name == name).first() if not language: language = Language(name) movie.languages.append(MovieLanguage(language, prominence=index)) for imdb_id, name in parser.actors.items(): actor = session.query(Actor).filter( Actor.imdb_id == imdb_id).first() if not actor: actor = Actor(imdb_id, name) movie.actors.append(actor) # pylint:disable=E1101 for imdb_id, name in parser.directors.items(): director = session.query(Director).filter( Director.imdb_id == imdb_id).first() if not director: director = Director(imdb_id, name) movie.directors.append(director) # pylint:disable=E1101 for imdb_id, name in parser.writers.items(): writer = session.query(Writer).filter( Writer.imdb_id == imdb_id).first() if not writer: writer = Writer(imdb_id, name) movie.writers.append(writer) # pylint:disable=E1101 # so that we can track how long since we've updated the info later movie.updated = datetime.now() session.add(movie) return movie
def test_parsed_data(self): parser = ImdbParser() parser.parse('tt0114814') assert parser.actors == { 'nm0000592': 'Pete Postlethwaite', 'nm0261452': 'Christine Estabrook', 'nm0000751': 'Suzy Amis', 'nm0000286': 'Stephen Baldwin', 'nm0000445': 'Dan Hedaya', 'nm0800339': 'Phillipe Simon', 'nm0002064': 'Giancarlo Esposito', 'nm0001590': 'Chazz Palminteri', 'nm0000321': 'Gabriel Byrne', 'nm0790436': 'Jack Shearer', 'nm0000228': 'Kevin Spacey', 'nm0001629': 'Kevin Pollak', 'nm0107808': 'Carl Bressler', 'nm0001125': 'Benicio Del Toro', 'nm0000860': 'Paul Bartel' }, 'Actors not parsed correctly' assert parser.directors == { 'nm0001741': 'Bryan Singer' }, 'Directors not parsed correctly' assert len(set(parser.genres).intersection([u'crime', u'drama', u'mystery', u'thriller'])) == \ len([u'crime', u'drama', u'mystery', u'thriller']), 'Genres not parsed correctly' assert parser.imdb_id == 'tt0114814', 'ID not parsed correctly' assert len( set(parser.languages).intersection( ['english', 'hungarian', 'spanish', 'french'])) == 4, 'Languages not parsed correctly' assert parser.mpaa_rating == 'R', 'Rating not parsed correctly' assert parser.name == 'The Usual Suspects', 'Name not parsed correctly' assert ( parser.photo == 'http://ia.media-imdb.com/images/M/MV5BMzI1MjI5MDQyOV5BMl5BanBnXkFtZTcwNzE4Mjg3NA@@._V1_UX182_CR0,0,182,268_AL_.jpg' ), 'Photo not parsed correctly' assert parser.plot_outline == ( 'Following a truck hijack in New York, five conmen are arrested and brought together for questioning. ' 'As none of them are guilty, they plan a revenge operation against the police. The operation goes well, ' 'but then the influence of a legendary mastermind criminal called Keyser S\xf6ze is felt. It becomes ' 'clear that each one of them has wronged S\xf6ze at some point and must pay back now. The payback job ' 'leaves 27 men dead in a boat explosion, but the real question arises now: Who actually is Keyser S\xf6ze?' ), 'Plot outline not parsed correctly' assert 8.0 < parser.score < 9.0, 'Score not parsed correctly' assert parser.url == 'http://www.imdb.com/title/tt0114814/', 'URL not parsed correctly' assert 400000 < parser.votes < 1000000, 'Votes not parsed correctly' assert parser.year == 1995, 'Year not parsed correctly'