示例#1
0
    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)
示例#2
0
    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)
示例#3
0
    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
示例#4
0
    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')
示例#5
0
    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')
示例#6
0
    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
示例#7
0
 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)
示例#8
0
 def test_person_repr(self):
     instance = Person(name='Чарльз Чаплин',
                       name_en='Charles Chaplin',
                       year_birth='1950')
     self.assertEqual(instance.__repr__(),
                      'Чарльз Чаплин (Charles Chaplin), 1950')
示例#9
0
 def test_person_photos_page_source(self):
     p = Person(id=8217)
     p.get_content('photos')
     self.assertGreaterEqual(len(p.photos), 11)
示例#10
0
    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)
示例#11
0
    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)
示例#12
0
 def test_person_repr(self):
     instance = Person(name='Чарльз Чаплин', name_en='Charles Chaplin', year_birth='1950')
     self.assertEqual(instance.__repr__(), 'Чарльз Чаплин (Charles Chaplin), 1950')
示例#13
0
 def test_person_photos_page_source(self):
     p = Person(id=8217)
     p.get_content('photos')
     self.assertGreaterEqual(len(p.photos), 11)
示例#14
0
 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)
示例#15
0
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