Example #1
0
    def test_get_episode(self):
        ''' Tests getting episode from video's field. '''

        configure_for_unittest()
        from model import Video, Show, Season, Episode

        show = Show(title='House of Cards').save()
        season1 = Season(show=show, number=1).save()
        season2 = Season(show=show, number=2).save()
        episode1 = Episode(season=season1,
                           number=1,
                           release_date=dt(2010, 1, 1)).save()
        episode2 = Episode(season=season1, number=2).save()
        episode3 = Episode(season=season2, number=1).save()
        video = Video(link='vk.com').save()

        show.seasons.connect(season1)
        show.seasons.connect(season2)
        season1.episodes.connect(episode1)
        season1.episodes.connect(episode2)
        season2.episodes.connect(episode3)
        episode1.videos.connect(video)

        video.refresh()

        self.assertEqual(video.episode.get().number, 1)
Example #2
0
    def merge_episode(episode_info):

        # Split the name
        path, info = episode_info
        show_name = info['series'].lower()
        parsed_season = info['season']
        parsed_episode = info['episodeNumber']

        try:
            show = Show.get(Show.name == show_name)
        except DoesNotExist:
            # Show does not exist yet
            show = Show.create(name=show_name)
            season = Season.create(show=show, season_number=parsed_season)
            Episode.create(season=season, episode_number=parsed_episode, path=path, added_time=datetime.datetime.now())
            print('Merged "' + show.name + '" season ' + str(parsed_season) + ' episode ' + str(parsed_episode))
        else:
            try:
                season = Season.get(Season.show == show, Season.season_number == parsed_season)
            except DoesNotExist:
                # Season did not exist yet
                season = Season.create(show=show, season_number=parsed_season)
                Episode.create(season=season, episode_number=parsed_episode, path=path,
                               added_time=datetime.datetime.now())
                print('Merged "' + show.name + '" season ' + str(parsed_season) + ' episode ' + str(parsed_episode))
            else:
                try:
                    Episode.get(Episode.season == season, Episode.episode_number == parsed_episode)
                except DoesNotExist:
                    Episode.create(season=season, episode_number=parsed_episode, path=path,
                                   added_time=datetime.datetime.now())
                    print('Merged "' + show.name + '" season ' + str(parsed_season) + ' episode ' + str(parsed_episode))
Example #3
0
def episode_request():
    return (Episode.select(Episode,
                           Season.season_number,
                           Show.name.alias('show_name'),
                           Show.id.alias('show_id'),
                           fn.REPLACE(fn.REPLACE(Episode.path, configurator.get()['settings']['search_path'], ''),
                                      '\\', '/').alias('url'))
            .join(Season)
            .join(Show)
            .dicts())
Example #4
0
    def update_model():

        db_ = list()
        for episode in Episode.select():
            db_.append(episode.path)

        searchpath = configurator.get()['settings']['search_path']

        finder = FileFinder([searchpath], db_, ("mkv", "avi", "mp4"))
        for episode_info in finder.find():
            ModelManager.merge_episode(episode_info)
Example #5
0
    def test_availability(self):
        ''' Tests availabity properties of object. '''

        configure_for_unittest()
        from model import Show, Season, Episode

        show = Show(title='House of Cards').save()
        season1 = Season(show=show, number=1).save()
        season2 = Season(show=show, number=2).save()
        episode1 = Episode(season=season1,
                           number=1,
                           release_date=dt(2010, 1, 1)).save()
        episode2 = Episode(season=season1, number=2).save()

        show.seasons.connect(season1)
        show.seasons.connect(season2)
        season1.episodes.connect(episode1)
        season1.episodes.connect(episode2)

        self.assertEqual(season1.available_episodes[0], episode1)
        self.assertEqual(season1.unavailable_episodes[0], episode2)
Example #6
0
    def update_subtitles():

        languages = {'eng', 'fra'}

        for episode in Episode.select().where(Episode.episode_state == PlayState.NOT_WATCHED):

            existing_subs = episode.subtitles
            if not languages.issubset(existing_subs):
                new_subs = get_subs(episode.path, languages)
                if new_subs:
                    episode.subtitles = existing_subs.union(new_subs)
                    episode.save()
                    print('Found subtitles"' + str(new_subs) + ' for episode "' + episode.path + '"')
    def syncEpisode(self, serie, season, episode):
        qry = Session.query(Season).filter_by(path=season).join(Serie).filter_by(path=serie)
        if qry.count() == 0:
            raise Exception("No season linked to %s/%s/%s" % (serie, saison, episode))
        season = qry.one()

        path = episode
        ext = os.path.splitext(episode)[1][1:].lower()
        if ext not in ["avi", "mkv", "mov", "mpg"]:
            raise Exception("Not supported extention %s" % ext)

        num = getEpisodeNumFromFilename(os.path.basename(episode))

        episode = filter(lambda episode: episode.num == num, season.episodes)
        if len(episode) == 0:
            episode = Episode(num=num, path=path)
            Session.add(episode)
            season.episodes.append(episode)
        else:
            assert len(episode) == 1
            episode = episode[0]
            episode.num = num
            episode.path = path
Example #8
0
def update_episode_status(data):
    episode = Episode.get(Episode.id == data['id'])

    episode.episode_state = PlayState.from_num(data['episode_state'][0])

    if "current_time" in data:
        episode.current_time = data['current_time']
    else:
        episode.current_time = 0

    if "total_time" in data:
        episode.total_time = data['total_time']
        episode.last_watched = datetime.datetime.now()

    episode.save()
Example #9
0
def create_episode(season, episode_number, doctor, title, imdb, ep_id, companion, guest_star):
    """Create and return a new episode"""

    episode = Episode(season=season, 
                        episode_number=episode_number, 
                        doctor=doctor, 
                        title=title, 
                        imdb=imdb, 
                        ep_id=ep_id,
                        companion=companion, 
                        guest_star=guest_star)

    db.session.add(episode)
    db.session.commit()

    return episode
Example #10
0
def add_or_update_show(title):

    # Обрабатываем отсутствие результатов поиска
    try:
        episodes, number_of_seasones, serial_title = parse_toramp(title)
    except ValueError as e:
        print '{} для {}'.format(e.message, title)
        return

    # Если сериал существует - работаем с ним
    try:
        show = Show.nodes.get(title_lower=serial_title.lower())
    except neomodel.DoesNotExist:
        show = Show(title=unicode(serial_title)).save()

    for i in xrange(number_of_seasones):

        # Если сезон уже существует - работаем с ним
        try:
            season = show.seasons.get(number=i+1)
        except neomodel.DoesNotExist:
            season = Season(show=show, number=i+1).save()
            show.seasons.connect(season)

        episodes_in_season = filter(lambda x: x['season'] == i + 1, episodes)

        for element in episodes_in_season:

            # Если эпизод уже есть - пропускаем
            try:
                episode = season.episodes.get(
                    number=element['number'],
                    title=element['title'],
                    release_date=element['release'],
                )

            except neomodel.DoesNotExist:
                episode = Episode(
                    season=season,
                    title=unicode(element['title']),
                    release_date=element['release'],
                    number=element['number'],
                    is_already_shown=element['release'] < datetime.datetime.now()
                ).save()
                season.episodes.connect(episode)
Example #11
0
    def test_default(self):
        ''' Tests responses on messages that are not commands. '''

        configure_for_unittest()
        from command import default, subscribe, unsubscribe, setlanguage, watch
        from model import Chat, Show, Season, Episode, Video

        chat = Chat(id=1).save()

        show = Show(title='House of Cards').save()
        season1 = Season(show=show, number=1).save()
        season2 = Season(show=show, number=2).save()
        episode1 = Episode(season=season1,
                           number=1,
                           release_date=dt(2010, 1, 1)).save()
        episode2 = Episode(season=season1, number=2).save()
        episode3 = Episode(season=season2, number=1).save()
        video1 = Video(link='link to video').save()
        video2 = Video(link='one more link').save()

        show.seasons.connect(season1)
        show.seasons.connect(season2)
        season1.episodes.connect(episode1)
        season1.episodes.connect(episode2)
        season2.episodes.connect(episode3)
        episode1.videos.connect(video1)
        episode1.videos.connect(video2)
        chat.rated_videos.connect(video1, {'value': 1})

        bot = FakeBot()
        upd = FakeUpdate(message=FakeMessage(chat=FakeChat(id=1)))

        # random input
        upd.message.text = 'random input'
        default(bot, upd)

        self.assertTrue('You can control' in bot.sended_message['text'])

        # subscribe in 2 steps
        upd.message.text = '/subscribe'
        subscribe(bot, upd)

        upd.message.text = 'house of cards'
        default(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('You have subscribed to the show.'))

        # unsubscribe in 2 steps
        upd.message.text = '/unsubscribe'
        unsubscribe(bot, upd)

        upd.message.text = 'house of cards'
        default(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('You have unsubscribed from the show.'))

        # setlanguage in 2 steps
        upd.message.text = '/setlanguage'
        setlanguage(bot, upd)

        upd.message.text = 'en'
        default(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('You are already using this language!'))

        # watch in 4 steps
        upd.message.text = '/watch'
        watch(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('Which TV show would you like to see?'))

        upd.message.text = 'house of cards'
        default(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('Which season would you like to see?'))

        upd.message.text = '1'
        default(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('Which episode would you like to see?'))

        upd.message.text = '1'
        default(bot, upd)

        self.assertEqual(bot.sended_message['text'], 'link to video')

        chat.referer = ''
        chat.save()

        # positive review - say 'thank you'
        upd.message.text = '/watch house of cards s1 e1'
        watch(bot, upd)

        upd.message.text = Emoji.THUMBS_UP_SIGN
        default(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('Thanks for the feedback!'))
Example #12
0
    def test_rate(self):
        ''' Tests rating of video. '''

        configure_for_unittest()
        from command import rate
        from model import Chat, Show, Season, Episode, Video

        chat = Chat(id=1).save()

        show = Show(title='House of Cards').save()
        season1 = Season(show=show, number=1).save()
        season2 = Season(show=show, number=2).save()
        episode1 = Episode(season=season1,
                           number=1,
                           release_date=dt(2010, 1, 1)).save()
        episode2 = Episode(season=season1, number=2).save()
        episode3 = Episode(season=season2, number=1).save()
        video1 = Video(link='link to video').save()
        video2 = Video(link='one more link').save()

        show.seasons.connect(season1)
        show.seasons.connect(season2)
        season1.episodes.connect(episode1)
        season1.episodes.connect(episode2)
        season2.episodes.connect(episode3)
        episode1.videos.connect(video1)
        episode1.videos.connect(video2)
        chat.rated_videos.connect(video1, {'value': 1})

        bot = FakeBot()
        upd = FakeUpdate(message=FakeMessage(chat=FakeChat(id=1)))

        # positive review
        upd.message.text = ' '.join(
            ['/rate link to video',
             unicode(Emoji.THUMBS_UP_SIGN, 'utf-8')])
        rate(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('Thanks for the feedback!'))
        self.assertEqual(bot.sended_message['chat_id'], 1)
        self.assertEqual(type(bot.sended_message['reply_markup']),
                         ReplyKeyboardHide)

        # negative review
        upd.message.text = ' '.join(
            ['/rate link to video',
             unicode(Emoji.THUMBS_DOWN_SIGN, 'utf-8')])
        rate(bot, upd)

        self.assertEqual(bot.sended_message['text'], 'one more link')
        self.assertEqual(bot.sended_message['chat_id'], 1)
        self.assertEqual(type(bot.sended_message['reply_markup']),
                         ReplyKeyboardMarkup)
        self.assertEqual(bot.sended_message['reply_markup'].keyboard,
                         [[Emoji.THUMBS_UP_SIGN, Emoji.THUMBS_DOWN_SIGN]])

        # unknown review
        upd.message.text = ' '.join(['/rate link to video', 'unknown'])
        rate(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('Please rate the video.'))
        self.assertEqual(bot.sended_message['chat_id'], 1)
        self.assertEqual(type(bot.sended_message['reply_markup']),
                         ReplyKeyboardMarkup)
        self.assertEqual(bot.sended_message['reply_markup'].keyboard,
                         [[Emoji.THUMBS_UP_SIGN, Emoji.THUMBS_DOWN_SIGN]])

        chat.referer = ''
        chat.save()
Example #13
0
    def test_watch(self):
        ''' Tests responses on watch request. '''

        configure_for_unittest()
        from command import watch
        from model import Chat, Show, Season, Episode, Video

        chat = Chat(id=1).save()

        show = Show(title='House of Cards').save()
        season1 = Season(show=show, number=1).save()
        season2 = Season(show=show, number=2).save()
        episode1 = Episode(season=season1,
                           number=1,
                           release_date=dt(2010, 1, 1)).save()
        episode2 = Episode(season=season1, number=2).save()
        episode3 = Episode(season=season2, number=1).save()
        video1 = Video(link='link to video').save()
        video2 = Video(link='one more link').save()

        show.seasons.connect(season1)
        show.seasons.connect(season2)
        season1.episodes.connect(episode1)
        season1.episodes.connect(episode2)
        season2.episodes.connect(episode3)
        episode1.videos.connect(video1)
        episode1.videos.connect(video2)
        chat.rated_videos.connect(video1, {'value': 1})

        bot = FakeBot()
        upd = FakeUpdate(message=FakeMessage(chat=FakeChat(id=1)))

        # valid request
        upd.message.text = '/watch house of cards s1 e1'
        watch(bot, upd)

        self.assertEqual(bot.sended_message['text'], 'link to video')
        self.assertEqual(bot.sended_message['chat_id'], 1)
        self.assertEqual(type(bot.sended_message['reply_markup']),
                         ReplyKeyboardMarkup)
        self.assertEqual(bot.sended_message['reply_markup'].keyboard,
                         [[Emoji.THUMBS_UP_SIGN, Emoji.THUMBS_DOWN_SIGN]])

        chat.referer = ''  # bot is waiting for feedback
        chat.save()

        # valid request - without arguments
        upd.message.text = '/watch'
        watch(bot, upd)

        chat.refresh()

        self.assertEqual('/watch', chat.referer)
        self.assertEqual(bot.sended_message['text'],
                         _('Which TV show would you like to see?'))
        self.assertEqual(bot.sended_message['chat_id'], 1)
        self.assertEqual(type(bot.sended_message['reply_markup']),
                         ReplyKeyboardHide)

        # valid request - continue with show_title
        upd.message.text = ' '.join([chat.referer, 'house of cards'])
        watch(bot, upd)

        chat.refresh()

        self.assertEqual(chat.referer, '/watch house of cards')
        self.assertEqual(bot.sended_message['text'],
                         _('Which season would you like to see?'))
        self.assertEqual(bot.sended_message['chat_id'], 1)
        self.assertEqual(type(bot.sended_message['reply_markup']),
                         ReplyKeyboardMarkup)
        self.assertEqual(bot.sended_message['reply_markup'].keyboard, [['1']])

        # valid request - continue with seasons number
        upd.message.text = ' '.join([chat.referer, 's1'])
        watch(bot, upd)

        chat.refresh()

        self.assertEqual(chat.referer, '/watch house of cards s1')
        self.assertEqual(bot.sended_message['text'],
                         _('Which episode would you like to see?'))
        self.assertEqual(bot.sended_message['chat_id'], 1)
        self.assertEqual(type(bot.sended_message['reply_markup']),
                         ReplyKeyboardMarkup)
        self.assertEqual(bot.sended_message['reply_markup'].keyboard, [['1']])

        # valid request - continue with episode number
        upd.message.text = ' '.join([chat.referer, 'e1'])
        watch(bot, upd)

        chat.refresh()

        self.assertEqual(chat.referer, '/rate link to video')
        self.assertEqual(bot.sended_message['text'], 'link to video')
        self.assertEqual(bot.sended_message['chat_id'], 1)
        self.assertEqual(type(bot.sended_message['reply_markup']),
                         ReplyKeyboardMarkup)
        self.assertEqual(bot.sended_message['reply_markup'].keyboard,
                         [[Emoji.THUMBS_UP_SIGN, Emoji.THUMBS_DOWN_SIGN]])

        chat.referer = ''
        chat.save()

        # trying to watch non-existent TV show
        upd.message.text = '/watch kitchen'
        watch(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('This TV show is not available.'))
        self.assertEqual(bot.sended_message['chat_id'], 1)
        self.assertEqual(type(bot.sended_message['reply_markup']),
                         ReplyKeyboardHide)

        # trying to watch non-existent season
        upd.message.text = '/watch house of cards s5'
        watch(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('This season is not available.'))
        self.assertEqual(bot.sended_message['chat_id'], 1)
        self.assertEqual(type(bot.sended_message['reply_markup']),
                         ReplyKeyboardHide)

        # trying to watch unavailable season
        upd.message.text = '/watch house of cards s2 e1'
        watch(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('This season is not available.'))
        self.assertEqual(bot.sended_message['chat_id'], 1)
        self.assertEqual(type(bot.sended_message['reply_markup']),
                         ReplyKeyboardHide)

        # trying to watch non-existent episode
        upd.message.text = '/watch house of cards s1 e5'
        watch(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('This episode is not available.'))
        self.assertEqual(bot.sended_message['chat_id'], 1)
        self.assertEqual(type(bot.sended_message['reply_markup']),
                         ReplyKeyboardHide)

        # trying to watch unavailable episode
        upd.message.text = '/watch house of cards s1 e2'
        watch(bot, upd)

        self.assertEqual(bot.sended_message['text'],
                         _('This episode is not available.'))
        self.assertEqual(bot.sended_message['chat_id'], 1)
        self.assertEqual(type(bot.sended_message['reply_markup']),
                         ReplyKeyboardHide)
Example #14
0
 def clear_model():
     Episode.delete()
     Season.delete()
     Show.delete()