def contextClearPreviews(): context_menu = [] if PLUGIN.get_setting('live_previews_enable', unicode) == 'true': notify = str(notifyRefresh()) context_menu.extend([(PLUGIN.get_string(30084), 'RunPlugin(%s)' % PLUGIN.url_for(endpoint='clearLivePreviews', notify=notify))]) return context_menu
def refreshPreviews(): if PLUGIN.get_setting('live_previews_enable', unicode) != 'true': return if PLUGIN.get_setting('refresh_previews', unicode) == 'true': refresh_interval = PLUGIN.get_setting('refresh_interval', int) * 60 if getRefreshDiff() >= refresh_interval: setRefeshStamp() TextureCacheCleaner().remove_like(LIVE_PREVIEW_IMAGE, notifyRefresh())
def searchresults(query, index='0'): index, offset, limit = utils.calculatePaginationValues(index) streams = TWITCHTV.searchStreams(query, offset, limit) items = [CONVERTER.convertStreamToListItem(stream) for stream in streams] items.append(utils.linkToNextPage('searchresults', index, query=query)) utils.refreshPreviews() PLUGIN.set_content(utils.getContentType()) return items
def createListOfFeaturedStreams(): featuredStreams = TWITCHTV.getFeaturedStream() utils.refreshPreviews() PLUGIN.set_content(utils.getContentType()) return [ CONVERTER.convertStreamToListItem(featuredStream[Keys.STREAM]) for featuredStream in featuredStreams ]
def linkToNextPage(target, currentIndex, **kwargs): return { 'label': PLUGIN.get_string(30011), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': theArt(), 'path': PLUGIN.url_for(target, index=str(currentIndex + 1), **kwargs) }
def createListOfTeams(index): index = int(index) teams = TWITCHTV.getTeams(index) items = [CONVERTER.convertTeamToListItem(item) for item in teams] if len(teams) == 25: items.append(utils.linkToNextPage('createListOfTeams', index)) PLUGIN.set_content(utils.getContentType()) return items
def createListOfGames(index): index, offset, limit = utils.calculatePaginationValues(index) games = TWITCHTV.getGames(offset, limit) items = [CONVERTER.convertGameToListItem(element[Keys.GAME]) for element in games] items.append(utils.linkToNextPage('createListOfGames', index)) PLUGIN.set_content(utils.getContentType()) return items
def execIrcPlugin(channel): if PLUGIN.get_setting('irc_enable', unicode) != 'true': return uname = PLUGIN.get_setting('irc_username', unicode) passwd = getOauthToken(token_only=False) host = 'irc.chat.twitch.tv' scrline = 'RunScript(script.ircchat, run_irc=True&nickname=%s&username=%s&password=%s&host=%s&channel=#%s)' % \ (uname, uname, passwd, host, channel) xbmc.executebuiltin(scrline)
def execIrcPlugin(channel): if PLUGIN.get_setting('irc_enable', unicode) != 'true': return uname = PLUGIN.get_setting('irc_username', unicode) passwd = PLUGIN.get_setting('irc_password', unicode) host = 'irc.chat.twitch.tv' scrline = 'RunScript(script.ircchat, run_irc=True&nickname=%s&username=%s&password=%s&host=%s&channel=#%s)' % \ (uname, uname, passwd, host, channel) xbmc.executebuiltin(scrline)
def createListForGame(gameName, index): index, offset, limit = utils.calculatePaginationValues(index) items = [CONVERTER.convertStreamToListItem(stream) for stream in TWITCHTV.getGameStreams(gameName, offset, limit)] items.append(utils.linkToNextPage('createListForGame', index, gameName=gameName)) utils.refreshPreviews() PLUGIN.set_content(utils.getContentType()) return items
def channelVideosList(name, index, broadcast_type): index = int(index) offset = index * 8 videos = TWITCHTV.getFollowerVideos(name, offset, broadcast_type) items = [CONVERTER.convertVideoListToListItem(video) for video in videos[Keys.VIDEOS]] if videos[Keys.TOTAL] > (offset + 8): items.append(utils.linkToNextPage('channelVideosList', index, name=name, broadcast_type=broadcast_type)) PLUGIN.set_content(utils.getContentType()) return items
def createFollowingGameList(): username = utils.getUserName() if not username: utils.notification(PLUGIN.get_string(30095)) else: games = TWITCHTV.getFollowingGames(username) items = [CONVERTER.convertGameToListItem(element) for element in games] PLUGIN.set_content(utils.getContentType()) return items
def channelVideosList(name, index, past): index = int(index) offset = index * 8 videos = TWITCHTV.getFollowerVideos(name, offset, past) items = [CONVERTER.convertVideoListToListItem(video) for video in videos[Keys.VIDEOS]] if videos[Keys.TOTAL] > (offset + 8): items.append(utils.linkToNextPage('channelVideosList', index, name=name, past=past)) PLUGIN.set_content(utils.getContentType()) return items
def handleTwitchException(exception): codeTranslations = {TwitchException.NO_STREAM_URL: 30023, TwitchException.STREAM_OFFLINE: 30021, TwitchException.HTTP_ERROR: 30020, TwitchException.JSON_ERROR: 30027, TwitchException.NO_PLAYABLE: 30080} code = exception.code title = 30010 msg = codeTranslations[code] PLUGIN.notify(PLUGIN.get_string(title), PLUGIN.get_string(msg), image=Images.ICON)
def play(item, listItem): fromAddon = xbmc.getInfoLabel('Container.PluginName') == PLUGIN.id withPlayer = int(sys.argv[1]) == -1 if withPlayer or not fromAddon: playbackItem = xbmcgui.ListItem(label=listItem.get('label', ''), thumbnailImage=listItem.get('thumbnail', Images.VIDEOTHUMB), path=listItem.get('path', item)) playbackItem.setProperty('IsPlayable', 'true') xbmc.Player().play(item, playbackItem) else: PLUGIN.set_resolved_url(listItem)
def play(item, listItem): fromAddon = xbmc.getInfoLabel('Container.PluginName') == PLUGIN.id withPlayer = int(sys.argv[1]) == -1 if withPlayer or not fromAddon: playbackItem = xbmcgui.ListItem(label=listItem.get('label', ''), path=listItem.get('path', item)) playbackItem.setArt(theArt({'thumb': listItem.get('thumbnail', Images.VIDEOTHUMB)})) playbackItem.setProperty('IsPlayable', 'true') xbmc.Player().play(item, playbackItem) else: PLUGIN.set_resolved_url(listItem)
def getOauthToken(token_only=True): oauthtoken = PLUGIN.get_setting('oauth_token', unicode) if not oauthtoken: PLUGIN.open_settings() oauthtoken = PLUGIN.get_setting('oauth_token', unicode) if oauthtoken: if token_only: oauthtoken = oauthtoken.replace('oauth:', '') else: if not oauthtoken.lower().startswith('oauth:'): oauthtoken = 'oauth:{0}'.format(oauthtoken) return oauthtoken
def handleTwitchException(exception): codeTranslations = { TwitchException.NO_STREAM_URL: 30023, TwitchException.STREAM_OFFLINE: 30021, TwitchException.HTTP_ERROR: 30020, TwitchException.JSON_ERROR: 30027, TwitchException.NO_PLAYABLE: 30080 } code = exception.code title = 30010 msg = codeTranslations[code] PLUGIN.notify(PLUGIN.get_string(title), PLUGIN.get_string(msg), image=Images.ICON)
def channelVideos(name): items = [{'label': PLUGIN.get_string(30078), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'path': PLUGIN.url_for(endpoint='channelVideosList', name=name, index=0, broadcast_type='archive')}, {'label': PLUGIN.get_string(30113), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'path': PLUGIN.url_for(endpoint='channelVideosList', name=name, index=0, broadcast_type='upload')}, {'label': PLUGIN.get_string(30079), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'path': PLUGIN.url_for(endpoint='channelVideosList', name=name, index=0, broadcast_type='highlight')}] PLUGIN.set_content(utils.getContentType()) return items
def getVideoQuality(quality=''): """ :param quality: string int/int: qualities[quality] qualities 0 = Best, 1 = 720, 2 = 480, 3 = 360, 4 = 226, -1 = Choose quality dialog * any other value for quality will use addon setting i18n: 0 = 30041, 1 = 30042, 2 = 30043, 3 = 30044, 4 = 30063 """ qualities = {'-1': -1, '0': 0, '1': 1, '2': 2, '3': 3, '4': 4} i18n_qualities = [ PLUGIN.get_string(30041), PLUGIN.get_string(30042), PLUGIN.get_string(30043), PLUGIN.get_string(30044), PLUGIN.get_string(30063) ] try: quality = int(quality) if 4 >= quality >= 0: chosenQuality = str(quality) elif quality == -1: chosenQuality = str(xbmcgui.Dialog().select( PLUGIN.get_string(30077), i18n_qualities)) else: raise ValueError except ValueError: chosenQuality = PLUGIN.get_setting('video', unicode) if chosenQuality == '-1': # chosenQuality == '-1' if dialog was cancelled return int(chosenQuality) else: return qualities.get(chosenQuality, sys.maxint)
def getVideoQuality(quality=''): """ :param quality: string int/int: qualities[quality] qualities 0 = Best, 1 = 720, 2 = 480, 3 = 360, 4 = 226, -1 = Choose quality dialog * any other value for quality will use addon setting i18n: 0 = 30041, 1 = 30042, 2 = 30043, 3 = 30044, 4 = 30063 """ qualities = {'-1': -1, '0': 0, '1': 1, '2': 2, '3': 3, '4': 4} i18n_qualities = [PLUGIN.get_string(30041), PLUGIN.get_string(30042), PLUGIN.get_string(30043), PLUGIN.get_string(30044), PLUGIN.get_string(30063)] try: quality = int(quality) if 4 >= quality >= 0: chosenQuality = str(quality) elif quality == -1: chosenQuality = str(xbmcgui.Dialog().select(PLUGIN.get_string(30077), i18n_qualities)) else: raise ValueError except ValueError: chosenQuality = PLUGIN.get_setting('video', unicode) if chosenQuality == '-1': # chosenQuality == '-1' if dialog was cancelled return int(chosenQuality) else: return qualities.get(chosenQuality, sys.maxint)
def getContentType(): chosenType = PLUGIN.get_setting('contenttypes', unicode) contentTypes = { '0': 'files', '1': 'tvshows', '2': 'movies', '3': 'episodes', '4': 'musicvideos' } return contentTypes.get(chosenType, 'files')
def getMediaType(): chosenType = PLUGIN.get_setting('contenttypes', unicode) mediaTypes = { '0': 'video', '1': 'tvshow', '2': 'movie', '3': 'episode', '4': 'musicvideo' } return mediaTypes.get(chosenType, 'video')
def channelVideos(name): items = [{ 'label': PLUGIN.get_string(30078), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'path': PLUGIN.url_for(endpoint='channelVideosList', name=name, index=0, past='true') }, { 'label': PLUGIN.get_string(30079), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'path': PLUGIN.url_for(endpoint='channelVideosList', name=name, index=0, past='false') }] PLUGIN.set_content(utils.getContentType()) return items
def search(): query = PLUGIN.keyboard('', PLUGIN.get_string(30007)) if query: target = PLUGIN.url_for(endpoint='searchresults', query=query, index='0') else: target = PLUGIN.url_for(endpoint='createMainListing') PLUGIN.redirect(target)
def channelVideos(name): items = [{'label': PLUGIN.get_string(30078), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'path': PLUGIN.url_for(endpoint='channelVideosList', name=name, index=0, past='true')}, {'label': PLUGIN.get_string(30079), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'path': PLUGIN.url_for(endpoint='channelVideosList', name=name, index=0, past='false')}] PLUGIN.set_content(utils.getContentType()) return items
def createFollowingList(): username = utils.getUserName() if not username: utils.notification(PLUGIN.get_string(30095)) else: streams = TWITCHTV.getFollowingStreams(username) liveStreams = [CONVERTER.convertStreamToListItem(stream) for stream in streams[Keys.LIVE]] liveStreams.insert(0, {'path': PLUGIN.url_for(endpoint='createFollowingList'), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'is_playable': False, 'label': PLUGIN.get_string(30012)}) liveStreams.append({'path': PLUGIN.url_for(endpoint='createFollowingList'), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'is_playable': False, 'label': PLUGIN.get_string(30013)}) liveStreams.extend([CONVERTER.convertFollowersToListItem(follower) for follower in streams[Keys.OTHERS]]) utils.refreshPreviews() PLUGIN.set_content(utils.getContentType()) return liveStreams
def getUserName(): username = PLUGIN.get_setting('username', unicode).lower() if not username: PLUGIN.open_settings() username = PLUGIN.get_setting('username', unicode).lower() return username
def createListOfFeaturedStreams(): featuredStreams = TWITCHTV.getFeaturedStream() utils.refreshPreviews() PLUGIN.set_content(utils.getContentType()) return [CONVERTER.convertStreamToListItem(featuredStream[Keys.STREAM]) for featuredStream in featuredStreams]
def createListOfTeamStreams(team): PLUGIN.set_content(utils.getContentType()) return [CONVERTER.convertTeamChannelToListItem(channel[Keys.CHANNEL]) for channel in TWITCHTV.getTeamStreams(team)]
def getContentType(): chosenType = PLUGIN.get_setting('contenttypes', unicode) contentTypes = {'0': 'files', '1': 'tvshows', '2': 'movies', '3': 'episodes', '4': 'musicvideos'} return contentTypes.get(chosenType, 'files')
def showSettings(): PLUGIN.open_settings()
def notifyRefresh(): notify = True if PLUGIN.get_setting('notify_refresh', unicode) == 'false': notify = False return notify
def getVideoQuality(quality=''): """ :param quality: string int/int: qualities[quality] qualities 0 = Source, 1 = 1080p60, 2 = 1080p30, 3 = 720p60, 4 = 720p30, 5 = 540p30, 6 = 480p30, 7 = 360p30, 8 = 240p30, 9 = 144p30 -1 = Choose quality dialog * any other value for quality will use addon setting i18n: 0 = 30102 ... 9 = 30111 """ qualities = {'-1': -1, '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9 } i18n_qualities = [PLUGIN.get_string(30102), PLUGIN.get_string(30103), PLUGIN.get_string(30104), PLUGIN.get_string(30105), PLUGIN.get_string(30106), PLUGIN.get_string(30107), PLUGIN.get_string(30108), PLUGIN.get_string(30109), PLUGIN.get_string(30110), PLUGIN.get_string(30111)] try: quality = int(quality) if 9 >= quality >= 0: chosenQuality = str(quality) elif quality == -1: chosenQuality = str(xbmcgui.Dialog().select(PLUGIN.get_string(30077), i18n_qualities)) else: raise ValueError except ValueError: chosenQuality = PLUGIN.get_setting('video', unicode) if chosenQuality == '-1': # chosenQuality == '-1' if dialog was cancelled return int(chosenQuality) else: return qualities.get(chosenQuality, sys.maxint)
def getOauthToken(): oauthtoken = PLUGIN.get_setting('oauth_token', unicode) if not oauthtoken: PLUGIN.open_settings() oauthtoken = PLUGIN.get_setting('oauth_token', unicode) return oauthtoken
def createMainListing(): context_menu = [] context_menu.extend(utils.contextClearPreviews()) items = [ {'label': PLUGIN.get_string(30005), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'context_menu': context_menu, 'path': PLUGIN.url_for(endpoint='createListOfFeaturedStreams') }, {'label': PLUGIN.get_string(30001), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'context_menu': context_menu, 'path': PLUGIN.url_for(endpoint='createListOfGames', index='0') }, {'label': PLUGIN.get_string(30008), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'context_menu': context_menu, 'path': PLUGIN.url_for(endpoint='createListOfChannels', index='0') }, {'label': PLUGIN.get_string(30002), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'context_menu': context_menu, 'path': PLUGIN.url_for(endpoint='createFollowingList') }, {'label': PLUGIN.get_string(30066), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'context_menu': context_menu, 'path': PLUGIN.url_for(endpoint='createFollowingGameList') }, {'label': PLUGIN.get_string(30006), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'context_menu': context_menu, 'path': PLUGIN.url_for(endpoint='createListOfTeams', index='0') }, {'label': PLUGIN.get_string(30098), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'context_menu': context_menu, 'path': PLUGIN.url_for(endpoint='createListForSelectedVideo') }, {'label': PLUGIN.get_string(30003), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'context_menu': context_menu, 'path': PLUGIN.url_for(endpoint='search') }, {'label': PLUGIN.get_string(30004), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': utils.theArt(), 'context_menu': context_menu, 'path': PLUGIN.url_for(endpoint='showSettings') } ] PLUGIN.set_content(utils.getContentType()) return items
def linkToNextPage(target, currentIndex, **kwargs): return {'label': PLUGIN.get_string(30011), 'icon': Images.ICON, 'thumbnail': Images.THUMB, 'art': theArt(), 'path': PLUGIN.url_for(target, index=str(currentIndex + 1), **kwargs)}
def getMediaType(): chosenType = PLUGIN.get_setting('contenttypes', unicode) mediaTypes = {'0': 'video', '1': 'tvshow', '2': 'movie', '3': 'episode', '4': 'musicvideo'} return mediaTypes.get(chosenType, 'video')
def getVideoQuality(quality=''): """ :param quality: string int/int: qualities[quality] qualities 0 = Source, 1 = 1080p60, 2 = 1080p30, 3 = 720p60, 4 = 720p30, 5 = 540p30, 6 = 480p30, 7 = 360p30, 8 = 240p30, 9 = 144p30 -1 = Choose quality dialog * any other value for quality will use addon setting i18n: 0 = 30102 ... 9 = 30111 """ qualities = { '-1': -1, '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9 } i18n_qualities = [ PLUGIN.get_string(30102), PLUGIN.get_string(30103), PLUGIN.get_string(30104), PLUGIN.get_string(30105), PLUGIN.get_string(30106), PLUGIN.get_string(30107), PLUGIN.get_string(30108), PLUGIN.get_string(30109), PLUGIN.get_string(30110), PLUGIN.get_string(30111) ] try: quality = int(quality) if 9 >= quality >= 0: chosenQuality = str(quality) elif quality == -1: chosenQuality = str(xbmcgui.Dialog().select( PLUGIN.get_string(30077), i18n_qualities)) else: raise ValueError except ValueError: chosenQuality = PLUGIN.get_setting('video', unicode) if chosenQuality == '-1': # chosenQuality == '-1' if dialog was cancelled return int(chosenQuality) else: return qualities.get(chosenQuality, sys.maxint)
# -*- coding: utf-8 -*- import sys import routes from constants import PLUGIN if __name__ == '__main__': sys.exit(PLUGIN.run())