def monitor_livetv(self): ''' for livetv we are not notified when the program changes so we have to monitor that ourself ''' if self.monitoring_stream: # another monitoring already in progress... return last_title = "" while not self.abortRequested() and getCondVisibility("Player.HasVideo"): self.monitoring_stream = True li_title = try_decode(xbmc.getInfoLabel("Player.Title")) if li_title and li_title != last_title: all_props = [] last_title = li_title self.reset_win_props() li_channel = try_decode(xbmc.getInfoLabel("VideoPlayer.ChannelName")) # pvr artwork if getCondVisibility("Skin.HasSetting(SkinHelper.EnablePVRThumbs)"): li_genre = try_decode(xbmc.getInfoLabel("VideoPlayer.Genre")) pvrart = self.metadatautils.get_pvr_artwork(li_title, li_channel, li_genre) if sys.version_info.major == 3: all_props = prepare_win_props(pvrart, "SkinHelper.Player.") else: all_props = prepare_win_props(pvrart, u"SkinHelper.Player.") # pvr channellogo channellogo = self.metadatautils.get_channellogo(li_channel) all_props.append(("SkinHelper.Player.ChannelLogo", channellogo)) all_props.append(("SkinHelper.Player.Art.ChannelLogo", channellogo)) if last_title == li_title: self.metadatautils.process_method_on_list(self.set_win_prop, all_props) # show infopanel if needed self.show_info_panel() self.waitForAbort(2) self.monitoring_stream = False
def multi_select(options, window_header=""): '''allows the user to choose from multiple options''' listitems = [] for option in options: if not option["condition"] or getCondVisibility(option["condition"]): listitem = xbmcgui.ListItem(label=option["label"], label2=option["description"]) listitem.setProperty("id", option["id"]) if getCondVisibility("Skin.HasSetting(%s)" % option["id"]) or (not xbmc.getInfoLabel( "Skin.String(defaultset_%s)" % option["id"]) and getCondVisibility(option["default"])): listitem.select(selected=True) listitems.append(listitem) # show select dialog dialog = DialogSelect("DialogSelect.xml", "", listing=listitems, windowtitle=window_header, multiselect=True) dialog.doModal() result = dialog.result if result: for item in result: if item.isSelected(): # option is enabled xbmc.executebuiltin("Skin.SetBool(%s)" % item.getProperty("id")) else: # option is disabled xbmc.executebuiltin("Skin.Reset(%s)" % item.getProperty("id")) # always set additional prop to define the defaults xbmc.executebuiltin("Skin.SetString(defaultset_%s,defaultset)" % item.getProperty("id")) del dialog
def set_forcedview(self, content_type): '''helper to force the view in certain conditions''' if self.enable_forcedviews: cur_forced_view = xbmc.getInfoLabel( "Skin.String(SkinHelper.ForcedViews.%s)" % content_type) if getCondVisibility( "Control.IsVisible(%s) | String.IsEmpty(Container.Viewmode) | System.HasModalDialog | System.HasVisibleModalDialog" % cur_forced_view): # skip if the view is already visible or if we're not in an actual media window return if (content_type and cur_forced_view and cur_forced_view != "None" and not getCondVisibility("Window.IsActive(MyPvrGuide.xml)")): self.win.setProperty("SkinHelper.ForcedView", cur_forced_view) count = 0 while not getCondVisibility( "Control.HasFocus(%s)" % cur_forced_view): xbmc.sleep(100) xbmc.executebuiltin("Container.SetViewMode(%s)" % cur_forced_view) xbmc.executebuiltin("SetFocus(%s)" % cur_forced_view) count += 1 if count == 50 or self.exit: break else: self.win.clearProperty("SkinHelper.ForcedView") else: self.win.clearProperty("SkinHelper.ForcedView")
def set_video_properties(self, mediatype, li_dbid): '''sets the window props for a playing video item''' if not mediatype: mediatype = self.get_mediatype() details = self.get_player_infolabels() li_title = details["title"] li_year = details["year"] li_imdb = details["imdbnumber"] li_showtitle = details["tvshowtitle"] details = {"art": {}} # video content if mediatype in ["movie", "episode", "musicvideo"]: # get imdb_id li_imdb, li_tvdb = self.metadatautils.get_imdbtvdb_id( li_title, mediatype, li_year, li_imdb, li_showtitle) # generic video properties (studio, streamdetails, omdb, top250) details = self.metadatautils.extend_dict( details, self.metadatautils.get_omdb_info(li_imdb)) if li_dbid: details = self.metadatautils.extend_dict( details, self.metadatautils.get_streamdetails(li_dbid, mediatype)) details = self.metadatautils.extend_dict( details, self.metadatautils.get_top250_rating(li_imdb)) # tvshows-only properties (tvdb) if mediatype == "episode": details = self.metadatautils.extend_dict( details, self.metadatautils.get_tvdb_details(li_imdb, li_tvdb)) # movies-only properties (tmdb, animated art) if mediatype == "movie": details = self.metadatautils.extend_dict( details, self.metadatautils.get_tmdb_details(li_imdb)) if li_imdb and getCondVisibility( "Skin.HasSetting(SkinHelper.EnableAnimatedPosters)"): details = self.metadatautils.extend_dict( details, self.metadatautils.get_animated_artwork(li_imdb)) # extended art if getCondVisibility( "Skin.HasSetting(SkinHelper.EnableExtendedArt)"): tmdbid = details.get("tmdb_id", "") details = self.metadatautils.extend_dict( details, self.metadatautils.get_extended_artwork( li_imdb, li_tvdb, tmdbid, mediatype)) if li_title == try_decode(xbmc.getInfoLabel("Player.Title")): if sys.version_info.major == 3: all_props = prepare_win_props(details, "SkinHelper.Player.") else: all_props = prepare_win_props(details, u"SkinHelper.Player.") self.metadatautils.process_method_on_list(self.set_win_prop, all_props)
def setview(self): '''sets the selected viewmode for the container''' xbmc.executebuiltin("ActivateWindow(busydialog)") content_type = get_current_content_type() if not content_type: content_type = "files" current_view = try_decode(xbmc.getInfoLabel("Container.Viewmode")) view_id, view_label = self.selectview(content_type, current_view) current_forced_view = xbmc.getInfoLabel( "Skin.String(SkinHelper.ForcedViews.%s)" % content_type) if view_id is not None: # also store forced view if (content_type and current_forced_view and current_forced_view != "None" and getCondVisibility( "Skin.HasSetting(SkinHelper.ForcedViews.Enabled)")): xbmc.executebuiltin( "Skin.SetString(SkinHelper.ForcedViews.%s,%s)" % (content_type, view_id)) xbmc.executebuiltin( "Skin.SetString(SkinHelper.ForcedViews.%s.label,%s)" % (content_type, view_label)) self.win.setProperty("SkinHelper.ForcedView", view_id) if not getCondVisibility( "Control.HasFocus(%s)" % current_forced_view): xbmc.sleep(100) xbmc.executebuiltin("Container.SetViewMode(%s)" % view_id) xbmc.executebuiltin("SetFocus(%s)" % view_id) else: self.win.clearProperty("SkinHelper.ForcedView") # set view xbmc.executebuiltin("Container.SetViewMode(%s)" % view_id)
def setfocus(self): '''helper to set focus on a list or control''' control = self.params.get("control") fallback = self.params.get("fallback") position = self.params.get("position", "0") relativeposition = self.params.get("relativeposition") if relativeposition: position = int(relativeposition) - 1 count = 0 if control: while not getCondVisibility("Control.HasFocus(%s)" % control): if getCondVisibility("Window.IsActive(busydialog)"): xbmc.sleep(150) continue elif count == 20 or (getCondVisibility( "!Control.IsVisible(%s) | " "!Integer.IsGreater(Container(%s).NumItems,0)" % (control, control))): if fallback: xbmc.executebuiltin("Control.SetFocus(%s)" % fallback) break else: xbmc.executebuiltin("Control.SetFocus(%s,%s)" % (control, position)) xbmc.sleep(50) count += 1
def show_info_panel(self): '''feature to auto show the OSD infopanel for X seconds''' try: sec_to_display = int( xbmc.getInfoLabel( "Skin.String(SkinHelper.ShowInfoAtPlaybackStart)")) except Exception: return if sec_to_display > 0 and not self.infopanelshown: retries = 0 log_msg("Show OSD Infopanel - number of seconds: %s" % sec_to_display) self.infopanelshown = True if self.win.getProperty("VideoScreensaverRunning") != "true": while retries != 50 and getCondVisibility("!Player.ShowInfo"): xbmc.sleep(100) if getCondVisibility( "!Player.ShowInfo + Window.IsActive(fullscreenvideo)" ): xbmc.executebuiltin('Action(info)') retries += 1 # close info again after given amount of time xbmc.Monitor().waitForAbort(sec_to_display) if getCondVisibility( "Player.ShowInfo + Window.IsActive(fullscreenvideo)"): xbmc.executebuiltin('Action(info)')
def correct_skin_settings(self): '''correct any special skin settings''' skinconstants = {} for settingid, settingvalues in list(self.skinsettings.items()): curvalue = xbmc.getInfoLabel("Skin.String(%s)" % settingid) curlabel = xbmc.getInfoLabel("Skin.String(%s.label)" % settingid) # first check if we have a sublevel if settingvalues and settingvalues[0]["value"].startswith( "||SUBLEVEL||"): sublevel = settingvalues[0]["value"].replace( "||SUBLEVEL||", "") settingvalues = self.skinsettings.get(sublevel) for settingvalue in settingvalues: value = settingvalue["value"] label = settingvalue["label"] if "%" in label: label = label % value # only correct the label if value already set if value and value == curvalue: xbmc.executebuiltin("Skin.SetString(%s.label,%s)" % (settingid, label)) # set the default value if current value is empty if not (curvalue or curlabel): if settingvalue["default"] and getCondVisibility( settingvalue["default"]): xbmc.executebuiltin("Skin.SetString(%s.label,%s)" % (settingid, label)) xbmc.executebuiltin("Skin.SetString(%s,%s)" % (settingid, value)) # additional onselect actions for action in settingvalue["onselectactions"]: if action["condition"] and getCondVisibility( action["condition"]): command = action["command"] if "$" in command: command = xbmc.getInfoLabel(command) xbmc.executebuiltin(command) # process any multiselects for option in settingvalue["settingoptions"]: settingid = option["id"] if (not xbmc.getInfoLabel( "Skin.String(defaultset_%s)" % settingid) and option["default"] and getCondVisibility(option["default"])): xbmc.executebuiltin("Skin.SetBool(%s)" % settingid) xbmc.executebuiltin( "Skin.SetString(defaultset_%s,defaultset)" % settingid) # set the default constant value if current value is empty if (not curvalue and settingvalue["constantdefault"] and getCondVisibility(settingvalue["constantdefault"])): skinconstants[settingid] = value # update skin constants if needed only if skinconstants: self.update_skin_constants(skinconstants)
def set_generic_props(self): '''set some generic window props with item counts''' # GET TOTAL ADDONS COUNT addons_count = len(kodi_json('Addons.GetAddons')) self.win.setProperty("SkinHelper.TotalAddons", "%s" % addons_count) addontypes = [] addontypes.append(("executable", "SkinHelper.TotalProgramAddons")) addontypes.append(("video", "SkinHelper.TotalVideoAddons")) addontypes.append(("audio", "SkinHelper.TotalAudioAddons")) addontypes.append(("image", "SkinHelper.TotalPicturesAddons")) for addontype in addontypes: media_array = kodi_json('Addons.GetAddons', {"content": addontype[0]}) self.win.setProperty(addontype[1], str(len(media_array))) # GET FAVOURITES COUNT favs = kodi_json('Favourites.GetFavourites') if favs: self.win.setProperty("SkinHelper.TotalFavourites", "%s" % len(favs)) if self.exit: return # GET TV CHANNELS COUNT if getCondVisibility("Pvr.HasTVChannels"): tv_channels = kodi_json('PVR.GetChannels', {"channelgroupid": "alltv"}) self.win.setProperty("SkinHelper.TotalTVChannels", "%s" % len(tv_channels)) if self.exit: return # GET MOVIE SETS COUNT movieset_movies_count = 0 moviesets = kodi_json('VideoLibrary.GetMovieSets') for item in moviesets: for item in kodi_json('VideoLibrary.GetMovieSetDetails', {"setid": item["setid"]}): movieset_movies_count += 1 self.win.setProperty("SkinHelper.TotalMovieSets", "%s" % len(moviesets)) self.win.setProperty("SkinHelper.TotalMoviesInSets", "%s" % movieset_movies_count) if self.exit: return # GET RADIO CHANNELS COUNT if getCondVisibility("Pvr.HasRadioChannels"): radio_channels = kodi_json('PVR.GetChannels', {"channelgroupid": "allradio"}) self.win.setProperty("SkinHelper.TotalRadioChannels", "%s" % len(radio_channels))
def get_mediatype(): '''get current content type''' if getCondVisibility("VideoPlayer.Content(movies)"): mediatype = "movie" elif getCondVisibility("VideoPlayer.Content(episodes) | !String.IsEmpty(VideoPlayer.TvShowTitle)"): mediatype = "episode" elif xbmc.getInfoLabel("VideoPlayer.Content(musicvideos) | !String.IsEmpty(VideoPlayer.Artist)"): mediatype = "musicvideo" else: mediatype = "file" return mediatype
def downloadresourceaddons(addontype): '''show dialog with all available resource addons on the repo so the user can install one''' xbmc.executebuiltin("ActivateWindow(busydialog)") listitems = [] addon = xbmcaddon.Addon(ADDON_ID) for item in get_repo_resourceaddons(addontype): if not getCondVisibility("System.HasAddon(%s)" % item["addonid"]): label2 = "%s: %s" % (xbmc.getLocalizedString(21863), item["author"]) listitem = xbmcgui.ListItem(label=item["name"], label2=label2) listitem.setArt({"icon": item["thumbnail"]}) listitem.setPath(item["path"]) listitem.setProperty("addonid", item["addonid"]) listitems.append(listitem) # if no addons available show OK dialog.. if not listitems: dialog = xbmcgui.Dialog() dialog.ok(addon.getLocalizedString(32021), addon.getLocalizedString(32022)) del dialog else: # show select dialog with choices dialog = DialogSelect("DialogSelect.xml", "", listing=listitems, windowtitle=addon.getLocalizedString(32021), richlayout=True) dialog.doModal() result = dialog.result del dialog del addon # process selection... if result: addon_id = result.getProperty("addonid") # trigger install... monitor = xbmc.Monitor() if KODI_VERSION > 16: xbmc.executebuiltin("InstallAddon(%s)" % addon_id) else: xbmc.executebuiltin("RunPlugin(plugin://%s)" % addon_id) count = 0 # wait (max 2 minutes) untill install is completed install_succes = False while not monitor.waitForAbort( 1) and not install_succes and count < 120: install_succes = getCondVisibility("System.HasAddon(%s)" % addon_id) del monitor if install_succes: return True return False
def get_settings(self): '''collect our skin settings that control the monitoring''' self.enable_extendedart = getCondVisibility( "Skin.HasSetting(SkinHelper.EnableExtendedArt)") == 1 self.enable_musicart = getCondVisibility( "Skin.HasSetting(SkinHelper.EnableMusicArt)") == 1 self.enable_animatedart = getCondVisibility( "Skin.HasSetting(SkinHelper.EnableAnimatedPosters)") == 1 self.enable_extrafanart = getCondVisibility( "Skin.HasSetting(SkinHelper.EnableExtraFanart)") == 1 self.enable_extraposter = getCondVisibility( "Skin.HasSetting(SkinHelper.EnableExtraPoster)") == 1 self.enable_pvrart = getCondVisibility( "Skin.HasSetting(SkinHelper.EnablePVRThumbs) + PVR.HasTVChannels" ) == 1 self.enable_forcedviews = getCondVisibility( "Skin.HasSetting(SkinHelper.ForcedViews.Enabled)") == 1 studiologos_path = xbmc.getInfoLabel( "Skin.String(SkinHelper.StudioLogos.Path)") if studiologos_path != self.metadatautils.studiologos_path: self.listitem_details = {} self.metadatautils.studiologos_path = studiologos_path # set additional window props to control contextmenus as using the skinsetting gives unreliable results for skinsetting in [ "EnableAnimatedPosters", "EnableMusicArt", "EnablePVRThumbs" ]: if getCondVisibility("Skin.HasSetting(SkinHelper.%s)" % skinsetting): self.win.setProperty("SkinHelper.%s" % skinsetting, "enabled") else: self.win.clearProperty("SkinHelper.%s" % skinsetting)
def playtrailer(self): '''auto play windowed trailer inside video listing''' if not getCondVisibility("Container.Scrolling | Container.OnNext | " "Container.OnPrevious | !IsEmpty(Window(Home).Property(traileractionbusy))"): self.win.setProperty("traileractionbusy", "traileractionbusy") widget_container = self.params.get("widgetcontainer", "") trailer_mode = self.params.get("mode", "").replace("auto_", "") allow_youtube = self.params.get("youtube", "") == "true" if not trailer_mode: trailer_mode = "windowed" if widget_container: widget_container_prefix = "Container(%s)." % widget_container else: widget_container_prefix = "" li_title = xbmc.getInfoLabel("%sListItem.Title" % widget_container_prefix) li_trailer = xbmc.getInfoLabel("%sListItem.Trailer" % widget_container_prefix) if not li_trailer and allow_youtube: youtube_result = self.get_youtube_listing("%s Trailer" % li_title) if youtube_result: li_trailer = youtube_result[0].get("file") # always wait a bit to prevent trailer start playing when we're scrolling the list xbmc.Monitor().waitForAbort(3) if li_trailer and (li_title == xbmc.getInfoLabel("%sListItem.Title" % widget_container_prefix)): if trailer_mode == "fullscreen" and li_trailer: xbmc.executebuiltin('PlayMedia("%s")' % li_trailer) else: xbmc.executebuiltin('PlayMedia("%s",1)' % li_trailer) self.win.setProperty("TrailerPlaying", trailer_mode) self.win.clearProperty("traileractionbusy")
def load_widget(self): '''legacy entrypoint called (widgets are moved to seperate addon), start redirect...''' action = self.params.get("action", "") newaddon = "script.skin.helper.widgets" log_msg( "Deprecated method: %s. Please reassign your widgets to get rid of this message. -" "This automatic redirect will be removed in the future" % (action), xbmc.LOGWARNING) paramstring = "" if sys.version_info.major == 3: for key, value in self.params.items(): paramstring += ",%s=%s" % (key, value) else: for key, value in self.params.iteritems(): paramstring += ",%s=%s" % (key, value) if getCondVisibility("System.HasAddon(%s)" % newaddon): # TEMP !!! for backwards compatability reasons only - to be removed in the near future!! import imp addon = xbmcaddon.Addon(newaddon) addon_path = try_decode(addon.getAddonInfo('path')) imp.load_source('plugin', os.path.join(addon_path, "plugin.py")) from plugin import main main.Main() del addon else: # trigger install of the addon if KODI_VERSION > 16: xbmc.executebuiltin("InstallAddon(%s)" % newaddon) else: xbmc.executebuiltin("RunPlugin(plugin://%s)" % newaddon)
def selectview(self, content_type="other", current_view=None, display_none=False): '''reads skinfile with all views to present a dialog to choose from''' cur_view_select_id = None label = "" all_views = [] if display_none: listitem = xbmcgui.ListItem(label="None") listitem.setProperty("id", "None") all_views.append(listitem) # read the special skin views file if sys.version_info.major == 3: views_file = try_decode( xbmcvfs.translatePath('special://skin/extras/views.xml')) else: views_file = try_decode( xbmc.translatePath('special://skin/extras/views.xml')) if xbmcvfs.exists(views_file): doc = parse(views_file) listing = doc.documentElement.getElementsByTagName('view') itemcount = 0 for view in listing: label = xbmc.getLocalizedString( int(view.attributes['languageid'].nodeValue)) viewid = view.attributes['value'].nodeValue mediatypes = view.attributes['type'].nodeValue.lower().split( ",") if label.lower() == current_view.lower( ) or viewid == current_view: cur_view_select_id = itemcount if display_none: cur_view_select_id += 1 if (("all" in mediatypes or content_type.lower() in mediatypes) and (not "!" + content_type.lower() in mediatypes) and not getCondVisibility( "Skin.HasSetting(SkinHelper.view.Disabled.%s)" % viewid)): image = "special://skin/extras/viewthumbs/%s.jpg" % viewid listitem = xbmcgui.ListItem(label=label, iconImage=image) listitem.setProperty("viewid", viewid) listitem.setProperty("icon", image) all_views.append(listitem) itemcount += 1 dialog = DialogSelect("DialogSelect.xml", "", listing=all_views, windowtitle=self.addon.getLocalizedString(32012), richlayout=True) dialog.autofocus_id = cur_view_select_id dialog.doModal() result = dialog.result del dialog if result: viewid = result.getProperty("viewid") label = try_decode(result.getLabel()) return (viewid, label) else: return (None, None)
def splashscreen(self): import time splashfile = self.params.get('file', '') duration = int(self.params.get('duration', 5)) if (splashfile.lower().endswith('jpg') or splashfile.lower().endswith('gif') or splashfile.lower().endswith('png') or splashfile.lower().endswith('tiff')): self.win.setProperty('SkinUtils.SplashScreen', splashfile) start_time = time.time() while (time.time() - start_time) <= duration: xbmc.sleep(500) else: xbmc.Player().play(splashfile, windowed=True) xbmc.sleep(500) while getCondVisibility('Player.HasMedia'): xbmc.sleep(150) startupwindow = xbmc.getInfoLabel('System.StartupWindow') xbmc.executebuiltin('ReplaceWindow(%s)' % startupwindow) autostart_playlist = xbmc.getInfoLabel( '$ESCINFO[Skin.String(autostart_playlist)]') if autostart_playlist: xbmc.executebuiltin("PlayMedia(%s)" % autostart_playlist)
def action_textbox(self, act): '''special handler to allow direct typing to search''' action_number_0 = 58 action_number_9 = 67 action = act.getId() button = act.getButtonCode() # Upper-case values if button >= 0x2f041 and button <= 0x2f05b: self.add_character(chr(button - 0x2F000)) # Lower-case values if button >= 0xf041 and button <= 0xf05b: self.add_character(chr(button - 0xEFE0)) # Numbers if action >= action_number_0 and action <= action_number_9: self.add_character(chr(action - action_number_0 + 48)) # Backspace if button == 0xF008: if len(self.search_string) >= 1: self.remove_char() # Delete if button == 0xF02E: self.clear_search() # Space if button == 0xF020: self.add_character(" ") if getCondVisibility("Window.IsVisible(10111)"): # close shutdown window if visible xbmc.executebuiltin("Dialog.close(10111)")
def searchyoutube(self): '''helper to search youtube for the given title''' xbmc.executebuiltin("ActivateWindow(busydialog)") title = self.params.get("title", "") window_header = self.params.get("header", "") results = [] for media in self.get_youtube_listing(title): if not media["filetype"] == "directory": label = media["label"] label2 = media["plot"] image = "" if media.get('art'): if media['art'].get('thumb'): image = (media['art']['thumb']) listitem = xbmcgui.ListItem(label=label, label2=label2, iconImage=image) listitem.setProperty("path", media["file"]) results.append(listitem) # finished lookup - display listing with results xbmc.executebuiltin("dialog.Close(busydialog)") dialog = DialogSelect("DialogSelect.xml", "", listing=results, windowtitle=window_header, multiselect=False, richlayout=True) dialog.doModal() result = dialog.result del dialog if result: if getCondVisibility( "Window.IsActive(script-skin_helper_service-CustomInfo.xml) | " "Window.IsActive(movieinformation)"): xbmc.executebuiltin("Dialog.Close(movieinformation)") xbmc.executebuiltin("Dialog.Close(script-skin_helper_service-CustomInfo.xml)") xbmc.sleep(1000) xbmc.executebuiltin('PlayMedia("%s")' % result.getProperty("path")) del result
def check_screensaver(self): '''Allow user to disable screensaver on fullscreen music playback''' if getCondVisibility( "Window.IsActive(visualisation) + Skin.HasSetting(SkinHelper.DisableScreenSaverOnFullScreenMusic)" ): if not self.screensaver_disabled: # disable screensaver when fullscreen music active self.screensaver_disabled = True screensaver_setting = kodi_json( 'Settings.GetSettingValue', '{"setting":"screensaver.mode"}') if screensaver_setting: self.screensaver_setting = screensaver_setting kodi_json('Settings.SetSettingValue', { "setting": "screensaver.mode", "value": None }) log_msg( "Disabled screensaver while fullscreen music playback - previous setting: %s" % self.screensaver_setting, xbmc.LOGINFO) elif self.screensaver_disabled and self.screensaver_setting: # enable screensaver again after fullscreen music playback was ended kodi_json('Settings.SetSettingValue', { "setting": "screensaver.mode", "value": self.screensaver_setting }) self.screensaver_disabled = False self.screensaver_setting = None log_msg( "fullscreen music playback ended - restoring screensaver: %s" % self.screensaver_setting, xbmc.LOGINFO)
def get_folderandprefix(self): '''get the current folder and prefix''' cur_folder = "" cont_prefix = "" try: widget_container = try_decode( self.win.getProperty("SkinHelper.WidgetContainer")) if getCondVisibility( "Window.IsActive(movieinformation)|Window.IsActive(DialogPVRInfo.xml)|Window.IsActive(DialogMusicInfo.xml)|Window.IsActive(script-script.extendedinfo-DialogVideoInfo.xml)" ): cont_prefix = "" cur_folder = try_decode( xbmc.getInfoLabel( "$INFO[Window.Property(xmlfile)]$INFO[Container.FolderPath]" "$INFO[Container.NumItems]$INFO[Container.Content]")) elif widget_container: cont_prefix = "Container(%s)." % widget_container cur_folder = try_decode( xbmc.getInfoLabel( "widget-%s-$INFO[Container(%s).NumItems]-$INFO[Container(%s).ListItemAbsolute(1).Label]" % (widget_container, widget_container, widget_container))) else: cont_prefix = "" cur_folder = try_decode( xbmc.getInfoLabel( "$INFO[Window.Property(xmlfile)]$INFO[Container.FolderPath]$INFO[Container.NumItems]$INFO[Container.Content]" )) except Exception as exc: log_exception(__name__, exc) cur_folder = "" cont_prefix = "" return (cur_folder, cont_prefix)
def onAction(self, action): if action.getId() in ( 9, 10, 92, 216, 247, 257, 275, 61467, 61448, ): self.close_dialog(True) # an item in the list is clicked if (action.getId() == 7 or action.getId() == 100) and getCondVisibility( "Control.HasFocus(3) | Control.HasFocus(6)"): if self.multiselect: # select/deselect the item item = self.list_control.getSelectedItem() if item.isSelected(): item.select(selected=False) else: item.select(selected=True) else: # no multiselect so just close the dialog (and return results) self.close_dialog()
def splashscreen(self): '''helper to show a user defined splashscreen in the skin''' import time splashfile = self.params.get("file", "") duration = int(self.params.get("duration", 5)) if (splashfile.lower().endswith("jpg") or splashfile.lower().endswith("gif") or splashfile.lower().endswith("png") or splashfile.lower().endswith("tiff")): # this is an image file self.win.setProperty("SkinHelper.SplashScreen", splashfile) # for images we just wait for X seconds to close the splash again start_time = time.time() while (time.time() - start_time) <= duration: xbmc.sleep(500) else: # for video or audio we have to wait for the player to finish... xbmc.Player().play(splashfile, windowed=True) xbmc.sleep(500) while getCondVisibility("Player.HasMedia"): xbmc.sleep(150) # replace startup window with home startupwindow = xbmc.getInfoLabel("System.StartupWindow") xbmc.executebuiltin("ReplaceWindow(%s)" % startupwindow) autostart_playlist = xbmc.getInfoLabel( "$ESCINFO[Skin.String(autostart_playlist)]") if autostart_playlist: xbmc.executebuiltin("PlayMedia(%s)" % autostart_playlist)
def getcastmedia(self): '''helper to show a dialog with all media for a specific actor''' xbmc.executebuiltin("ActivateWindow(busydialog)") name = self.params.get("name", "") window_header = self.params.get("name", "") results = [] items = self.mutils.kodidb.castmedia(name) items = self.mutils.process_method_on_list( self.mutils.kodidb.prepare_listitem, items) for item in items: if item["file"].startswith("videodb://"): item[ "file"] = "ActivateWindow(Videos,%s,return)" % item["file"] else: item["file"] = 'PlayMedia("%s")' % item["file"] results.append(self.mutils.kodidb.create_listitem(item, False)) # finished lookup - display listing with results xbmc.executebuiltin("dialog.Close(busydialog)") dialog = DialogSelect("DialogSelect.xml", "", listing=results, windowtitle=window_header, richlayout=True) dialog.doModal() result = dialog.result del dialog if result: while getCondVisibility( "System.HasModalDialog | System.HasVisibleModalDialog"): xbmc.executebuiltin("Action(Back)") xbmc.sleep(300) xbmc.executebuiltin(result.getfilename()) del result
def artwork_downloader(self, media_type, dbid): '''trigger artwork scan with artwork downloader if enabled''' if getCondVisibility( "System.HasAddon(script.artwork.downloader) + Skin.HasSetting(EnableArtworkDownloader)"): if media_type == "episode": media_type = "tvshow" dbid = self.metadatautils.kodidb.episode(dbid)["tvshowid"] xbmc.executebuiltin( "RunScript(script.artwork.downloader,silent=true,mediatype=%s,dbid=%s)" % (media_type, dbid))
def wait_for_player(): '''wait for player untill it's actually playing content''' count = 0 while not getCondVisibility("Player.HasVideo | Player.HasAudio"): xbmc.sleep(100) if count == 50: return False count += 1 return True
def plugin_widgetlisting(pluginpath, sublevel=""): '''get all nodes in a plugin listing''' widgets = [] if sublevel: media_array = kodi_json('Files.GetDirectory', { "directory": pluginpath, "media": "files" }) else: if not getCondVisibility("System.HasAddon(%s)" % pluginpath): return [] media_array = kodi_json('Files.GetDirectory', { "directory": "plugin://%s" % pluginpath, "media": "files" }) for item in media_array: log_msg("skinshortcuts widgets processing: %s" % (item["file"])) content = item["file"] label = item["label"] # extendedinfo has some login-required widgets, skip those if ("script.extendedinfo" in pluginpath and not EXTINFO_CREDS and ("info=starred" in content or "info=rated" in content or "info=account" in content)): continue if item.get("filetype", "") == "file": continue mutils = MetadataUtils() media_type = mutils.detect_plugin_content(item["file"]) del mutils if media_type == "empty": continue if media_type == "folder": content = "plugin://script.skin.helper.service?action=widgets&path=%s&sublevel=%s" % ( urlencode(item["file"]), label) # add reload param for widgets if "reload=" not in content: if "movies" in content: reloadstr = "&reload=$INFO[Window(Home).Property(widgetreload-movies)]" elif "episodes" in content: reloadstr = "&reload=$INFO[Window(Home).Property(widgetreload-episodes)]" elif "tvshows" in content: reloadstr = "&reload=$INFO[Window(Home).Property(widgetreload-tvshows)]" elif "musicvideos" in content: reloadstr = "&reload=$INFO[Window(Home).Property(widgetreload-musicvideos)]" elif "albums" in content or "songs" in content or "artists" in content: reloadstr = "&reload=$INFO[Window(Home).Property(widgetreload-music)]" else: reloadstr = "&reload=$INFO[Window(Home).Property(widgetreload)]"\ "$INFO[Window(Home).Property(widgetreload2)]" content = content + reloadstr content = content.replace("&limit=100", "&limit=25") widgets.append([label, content, media_type]) if pluginpath == "script.extendedinfo" and not sublevel: # some additional entrypoints for extendedinfo... widgets += extendedinfo_youtube_widgets() return widgets
def enableviews(self): '''show select dialog to enable/disable views''' all_views = [] if sys.version_info.major == 3: views_file = try_decode( xbmcvfs.translatePath('special://skin/extras/views.xml')) else: views_file = try_decode( xbmc.translatePath('special://skin/extras/views.xml')) richlayout = self.params.get("richlayout", "") == "true" if xbmcvfs.exists(views_file): doc = parse(views_file) listing = doc.documentElement.getElementsByTagName('view') for view in listing: view_id = view.attributes['value'].nodeValue label = xbmc.getLocalizedString( int(view.attributes['languageid'].nodeValue)) desc = label + " (" + str(view_id) + ")" image = "special://skin/extras/viewthumbs/%s.jpg" % view_id listitem = xbmcgui.ListItem(label=label, label2=desc, iconImage=image) listitem.setProperty("viewid", view_id) if not getCondVisibility( "Skin.HasSetting(SkinHelper.view.Disabled.%s)" % view_id): listitem.select(selected=True) excludefromdisable = False try: excludefromdisable = view.attributes[ 'excludefromdisable'].nodeValue == "true" except Exception: pass if not excludefromdisable: all_views.append(listitem) dialog = DialogSelect("DialogSelect.xml", "", listing=all_views, windowtitle=self.addon.getLocalizedString(32013), multiselect=True, richlayout=richlayout) dialog.doModal() result = dialog.result del dialog if result: for item in result: view_id = item.getProperty("viewid") if item.isSelected(): # view is enabled xbmc.executebuiltin( "Skin.Reset(SkinHelper.view.Disabled.%s)" % view_id) else: # view is disabled xbmc.executebuiltin( "Skin.SetBool(SkinHelper.view.Disabled.%s)" % view_id)
def wait_for_skinshortcuts_window(): '''wait untill skinshortcuts is active window (because of any animations that may have been applied)''' for i in range(40): if not (getCondVisibility( "Window.IsActive(DialogSelect.xml) | " "Window.IsActive(script-skin_helper_service-ColorPicker.xml) | " "Window.IsActive(DialogKeyboard.xml)")): break else: xbmc.sleep(100)
def togglekodisetting(self): '''toggle kodi setting''' settingname = self.params.get("setting", "") cur_value = getCondVisibility("system.getbool(%s)" % settingname) if cur_value: new_value = "false" else: new_value = "true" xbmc.executeJSONRPC( '{"jsonrpc":"2.0", "id":1, "method":"Settings.SetSettingValue","params":{"setting":"%s","value":%s}}' % (settingname, new_value))
def set_music_properties(self): '''sets the window props for a playing song''' li_title = try_decode(xbmc.getInfoLabel("MusicPlayer.Title")) li_title_org = li_title li_artist = try_decode(xbmc.getInfoLabel("MusicPlayer.Artist")) li_album = try_decode(xbmc.getInfoLabel("MusicPlayer.Album")) li_disc = try_decode(xbmc.getInfoLabel("MusicPlayer.DiscNumber")) li_plot = try_decode(xbmc.getInfoLabel("MusicPlayer.Comment")) # fix for internet streams if not li_artist and getCondVisibility("Player.IsInternetStream"): for splitchar in [" - ", "-", ":", ";"]: if splitchar in li_title: li_artist = li_title.split(splitchar)[0].strip() li_title = li_title.split(splitchar)[1].strip() break # fix for pvr.radio if not li_artist and getCondVisibility("Pvr.IsPlayingRadio"): for splitchar in [" - ", "-", ":", ";"]: if splitchar in li_title: li_artist = li_title.split(splitchar)[0].strip() li_title = li_title.split(splitchar)[1].strip() break if getCondVisibility("Skin.HasSetting(SkinHelper.EnableMusicArt)" ) and li_artist and (li_title or li_album): result = self.metadatautils.get_music_artwork( li_artist, li_album, li_title, li_disc) if result.get("extendedplot") and li_plot: li_plot = li_plot.replace('\n', ' ').replace('\r', '').rstrip() result["extendedplot"] = "%s -- %s" % (result["extendedplot"], li_plot) if sys.version_info.major == 3: all_props = prepare_win_props(result, "SkinHelper.Player.") else: all_props = prepare_win_props(result, u"SkinHelper.Player.") if li_title_org == try_decode( xbmc.getInfoLabel("MusicPlayer.Title")): self.metadatautils.process_method_on_list( self.set_win_prop, all_props)