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)
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))
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())
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)
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)
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
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()
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
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)
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!'))
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()
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)
def clear_model(): Episode.delete() Season.delete() Show.delete()