def showSettings(self, section): settings = self.settings[section][1] if not settings: return self.settingsList.reset() items = [] for setting in settings: item = kodigui.ManagedListItem( setting.label, setting.type != 'BOOL' and setting.valueLabel() or '', data_source=setting) item.setProperty('description', setting.desc) if setting.type == 'BOOL': item.setProperty('checkbox', '1') item.setProperty('checkbox.checked', setting.get() and '1' or '') items.append(item) self.settingsList.reset() self.settingsList.addItems(items)
def fillSettingsList(self, update=False): sItem = self.item.dataSource items = [] for i, e in enumerate(sItem._elements): if not sItem.elementVisible(e): continue attr = e['attr'] mli = kodigui.ManagedListItem( e['name'], e['limits'] != cinemavision.sequence.LIMIT_ACTION and unicode(sItem.getSettingDisplay(attr)) or '', data_source=attr ) if sItem.getType(attr) == int: mli.setProperty('type', 'integer') items.append(mli) if update: self.settingsList.replaceItems(items) else: self.settingsList.reset() self.settingsList.addItems(items) self.setFocusId(self.SETTINGS_LIST_ID)
def fillRoles(self, has_prev=False): items = [] idx = 0 if not self.video.roles: self.rolesListControl.reset() return False for role in self.video.roles(): mli = kodigui.ManagedListItem(role.tag, role.role, thumbnailImage=role.thumb.asTranscodedImageURL(*self.ROLES_DIM), data_source=role) mli.setProperty('index', str(idx)) items.append(mli) idx += 1 if not items: return False self.setProperty('divider.{0}'.format(self.ROLES_LIST_ID), has_prev and '1' or '') self.rolesListControl.reset() self.rolesListControl.addItems(items) return True
def updateProperties(self, **kwargs): if not self.started: return if self.fromSeek: self.setFocusId(self.MAIN_BUTTON_ID) self.fromSeek = 0 self.setProperty('has.bif', self.bifURL and '1' or '') self.setProperty('video.title', self.title) self.setProperty('video.title2', self.title2) self.setProperty('is.show', (self.player.video.type == 'episode') and '1' or '') self.setProperty('time.left', util.timeDisplay(self.duration)) pq = self.handler.playlist if pq: self.setProperty('has.playlist', '1') self.setProperty('pq.isRemote', pq.isRemote and '1' or '') self.setProperty('pq.hasnext', pq.hasNext() and '1' or '') self.setProperty('pq.hasprev', pq.hasPrev() and '1' or '') self.setProperty('pq.repeat', pq.isRepeat and '1' or '') self.setProperty('pq.repeat.one', pq.isRepeatOne and '1' or '') self.setProperty('pq.shuffled', pq.isShuffled and '1' or '') else: self.setProperties(('pq.isRemote', 'pq.hasnext', 'pq.hasprev', 'pq.repeat', 'pq.shuffled', 'has.playlist'), '') self.updateCurrent() div = int(self.duration / 12) items = [] for x in range(12): offset = div * x items.append(kodigui.ManagedListItem(data_source=offset)) self.bigSeekControl.reset() self.bigSeekControl.addItems(items)
def showDevices(self): self.setProperty('tablo.found', '') self.deviceList.reset() tablo.API.discover() self.addTestDevice() for device in sorted(tablo.API.devices.tablos, key=lambda x: x.displayName): if not self.deviceVersionAllowed(device): util.DEBUG_LOG( 'Skipping device because of low version: {0}'.format( device)) continue self.deviceList.addItem( kodigui.ManagedListItem(device.displayName, data_source=device)) self.setProperty('initialized', '1') self.setProperty('tablo.found', '1') if self.deviceList.size(): self.setFocusId(200) else: self.setFocusId(300)
def createListItem(self, episode): if episode.index: subtitle = u'{0}{1} \u2022 {2}{3}'.format(T(32310, 'S'), episode.parentIndex, T(32311, 'E'), episode.index) else: subtitle = episode.originallyAvailableAt.asDatetime('%m/%d/%y') mli = kodigui.ManagedListItem( episode.title, subtitle, thumbnailImage=episode.thumb.asTranscodedImageURL( *self.THUMB_AR16X9_DIM), data_source=episode) mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/show.png') mli.setProperty('episode.number', str(episode.index) or '') mli.setProperty('episode.duration', util.durationToText(episode.duration.asInt())) mli.setProperty('unwatched', not episode.isWatched and '1' or '') # mli.setProperty('progress', util.getProgressImage(obj)) return mli
def fillOptions(self): for i in cinemavision.sequence.ITEM_TYPES: item = kodigui.ManagedListItem( '{0}: {1}'.format(T(32530, 'Add'), i[1]), thumbnailImage='small/script.cinemavision-{0}.png'.format(i[2]), data_source=i[0] ) item.setProperty('thumb.focus', 'small/script.cinemavision-{0}_selected.png'.format(i[2])) self.addItemControl.addItem(item) item = kodigui.ManagedListItem(T(32531, 'Edit'), T(32531, 'Edit'), thumbnailImage='small/script.cinemavision-edit.png', data_source='edit') item.setProperty('alt.thumb', 'small/script.cinemavision-edit.png') item.setProperty('thumb.focus', 'small/script.cinemavision-A_selected.png') self.itemOptionsControl.addItem(item) item = kodigui.ManagedListItem(T(32532, 'Rename'), T(32532, 'Rename'), thumbnailImage='small/script.cinemavision-rename.png', data_source='rename') item.setProperty('alt.thumb', 'small/script.cinemavision-rename.png') item.setProperty('thumb.focus', 'small/script.cinemavision-A_selected.png') self.itemOptionsControl.addItem(item) item = kodigui.ManagedListItem(T(32533, 'Copy'), T(32533, 'Copy'), thumbnailImage='small/script.cinemavision-copy.png', data_source='copy') item.setProperty('alt.thumb', 'small/script.cinemavision-copy.png') item.setProperty('thumb.focus', 'small/script.cinemavision-A_selected.png') self.itemOptionsControl.addItem(item) item = kodigui.ManagedListItem(T(32534, 'Move'), T(32534, 'Move'), thumbnailImage='small/script.cinemavision-move.png', data_source='move') item.setProperty('alt.thumb', 'small/script.cinemavision-move.png') item.setProperty('thumb.focus', 'small/script.cinemavision-A_selected.png') self.itemOptionsControl.addItem(item) item = kodigui.ManagedListItem(T(32535, 'Disable'), T(32535, 'Disable'), thumbnailImage='small/script.cinemavision-disable.png', data_source='enable') item.setProperty('alt.thumb', 'small/script.cinemavision-enable.png') item.setProperty('thumb.focus', 'small/script.cinemavision-A_selected.png') self.itemOptionsControl.addItem(item) item = kodigui.ManagedListItem(T(32536, 'Remove'), T(32536, 'Remove'), thumbnailImage='small/script.cinemavision-minus.png', data_source='remove') item.setProperty('alt.thumb', 'small/script.cinemavision-minus.png') item.setProperty('thumb.focus', 'small/script.cinemavision-A_selected.png') self.itemOptionsControl.addItem(item)
def fillRelated(self, has_prev=False): items = [] idx = 0 if not self.video.related: self.relatedListControl.reset() return False for rel in self.video.related()[0].items: mli = kodigui.ManagedListItem(rel.title or '', thumbnailImage=rel.thumb.asTranscodedImageURL(*self.RELATED_DIM), data_source=rel) if mli: mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/{0}.png'.format(rel.type in ('show', 'season', 'episode') and 'show' or 'movie')) mli.setProperty('index', str(idx)) items.append(mli) idx += 1 if not items: return False self.setProperty('divider.{0}'.format(self.RELATED_LIST_ID), has_prev and '1' or '') self.relatedListControl.reset() self.relatedListControl.addItems(items) return True
def start(self): self.setProperty('busy', '1') try: users = plexapp.ACCOUNT.homeUsers items = [] for user in users: # thumb, back = image.getImage(user.thumb, user.id) # mli = kodigui.ManagedListItem(user.title, thumbnailImage=thumb, data_source=user) mli = kodigui.ManagedListItem(user.title, user.title[0].upper(), data_source=user) mli.setProperty('pin', user.title) # mli.setProperty('back.image', back) mli.setProperty('protected', user.isProtected and '1' or '') mli.setProperty('admin', user.isAdmin and '1' or '') items.append(mli) self.userList.addItems(items) self.task = UserThumbTask().setup(users, self.userThumbCallback) backgroundthread.BGThreader.addTask(self.task) self.setFocusId(self.USER_LIST_ID) self.setProperty('initialized', '1') finally: self.setProperty('busy', '')
def fillRecordings(self): items = [] self.count = 0 for r in self.storageServer.recordings: if self.groupID and not r.displayGroupID == self.groupID: continue item = kodigui.ManagedListItem(r.episodeTitle, r.synopsis, thumbnailImage=r.icon, data_source=r) item.setProperty('series.title', r.seriesTitle) item.setProperty('episode.number', r.episodeNumber) #item.setProperty('channel.number',r.channelNumber) #item.setProperty('channel.name',r.channelName) item.setProperty('air.date', r.displayDate()) item.setProperty('air.time', r.displayTime()) item.setProperty('original.date', r.displayDate(original=True)) items.append(item) self.sortItems(items) self.recordingList.reset() self.recordingList.addItems(items) self.count = self.recordingList.size() self.setFocusId(self.RECORDING_LIST_ID)
def fillRules(self,update=False): self.lastRulesRefresh = time.time() if update: self.storageServer.updateRules() items = [] for r in self.storageServer.rules: item = kodigui.ManagedListItem(r.title,data_source=r) if r.dateTimeOnly: item.setProperty('rule.recent_only','{0} at {1}'.format(r.displayDateDTO(), r.displayTimeDTO())) elif r.teamOnly: item.setProperty('rule.recent_only', '{0}: {1}'.format('TEAM', r.teamOnly)) else: item.setProperty('rule.recent_only',r.recentOnly and T(32805) or T(32806)) item.setProperty('seriesID', r.seriesID) #print '{0} {1}'.format(r.ruleID, r.title) items.append(item) if not items: util.setGlobalProperty('NO_RULES',self.storageServer.getRulesFailed and u'[COLOR 80FF0000]{0}[/COLOR]'.format(T(32830)) or T(32804)) else: util.setGlobalProperty('NO_RULES','') self.ruleList.reset() self.ruleList.addItems(items)
def createMovieListItem(self, movie): mli = kodigui.ManagedListItem(movie.title, movie.year, thumbnailImage=movie.art.asTranscodedImageURL(*self.LI_AR16X9_THUMB_DIM), data_source=movie) mli.setProperty('track.duration', util.durationToShortText(movie.duration.asInt())) mli.setProperty('video', '1') mli.setProperty('watched', movie.isWatched and '1' or '') return mli
def createListItem(self, obj): mli = kodigui.ManagedListItem( obj.title or '', thumbnailImage=obj.thumb.asTranscodedImageURL(*self.EXTRA_DIM), data_source=obj) return mli
def createListItem(self, obj): mli = kodigui.ManagedListItem(obj.title, data_source=obj) mli.setProperty('track.number', str(obj.index) or '') mli.setProperty('track.duration', util.simplifiedTimeDisplay(obj.duration.asInt())) return mli
def fillPhotos(self): self.setBoolProperty('no.content', False) self.setBoolProperty('no.content.filtered', False) items = [] keys = [] self.firstOfKeyItems = {} idx = 0 if self.section.TYPE == 'photodirectory': photos = self.section.all() else: photos = self.section.all(filter_=self.getFilterOpts(), sort=self.getSortOpts(), unwatched=self.filterUnwatched) if not photos: return photo = random.choice(photos) self.setProperty( 'background', photo.art.asTranscodedImageURL( self.width, self.height, blur=128, opacity=60, background=colors.noAlpha.Background)) thumbDim = TYPE_KEYS.get(self.section.type, TYPE_KEYS['movie'])['thumb_dim'] fallback = 'script.plex/thumb_fallbacks/{0}.png'.format( TYPE_KEYS.get(self.section.type, TYPE_KEYS['movie'])['fallback']) if not photos: if self.filter or self.filterUnwatched: self.setBoolProperty('no.content.filtered', True) else: self.setBoolProperty('no.content', True) return for photo in photos: title = photo.title if photo.TYPE == 'photodirectory': thumb = photo.composite.asTranscodedImageURL(*thumbDim) mli = kodigui.ManagedListItem(title, thumbnailImage=thumb, data_source=photo) mli.setProperty('is.folder', '1') else: thumb = photo.defaultThumb.asTranscodedImageURL(*thumbDim) label2 = util.cleanLeadingZeros( photo.originallyAvailableAt.asDatetime('%d %B %Y')) mli = kodigui.ManagedListItem(title, label2, thumbnailImage=thumb, data_source=photo) mli.setProperty('thumb.fallback', fallback) mli.setProperty('index', str(idx)) key = title[0].upper() if key not in KEYS: key = '#' if key not in keys: self.firstOfKeyItems[key] = mli keys.append(key) mli.setProperty('key', str(key)) items.append(mli) idx += 1 litems = [] self.keyItems = {} for i, key in enumerate(keys): mli = kodigui.ManagedListItem(key, data_source=key) mli.setProperty('key', key) mli.setProperty('original', '{0:02d}'.format(i)) self.keyItems[key] = mli litems.append(mli) self.showPanelControl.reset() self.keyListControl.reset() self.showPanelControl.addItems(items) self.keyListControl.addItems(litems) if keys: self.setProperty('key', keys[0])
def fillShows(self): self.setBoolProperty('no.content', False) self.setBoolProperty('no.content.filtered', False) items = [] jitems = [] self.keyItems = {} self.firstOfKeyItems = {} totalSize = 0 jumpList = self.section.jumpList(filter_=self.getFilterOpts(), sort=self.getSortOpts(), unwatched=self.filterUnwatched) idx = 0 fallback = 'script.plex/thumb_fallbacks/{0}.png'.format( TYPE_KEYS.get(self.section.type, TYPE_KEYS['movie'])['fallback']) if not jumpList: if self.filter or self.filterUnwatched: self.setBoolProperty('no.content.filtered', True) else: self.setBoolProperty('no.content', True) return for kidx, ji in enumerate(jumpList): mli = kodigui.ManagedListItem(ji.title, data_source=ji.key) mli.setProperty('key', ji.key) mli.setProperty('original', '{0:02d}'.format(kidx)) self.keyItems[ji.key] = mli jitems.append(mli) totalSize += ji.size.asInt() for x in range(ji.size.asInt()): mli = kodigui.ManagedListItem('') mli.setProperty('key', ji.key) mli.setProperty('thumb.fallback', fallback) mli.setProperty('index', str(idx)) items.append(mli) if not x: # i.e. first item self.firstOfKeyItems[ji.key] = mli idx += 1 self.showPanelControl.reset() self.keyListControl.reset() self.showPanelControl.addItems(items) self.keyListControl.addItems(jitems) if jumpList: self.setProperty('key', jumpList[0].key) tasks = [] for start in range(0, totalSize, 500): tasks.append(ChunkRequestTask().setup( self.section, start, 500, self.chunkCallback, filter_=self.getFilterOpts(), sort=self.getSortOpts(), unwatched=self.filterUnwatched)) self.tasks = tasks backgroundthread.BGThreader.addTasksToFront(tasks)
def fillShows(self, reset=False, clear=False): self.setProperty('show.recent', '') self.cancelTasks() self.setProperty('busy', '1') self.lastKey = None lastPath = None selectItem = None lastPos = None if not reset: currentItem = self.showList.getSelectedItem() if currentItem: lastPath = currentItem.dataSource['path'] lastPos = currentItem.pos() self.showItems = {} if clear: self.showList.reset() self.keysList.reset() args = {} if self.state: args = {'state': self.state} try: if self.filter == 'SERIES': keys = tablo.API.views(self.view).series.get(**args) elif self.filter == 'MOVIES': keys = tablo.API.views(self.view).movies.get(**args) elif self.filter == 'SPORTS': keys = tablo.API.views(self.view).sports.get(**args) elif self.filter == 'MANUAL': keys = tablo.API.views(self.view).programs.get(**args) else: keys = tablo.API.views(self.view).shows.get(**args) except tablo.ConnectionError: self.setProperty('busy', '') msg = T(32125).format(tablo.API.device.displayName) self.showList.reset() self.keysList.reset() self.setProperty('empty.message', msg) # xbmcgui.Dialog().ok('Connection Failure', msg) return except: msg = util.ERROR() self.showList.reset() self.keysList.reset() self.setProperty('busy', '') self.setProperty('empty.message', u'{0}: {1}'.format(T(32126), msg)) xbmcgui.Dialog().ok(T(32126), u'{0}: {1}'.format(T(32126), msg)) return paths = [] keyitems = [] items = [] ct = 0 for i, k in enumerate(keys): key = k['key'] keyitem = kodigui.ManagedListItem(key.upper()) keyitem.setProperty('key', key) self.lastSelectedKey = self.lastSelectedKey or key if k.get('contents'): keyitem.setProperty('has.contents', '1') for p in k['contents']: ct += 1 paths.append(p) item = kodigui.ManagedListItem(data_source={ 'path': p, 'key': key, 'show': None }) if p == lastPath: selectItem = item item.setProperty('key', key) if ct > 6: item.setProperty('after.firstrow', '1') self.showItems[p] = item items.append(item) keyitems.append(keyitem) self.keys[k['key']] = i self.showList.reset() self.keysList.reset() self.keysList.addItems(keyitems) self.showList.addItems(items) if selectItem: self.showList.selectItem(selectItem.pos()) elif lastPos: if self.showList.positionIsValid(lastPos): self.showList.selectItem(lastPos) else: if lastPos > 0: self.showList.selectItem(self.showList.size() - 1) # Select last item if items: self.setProperty('empty.message', '') self.setProperty('empty.message2', '') if self.getFocusId() in (51, 400): self.setFocusId(self.SHOW_PANEL_ID) else: self.setProperty('busy', '') if self.filter == 'SERIES': message = self.emptyMessageTVShows elif self.filter == 'MOVIES': message = self.emptyMessageMovies elif self.filter == 'SPORTS': message = self.emptyMessageSports else: message = self.emptyMessage self.setProperty('empty.message', message[0]) if len(message) > 1: self.setProperty('empty.message2', message[1]) self.getShowData(paths) self.updateKey()
def fillAirings(self): self.setEmptyMessage(clear=True) self.airingsList.reset() self.airingItems = {} airings = [] airingIDX = 0 if isinstance(self._show, tablo.Series): seasons = self._show.seasons() if seasons: seasonsData = tablo.API.batch.post(seasons) first = True for seasonPath in seasons: self.seasonCount += 1 season = seasonsData[seasonPath] number = season['season']['number'] title = number and T(32155).format(number) or T(32156) item = kodigui.ManagedListItem('', data_source={ 'path': None, 'airing': None }) item.setProperty('header', '1') self.airingsList.addItem(item) item = kodigui.ManagedListItem(title, data_source={ 'path': None, 'airing': None }) item.setProperty('header', '1') item.setProperty('top', '1') self.airingsList.addItem(item) seasonEps = tablo.API(seasonPath).episodes.get() airings += seasonEps for p in seasonEps: item = kodigui.ManagedListItem('', data_source={ 'path': p, 'airing': None }) item.setProperty('pos', str(airingIDX)) airingIDX += 1 if first: first = False item.setProperty('top', '1') self.airingItems[p] = item self.airingsList.addItem(item) else: airings = self._show.airings() item = kodigui.ManagedListItem('', data_source={ 'path': None, 'airing': None }) item.setProperty('header', '1') self.airingsList.addItem(item) first = True for p in airings: item = kodigui.ManagedListItem('', data_source={ 'path': p, 'airing': None }) item.setProperty('pos', str(airingIDX)) airingIDX += 1 if first: first = False item.setProperty('top', '1') self.airingItems[p] = item self.airingsList.addItem(item) if not self.airingItems: self.setEmptyMessage() self.getAiringData(airings)
def mcList(self, category='all'): items = [] category = plugintools.get_setting('mcLastCategory') if category == '' or category == None: category = 'all' plugintools.log('get mc category:' + category) self.programsList.reset() apiEndpoint = self.vader.apiEndpoint manualOffsetEnabled = plugintools.get_setting("mc_timezone_enable") mcBackward = float( plugintools.get_setting("mc_backward")) * 60 * 60 * -1 mcForward = float(plugintools.get_setting("mc_forward")) * 60 * 60 username = self.vader.username password = self.vader.password embedded = self.vader.embedded if self.mcData == None: data = self.getCachedData() self.mcData = json.loads(data.decode('utf-8')) if manualOffsetEnabled == 'true': offset = float(plugintools.get_setting('mc_timezone')) offset = offset * 60 * 60 else: offset = 0 timeNow = int(time.time()) validItems = [] itemsAdded = 0 for epgItem in self.mcData: name = epgItem['name'].encode('utf-8') startTime = epgItem['startTime'] endTime = epgItem['endTime'] stream = epgItem['stream'] addItem = False if int(endTime) > timeNow and int(startTime) < timeNow: addItem = True if int(startTime) - timeNow < 0 and int( startTime) - timeNow > mcBackward: addItem = True if int(startTime) - timeNow > 0 and int( startTime) - timeNow < mcForward: addItem = True if addItem == True: validItems.append(epgItem) sortedEpg = sorted(validItems, key=lambda k: k['startTime']) for epgItem in sortedEpg: startTime = int(epgItem['startTime']) + int(offset) endTime = int(epgItem['endTime']) + int((offset)) quality = epgItem['quality'] ss_chan = epgItem['ss_stream'] itemCategory = epgItem['category'] name = epgItem['name'] parentId = epgItem['parentId'] if category.lower() in itemCategory.lower() or category.lower( ) in 'all': if '0' == parentId: startTimeString = datetime.fromtimestamp( int(startTime)).strftime("%a - %H:%M") title = '[COLOR crimson]' + itemCategory + '[/COLOR] ' + epgItem[ 'name'] if embedded == True: timeNow = time.time() diffTime = timeNow % 3600 tokenTime = timeNow - diffTime base = 'live' extension = 'ts' tokenString = username + password + str( epgItem['stream']) + str(tokenTime) token = hashlib.md5(tokenString).hexdigest() chanUrl = 'http://{apiEndpoint}/boxRedir?token={token}&stream={stream}&base={base}&extension={extension}&plugin={plugin}'.format( apiEndpoint=apiEndpoint, token=token, stream=epgItem['stream'], base=base, extension=extension, plugin=ADDONID) else: chanUrl = 'http://%s/live/%s/%s/%s.%s' % ( apiEndpoint, username, password, epgItem['stream'], 'ts') listitem = xbmcgui.ListItem(title, iconImage="DefaultVideo.png") info_labels = { "Title": title, "FileName": title, "Plot": title } listitem.setInfo("video", info_labels) listitem.setProperty('IsPlayable', 'true') item = kodigui.ManagedListItem( title, startTimeString, iconImage=None, data_source=chanUrl, versions=epgItem['versions']) qtex = '' if endTime < time.time(): item.setProperty('old', 'old') elif startTime <= time.time(): prog = ((timeNow - startTime) / float(endTime - startTime)) * 100 prog = int(prog - (prog % 5)) tex = 'progress/script-progress_{0}.png'.format(prog) item.setProperty('playing', tex) if epgItem['versions'] == None: item.setProperty('channel', str('#' + ss_chan)) if '720p' in quality.lower(): qtex = 'script-hd_720p.png' elif '1080i' in quality.lower(): qtex = 'script-hd_1080i.png' elif 'UHD' in quality.lower(): qtex = 'script-hd_720p.png' else: for version in epgItem['versions']: if '(720p' in version['name'].lower(): qtex = 'script-hd_720p.png' elif '(1080i' in version['name'].lower(): qtex = 'script-hd_1080i.png' elif '(UHD' in version['name'].lower(): qtex = 'script-hd_720p.png' itemsAdded = itemsAdded + 1 items.append(item) item.setProperty('quality', qtex) self.programsList.addItems(items) for i in range(len(items)): if not items[i].getProperty('old'): self.programsList.selectItem(i) break plugintools.log(str(itemsAdded)) if itemsAdded == 0: plugintools.log('no events for category') item = kodigui.ManagedListItem( 'No Upcoming Events in {category}'.format(category=category), '', iconImage=None, data_source=None, versions=None) self.programsList.addItem(item) return True
def fillSequence(self): mli = kodigui.ManagedListItem() self.sequenceControl.addItem(mli)
def fillRecent(self): self.setProperty('show.recent', '1') self.showList.reset() self.airingsList.reset() self.showItems = {} airings = [] self.setProperty('busy', '1') recentDates = tablo.API.views.recordings.recent.get() first = True now = time.localtime() for date in recentDates: tt = time.strptime(date['key'], '%Y-%m-%d') label = None if tt.tm_year == now.tm_year: if tt.tm_yday == now.tm_yday: label = T(32184) elif tt.tm_yday == now.tm_yday - 1: label = T(32185) label = label or time.strftime('%A, %B %d', tt) item = kodigui.ManagedListItem(label, data_source={ 'path': None, 'airing': None }) item.setProperty('header', '1') item.setProperty('top', '1') if not first: item.setProperty('after.firstrow', '1') self.airingsList.addItem(item) for airingPath in date['contents']: airings.append(airingPath) item = kodigui.ManagedListItem('', data_source={ 'path': airingPath, 'airing': None }) if first: first = False item.setProperty('top', '1') else: item.setProperty('after.firstrow', '1') self.showItems[airingPath] = item self.airingsList.addItem(item) if self.airingsList.size(): self.setProperty('empty.message', '') self.setProperty('empty.message2', '') if self.getFocusId() in (51, 400): self.setFocusId(self.RECENT_LIST_ID) self.getAiringData(airings) else: self.setProperty('busy', '') self.setProperty('empty.message', T(32186))
def _showHub(self, hub, hubitems=None, index=None, with_progress=False, with_art=False, ar16x9=False, text2lines=False, **kwargs): control = self.hubControls[index] control.dataSource = hub if not hub.items and not hubitems: control.reset() return if not hubitems: hub.reset() self.setProperty('hub.4{0:02d}'.format(index), hub.title or kwargs.get('title')) self.setProperty('hub.text2lines.4{0:02d}'.format(index), text2lines and '1' or '') items = [] for obj in hubitems or hub.items: if not self.backgroundSet: self.backgroundSet = True self.setProperty( 'background', obj.art.asTranscodedImageURL( self.width, self.height, blur=128, opacity=60, background=colors.noAlpha.Background)) mli = self.createListItem(obj, wide=with_art) if mli: items.append(mli) if with_progress: for mli in items: mli.setProperty('progress', util.getProgressImage(mli.dataSource)) if with_art: for mli in items: mli.setThumbnailImage( mli.dataSource.art.asTranscodedImageURL( *self.THUMB_AR16X9_DIM)) mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/movie16x9.png') if ar16x9: for mli in items: mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/movie16x9.png') if hub.more.asBool(): end = kodigui.ManagedListItem('') end.setBoolProperty('is.end', True) items.append(end) if hubitems: end = control.size() - 1 control.replaceItem(end, items[0]) control.addItems(items[1:]) control.selectItem(end) else: control.replaceItems(items)
def mcList(self, category='all'): items = [] category = plugintools.get_setting('mcLastCategory') if category == '' or category == None: category = 'all' self.programsList.reset() apiEndpoint = self.vader.apiEndpoint manualOffsetEnabled = plugintools.get_setting("mc_timezone_enable") username = self.vader.username password = self.vader.password embedded = self.vader.embedded from_zone = tz.tzutc() to_zone = tz.tzlocal() if self.mcData == None: data = self.getCachedData() self.mcData = json.loads(data.decode('utf-8')) if manualOffsetEnabled == True: offset = float(plugintools.get_setting('mc_timezone')) else: offset = -1000 if offset != -1000: timeNow = datetime.utcnow().replace( tzinfo=tzoffset('UTC+0', 0)) + timedelta(hours=int(offset)) else: timeNow = datetime.utcnow().replace(tzinfo=tzoffset('UTC+0', 0)) itemsAdded = 0 sortedEpg = sorted(self.mcData, key=lambda k: k['startTime']) for epgItem in sortedEpg: if len(epgItem['streams']) > 0: if offset != -1000: startTime = dateutil.parser.parse( epgItem['startTime']) + timedelta(hours=int(offset)) endTime = dateutil.parser.parse( epgItem['endTime']) + timedelta(hours=int(offset)) else: startTime = dateutil.parser.parse(epgItem['startTime']) startTime = startTime.replace(tzinfo=from_zone) startTime = startTime.astimezone(to_zone) endTime = dateutil.parser.parse(epgItem['endTime']) endTime = endTime.replace(tzinfo=from_zone) endTime = endTime.astimezone(to_zone) itemCategory = epgItem['category']['name'] name = epgItem['title'] if category.lower() in itemCategory.lower() or category.lower( ) in 'all': startTimeString = startTime.strftime("%a - %H:%M") title = '[COLOR crimson]' + itemCategory + '[/COLOR] ' + epgItem[ 'title'] if embedded == True: diffTime = to_timestamp(timeNow) % 3600 tokenTime = to_timestamp(timeNow) - diffTime base = 'live' extension = self.vader.stream_format tokenString = username + password + str( epgItem['streams'][0]['id']) + str(tokenTime) token = hashlib.md5(tokenString).hexdigest() chanUrl = 'http://{apiEndpoint}/boxRedir?token={token}&stream={stream}&base={base}&extension={extension}&plugin={plugin}'.format( apiEndpoint=apiEndpoint, token=token, stream=epgItem['streams'][0]['id'], base=base, extension=extension, plugin=ADDONID) else: tokenDict = {} tokenDict['username'] = username tokenDict['password'] = password jsonToken = json.dumps(tokenDict) import base64 tokens = base64.b64encode(jsonToken) chanUrl = 'http://vapi.vaders.tv/play/{streamId}.m3u8?token={token}'.format( token=tokens, streamId=epgItem['streams'][0]['id']) listitem = xbmcgui.ListItem(title, iconImage="DefaultVideo.png") info_labels = { "Title": title, "FileName": title, "Plot": title } listitem.setInfo("video", info_labels) listitem.setProperty('IsPlayable', 'true') item = kodigui.ManagedListItem(title, startTimeString, iconImage=None, data_source=chanUrl, versions=epgItem['streams']) endTimeTS = self.totimestamp( endTime.astimezone(from_zone).replace(tzinfo=None)) timeNowTS = self.totimestamp( timeNow.astimezone(from_zone).replace(tzinfo=None)) startTimeTS = self.totimestamp( startTime.astimezone(from_zone).replace(tzinfo=None)) qtex = '' if endTimeTS < timeNowTS: item.setProperty('old', 'old') elif startTimeTS <= timeNowTS: # prog = ((to_timestamp(timeNow) - to_timestamp(startTime)) / float(to_timestamp(endTime)-to_timestamp(startTime))) * 100 prog = ((float(timeNowTS) - float(startTimeTS)) / (float(endTimeTS) - float(startTimeTS))) * 100 # 1511760353 - 1511753400 / 1511760600-1511753400 # 6953 /7,200 prog = int(prog - (prog % 5)) tex = 'progress/script-progress_{0}.png'.format(prog) item.setProperty('playing', tex) for version in epgItem['streams']: if '(720p' in version['name'].lower(): qtex = 'script-hd_720p.png' elif '(1080i' in version['name'].lower(): qtex = 'script-hd_1080i.png' elif '(UHD' in version['name'].lower(): qtex = 'script-hd_720p.png' else: item.setProperty('old', 'old') timeNowTS = self.totimestamp( timeNow.astimezone(from_zone).replace(tzinfo=None)) startTimeTS = self.totimestamp( startTime.astimezone(from_zone).replace( tzinfo=None)) timeinMins = (startTimeTS - timeNowTS) / 60 timeLabel = 'Starts in {mins} minutes'.format( mins=timeinMins) if timeinMins > 60: timeLabel = 'Starts in {hours} hours'.format( hours=int(math.ceil(timeinMins / 60)) + 1) item.setProperty('startsin', timeLabel) itemsAdded = itemsAdded + 1 items.append(item) item.setProperty('quality', qtex) if len(epgItem['streams']) == 1: item.setProperty('duration', epgItem['streams'][0]['name']) self.programsList.addItems(items) for i in range(len(items)): if not items[i].getProperty('old'): self.programsList.selectItem(i) break plugintools.log(str(itemsAdded)) if itemsAdded == 0: plugintools.log('no events for category') item = kodigui.ManagedListItem( 'No Upcoming Events in {category}'.format(category=category), '', iconImage=None, data_source=None, versions=None) self.programsList.addItem(item) return True