Esempio n. 1
0
 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
Esempio n. 3
0
 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")
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)
Esempio n. 6
0
 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
Esempio n. 7
0
    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)
Esempio n. 9
0
    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))
Esempio n. 10
0
 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
Esempio n. 12
0
 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)
Esempio n. 16
0
    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
Esempio n. 19
0
 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)
Esempio n. 20
0
 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)
Esempio n. 21
0
    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()
Esempio n. 22
0
 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)
Esempio n. 23
0
 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
Esempio n. 24
0
 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))
Esempio n. 25
0
 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)
Esempio n. 29
0
 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))
Esempio n. 30
0
    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)