def start(): import urllib #re-import ZattooDB to prevent "convert_timestamp" error from resources.zattooDB import ZattooDB _zattooDB_ = ZattooDB() _zattooDB_.cleanProg(True) #re-import ZattooDB to prevent "convert_timestamp" error from resources.zattooDB import ZattooDB _zattooDB_ = ZattooDB() _zattooDB_.updateChannels(True) #re-import ZattooDB to prevent "convert_timestamp" error from resources.zattooDB import ZattooDB _zattooDB_ = ZattooDB() _zattooDB_.updateProgram() startTime = datetime.datetime.now() #-datetime.timedelta(minutes = 60) endTime = datetime.datetime.now() + datetime.timedelta(minutes=20) #re-import ZattooDB to prevent "convert_timestamp" error from resources.zattooDB import ZattooDB _zattooDB_ = ZattooDB() #xbmcgui.Dialog().notification(localString(31916), localString(30110), __addon__.getAddonInfo('path') + '/icon.png', 3000, False) _zattooDB_.getProgInfo(True, startTime, endTime) #xbmcgui.Dialog().notification(localString(31106), localString(31915), __addon__.getAddonInfo('path') + '/icon.png', 3000, False) #xbmc.executebuiltin("ActivateWindow(busydialog)") recInfo() _library_.delete_library() # add by samoth _library_.make_library()
def __init__(self): super(Teletext, self).__init__() self.channelID = ZattooDB().get_playing()['channel'] self.imagePath='' self.pageInput='' self.bgImage = xbmcgui.ControlImage(0,0,1280,720,'') self.addControl(self.bgImage) self.bgImage.setImage(__addon__.getAddonInfo('path') + '/resources/teletextBG.png') self.pageInputCtrl = xbmcgui.ControlLabel(0, 0, 265, 100, '100', font='font30', alignment=2) self.addControl(self.pageInputCtrl) self.pageInputCtrl.setVisible(False) self.pageImage = xbmcgui.ControlImage(260, 0, 800, 720, "") self.addControl(self.pageImage) self.button0 = xbmcgui.ControlButton(50, 640, 170, 40, localString(31912), font='font20', alignment=6) self.addControl(self.button0) self.button1 = xbmcgui.ControlButton(1090, 640, 50, 40, "<", font='font30', alignment=6) self.addControl(self.button1) self.button2 = xbmcgui.ControlButton(1190, 640, 50, 40, ">", font='font30', alignment=6) self.addControl(self.button2) self.currentPage=100 self.subPage=1 self.showPage(str(self.currentPage))#, str(self.subPage))
def toggle_channel(): lastChannel=xbmcgui.Window(10000).getProperty('ZBElastChannel') watch_channel(lastChannel, '0', '0') _zattooDB_=ZattooDB() channelList = _zattooDB_.getChannelList(_listMode_ == 'favourites') nr=channelList[lastChannel]['nr'] return nr
def recInfo(): import urllib from resources.zattooDB import ZattooDB _zattooDB_ = ZattooDB() resultData = _zattooDB_.zapi.exec_zapiCall('/zapi/playlist', None) if resultData is None: return for record in resultData['recordings']: _zattooDB_.getShowInfo(record['program_id'])
def getProgNextDay(): from resources.zattooDB import ZattooDB _zattooDB_ = ZattooDB() start = datetime.time(14, 0, 0) now = datetime.datetime.now().time() tomorrow = datetime.datetime.today() + datetime.timedelta(days=1) if now > start: #debug('NextDay ' + str(start) + ' - ' + str(now) + ' - ' + str(tomorrow)) _zattooDB_.updateProgram(tomorrow)
def toggle_channel(): _zattooDB_ = ZattooDB() toggleChannel = xbmcgui.Window(10000).getProperty('toggleChannel') playing = _zattooDB_.get_playing() xbmcgui.Window(10000).setProperty('toggleChannel', playing['channel']) if toggleChannel == "": xbmc.executebuiltin("Action(Back)") #go back to channel selector else: watch_channel(toggleChannel, '0', '0') channelList = _zattooDB_.getChannelList(_listMode_ == 'favourites') nr = channelList[toggleChannel]['nr'] return nr
def start(): import urllib #xbmc.executebuiltin('ActivateWindow(busydialognocancel)') #re-import ZattooDB to prevent "convert_timestamp" error from resources.zattooDB import ZattooDB _zattooDB_ = ZattooDB() _zattooDB_.cleanProg(True) #re-import ZattooDB to prevent "convert_timestamp" error from resources.zattooDB import ZattooDB _zattooDB_ = ZattooDB() _zattooDB_.updateChannels() #re-import ZattooDB to prevent "convert_timestamp" error from resources.zattooDB import ZattooDB _zattooDB_ = ZattooDB() _zattooDB_.updateProgram() try: tomorrow = datetime.datetime.today() + datetime.timedelta(days=1) _zattooDB_.updateProgram(tomorrow) except:pass startTime=datetime.datetime.now()#-datetime.timedelta(minutes = 60) endTime=datetime.datetime.now()+datetime.timedelta(minutes = 20) #re-import ZattooDB to prevent "convert_timestamp" error from resources.zattooDB import ZattooDB _zattooDB_ = ZattooDB() #xbmcgui.Dialog().notification(localString(31916), localString(30110), __addon__.getAddonInfo('path') + '/icon.png', 3000, False) if __addon__.getSetting('dbonstart') == 'true': _zattooDB_.getProgInfo(True, startTime, endTime) recInfo() _library_.delete_library() # add by samoth _library_.make_library()
def skip_channel(skipDir): #new ZattooDB instance because this is called from thread-timer on channel-nr input (sql connection doesn't work) _zattooDB_ = ZattooDB() channelList = _zattooDB_.getChannelList(_listMode_ == 'favourites') currentChannel = _zattooDB_.get_playing()['channel'] nr = channelList[currentChannel]['nr'] nr += skipDir if nr < len(channelList) and nr > -1: watch_channel(channelList['index'][nr], '0', '0') return nr else: xbmc.executebuiltin('XBMC.Action(FullScreen)') return channelList[currentChannel]['nr']
def refreshProg(): import urllib monitor = xbmc.Monitor() while not monitor.abortRequested(): if monitor.waitForAbort(600): break from resources.zattooDB import ZattooDB _zattooDB_ = ZattooDB() #update programInfo startTime=datetime.datetime.now() endTime=datetime.datetime.now()+datetime.timedelta(minutes = 120) try: getProgNextDay() _zattooDB_.getProgInfo(False, startTime, endTime,'all') except: pass
def showChannels(self): start = int(self.selected / 16) * 16 channels = self.channels self.programms = ZattooDB().getPrograms(channels, False, datetime.datetime.now(), datetime.datetime.now()) #xbmcgui.lock() for nr in range(0, 16): current = start + nr control = self.controls[nr] if current > (len(channels) - 2): #-2: skip channel['index'] control['image'].setVisible(False) control['logo'].setVisible(False) control['label'].setVisible(False) control['channelNr'].setVisible(False) control['visible'] = False else: currenChannel = channels[channels['index'][current]] title = '' control['program'] = '' for search in self.programms: if search['channel'] == currenChannel['id']: title = search['title'] control['program'] = search break control['logo'].setImage(currenChannel['logo']) control['label'].setLabel(title) control['channelNr'].setLabel(str(current + 1)) control['channel'] = currenChannel['id'] if control['visible'] == False: control['image'].setVisible(True) control['logo'].setVisible(True) control['label'].setVisible(True) control['channelNr'].setVisible(True) control['visible'] = True #show images now = int(time.time()) for control in self.controls: if control['visible']: #src = 'http://thumb.zattic.com/' + control['channel'] + '/500x288.jpg?r=' + str(now) src = 'http://thumb.zattic.com/' + control[ 'channel'] + '/256x144.jpg?r=' + str(now) control['image'].setImage(src, False)
def refreshProg(): import urllib monitor = xbmc.Monitor() while not monitor.abortRequested(): if monitor.waitForAbort(600): break from resources.zattooDB import ZattooDB _zattooDB_ = ZattooDB() #update programInfo startTime = datetime.datetime.now() endTime = datetime.datetime.now() + datetime.timedelta(minutes=120) print 'StartRefresh ' + str(datetime.datetime.now()) try: _zattooDB_.getProgInfo(False, startTime, endTime) except: print 'ERROR on REFRESH' pass print "REFRESH Prog " + str(datetime.datetime.now())
def onInit(self): self.db = ZattooDB() control = self.getControl(self.C_MAIN_EPG_VIEW_MARKER) if control: left, top = control.getPosition() self.focusPoint.x = left self.focusPoint.y = top self.epgView.left = left self.epgView.top = top self.epgView.right = left + control.getWidth() self.epgView.bottom = top + control.getHeight() self.epgView.width = control.getWidth() self.epgView.cellHeight = control.getHeight() / CHANNELS_PER_PAGE # draw epg on open self.onRedrawEPG(self.channelIdx, self.viewStartDate) # self.notification = Notification(self.database, ADDON.getAddonInfo('path')+'/resources/epg') self.updateTimebar() self.getControl(4400).setVisible(False) self.getControl(4401).setVisible(True)
def showInfo(self, jump=True): controlNr = self.selected % 16 endPos = self.getControlPos(controlNr) if (not jump): #moving highlight pos = self.highlightImage.getPosition() stepX = (endPos['x'] - pos[0]) / 5 stepY = (endPos['y'] - pos[1]) / 5 for nr in range(1, 5): self.highlightImage.setPosition(pos[0] + (stepX * nr), pos[1] + (stepY * nr)) xbmc.sleep(10) self.highlightImage.setPosition(endPos['x'], endPos['y']) #refresh image if hasattr(self, 'refreshImageTimer'): self.refreshImageTimer.cancel() src = 'http://thumb.zattic.com/' + self.controls[controlNr][ 'channel'] + '/256x144.jpg?r=' + str(int(time.time())) self.refreshImageTimer = threading.Timer( 1, lambda: self.controls[controlNr]['image'].setImage(src, False)) self.refreshImageTimer.start() #program= self.controls[controlNr]['program'] program = ZattooDB().getPrograms( {'index': [self.controls[controlNr]['channel']]}, False, datetime.datetime.now(), datetime.datetime.now())[0] nextprog = ZattooDB().getPrograms( {'index': [self.controls[controlNr]['channel']]}, False, program['end_date'] + datetime.timedelta(seconds=60), program['end_date'] + datetime.timedelta(seconds=60)) self.controls[controlNr]['label'].setLabel('') self.highLabel = program['title'] self.scrollLabel.reset() self.scrollLabel.setPosition(endPos['x'] + 6, endPos['y'] + 149) self.scrollLabel.addLabel(program['title']) #update info channel = self.channels[self.channels['index'][self.selected]] self.infoLogo.setImage(channel['logo'], False) self.infoTitle.reset() self.infoDesc.reset() self.infoNext.reset() if (not program): self.infoChannelTitle.setLabel('[B]' + channel['title'] + '[/B]\n ') self.infoTitle.addLabel('[B] [/B]') self.infoImg.setImage('') self.infoDesc.addLabel('[B] [/B]') self.infoPlot.setText('') self.infoNext.addLabel('') else: self.infoChannelTitle.setLabel( '[B]' + channel['title'] + '[/B]\n' + program['start_date'].strftime('%H:%M') + ' - ' + program['end_date'].strftime('%H:%M')) self.infoTitle.addLabel('[B]' + program['title'] + '[/B]') self.infoImg.setImage(program['image_small'], False) self.infoNext.addLabel( '[COLOR blue]' + localString(30010) + '[/COLOR]' + '[COLOR aquamarine]' + nextprog[0]['title'] + '[/COLOR]' + ' ' + '[COLOR khaki]' + nextprog[0]['start_date'].strftime('%H:%M') + ' - ' + nextprog[0]['end_date'].strftime('%H:%M') + '[/COLOR]') desc = program['description'] if (not desc): desc = " " self.infoDesc.addLabel('[B]' + desc + '[/B]') plot = self.db.getShowInfo(program['showID'], 'description') if (not plot): plot = "No description " self.infoPlot.setText(plot)
def createPreview(self, fav): imgW = 256 imgH = 150 # collect all controls and add them in one call to save time allControls = [] # create preview images first so they are behind highlight image images = [] for nr in range(0, 16): pos = self.getControlPos(nr) image = xbmcgui.ControlImage(pos['x'], pos['y'] + 1, imgW - 2, imgH, '') allControls.append(image) images.append(image) self.highlightImage = xbmcgui.ControlImage(0, 0, imgW, 178, '') allControls.append(self.highlightImage) self.highLabel = '' #add a scroll label for highlighted item self.scrollLabel = xbmcgui.ControlFadeLabel(0, 0, 240, 30, 'font13', '0xFF000000') allControls.append(self.scrollLabel) #preloadImage is buffer for image update self.preloadImage = xbmcgui.ControlImage(0, -200, 256, 150, '') allControls.append(self.preloadImage) for nr in range(0, 16): pos = self.getControlPos(nr) logo = xbmcgui.ControlImage(pos['x'] + 5, pos['y'] + 100, 84, 48, '') label = xbmcgui.ControlLabel(pos['x'] + 6, pos['y'] + imgH - 1, 250, 30, 'font13') channelNr = xbmcgui.ControlLabel(pos['x'] + 200, pos['y'] + 5, 50, 20, 'font13', alignment=1) allControls.append(logo) allControls.append(label) allControls.append(channelNr) self.controls.append({ 'image': images[nr], 'logo': logo, 'label': label, 'channelNr': channelNr, 'program': '', 'visible': True }) addonPath = xbmcaddon.Addon().getAddonInfo('path') #add info controls posX = 768 #bg = xbmcgui.ControlImage(posX-10, -10, 530, 376, 'recentaddedback.png') #bg = xbmcgui.ControlImage(posX, 0, 512, 360, 'ContentPanel.png') #bg = xbmcgui.ControlImage(posX, 0, 512, 360, 'episodematte.png', colorDiffuse='0xFF333333') bg = xbmcgui.ControlImage( posX, 0, 512, 360, addonPath + '/resources/media/previewInfo.png') self.infoLogo = xbmcgui.ControlImage( 74 + posX, 5, 140, 70, (xbmcaddon.Addon().getAddonInfo('path') + '/resources/media/channel-highlight.png')) self.infoChannelTitle = xbmcgui.ControlLabel(0 + posX, 85, 287, 30, 'TITLE', alignment=2) self.infoImg = xbmcgui.ControlImage( 284 + posX, 3, 225, 146, (xbmcaddon.Addon().getAddonInfo('path') + '/resources/media/channel-highlight.png')) self.infoTitle = xbmcgui.ControlFadeLabel(5 + posX, 150, 500, 20, 'font16', '0xFFFFFFFF', 2) self.infoDesc = xbmcgui.ControlFadeLabel(5 + posX, 180, 500, 20, 'font13', '0xFFFFFFFF', 2) self.infoPlot = xbmcgui.ControlTextBox(8 + posX, 205, 500, 128, 'font13') self.infoNext = xbmcgui.ControlFadeLabel(8 + posX, 333, 500, 128, 'font12', '0xFFFFFFFF', 2) allControls.append(bg) allControls.append(self.infoLogo) allControls.append(self.infoChannelTitle) allControls.append(self.infoImg) allControls.append(self.infoTitle) allControls.append(self.infoDesc) allControls.append(self.infoPlot) allControls.append(self.infoNext) self.addControls(allControls) self.highlightImage.setImage(addonPath + '/resources/media/channel-highlight.png') self.infoPlot.autoScroll(5000, 1800, 5000) self.db = ZattooDB() if fav == 'popular': self.channels = self.db.getPopularList() else: self.channels = self.db.getChannelList(fav)
def onAction(self, action): _zattooDB_=ZattooDB() channel=_zattooDB_.get_playing()['channel'] channeltitle=_zattooDB_.get_channeltitle(channel) program = _zattooDB_.getPrograms({'index':[channel]}, True, datetime.datetime.now(), datetime.datetime.now()) program=program[0] #print('ZATTOOGUI BUTTON'+str(action.getButtonCode())) #print('ZATTOOGUI ACTIONID'+str(action.getId())) self.channelInputCtrl.setVisible(False) action = action.getId() if action in [ACTION_PARENT_DIR, KEY_NAV_BACK, ACTION_PREVIOUS_MENU]: if hasattr(self, 'hideNrTimer'): self.hideNrTimer.cancel() self.close() xbmc.executebuiltin("Action(Stop)") if action==ACTION_STOP: if hasattr(self, 'hideNrTimer'): self.hideNrTimer.cancel() self.close() elif action==ACTION_OSD: if hasattr(self, 'hideNrTimer'): self.hideNrTimer.cancel() self.close() elif action in [ACTION_SELECT_ITEM, ACTION_MOUSE_LEFT_CLICK]: self.hidePrevImg() if(self.channelInput): self.channelInputTimer.cancel() self.channelInputTimeout() else: makeOsdInfo() gui = zattooOSD("zattooOSD.xml",__addon__.getAddonInfo('path')) gui.doModal() elif action == ACTION_MOVE_DOWN: if self.hidePrevImg():return xbmc.executebuiltin("Action(OSD)") #close hidden gui xbmc.executebuiltin('RunPlugin("plugin://'+__addonId__+'/?mode=epgOSD")') elif action == ACTION_MOVE_UP: if self.hidePrevImg():return xbmc.executebuiltin("Action(OSD)") #close hidden gui xbmc.executebuiltin('ActivateWindow(10025,"plugin://'+__addonId__+'/?mode=channellist")') elif action == ACTION_MOVE_LEFT: self.setPrevImg() self.showChannelNr(toggle_channel()+1) elif action == ACTION_MOVE_RIGHT: change_stream(1) elif action in [ACTION_CHANNEL_UP, ACTION_PAGE_UP]: #if self.hidePrevImg():return nr=skip_channel(+1) self.showChannelNr(nr+1) elif action in [ACTION_CHANNEL_DOWN, ACTION_PAGE_DOWN]: #if self.hidePrevImg():return nr=skip_channel(-1) self.showChannelNr(nr+1) elif action == ACTION_RECORD: setup_recording(program['showID']) elif (action>57 and action<68): #numbers 0-9 self.hidePrevImg() #print('channel ipnut'+str(action)) if hasattr(self, 'channelInputTimer'): self.channelInputTimer.cancel() self.channelInput+=str(action-58) self.channelInputCtrl.setLabel(self.channelInput) self.channelInputCtrl.setVisible(True) if len(self.channelInput)>2: self.channelInputTimeout() else: self.channelInputTimer = threading.Timer(1.5, self.channelInputTimeout) self.channelInputTimer.start() elif action == ACTION_BUILT_IN_FUNCTION:self.close() #keymap functions
def watch_channel(channel_id, start, end, showID="", restart=False, showOSD=False): #print('WATCH: '+channel_id+' st:'+str(start)+' en:'+str(end)) #new ZattooDB instance because this is called from thread-timer on channel-nr input (sql connection doesn't work) _zattooDB_ = ZattooDB() #selected currently playing live TV playing = _zattooDB_.get_playing() if (xbmc.Player().isPlaying() and channel_id == playing['channel'] and start == '0'): xbmc.executebuiltin("Action(FullScreen)") return # (64 150 300) 600 900 1500 3000 5000 max_bandwidth = __addon__.getSetting('max_bandwidth') if DASH: stream_type = 'dash' else: stream_type = 'hls' if restart: startTime = datetime.datetime.fromtimestamp(int(start)) endTime = datetime.datetime.fromtimestamp(int(end)) params = {'stream_type': stream_type, 'maxrate': max_bandwidth} elif start == '0': startTime = datetime.datetime.now() endTime = datetime.datetime.now() params = { 'cid': channel_id, 'stream_type': stream_type, 'maxrate': max_bandwidth } else: startTime = datetime.datetime.fromtimestamp(int(start)) endTime = datetime.datetime.fromtimestamp(int(end)) zStart = datetime.datetime.fromtimestamp( int(start) - _timezone_).strftime( "%Y-%m-%dT%H:%M:%SZ") #5min zattoo skips back zEnd = datetime.datetime.fromtimestamp(int(end) - _timezone_).strftime( "%Y-%m-%dT%H:%M:%SZ") params = { 'cid': channel_id, 'stream_type': stream_type, 'start': zStart, 'end': zEnd, 'maxrate': max_bandwidth } #print "RECALL: " +str(zStart) + " " + str(startTime) + " " +str(_timezone_) channelInfo = _zattooDB_.get_channelInfo(channel_id) if restart: resultData = _zattooDB_.zapi.exec_zapiCall( '/zapi/watch/selective_recall/' + channel_id + '/' + showID, params) else: resultData = _zattooDB_.zapi.exec_zapiCall('/zapi/watch', params) #resultData = _zattooDB_.zapi.exec_zapiCall('/zapi/watch',params) #print 'ResultData ' +str(resultData) if resultData is None: xbmcgui.Dialog().notification("ERROR", "NO ZAPI RESULT", channelInfo['logo'], 5000, False) return streams = resultData['stream']['watch_urls'] if len(streams) == 0: xbmcgui.Dialog().notification("ERROR", "NO STREAM FOUND, CHECK SETTINGS!", channelInfo['logo'], 5000, False) return # change stream if settings are set streamNr = 0 if len(streams) > 1 and __addon__.getSetting( 'audio_stream') == 'B' and streams[1]['audio_channel'] == 'B': streamNr = 1 xbmcgui.Window(10000).setProperty('playstream', streams[streamNr]['url']) # save currently playing streamsList = [] for stream in resultData['stream']['watch_urls']: streamsList.append(stream['url']) streamsList = '|'.join(streamsList) _zattooDB_.set_playing(channel_id, streamsList, streamNr) #make Info program = _zattooDB_.getPrograms({'index': [channel_id]}, True, startTime, endTime) listitem = xbmcgui.ListItem(channel_id) if program: program = program[0] heading = ('[B]' + channelInfo['title'] + '[/B] ').translate( _umlaut_) + ' ' + program['start_date'].strftime( '%H:%M') + '-' + program['end_date'].strftime('%H:%M') xbmcgui.Dialog().notification(heading, program['title'].translate(_umlaut_), channelInfo['logo'], 5000, False) #set info for recall listitem.setThumbnailImage(program['image_small']) meta = { 'title': program['title'], 'season': 'S', 'episode': streamNr, 'tvshowtitle': channelInfo['title'] + ', ' + program['start_date'].strftime('%A %H:%M') + '-' + program['end_date'].strftime('%H:%M'), 'premiered': 'premiered', 'duration': '20', 'rating': 'rating', 'director': 'director', 'writer': 'writer', 'plot': program['description_long'] } listitem.setInfo(type="Video", infoLabels=meta) listitem.setArt({ 'poster': program['image_small'], 'logo': channelInfo['logo'] }) if DASH: listitem.setProperty('inputstreamaddon', 'inputstream.adaptive') listitem.setProperty('inputstream.adaptive.manifest_type', 'mpd') #play liveTV: info is created in OSD if (start == '0'): _zattooDB_ = ZattooDB() channelList = _zattooDB_.getChannelList(_listMode_ == 'favourites') #print "ChannelList: " + str(channelList) currentChannel = _zattooDB_.get_playing()['channel'] nr = channelList[currentChannel]['nr'] player = xbmc.Player() #player.startTime=startTime player.play(streams[streamNr]['url'], listitem) #while (player.playing):xbmc.sleep(100) show_channelNr(nr + 1) else: #player= myPlayer(290) player = xbmc.Player() player.startTime = startTime player.play(streams[streamNr]['url'], listitem) while (player.playing): xbmc.sleep(100)
def _showDescription(self, id): description = ZattooDB().getShowInfo(id,'description') if description == '': description = strings(NO_DESCRIPTION) self.setControlText(self.C_MAIN_DESCRIPTION, description)
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with zattooHiQ. If not, see <http://www.gnu.org/licenses/>. # import xbmc, xbmcgui, xbmcplugin, xbmcaddon import sys, urlparse import time, datetime, threading from resources.zattooDB import ZattooDB __addon__ = xbmcaddon.Addon() __addonId__ = __addon__.getAddonInfo('id') __addonname__ = __addon__.getAddonInfo('name') _zattooDB_ = ZattooDB() _timezone_ = int( __addon__.getSetting('time_offset')) * 60 * -60 #-time.altzone DEBUG = __addon__.getSetting('debug') def debug(s): if DEBUG: xbmc.log(str(s), xbmc.LOGDEBUG) class library: def make_library(self): folder = __addon__.getSetting('library_dir') if not folder: return
def watch_channel(channel_id, start, end, showID="", restart=False): #print('WATCH: '+channel_id+' st:'+str(start)+' en:'+str(end)) #new ZattooDB instance because this is called from thread-timer on channel-nr input (sql connection doesn't work) _zattooDB_=ZattooDB() #selected currently playing live TV playing=_zattooDB_.get_playing() if (xbmc.Player().isPlaying() and channel_id == playing['channel'] and start=='0' ): xbmc.executebuiltin("Action(FullScreen)") makeZattooGUI() return #save current channel for toggle xbmcgui.Window(10000).setProperty('ZBElastChannel', playing['channel']) # (64 150 300) 600 900 1500 3000 5000 max_bandwidth = __addon__.getSetting('max_bandwidth') if restart: params = {'stream_type': 'hls'} elif start == '0': params = {'cid': channel_id, 'stream_type': 'hls', 'maxrate':max_bandwidth} else: zStart = datetime.datetime.fromtimestamp(int(start) - _timezone_ ).strftime("%Y-%m-%dT%H:%M:%SZ") #5min zattoo skips back zEnd = datetime.datetime.fromtimestamp(int(end) - _timezone_ ).strftime("%Y-%m-%dT%H:%M:%SZ") params = {'cid': channel_id, 'stream_type': 'hls', 'start':zStart, 'end':zEnd, 'maxrate':max_bandwidth } channelInfo = _zattooDB_.get_channelInfo(channel_id) if restart: resultData = _zattooDB_.zapi.exec_zapiCall('/zapi/watch/selective_recall/'+channel_id+'/'+showID, params) else: resultData = _zattooDB_.zapi.exec_zapiCall('/zapi/watch',params) print 'ResultData ' +str(params) if resultData is None: xbmcgui.Dialog().notification("ERROR", "NO ZAPI RESULT", channelInfo['logo'], 5000, False) return streams = resultData['stream']['watch_urls'] if len(streams)==0: xbmcgui.Dialog().notification("ERROR", "NO STREAM FOUND, CHECK SETTINGS!", channelInfo['logo'], 5000, False) return # change stream if settings are set streamNr = 0 if len(streams) > 1 and __addon__.getSetting('audio_stream') == 'B' and streams[1]['audio_channel'] == 'B': streamNr = 1 #play liveTV: info is created in OSD if (start=='0'): xbmc.Player().play(streams[streamNr]['url'], xbmcgui.ListItem(channel_id)) xbmcgui.Window(10000).setProperty('playstream', streams[streamNr]['url']) #12005:fullscreenvideo #if (xbmcgui.getCurrentWindowId()!=12005):xbmc.executebuiltin("Action(FullScreen)") # save currently playing streamsList = [] for stream in resultData['stream']['watch_urls']: streamsList.append(stream['url']) streamsList = '|'.join(streamsList) _zattooDB_.set_playing(channel_id, streamsList, streamNr) #make Info if start == '0':startTime = datetime.datetime.now() else: startTime = datetime.datetime.fromtimestamp(int(start)) if end == '0': endTime = datetime.datetime.now() else: endTime = datetime.datetime.fromtimestamp(int(end)) program = _zattooDB_.getPrograms({'index':[channel_id]}, True, startTime, endTime) listitem = xbmcgui.ListItem(channel_id) if program: program = program[0] heading = ('[B]' + channelInfo['title'] + '[/B] ').translate(_umlaut_) + ' ' + program['start_date'].strftime('%H:%M') + '-' + program['end_date'].strftime('%H:%M') xbmcgui.Dialog().notification(heading, program['title'].translate(_umlaut_), channelInfo['logo'], 5000, False) #set info for recall listitem.setThumbnailImage(program['image_small']) meta = {'title': program['title'], 'season' : 'S', 'episode': streamNr, 'tvshowtitle': channelInfo['title']+ ', ' + program['start_date'].strftime('%A %H:%M') + '-' + program['end_date'].strftime('%H:%M'), 'premiered' :'premiered', 'duration' : '20', 'rating': 'rating', 'director': 'director', 'writer': 'writer', 'plot': program['description_long']} listitem.setInfo(type="Video", infoLabels = meta) listitem.setArt({ 'poster': program['image_small'], 'logo' : channelInfo['logo'] }) #play recall if (start!='0') or restart: player= myPlayer(True) player.play(streams[streamNr]['url'], listitem) while (player.starting):xbmc.sleep(10) #wait for player to skip 5min on recall else: makeZattooGUI() #liveTV: intercept keys and show OSD