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 y in range(0, 4): for x in range(0, 5): image = xbmcgui.ControlImage(x * imgW, y * 180 + 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', '0xFFFFFFFF') allControls.append(self.scrollLabel) #preloadImage is buffer for image update self.preloadImage = xbmcgui.ControlImage(0, -200, 256, 150, '') allControls.append(self.preloadImage) for y in range(0, 4): for x in range(0, 5): logo = xbmcgui.ControlImage((x * imgW) + 5, y * 180 + 100, 84, 48, '') label = xbmcgui.ControlLabel(x * imgW + 6, y * 180 + imgH - 1, 250, 30, 'font13') channelNr = xbmcgui.ControlLabel(x * imgW + 200, y * 180 + 5, 50, 20, 'font13', alignment=1) allControls.append(logo) allControls.append(label) allControls.append(channelNr) self.controls.append({ 'image':images[y * 5 + x], 'logo':logo, 'label':label, 'channelNr':channelNr, 'visible':True }) self.addControls(allControls) db = ZattooDB() self.channels = db.getChannelList(fav) currentChannel = db.get_playing()['channel'] #highlight current channel start=self.channels[currentChannel]['nr'] self.showChannels(int(start/20)*20) self.moveHighlight(start%20) self.highlightImage.setImage(xbmcaddon.Addon().getAddonInfo('path') + '/resources/channel-highlight.png') self.refreshTimerRunning=True self.refreshImageNr=0
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 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 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']
class ChannelsPreview(xbmcgui.WindowXML ): #needs to be WindowXML or onInit won't fire #print('FAV:'+str(fav)) #favourites=favourites def __new__(cls): # GreenAir: change path return super(ChannelsPreview, cls).__new__(cls, "zattooGUI.xml", __addon__.getAddonInfo('path')) def __init__(self): #super(ChannelsPreview, self).__init__() self.channels = [] self.programms = [] self.controls = [] self.selected = 0 self.highlightImage = '' self.startChannel = 0 self.refreshTimerRunning = False self.updateNr = 0 xbmcgui.Window(10000).setProperty('zattoo_runningView', "preview") def onInit(self): self.highLabel = '' self.rebuildChannels() ''' def onClick(self, controlId): print('CLICKED') i = 20 # why isn't this called!? def onFocus(self): print('HASFOCUS') ''' def onAction(self, action): actionID = action.getId() #print('previewAction'+str(action)) if actionID in [ACTION_PARENT_DIR, KEY_NAV_BACK, ACTION_PREVIOUS_MENU]: self.close() #print('SELF CLOSE') self.refreshTimerRunning = False #xbmc.executebuiltin("PreviousMenu") #elif actionID in [ACTION_BUILT_IN_FUNCTION]: #self.close() elif actionID == ACTION_MOVE_LEFT: self.moveHighlight(-1) elif actionID == ACTION_MOVE_RIGHT: self.moveHighlight(1) elif actionID in [ ACTION_MOVE_UP, ACTION_MOUSE_WHEEL_UP, ACTION_GESTURE_SWIPE_UP ]: self.moveHighlight(-5) elif actionID in [ ACTION_MOVE_DOWN, ACTION_MOUSE_WHEEL_DOWN, ACTION_GESTURE_SWIPE_DOWN ]: self.moveHighlight(5) elif actionID in [ACTION_SELECT_ITEM, ACTION_MOUSE_LEFT_CLICK]: self.refreshTimerRunning = False url = "plugin://" + __addonId__ + "/?mode=watch_c&id=" + self.controls[ self.selected % 16]['channel'] xbmc.executebuiltin('XBMC.RunPlugin(%s)' % url) #xbmc.executebuiltin("Action(FullScreen)") elif actionID == ACTION_MOUSE_MOVE: x = int(action.getAmount1() / (self.getWidth() / 5)) y = int(action.getAmount2() / (self.getHeight() / 4)) if (x > 2 and y < 2): return controlNr = self.selected % 16 step = y * 3 + x - controlNr if (y == 3): step += 2 #don't update current or rollover after last channel if (step == 0 or (self.selected + step > len(self.channels) - 2)): return self.moveHighlight(step, True) def getControlPos(self, nr): if (nr < 6): x = (nr % 3) * 256 y = int(nr / 3) * 180 else: nr = nr - 6 x = (nr % 5) * 256 y = int(nr / 5) * 180 + 360 return {'x': x, 'y': y} 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 rebuildChannels(self): currentChannel = self.db.get_playing()['channel'] #highlight current channel if currentChannel != '0' and (currentChannel in self.channels): self.selected = self.channels[currentChannel]['nr'] else: self.selected = 0 self.showChannels() self.moveHighlight() self.refreshTimerRunning = True self.refreshImageNr = 0 #self.refreshPreviewImages() #threading.Timer(10, self.refreshPreviewImages).start() 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) #xbmc.sleep(50) #self.preloadImageSrc=src #xbmcgui.unlock() ''' def refreshPreviewImages(self): now = int(time.time()) control=self.controls[self.refreshImageNr] if control['visible']: src = 'http://thumb.zattic.com/' + control['channel'] + '/500x288.jpg?r=' + str(now) self.controls[self.refreshImageNr-1]['image'].setImage(self.preloadImageSrc, False) self.preloadImage.setImage(src, False) self.preloadImageSrc=src self.refreshImageNr+=1 if self.refreshImageNr>19:self.refreshImageNr=0 #if self.refreshTimerRunning: # threading.Timer(2, self.refreshPreviewImages).start() ''' def moveHighlight(self, step=0, jump=False): controlNr = self.selected % 16 #move around infoBox if (step == 5 and controlNr < 6): step = 3 elif (step == 5 and controlNr > 13): step = 18 - controlNr elif (step == -5 and controlNr < 10 and controlNr > 2): if (controlNr > 8): step = -(controlNr - 5) else: step = -3 #reset label if self.highLabel: self.controls[controlNr]['label'].setLabel(self.highLabel) #rebuild channels? controlNr += step self.selected += step if self.selected < 0: self.selected = len(self.channels) - 2 #+self.selected+1 self.showChannels() elif self.selected > len(self.channels) - 2: self.selected = 0 #self.selected-len(self.channels)+1 self.showChannels() elif controlNr > 15 or controlNr < 0: self.showChannels() if jump: self.showInfo(jump) else: i = 10 #if hasattr(self, 'showInfoTimer'): self.showInfoTimer.cancel() #self.showInfoTimer = threading.Timer(0.1, self.showInfo) #self.showInfoTimer.start() self.showInfo() #controlNr = self.selected%16 #src = 'http://thumb.zattic.com/' + self.controls[controlNr]['channel'] + '/500x288.jpg?r=' + str(int(time.time())) #self.controls[controlNr]['image'].setImage(src, False) 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 close(self): xbmc.executebuiltin('ActivateWindow(10025,"plugin://' + __addonId__ + '")') xbmcgui.Window(10000).setProperty('zattoo_runningView', "")
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 watch_channel(channel_id, start, end): #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' and str(playing['start'])=='1970-01-01 01:00:00'): 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 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) resultData = _zattooDB_.zapi.exec_zapiCall('/zapi/watch',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, start, 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({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'): 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
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): #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