def searchJobs(self, init=False, key=None, value=None): """ obj.searchJobs(**kwars) -> list of Job objects Supports the following keywords: chanid, starttime, type, status, hostname, title, subtitle, flags, olderthan, newerthan """ if init: init.table = 'jobqueue' init.handler = Job init.joins = (init.Join(table='recorded', tableto='jobqueue', fields=('chanid', 'starttime')), ) return None if key in ('chanid', 'type', 'status', 'hostname'): return ('jobqueue.%s=?' % key, value, 0) if key in ('title', 'subtitle'): return ('recorded.%s=?' % key, value, 1) if key == 'flags': return ('jobqueue.flags&?', value, 0) if key == 'starttime': return ('jobqueue.starttime=?', datetime.duck(value), 0) if key == 'olderthan': return ('jobqueue.inserttime>?', datetime.duck(value), 0) if key == 'newerthan': return ('jobqueue.inserttime<?', datetime.duck(value), 0) return None
def searchJobs(self, init=False, key=None, value=None): """ obj.searchJobs(**kwars) -> list of Job objects Supports the following keywords: chanid, starttime, type, status, hostname, title, subtitle, flags, olderthan, newerthan """ if init: init.table = 'jobqueue' init.handler = Job init.joins = (init.Join(table='recorded', tableto='jobqueue', fields=('chanid','starttime')),) return None if key in ('chanid','type','status','hostname'): return ('jobqueue.%s=?' % key, value, 0) if key in ('title','subtitle'): return ('recorded.%s=?' % key, value, 1) if key == 'flags': return ('jobqueue.flags&?', value, 0) if key == 'starttime': return ('jobqueue.starttime=?', datetime.duck(value), 0) if key == 'olderthan': return ('jobqueue.inserttime>?', datetime.duck(value), 0) if key == 'newerthan': return ('jobqueue.inserttime<?', datetime.duck(value), 0) return None
def searchArtwork(self, init=False, key=None, value=None): """ obj.searchArtwork(**kwargs) -> list of RecordedArtwork objects Supports the following keywords: inetref, season, host, chanid, starttime title, subtitle """ if init: # table and join descriptor init.table = 'recordedartwork' init.handler = RecordedArtwork init.joins = (init.Join(table='recorded', tableto='recordedartwork', fieldsfrom=('inetref', 'season', 'hostname'), fieldsto=('inetref', 'season', 'host')), ) return None if key in ('inetref', 'season', 'host'): return ('recordedartwork.%s=?' % key, value, 0) if key in ('chanid', 'title', 'subtitle'): return ('recorded.%s=?' % key, value, 1) if key == 'starttime': return ('recorded.%s=?' % key, datetime.duck(value), 1) return None
def searchArtwork(self, init=False, key=None, value=None): """ obj.searchArtwork(**kwargs) -> list of RecordedArtwork objects Supports the following keywords: inetref, season, host, chanid, starttime title, subtitle """ if init: # table and join descriptor init.table = 'recordedartwork' init.handler = RecordedArtwork init.joins = (init.Join(table='recorded', tableto='recordedartwork', fieldsfrom=('inetref','season','hostname'), fieldsto=('inetref','season','host')),) return None if key in ('inetref', 'season', 'host'): return ('recordedartwork.%s=?' % key, value, 0) if key in ('chanid', 'title', 'subtitle'): return ('recorded.%s=?' % key, value, 1) if key == 'starttime': return ('recorded.%s=?' % key, datetime.duck(value), 1) return None
def __setitem__(self, key, value): if key not in self._field_order: raise KeyError(str(key)) if self._field_type != 'Pass': ind = self._field_order.index(key) if self._field_type[ind] in (4, 6): value = datetime.duck(value) dict.__setitem__(self, key, value)
def __init__(self, data=None, db=None): if data is not None: if None not in data: data = [data[0], datetime.duck(data[1])] DBDataWrite.__init__(self, data, db) if self.future: raise MythDBError(MythError.DB_RESTRICT, "'future' OldRecorded " +\ "instances are not usable from the bindings.")
def __setitem__(self, key, value): if key not in self._field_order: raise KeyError(str(key)) if self._field_type != 'Pass': ind = self._field_order.index(key) if self._field_type[ind] in (4,6): value = datetime.duck(value) dict.__setitem__(self, key, value)
def getLastGuideData(self): """ Returns the last dat for which guide data is available """ try: return datetime.duck(self.backendCommand('QUERY_GUIDEDATATHROUGH')) except ValueError: return None
def getPreviewImage(self, chanid, starttime, width=None, \ height=None, secsin=None): starttime = datetime.duck(starttime) args = {'ChanId': chanid, 'StartTime': starttime.utcisoformat()} if width: args['Width'] = width if height: args['Height'] = height if secsin: args['SecsIn'] = secsin return self._request('Content/GetPreviewImage', **args).read()
def getPreviewImage(self, chanid, starttime, width=None, \ height=None, secsin=None): starttime = datetime.duck(starttime) args = {'ChanId':chanid, 'StartTime':starttime.isoformat()} if width: args['Width'] = width if height: args['Height'] = height if secsin: args['SecsIn'] = secsin return self._result('Content/GetPreviewImage', **args).read()
def getRecording(self, chanid, starttime): """FileOps.getRecording(chanid, starttime) -> Program object""" starttime = datetime.duck(starttime) res = self.backendCommand('QUERY_RECORDING TIMESLOT %s %s' \ % (chanid, starttime.mythformat()))\ .split(BACKEND_SEP) if res[0] == 'ERROR': return None else: return Program(res[1:], db=self.db)
def getProgramGuide(self, starttime, endtime, startchan, numchan=None): """ Returns a list of Guide objects corresponding to the given time period. """ starttime = datetime.duck(starttime) endtime = datetime.duck(endtime) args = {'StartTime':starttime.isoformat().rsplit('.',1)[0], 'EndTime':endtime.isoformat().rsplit('.',1)[0], 'StartChanId':startchan, 'Details':1} if numchan: args['NumOfChannels'] = numchan else: args['NumOfChannels'] = 1 dat = self._request('Guide/GetProgramGuide', **args).readJSON() for chan in dat['ProgramGuide']['Channels']: for prog in chan['Programs']: prog['ChanId'] = chan['ChanId'] yield Guide.fromJSON(prog, self.db)
def getProgramDetails(self, chanid, starttime): """ Returns a Program object for the matching show. """ starttime = datetime.duck(starttime) args = {'ChanId': chanid, 'StartTime': starttime.isoformat()} return Program.fromJSON( self._request('Guide/GetProgramDetails', **args)\ .readJSON()['Program'], db=self.db)
def getProgramDetails(self, chanid, starttime): """ Returns a Program object for the matching show. """ starttime = datetime.duck(starttime) args = {'ChanId': chanid, 'StartTime': starttime.utcisoformat()} return Program.fromJSON( self._request('Guide/GetProgramDetails', **args)\ .readJSON()['Program'], db=self.db)
def getProgramGuide(self, starttime, endtime, startchan, numchan=None): """ Returns a list of Guide objects corresponding to the given time period. """ starttime = datetime.duck(starttime) endtime = datetime.duck(endtime) args = { 'StartTime': starttime.utcisoformat().rsplit('.', 1)[0], 'EndTime': endtime.utcisoformat().rsplit('.', 1)[0], 'StartChanId': startchan, 'Details': 1 } if numchan: args['NumOfChannels'] = numchan else: args['NumOfChannels'] = 1 dat = self._request('Guide/GetProgramGuide', **args).readJSON() for chan in dat['ProgramGuide']['Channels']: for prog in chan['Programs']: prog['ChanId'] = chan['ChanId'] yield Guide.fromJSON(prog, self.db)
def searchOldRecorded(self, init=False, key=None, value=None): """ obj.searchOldRecorded(**kwargs) -> list of OldRecorded objects Supports the following keywords: title, subtitle, chanid, starttime, endtime, category, seriesid, programid, station, duplicate, generic, recstatus, inetref, season, episode """ if init: init.table = 'oldrecorded' init.handler = OldRecorded return None if key in ('title', 'subtitle', 'chanid', 'category', 'seriesid', 'programid', 'station', 'duplicate', 'generic', 'recstatus', 'inetref', 'season', 'episode'): return ('oldrecorded.%s=?' % key, value, 0) # time matches if key in ('starttime', 'endtime'): return ('oldrecorded.%s=?' % key, datetime.duck(value), 0) return None
def searchOldRecorded(self, init=False, key=None, value=None): """ obj.searchOldRecorded(**kwargs) -> list of OldRecorded objects Supports the following keywords: title, subtitle, chanid, starttime, endtime, category, seriesid, programid, station, duplicate, generic, recstatus, inetref, season, episode """ if init: init.table = 'oldrecorded' init.handler = OldRecorded return None if key in ('title','subtitle','chanid', 'category','seriesid','programid','station', 'duplicate','generic','recstatus','inetref', 'season','episode'): return ('oldrecorded.%s=?' % key, value, 0) # time matches if key in ('starttime','endtime'): return ('oldrecorded.%s=?' % key, datetime.duck(value), 0) return None
def searchGuide(self, init=False, key=None, value=None): """ obj.searchGuide(**args) -> list of Guide objects Supports the following keywords: chanid, starttime, endtime, title, subtitle, category, airdate, stars, previouslyshown, stereo, subtitled, hdtv, closecaptioned, partnumber, parttotal, seriesid, originalairdate, showtype, programid, generic, syndicatedepisodenumber, ondate, cast, startbefore,startafter endbefore, endafter, dayofweek, weekday first, last, callsign, commfree channelgroup, videosource, genre, rating, cast, fuzzytitle fuzzysubtitle, fuzzydescription, fuzzyprogramid, beforedate, afterdate, """ if init: init.table = 'program' init.handler = Guide init.joins = (init.Join(table='credits', tableto='program', fields=('chanid', 'starttime')), init.Join(table='people', tableto='credits', fields=('person', )), init.Join(table='channel', tableto='program', fields=('chanid', )), init.Join(table='channelgroup', tableto='program', fields=('chanid', )), init.Join(table='channelgroupnames', tableto='channelgroup', fields=('grpid', )), init.Join(table='videosource', tableto='channel', fields=('sourceid', )), init.Join(table='programgenres', tableto='program', fields=('chanid', 'starttime')), init.Join(table='programrating', tableto='program', fields=('chanid', 'starttime'))) return None if key in ('chanid', 'title', 'subtitle', 'category', 'airdate', 'stars', 'previouslyshown', 'stereo', 'subtitled', 'hdtv', 'closecaptioned', 'partnumber', 'parttotal', 'seriesid', 'originalairdate', 'showtype', 'syndicatedepisodenumber', 'programid', 'generic', 'category_type'): return ('program.%s=?' % key, value, 0) if key in ('starttime', 'endtime'): return ('program.%s=?' % key, datetime.duck(value), 0) if key == 'dayofweek': return ('DAYNAME(program.starttime)=?', value, 0) if key == 'weekday': return ('WEEKDAY(program.starttime)<?', 5, 0) if key in ('first', 'last'): return ('program.%s=?' % key, 1, 0) if key == 'callsign': return ('channel.callsign=?', value, 4) if key == 'commfree': return ('channel.commmethod=?', -2, 4) if key == 'channelgroup': return ('channelgroupnames.name=?', value, 24) if key == 'videosource': try: value = int(value) return ('channel.sourceid=?', value, 4) except: return ('videosource.name=?', value, 36) if key == 'genre': return ('programgenres.genre=?', value, 64) if key == 'rating': return ('programrating.rating=?', value, 128) if key == 'cast': return ('people.name', 'credits', 2, 0) if key.startswith('fuzzy'): if key[5:] in ('title', 'subtitle', 'description', 'programid'): return ('program.%s LIKE ?' % key[5:], '%' + value + '%', 0) if key[5:] == 'callsign': return ('channel.callsign LIKE ?', '%' + value + '%', 4) if key.endswith('date'): prefix = {'on': '=', 'before': '<', 'after': '>'} if key[:-4] in prefix: return ('DATE(program.starttime){0}?'.format(prefix[key[:-4]]), value, 0) if key == 'startbefore': return ('program.starttime<?', datetime.duck(value), 0) if key == 'startafter': return ('program.starttime>?', datetime.duck(value), 0) if key == 'endbefore': return ('program.endtime<?', datetime.duck(value), 0) if key == 'endafter': return ('program.endtime>?', datetime.duck(value), 0) return None
def __init__(self, data=None, db=None): if data is not None: if None not in data: data = [data[0], datetime.duck(data[1])] DBDataWrite.__init__(self, data, db)
def searchRecorded(self, init=False, key=None, value=None): """ obj.searchRecorded(**kwargs) -> list of Recorded objects Supports the following keywords: title, subtitle, chanid, starttime, progstart, category, hostname, autoexpire, commflagged, stars, recgroup, playgroup, duplicate, transcoded, watched, storagegroup, category_type, airdate, stereo, subtitled, hdtv, closecaptioned, partnumber, parttotal, seriesid, showtype, programid, manualid, generic, cast, livetv, basename, syndicatedepisodenumber, olderthan, newerthan, inetref, season, episode Multiple keywords can be chained as such: obj.searchRecorded(title='Title', commflagged=False) """ if init: # table and join descriptor init.table = 'recorded' init.handler = Recorded init.require = ('livetv', ) init.joins = (init.Join(table='recordedprogram', tableto='recorded', fieldsfrom=('chanid', 'starttime'), fieldsto=('chanid', 'progstart')), init.Join(table='recordedcredits', tableto='recorded', fieldsfrom=('chanid', 'starttime'), fieldsto=('chanid', 'progstart')), init.Join(table='people', tableto='recordedcredits', fields=('person', ))) return None # local table matches if key in ('title', 'subtitle', 'chanid', 'category', 'hostname', 'autoexpire', 'commflagged', 'stars', 'recgroup', 'playgroup', 'duplicate', 'transcoded', 'watched', 'storagegroup', 'basename', 'inetref', 'season', 'episode'): return ('recorded.%s=%%s' % key, value, 0) # time matches if key in ('starttime', 'endtime', 'progstart', 'progend'): return ('recorded.%s=?' % key, datetime.duck(value), 0) if key == 'olderthan': return ('recorded.starttime<?', datetime.duck(value), 0) if key == 'newerthan': return ('recorded.starttime>?', datetime.duck(value), 0) # recordedprogram matches if key in ('category_type', 'airdate', 'stereo', 'subtitled', 'hdtv', 'closecaptioned', 'partnumber', 'parttotal', 'seriesid', 'showtype', 'syndicatedepisodenumber', 'programid', 'manualid', 'generic'): return ('recordedprogram.%s=?' % key, value, 1) if key == 'cast': return ('people.name', 'recordedcredits', 4, 1) if key == 'livetv': if (value is None) or (value == False): return ('recorded.recgroup!=?', 'LiveTV', 0) return () return None
def searchRecorded(self, init=False, key=None, value=None): """ obj.searchRecorded(**kwargs) -> list of Recorded objects Supports the following keywords: title, subtitle, chanid, starttime, progstart, category, hostname, autoexpire, commflagged, stars, recgroup, playgroup, duplicate, transcoded, watched, storagegroup, category_type, airdate, stereo, subtitled, hdtv, closecaptioned, partnumber, parttotal, seriesid, showtype, programid, manualid, generic, cast, livetv, basename, syndicatedepisodenumber, olderthan, newerthan, inetref, season, episode Multiple keywords can be chained as such: obj.searchRecorded(title='Title', commflagged=False) """ if init: # table and join descriptor init.table = 'recorded' init.handler = Recorded init.require = ('livetv',) init.joins = (init.Join(table='recordedprogram', tableto='recorded', fields=('chanid','starttime')), init.Join(table='recordedcredits', tableto='recorded', fieldsfrom=('chanid','starttime'), fieldsto=('chanid','progstart')), init.Join(table='people', tableto='recordedcredits', fields=('person',))) return None # local table matches if key in ('title','subtitle','chanid', 'category','hostname','autoexpire','commflagged', 'stars','recgroup','playgroup','duplicate', 'transcoded','watched','storagegroup','basename', 'inetref','season','episode'): return ('recorded.%s=%%s' % key, value, 0) # time matches if key in ('starttime','endtime','progstart','progend'): return ('recorded.%s=?' % key, datetime.duck(value), 0) if key == 'olderthan': return ('recorded.starttime<?', datetime.duck(value), 0) if key == 'newerthan': return ('recorded.starttime>?', datetime.duck(value), 0) # recordedprogram matches if key in ('category_type','airdate','stereo','subtitled','hdtv', 'closecaptioned','partnumber','parttotal','seriesid', 'showtype','syndicatedepisodenumber','programid', 'manualid','generic'): return ('recordedprogram.%s=?' % key, value, 1) if key == 'cast': return ('people.name', 'recordedcredits', 4, 1) if key == 'livetv': if (value is None) or (value == False): return ('recorded.recgroup!=?', 'LiveTV', 0) return () return None
def searchGuide(self, init=False, key=None, value=None): """ obj.searchGuide(**args) -> list of Guide objects Supports the following keywords: chanid, starttime, endtime, title, subtitle, category, airdate, stars, previouslyshown, stereo, subtitled, hdtv, closecaptioned, partnumber, parttotal, seriesid, originalairdate, showtype, programid, generic, syndicatedepisodenumber, ondate, cast, startbefore,startafter endbefore, endafter, dayofweek, weekday first, last, callsign, commfree channelgroup, videosource, genre, rating, cast, fuzzytitle fuzzysubtitle, fuzzydescription, fuzzyprogramid, beforedate, afterdate, """ if init: init.table = 'program' init.handler = Guide init.joins = (init.Join(table='credits', tableto='program', fields=('chanid','starttime')), init.Join(table='people', tableto='credits', fields=('person',)), init.Join(table='channel', tableto='program', fields=('chanid',)), init.Join(table='channelgroup', tableto='program', fields=('chanid',)), init.Join(table='channelgroupnames', tableto='channelgroup', fields=('grpid',)), init.Join(table='videosource', tableto='channel', fields=('sourceid',)), init.Join(table='programgenres', tableto='program', fields=('chanid','starttime')), init.Join(table='programrating', tableto='program', fields=('chanid','starttime'))) return None if key in ('chanid','title','subtitle', 'category','airdate','stars','previouslyshown','stereo', 'subtitled','hdtv','closecaptioned','partnumber', 'parttotal','seriesid','originalairdate','showtype', 'syndicatedepisodenumber','programid','generic', 'category_type'): return ('program.%s=?' % key, value, 0) if key in ('starttime','endtime'): return ('program.%s=?' % key, datetime.duck(value), 0) if key == 'dayofweek': return ('DAYNAME(program.starttime)=?', value, 0) if key == 'weekday': return ('WEEKDAY(program.starttime)<?', 5, 0) if key in ('first', 'last'): return ('program.%s=?' % key, 1, 0) if key == 'callsign': return ('channel.callsign=?', value, 4) if key == 'commfree': return ('channel.commmethod=?', -2, 4) if key == 'channelgroup': return ('channelgroupnames.name=?', value, 24) if key == 'videosource': try: value = int(value) return ('channel.sourceid=?', value, 4) except: return ('videosource.name=?', value, 36) if key == 'genre': return ('programgenres.genre=?', value, 64) if key == 'rating': return ('programrating.rating=?', value, 128) if key == 'cast': return ('people.name', 'credits', 2, 0) if key.startswith('fuzzy'): if key[5:] in ('title', 'subtitle', 'description', 'programid'): return ('program.%s LIKE ?' % key[5:], '%'+value+'%', 0) if key[5:] == 'callsign': return ('channel.callsign LIKE ?', '%'+value+'%', 4) if key.endswith('date'): prefix = {'on':'=', 'before':'<', 'after':'>'} if key[:-4] in prefix: return ('DATE(program.starttime){0}?'.format(prefix[key[:-4]]), value, 0) if key == 'startbefore': return ('program.starttime<?', datetime.duck(value), 0) if key == 'startafter': return ('program.starttime>?', datetime.duck(value), 0) if key == 'endbefore': return ('program.endtime<?', datetime.duck(value), 0) if key == 'endafter': return ('program.endtime>?', datetime.duck(value), 0) return None