示例#1
0
 def test_hasCommercials_True(self):
     p = RecordedProgram(pdata({'programflags':FlagMask.FL_COMMFLAG | FlagMask.FL_AUTOEXP}), **self.pkwargs)
     commBreaks = []
     commBreaks.append(CommercialBreak(120,180))
     when(self.conn).getCommercialBreaks(p).thenReturn(commBreaks)
     log.debug('comms = %s' % len(p.getCommercials()))
     self.assertTrue(p.hasCommercials())    
示例#2
0
 def test_hasCommercials_True(self):
     p = RecordedProgram(pdata({'programflags':FlagMask.FL_COMMFLAG | FlagMask.FL_AUTOEXP}), **self.pkwargs)
     commBreaks = []
     commBreaks.append(CommercialBreak(120,180))
     when(self.conn).getCommercialBreaks(p).thenReturn(commBreaks)
     log.debug('comms = %s' % len(p.getCommercials()))
     self.assertTrue(p.hasCommercials())    
示例#3
0
    def test_When_program_title_contains_unicode_chars_Then_title_sorting_doesnt_break(self):
        u1 = u'Königreich der Himmel'
        u2 = u'Avocats et associés'
        u3 = u'All Recordings'
        
        protocol = Protocol23056()
        ititle = protocol.recordFields().index('title')
        d1 = ["0"] * protocol.recordSize()
        d1[ititle]  = u1
        
        d2 = d1[:]
        d2[ititle] = u2
        
        d3 = d1[:]
        d3[ititle] = u3
        
        p1 = RecordedProgram(d1, Mock(), Mock(), Mock(), protocol, Mock())
        p2 = RecordedProgram(d2, Mock(), Mock(), Mock(), protocol, Mock())
        p3 = RecordedProgram(d3, Mock(), Mock(), Mock(), protocol, Mock())
        
        c = [p1, p2, p3]
        
        c.sort(key=TITLE_SORT_BY['Title']['sorter'], reverse=TITLE_SORT_BY['Title']['reverse'])

        self.assertTrue(c[0].title() == u3)
        self.assertTrue(c[1].title() == u2)
        self.assertTrue(c[2].title() == u1)
示例#4
0
    def getUpcomingRecordings(self, filter=Upcoming.SCHEDULED):
        """
        @type filter: UPCOMING_*
        @rtype: RecordedProgram[]
        """
        upcoming = []
        reply = self._sendRequest(self.cmdSock, ['QUERY_GETALLPENDING', '2'])

        log.debug('getUpcomingRecordings reply begin= %s' %
                  safe_str(reply[:80]))
        log.debug('getUpcomingRecordings reply end  = %s' %
                  safe_str(reply[-80:]))

        numRows = int(reply[1])
        offset = 2

        from mythbox.mythtv.domain import RecordedProgram
        for i in xrange(numRows):
            program = RecordedProgram(
                reply[offset:offset + self.protocol.recordSize()],
                self.settings, self.translator, self.platform, self.protocol,
                [self, None][self._db is None])
            if program.getRecordingStatus() in filter:
                upcoming.append(program)
            offset += self.protocol.recordSize()
        return upcoming
示例#5
0
 def test_formattedAirTime(self):
     #                                      9:00pm                               9:30pm
     p = RecordedProgram(pdata({'starttime':socketTime(21, 0, 0), 'endtime':socketTime(21, 30, 0)}), **self.pkwargs)
     print p
     self.assertEqual('9:00 - 9:30PM', p.formattedAirTime(short=False))
     self.assertEqual('9 - 9:30PM', p.formattedAirTime(short=True))
     self.assertEqual('9 - 9:30PM', p.formattedAirTime())
示例#6
0
    def getRecordings(self, recordingGroup='default', title='all shows'):
        """
        Returns a list of RecordedProgram for the given recording group and show title (both case insensetive).
        
        @param recordingGroup: Recording group name or 'All Groups'
        @type recordingGroup: string
        @param title: Title of program or 'All Shows'
        @type title: string
        @rtype: RecordedProgram[]
        """
        # TODO: Optimize so it doesn't get all recordings and filters locally
        programs = []
        offset = 0
        reply = self._sendRequest(self.cmdSock,
                                  self.protocol.genQueryRecordingsCommand())
        numRows = int(reply.pop(0))

        recordingGroup = recordingGroup.upper()
        title = title.upper()
        from mythbox.mythtv.domain import RecordedProgram

        for i in xrange(numRows):
            response = reply[offset:offset + self.protocol.recordSize()]
            # use of self._db intentional
            p = RecordedProgram(response, self.settings, self.translator,
                                self.platform, self.protocol,
                                [self, None][self._db is None])
            if  recordingGroup.upper() in ('ALL GROUPS', p.getRecordingGroup().upper(),) and \
                title.upper() in ('ALL SHOWS', p.title().upper(),):
                programs.append(p)
            offset += self.protocol.recordSize()
        return programs
    def getUpcomingRecordings(self, filter=Upcoming.SCHEDULED):
        """
        @type filter: UPCOMING_*
        @rtype: RecordedProgram[]
        """
        upcoming = []
        reply = self._sendRequest(self.cmdSock, ['QUERY_GETALLPENDING', '2'])
        
        log.debug('getUpcomingRecordings reply begin= %s' % safe_str(reply[:80]))
        log.debug('getUpcomingRecordings reply end  = %s' % safe_str(reply[-80:]))
        
        numRows = int(reply[1])
        offset = 2

        from mythbox.mythtv.domain import RecordedProgram
        for i in xrange(numRows):
            program = RecordedProgram(
                    reply[offset:offset+self.protocol.recordSize()],
                    self.settings, 
                    self.translator,
                    self.platform,
                    self.protocol,
                    [self, None][self._db is None])
            if program.getRecordingStatus() in filter:
                upcoming.append(program)
            offset += self.protocol.recordSize()
        return upcoming
 def getRecordings(self, recordingGroup='default', title='all shows'):
     """
     Returns a list of RecordedProgram for the given recording group and show title (both case insensetive).
     
     @param recordingGroup: Recording group name or 'All Groups'
     @type recordingGroup: string
     @param title: Title of program or 'All Shows'
     @type title: string
     @rtype: RecordedProgram[]
     """
     # TODO: Optimize so it doesn't get all recordings and filters locally
     programs = []
     offset = 0
     reply = self._sendRequest(self.cmdSock, self.protocol.genQueryRecordingsCommand())   
     numRows = int(reply.pop(0))
     
     recordingGroup = recordingGroup.upper()
     title = title.upper()
     from mythbox.mythtv.domain import RecordedProgram
     
     for i in xrange(numRows):
         response = reply[offset:offset+self.protocol.recordSize()]
         # use of self._db intentional
         p = RecordedProgram(response, self.settings, self.translator, self.platform, self.protocol, [self, None][self._db is None])
         if  recordingGroup.upper() in ('ALL GROUPS', p.getRecordingGroup().upper(),) and \
             title.upper() in ('ALL SHOWS', p.title().upper(),):
             programs.append(p) 
         offset += self.protocol.recordSize()
     return programs
示例#9
0
 def test_originalAirDate_When_missing_Returns_None(self):
     rp = RecordedProgram(pdata({
         'airdate': '',
         'hasairdate': 0
     }), **self.pkwargs)
     self.assertFalse(rp.hasOriginalAirDate())
     self.assertEqual('', rp.originalAirDate())
示例#10
0
 def test_originalAirDate_When_available_Returns_date_as_string(self):
     rp = RecordedProgram(pdata({
         'airdate': '2008-10-10',
         'hasairdate': 1
     }), **self.pkwargs)
     self.assertEqual('2008-10-10', rp.originalAirDate())
     self.assertTrue(rp.hasOriginalAirDate())
示例#11
0
 def test_hashable(self):
     p1 = RecordedProgram(pdata({'channum':'99', 'starttime':999999}), **self.pkwargs)
     p2 = RecordedProgram(pdata({'channum':'101', 'starttime':888888}), **self.pkwargs)
     mydict = {p1:'p1', p2:'p2'}
     self.assertTrue(p1 in mydict)
     self.assertTrue(p2 in mydict)
     self.assertEqual('p1', mydict[p1])
     self.assertEqual('p2', mydict[p2])
示例#12
0
 def test_getCommercials_ReturnsOneCommercial(self):
     p = RecordedProgram(pdata({'programflags':FlagMask.FL_COMMFLAG | FlagMask.FL_AUTOEXP}), **self.pkwargs)
     commBreaks = []
     commBreaks.append(CommercialBreak(120,180))
     when(self.conn).getCommercialBreaks(p).thenReturn(commBreaks)
     result = p.getCommercials()    
     log.debug('commercials = %s'%result)
     self.assertEqual(commBreaks, result)
     verify(self.conn).getCommercialBreaks(p)
示例#13
0
 def test_getCommercials_ReturnsOneCommercial(self):
     p = RecordedProgram(pdata({'programflags':FlagMask.FL_COMMFLAG | FlagMask.FL_AUTOEXP}), **self.pkwargs)
     commBreaks = []
     commBreaks.append(CommercialBreak(120,180))
     when(self.conn).getCommercialBreaks(p).thenReturn(commBreaks)
     result = p.getCommercials()    
     log.debug('commercials = %s'%result)
     self.assertEqual(commBreaks, result)
     verify(self.conn).getCommercialBreaks(p)
示例#14
0
 def test_eq_False_different_channelNumber_same_startttime(self):
     p1 = RecordedProgram(pdata({
         'channum': '99',
         'starttime': 999999
     }), **self.pkwargs)
     p2 = RecordedProgram(pdata({
         'channum': '101',
         'starttime': 999999
     }), **self.pkwargs)
     self.assertNotEquals(p1, p2)
     self.assertNotEquals(p2, p1)
示例#15
0
    def test_getJobs_ForProgram_ByJobType(self):
        # Setup
        when(self.domainCache).getUserJobs().thenReturn(self.db.getUserJobs())
        jobs = self.db.getJobs()
        if len(jobs) == 0:
            log.warn('No jobs in database to test with. Test skipped...')
            return
        job = jobs[-1]  # last job
        data = [''] * self.protocol.recordSize()
        data[4] = job.channelId
        data[11] = time.mktime(job.startTime.timetuple())
        program = RecordedProgram(data=data,
                                  settings=Mock(),
                                  translator=Mock(),
                                  platform=Mock(),
                                  protocol=self.protocol,
                                  conn=Mock())

        # Test
        jobs = self.db.getJobs(program=program, jobType=job.jobType)

        # Verify
        self.assertTrue(len(jobs) > 0)
        for index, actual in enumerate(jobs):
            log.debug('job %d = %s' % (index, actual))
            self.assertEquals(job.channelId, actual.channelId)
            self.assertEquals(job.startTime, actual.startTime)
            self.assertEquals(job.jobType, actual.jobType)
示例#16
0
    def test_getSeasonAndEpisode_try_to_cache_output(self):
        # Given
        fields = {
            'title': u'Seinfeld',
            'starttime': socketDateTime(2008, 11, 4, 23, 45, 00),
            'endtime': socketDateTime(2008, 11, 4, 23, 50, 00),
            'hasairdate': 1,
            'airdate': u'1989-07-05'
        }
        program = RecordedProgram(data=pdata(fields, P.version()),
                                  settings=Mock(),
                                  translator=Mock(),
                                  platform=self.platform,
                                  protocol=P,
                                  conn=Mock())
        provider = TvRageProvider(self.platform)

        # When
        for i in xrange(100):  #@UnusedVariable
            # TODO Verify hitting cache < 1sec per invocation.
            #      Since tvrage api is not injected, cannot mock
            season, episode = provider.getSeasonAndEpisode(program)
            # Then
            self.assertEqual('1', season)
            self.assertEqual('1', episode)
示例#17
0
    def test_getSeasonAndEpisode_When_match_not_found_using_original_airdate_Then_match_by_subtitle(
            self):
        # Given
        fields = {
            'title': u'WCG Ultimate Gamer',
            'subtitle': u'In The Crosshairs',
            'starttime': socketDateTime(2010, 12, 2, 22, 45, 00),
            'endtime': socketDateTime(2010, 12, 2, 23, 50, 00),
            'hasairdate': 1,
            'airdate': u'2010-09-20',  # TVRage shows date as 2010-09-16
        }
        program = RecordedProgram(data=pdata(fields, P.version()),
                                  settings=Mock(),
                                  translator=Mock(),
                                  platform=self.platform,
                                  protocol=P,
                                  conn=Mock())
        provider = TvRageProvider(self.platform)

        # When
        season, episode = provider.getSeasonAndEpisode(program)

        # Then
        self.assertEqual('2', season)
        self.assertEqual('5', episode)
示例#18
0
    def test_getSeasonAndEpisode_NBCNightlyNews_returns_None_cuz_TVRage_throws_KeyError(
            self):
        # Given
        fields = {
            'title': u'NBC Nightly News',
            'subtitle': u'blah',
            'starttime': socketDateTime(2008, 11, 4, 23, 45, 00),
            'endtime': socketDateTime(2008, 11, 4, 23, 50, 00),
            'hasairdate': 1,
            'airdate': u'2010-07-14'
        }

        program = RecordedProgram(pdata(fields, P.version()),
                                  settings=Mock(),
                                  translator=Mock(),
                                  platform=self.platform,
                                  protocol=P,
                                  conn=Mock())
        provider = TvRageProvider(self.platform)

        # When
        season, episode = provider.getSeasonAndEpisode(program)

        # Then
        self.assertIsNone(season)
        self.assertIsNone(episode)
示例#19
0
 def test_getDuration_When_start_and_end_times_same_Then_return_0mins(self):
     self.assertEqual(
         0,
         RecordedProgram(
             pdata({
                 'starttime': socketTime(18, 30, 0),
                 'endtime': socketTime(18, 30, 0)
             }), **self.pkwargs).getDuration())
示例#20
0
 def test_getSeasonAndEpisode_When_show_not_found_Then_returns_none(self):
     fields = {
         'title'     : u'Crap Crappity Crapola',
         'starttime' : socketDateTime(2008, 11, 4, 22, 45, 00),
         'endtime'   : socketDateTime(2008, 11, 4, 23, 50, 00),
         'airdate'   : u'2010-08-03'
     }
     self.assertSeasonAndEpisode(RecordedProgram(data=pdata(fields), **self.deps), None, None)
示例#21
0
 def test_getSeasonAndEpisode_Success_HouseHunters(self):
     fields = {
         'title'     : u'House Hunters',
         'starttime' : socketDateTime(2010, 12, 2, 22, 45, 00), 
         'endtime'   : socketDateTime(2010, 12, 2, 23, 50, 00),
         'airdate'   : u'2008-11-02'
     }
     self.assertSeasonAndEpisode(RecordedProgram(data=pdata(fields), **self.deps), u'30', u'2')
示例#22
0
 def test_getSeasonAndEpisode_Success(self):
     fields = {
         'title'     : u'The Real World',
         'starttime' : socketDateTime(2008, 11, 4, 23, 45, 00), 
         'endtime'   : socketDateTime(2008, 11, 4, 23, 45, 00),
         'airdate'   : u'2010-07-14'
     }
     self.assertSeasonAndEpisode(RecordedProgram(data=pdata(fields), **self.deps), u'24', u'3')
示例#23
0
 def test_getSeasonAndEpisode_When_original_airdate_not_available_Then_return_nones(self):
     fields = {
         'title'     : u'The Real World',
         'subtitle'  : u'',
         'starttime' : socketDateTime(2008, 11, 4, 22, 45, 00),
         'endtime'   : socketDateTime(2008, 11, 4, 23, 50, 00),
         'airdate'   : u''
     }
     self.assertSeasonAndEpisode(RecordedProgram(data=pdata(fields), **self.deps), None, None)
示例#24
0
 def test_getSeasonAndEpisode_When_search_by_original_airdate_and_subtitle_fails_Then_search_on_record_date(self):
     fields = {
         'title'     : u'Late Night With Jimmy Fallon',
         'subtitle'  : u'xxx',
         'starttime' : socketDateTime(2011, 12, 2, 2, 00, 00),
         'endtime'   : socketDateTime(2011, 12, 2, 3, 00, 00),
         'airdate'   : u'2006-10-10'
     }
     self.assertSeasonAndEpisode(RecordedProgram(data=pdata(fields), **self.deps), u'2011', u'184')
示例#25
0
 def test_love_and_hiphop_failure(self):
     fields = {
         'title'     : u'Love and HipHop',
         'subtitle'  : u'',
         'airdate'   : u'2011-11-21',
         'starttime' : socketDateTime(2011, 12, 8, 22, 00, 00),
         'endtime'   : socketDateTime(2011, 12, 8, 23, 00, 00),
     }
     self.assertSeasonAndEpisode(RecordedProgram(data=pdata(fields), **self.deps), u'2', u'2')
示例#26
0
 def test_getDuration_When_duration_is_half_hour_Then_return_30mins(self):
     #                                                       6:30pm                           7:00pm
     self.assertEqual(
         30,
         RecordedProgram(
             pdata({
                 'starttime': socketTime(18, 30, 0),
                 'endtime': socketTime(19, 0, 0)
             }), **self.pkwargs).getDuration())
示例#27
0
 def test_getSeasonAndEpisode_When_original_airdate_and_subtitle_not_available_Then_return_Nones(self):
     fields = {
         'title'     : u'WCG Ultimate Gamer',
         'subtitle'  : u'',
         'airdate'   : u'',
         'starttime' : socketDateTime(2010, 12, 2, 22, 45, 00), 
         'endtime'   : socketDateTime(2010, 12, 2, 23, 50, 00),
     }
     self.assertSeasonAndEpisode(RecordedProgram(data=pdata(fields), **self.deps), None, None)
示例#28
0
 def test_isJobFor_ShouldReturnFalse_ChannelIds_DontMatch(self):
     # Setup
     job = self.createJob()
     job.startTime = datetime.datetime(2008, 11, 4, 23, 45, 00)
     job.channelId = 200
     program = RecordedProgram(pdata({'chanid':1999, 'starttime':time.mktime(datetime.datetime(2008, 11, 4, 23, 45, 00).timetuple())}), **self.deps)
     
     # Test & verify
     self.assertFalse(job.isJobFor(program))
示例#29
0
 def test_getSeasonAndEpisode_NBCNightlyNews_returns_None_cuz_TVRage_throws_KeyError(self):
     fields = {
         'title'       :u'NBC Nightly News',
         'subtitle'    :u'blah',
         'starttime'   :socketDateTime(2008, 11, 4, 23, 45, 00),
         'endtime'     :socketDateTime(2008, 11, 4, 23, 50, 00),
         'airdate'     :u'2010-07-14'
     }
     self.assertSeasonAndEpisode(RecordedProgram(data=pdata(fields), **self.deps), None, None)
示例#30
0
 def test_getSeasonAndEpisode_When_original_airdate_not_available_and_subtitle_matches_Then_return_season_and_episode(self):
     fields = {
         'title'     : u'The Real World',
         'subtitle'  : u"Jemmye's White Knight",
         'starttime' : socketDateTime(2008, 11, 4, 22, 45, 00),
         'endtime'   : socketDateTime(2008, 11, 4, 23, 50, 00),
         'airdate'   : u''
     }
     self.assertSeasonAndEpisode(RecordedProgram(data=pdata(fields), **self.deps), u'24', u'3')
示例#31
0
 def test_getSeasonAndEpisode_When_match_not_found_using_original_airdate_Then_match_by_subtitle(self):
     fields = {
         'title'     : u'WCG Ultimate Gamer',
         'subtitle'  : u'In The Crosshairs',
         'starttime' : socketDateTime(2010, 12, 2, 22, 45, 00), 
         'endtime'   : socketDateTime(2010, 12, 2, 23, 50, 00),
         'airdate'   : u'2010-09-20',   # TVRage shows date as 2010-09-16
     }
     self.assertSeasonAndEpisode(RecordedProgram(data=pdata(fields), **self.deps), u'2', u'5')
示例#32
0
 def test_isJobFor_ShouldReturnTrue(self):
     # Setup
     job = self.createJob()
     job.startTime = datetime.datetime(2009, 12, 5, 10, 20, 00)
     job.channelId = 1999
     program = RecordedProgram(pdata({'chanid':1999, 'starttime' : time.mktime(datetime.datetime(2009, 12, 5, 10, 20, 00).timetuple())}), **self.deps)
                               
     # Test & verify
     self.assertTrue(job.isJobFor(program))
示例#33
0
 def test_getSeasonAndEpisode_succeeds_when_original_airdate_incorrect_and_one_day_behind(self):
     fields = {
         'title'     : u'Love and HipHop',
         'subtitle'  : u'',
         'airdate'   : u'2011-11-20',
         'starttime' : socketDateTime(2011, 12, 8, 22, 00, 00),
         'endtime'   : socketDateTime(2011, 12, 8, 23, 00, 00),
     }
     self.assertSeasonAndEpisode(RecordedProgram(data=pdata(fields), **self.deps), u'2', u'2')
示例#34
0
 def test_getSeasonAndEpisode_When_no_matching_original_airdate_or_subtitle_Then_return_nones(self):
     fields = {
         'title'     : u'MasterChef',
         'subtitle'  : u'',
         'starttime' : socketDateTime(2008, 11, 4, 22, 45, 00),
         'endtime'   : socketDateTime(2008, 11, 4, 23, 50, 00),
         'airdate'   : u''
     }
     self.assertSeasonAndEpisode(RecordedProgram(data=pdata(fields), **self.deps), None, None)
示例#35
0
 def test_originalAirDate_When_missing_Returns_None(self):
     rp = RecordedProgram(pdata({'airdate':'','hasairdate':0}), **self.pkwargs)
     self.assertFalse(rp.hasOriginalAirDate())
     self.assertEqual('', rp.originalAirDate())
示例#36
0
 def test_originalAirDate_When_available_Returns_date_as_string(self):
     rp = RecordedProgram(pdata({'airdate': '2008-10-10', 'hasairdate':1}), **self.pkwargs)
     self.assertEqual('2008-10-10', rp.originalAirDate())
     self.assertTrue(rp.hasOriginalAirDate())
示例#37
0
 def test_hasBookmark_True(self):
     p = RecordedProgram(pdata(), **self.pkwargs)
     p.setProgramFlags(FlagMask.FL_BOOKMARK | FlagMask.FL_AUTOEXP)
     self.assertTrue(p.isBookmarked())
     self.assertTrue(p.isAutoExpire())