def test_person_cast_special_case(self): p = Person(id=9843) p.get_content('main_page') # ... in movie title self.assertEqual(p.career['actor'][137].name, None) self.assertEqual(p.career['actor'][137].movie.title, 'Тарзан и Джейн возвращены... как будто') self.assertEqual(p.career['actor'][137].movie.title_en, 'Tarzan and Jane Regained... Sort of') self.assertEqual(p.career['actor'][137].movie.year, 1964)
def test_person_main_page_source(self): p = Person(id=6245) p.get_content('main_page') self.assertEqual(p.id, 6245) self.assertEqual(p.name, 'Джонни Депп') self.assertEqual(p.year_birth, 1963) self.assertEqual(p.name_en, 'Johnny Depp') self.assertGreater(len(p.information), 50) # career self.assertGreaterEqual(len(p.career['actor']), 86) self.assertGreaterEqual(len(p.career['producer']), 7) self.assertGreaterEqual(len(p.career['director']), 3) self.assertGreaterEqual(len(p.career['writer']), 1) self.assertGreaterEqual(len(p.career['hrono_titr_male']), 11) self.assertGreaterEqual(len(p.career['himself']), 124) self.assertEqual(p.career['actor'][0].movie.title, 'Человек-невидимка') self.assertEqual(p.career['actor'][0].movie.title_en, 'The Invisible Man') self.assertEqual(p.career['actor'][0].name, 'Dr. Griffin') self.assertEqual(p.career['actor'][1].movie.title, 'Ричард прощается') self.assertEqual(p.career['actor'][1].movie.year, 2018) self.assertEqual(p.career['actor'][1].movie.title_en, 'Richard Says Goodbye') self.assertEqual(p.career['actor'][4].movie.title, 'Шерлок Гномс') self.assertEqual(p.career['actor'][4].movie.title_en, 'Sherlock Gnomes') self.assertEqual(p.career['actor'][4].movie.year, 2018) self.assertEqual(p.career['actor'][4].name, 'Sherlock Gnomes') # voice self.assertEqual(p.career['actor'][5].movie.title_en, 'Murder on the Orient Express') self.assertAlmostEqual(p.career['actor'][5].movie.rating, 6.68) self.assertGreaterEqual(p.career['actor'][5].movie.votes, 64162) self.assertAlmostEqual(p.career['actor'][5].movie.imdb_rating, 6.6) self.assertGreaterEqual(p.career['actor'][5].movie.imdb_votes, 70581) self.assertEqual(p.career['actor'][6].name, 'Abel') # short
def parse(self): from kinopoisk.person import Person note = self.extract('note', to_str=True).split('...') role_name = None if len(note) > 1: role_name = re.sub(r'^(.*),( в титрах не указан.?| озвучка)?$', r'\1', self.prepare_str(note[1])) self.instance.name = role_name self.instance.person = Person.get_parsed('cast_link', self.content) self.instance.set_source('role_link')
def parse(self): from kinopoisk.person import Person note = self.extract('note', to_str=True).split('...') role_name = None if len(note) > 1: role_name = re.sub(r'^(.*),( в титрах не указан.?| озвучка)?$', r'\1', self.prepare_str(note[1])) if 'озвучка' in note[1]: self.instance.voice = True self.instance.name = role_name self.instance.person = Person.get_parsed('cast_link', self.content) self.instance.set_source('role_link')
def test_person_main_page_source(self): p = Person(id=6245) p.get_content('main_page') self.assertEqual(p.id, 6245) self.assertEqual(p.name, 'Джонни Депп') self.assertEqual(p.year_birth, 1963) self.assertEqual(p.name_en, 'Johnny Depp') self.assertGreater(len(p.information), 50) # career self.assertGreaterEqual(len(p.career['actor']), 86) self.assertGreaterEqual(len(p.career['producer']), 7) self.assertGreaterEqual(len(p.career['director']), 3) self.assertGreaterEqual(len(p.career['writer']), 1) self.assertGreaterEqual(len(p.career['hrono_titr_male']), 12) self.assertGreaterEqual(len(p.career['himself']), 124) self.assertEqual(p.career['actor'][0].movie.title, 'Потаскун') self.assertEqual(p.career['actor'][0].movie.title_en, 'The Libertine') self.assertEqual(p.career['actor'][1].movie.title, 'Человек-невидимка') self.assertEqual(p.career['actor'][1].movie.title_en, 'The Invisible Man') self.assertEqual(p.career['actor'][1].name, 'Dr. Griffin') self.assertEqual(p.career['actor'][4].movie.title, 'Шерлок Гномс') self.assertEqual(p.career['actor'][4].movie.title_en, 'Gnomeo & Juliet: Sherlock Gnomes') self.assertEqual(p.career['actor'][4].movie.year, 2018) self.assertEqual(p.career['actor'][4].name, 'Sherlock Gnomes') # voice self.assertGreaterEqual(p.career['actor'][6].movie.rating, 6.82) self.assertGreaterEqual(p.career['actor'][6].movie.votes, 42661) self.assertGreaterEqual(p.career['actor'][6].movie.imdb_rating, 6.70) self.assertGreaterEqual(p.career['actor'][6].movie.imdb_votes, 70581) self.assertEqual(p.career['actor'][7].name, 'Abel') # short
def parse_persons(self, field_name, links): from kinopoisk.person import Person for link in links: if isinstance(link, Tag) and link.text != "...": person = Person.get_parsed('short_link', link.decode()) getattr(self.instance, field_name).append(person)
def test_person_repr(self): instance = Person(name='Чарльз Чаплин', name_en='Charles Chaplin', year_birth='1950') self.assertEqual(instance.__repr__(), 'Чарльз Чаплин (Charles Chaplin), 1950')
def test_person_photos_page_source(self): p = Person(id=8217) p.get_content('photos') self.assertGreaterEqual(len(p.photos), 11)
def test_person_main_page_source(self): p = Person(id=6245) p.get_content('main_page') self.assertEqual(p.id, 6245) self.assertEqual(p.name, 'Джонни Депп') self.assertEqual(p.year_birth, 1963) self.assertEqual(p.name_en, 'Johnny Depp') self.assertGreater(len(p.information), 50) # career self.assertGreaterEqual(len(p.career['actor']), 86) self.assertGreaterEqual(len(p.career['producer']), 7) self.assertGreaterEqual(len(p.career['director']), 3) self.assertGreaterEqual(len(p.career['writer']), 1) self.assertGreaterEqual(len(p.career['hrono_titr_male']), 11) self.assertGreaterEqual(len(p.career['himself']), 124) role = p.career['actor'][6] self.assertEqual(role.movie.title, 'Шерлок Гномс') self.assertEqual(role.movie.title_en, 'Sherlock Gnomes') self.assertEqual(role.movie.year, 2018) self.assertEqual(role.name, 'Sherlock Gnomes') # voice self.assertEqual(role.voice, True) role = p.career['actor'][8] self.assertEqual(role.movie.title_en, 'Murder on the Orient Express') self.assertAlmostEqual(role.movie.rating, 6.67) self.assertGreaterEqual(role.movie.votes, 64162) self.assertAlmostEqual(role.movie.imdb_rating, 6.5) self.assertGreaterEqual(role.movie.imdb_votes, 70581) self.assertEqual(p.career['actor'][9].name, 'Abel') # short # series role = p.career['actor'][26] self.assertEqual(role.name, 'Johnny Depp') self.assertEqual(role.movie.title, 'Жизнь так коротка') self.assertEqual(role.movie.title_en, 'Life\'s Too Short') self.assertEqual(role.movie.year, None) self.assertEqual(role.movie.series, True) self.assertEqual(role.movie.series_years, (2011, 2013)) # top + budget role = p.career['actor'][37] self.assertEqual(role.name, 'Jack Sparrow') self.assertEqual(role.movie.title, 'Пираты Карибского моря: Сундук мертвеца') self.assertEqual(role.movie.title_en, 'Pirates of the Caribbean: Dead Man\'s Chest') self.assertEqual(role.movie.year, 2006) # voice role = p.career['actor'][38] self.assertEqual(role.name, 'Narration') self.assertEqual(role.voice, True) # short role = p.career['actor'][41] self.assertEqual(role.movie.genres, ['короткометражка']) # endless series role = p.career['actor'][57] self.assertEqual(role.name, 'Jack Kahuna Laguna') self.assertEqual(role.movie.title, 'Губка Боб квадратные штаны') self.assertEqual(role.movie.title_en, 'SpongeBob SquarePants') self.assertEqual(role.movie.year, None) self.assertEqual(role.movie.series, True) self.assertEqual(role.movie.series_years, (1999, )) # short, no russian title role = p.career['actor'][84] self.assertEqual(role.name, 'Pete') self.assertEqual(role.movie.title, '') self.assertEqual(role.movie.title_en, 'Dummies') self.assertEqual(role.movie.year, 1985) self.assertEqual(role.movie.genres, ['короткометражка']) self.assertEqual(role.movie.rating, None) self.assertEqual(role.movie.votes, None)
def test_person_main_page_source(self): p = Person(id=6245) p.get_content('main_page') self.assertEqual(p.id, 6245) self.assertEqual(p.name, 'Джонни Депп') self.assertEqual(p.year_birth, 1963) self.assertEqual(p.name_en, 'Johnny Depp') self.assertGreater(len(p.information), 50) # career self.assertGreaterEqual(len(p.career['actor']), 86) self.assertGreaterEqual(len(p.career['producer']), 7) self.assertGreaterEqual(len(p.career['director']), 3) self.assertGreaterEqual(len(p.career['writer']), 1) self.assertGreaterEqual(len(p.career['hrono_titr_male']), 11) self.assertGreaterEqual(len(p.career['himself']), 124) self.assertEqual(p.career['actor'][0].movie.id, 420454) self.assertEqual(p.career['actor'][0].movie.title, 'Человек-невидимка') self.assertEqual(p.career['actor'][0].movie.title_en, 'The Invisible Man') self.assertEqual(p.career['actor'][0].name, 'Dr. Griffin') self.assertEqual(p.career['actor'][1].movie.title, 'Ричард прощается') self.assertEqual(p.career['actor'][1].movie.year, 2018) self.assertEqual(p.career['actor'][1].movie.title_en, 'Richard Says Goodbye') self.assertEqual(p.career['actor'][4].movie.title, 'Шерлок Гномс') self.assertEqual(p.career['actor'][4].movie.title_en, 'Sherlock Gnomes') self.assertEqual(p.career['actor'][4].movie.year, 2018) self.assertEqual(p.career['actor'][4].name, 'Sherlock Gnomes') # voice self.assertEqual(p.career['actor'][5].movie.title_en, 'Murder on the Orient Express') self.assertAlmostEqual(p.career['actor'][5].movie.rating, 6.68) self.assertGreaterEqual(p.career['actor'][5].movie.votes, 64162) self.assertAlmostEqual(p.career['actor'][5].movie.imdb_rating, 6.6) self.assertGreaterEqual(p.career['actor'][5].movie.imdb_votes, 70581) self.assertEqual(p.career['actor'][6].name, 'Abel') # short # series self.assertEqual(p.career['actor'][22].name, 'Johnny Depp') self.assertEqual(p.career['actor'][22].movie.title, 'Жизнь так коротка') self.assertEqual(p.career['actor'][22].movie.title_en, 'Life\'s Too Short') self.assertEqual(p.career['actor'][22].movie.year, None) self.assertEqual(p.career['actor'][22].movie.series, True) self.assertEqual(p.career['actor'][22].movie.series_years, (2011, 2013)) # top + budget self.assertEqual(p.career['actor'][34].name, 'Jack Sparrow') self.assertEqual(p.career['actor'][34].movie.title, 'Пираты Карибского моря: Сундук мертвеца') self.assertEqual(p.career['actor'][34].movie.title_en, 'Pirates of the Caribbean: Dead Man\'s Chest') self.assertEqual(p.career['actor'][34].movie.year, 2006) # voice and short self.assertEqual(p.career['actor'][35].name, 'Narration') self.assertEqual(p.career['actor'][35].movie.genres, ['короткометражка']) self.assertEqual(p.career['actor'][35].voice, True) # endless series self.assertEqual(p.career['actor'][55].name, 'Jack Kahuna Laguna') self.assertEqual(p.career['actor'][55].movie.title, 'Губка Боб квадратные штаны') self.assertEqual(p.career['actor'][55].movie.title_en, 'SpongeBob SquarePants') self.assertEqual(p.career['actor'][55].movie.year, None) self.assertEqual(p.career['actor'][55].movie.series, True) self.assertEqual(p.career['actor'][55].movie.series_years, (1999,)) # short, no russian title self.assertEqual(p.career['actor'][82].name, 'Pete') self.assertEqual(p.career['actor'][82].movie.title, '') self.assertEqual(p.career['actor'][82].movie.title_en, 'Dummies') self.assertEqual(p.career['actor'][82].movie.year, 1985) self.assertEqual(p.career['actor'][82].movie.genres, ['короткометражка']) self.assertEqual(p.career['actor'][82].movie.rating, None) self.assertEqual(p.career['actor'][82].movie.votes, None)
def messages(update, context): global constant # Используем переменную для хранения сообщения в нижнем регистре mes = update.message.text.lower() print(mes) # Так как название фильма не постоянная команда, когда мы узнаём, # что пользователь сейчас выберет фильм, мы меняем постоянную, а затем # понимаем, что непонятное словосочетание - фильм (или актёр). # При возвращении назад мы "обнуляем" постоянную. if mes == 'найти фильм по названию' and constant is None: update.message.reply_text( 'Введите название фильма на русском или английском языке. Информация о сериалах недоступна.', reply_markup=markup_back) constant = 'film_search' elif mes == 'найти информацию о знаменитости' and constant is None: update.message.reply_text( 'Введите имя знаменитости на русском или английском языке.', reply_markup=markup_back) constant = 'actor_search' elif mes == 'вернуться к началу': # Команда, которая позволяет вернуться к основной клавиатуре в любой момент использования бота. update.message.reply_text("Хорошо, вернёмся.", reply_markup=markup_main_keyboard) constant = None elif constant == 'film_search': movie_list = Movie.objects.search(mes) length = len(movie_list) if length >= 10: movie_list = Movie.objects.search(mes)[:10] # Список из всех фильмов результатов поиска, будет иметь длину 10 или меньше length = len( movie_list) # Чтобы постоянно не пересчитывать длину функции if length == 0: update.message.reply_text( 'Извините, фильма с таким названием не найдено. Вернёмся к началу.', reply_markup=markup_main_keyboard) constant = None elif length >= 1: movie = Movie( id=movie_list[0].id ) # Чтобы вызвать команду в следующей строке, нужно найти фильм по id link = 'www.kinopoisk.ru/film/{}/'.format(movie_list[0].id) movie.get_content( 'main_page' ) # Обязательная команда, чтобы получить информацию кроме года и названия update.message.reply_text( 'Полное название - {}.\n{}\nСлоган - {}\nГод - {}\nДлительность - {}\nРейтинг фильма - {}\n{}' '\nХотите увидеть список актёров?'.format( movie.title, movie.plot, movie.tagline, movie.year, movie.runtime, movie.rating, link), reply_markup=markup_yesornot) constant = ['cast', movie.actors] # Передаём список, чтобы суметь обратить к списку актёров, если он нам понадобится elif constant[0] == 'cast': res = '' x = constant[1] for el in x[:10]: res += '\n{}'.format(el) res = 'В фильме снимались:' + res update.message.reply_text(res, reply_markup=markup_main_keyboard) constant = None elif constant == 'actor_search': actor_list = Person.objects.search(mes) length = len(actor_list) if length >= 10: actor_list = Person.objects.search(mes)[:10] length = len(actor_list) if length == 0: update.message.reply_text( 'Извините, знаменитости с таким именем найти не удалось. Вернёмся к началу.', reply_markup=markup_main_keyboard) constant = None elif length >= 1: actor = Person(id=actor_list[0].id) link = 'www.kinopoisk.ru/name/{}/'.format(actor_list[0].id) actor.get_content('main_page') update.message.reply_text(( '{}, {} год рождения\n{}\nХотите увидеть фильмографию?'.format( actor.name, actor.year_birth, link)), reply_markup=markup_yesornot) constant = ['filmography', actor.career['actor']] elif constant[0] == 'filmography': res = '' x = constant[1] # Переменные, чтобы не использовать функцию len() много раз length_x = len(x) length_con = len(constant) # Так как у актёра может быть очень много фильмов и # их построчный вывод может занять долгое время и несколько страниц, # что окажется неудобным для пользователя, мы будем выводить по 10 фильмов за раз if length_con == 2: # Если мы выводим первую страницу фильмографии, длина константы будет равна двум, # так что мы будем выводить первые 10 (или все, если length_x <= 10) if length_x > 10: for el in x[:10]: res += '\n{}'.format(el.movie) else: for el in x: res += '\n{}'.format(el.movie) elif constant[2] + 10 < length_x: # Если невыведенных элементов в списке всё ещё больше 10, мы выводим только следующие 10 for el in x[constant[2]:constant[2] + 10]: res += '\n{}'.format(el.movie) else: # Если невыведенных элементов в списке осталось 10 или меньше, мы выводим последние элементы for el in x[constant[2]:length_x]: res += '\n{}'.format(el.movie) if length_con == 2: # Длина константы равна двум, если мы выводим первую страницу фильмографии. # В таком случае мы добавим в начало фразу "Вот фильмография:" res = 'Вот фильмография:' + res if length_x > 10: update.message.reply_text(res, reply_markup=markup_pages) constant = constant + [10] # Если в списке фильмов больше 10 кинокартин, мы выводим клавиатуру с предложением продолжить вывод # и добавляем третий элемент к константе - количество уже выведенных фильмов else: update.message.reply_text(res + '\n\nФильмография кончилась.', reply_markup=markup_main_keyboard) constant = None # Если в списке меньше 10 кинокартин, мы выводим основную клавиатуру и меняем константу на None elif constant[2] + 10 < length_x: update.message.reply_text(res, reply_markup=markup_pages) constant = constant[0:2] + [constant[2] + 10] # Если невыведенные элементы в списке ещё есть, мы изменяем последний элемент константы # и показываем клавиатуру с предложением продолжить вывод else: res += '\n\nФильмография кончилась.' update.message.reply_text(res, reply_markup=markup_main_keyboard) constant = None