def backup_theme(self, themename): """backup a colortheme to a zipfile""" import zipfile backup_path = xbmcgui.Dialog().browse( 3, self.addon.getLocalizedString(32029), "files").decode("utf-8") if backup_path: busyDialog("activate") backup_name = u"%s ColorTheme - %s" % ( get_skin_name().capitalize(), themename) backupfile = os.path.join(backup_path, backup_name + u".zip") zip_temp = u'special://temp/%s.zip' % backup_name xbmcvfs.delete(zip_temp) xbmcvfs.delete(backupfile) zip_temp = xbmc.translatePath(zip_temp).decode("utf-8") zip_file = zipfile.ZipFile(zip_temp, "w", zipfile.ZIP_DEFLATED) abs_src = os.path.abspath( xbmc.translatePath(self.userthemes_path).decode("utf-8")) for filename in xbmcvfs.listdir(self.userthemes_path)[1]: if (filename.startswith("%s_" % themename) or filename.replace( ".theme", "").replace(".jpg", "") == themename): filename = filename.decode("utf-8") filepath = xbmc.translatePath(self.userthemes_path + filename).decode("utf-8") absname = os.path.abspath(filepath) arcname = absname[len(abs_src) + 1:] zip_file.write(absname, arcname) zip_file.close() xbmcvfs.copy(zip_temp, backupfile) busyDialog("close")
def downloadresourceaddons(addontype): """show dialog with all available resource addons on the repo so the user can install one""" busyDialog("activate") 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, iconImage=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 open_item(self): """open selected item""" control_id = self.getFocusId() listitem = self.getControl(control_id).getSelectedItem() filename = listitem.getfilename() if "videodb:" in filename: # tvshow: open path xbmc.executebuiltin('Dialog.Close(all,true)') xbmc.executebuiltin('ReplaceWindow(Videos,%s/-2/)' % filename) self.close_dialog() elif "actor" in listitem.getProperty("DBTYPE"): # cast dialog busyDialog("activate") from dialogselect import DialogSelect results = [] name = listitem.getLabel().decode("utf-8") 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 busyDialog("close") dialog = DialogSelect("DialogSelect.xml", "", listing=results, windowtitle=name, richlayout=True) dialog.doModal() result = dialog.result del dialog if result: xbmc.executebuiltin(result.getfilename()) self.close_dialog() else: # video file: start playback xbmc.executebuiltin('PlayMedia("%s")' % filename) self.close_dialog()
""" script.skin.helper.service Contextmenu for Pvr art """ import xbmc import xbmcgui from metadatautils import MetadataUtils from utils import busyDialog # pylint: disable-msg=invalid-constant-name # Kodi contextmenu item to configure pvr artwork if __name__ == '__main__': ##### PVR Artwork ######## win = xbmcgui.Window(10000) win.setProperty("SkinHelper.Artwork.ManualLookup", "busy") busyDialog("activate") title = xbmc.getInfoLabel("ListItem.Title").decode('utf-8') if not title: title = xbmc.getInfoLabel("ListItem.Label").decode('utf-8') channel = xbmc.getInfoLabel("ListItem.ChannelName").decode('utf-8') genre = xbmc.getInfoLabel("ListItem.Genre").decode('utf-8') metadatautils = MetadataUtils() metadatautils.pvr_artwork_options(title, channel, genre) busyDialog("close") win.clearProperty("SkinHelper.Artwork.ManualLookup") metadatautils.close() del win
def select_image(self, skinstring, allow_multi=True, windowheader="", resource_addon="", skinhelper_backgrounds=False, current_value=""): """helper which lets the user select an image or imagepath from resourceaddons or custom path""" busyDialog("activate") images = [] if not windowheader: windowheader = self.addon.getLocalizedString(32020) if not current_value: current_value = xbmc.getInfoLabel("Skin.String(%s.label)" % skinstring).decode("utf-8") # none option images.append((self.addon.getLocalizedString(32001), "", "", "DefaultAddonNone.png")) # custom single images.append((self.addon.getLocalizedString(32004), "", "", "DefaultAddonPicture.png")) # custom multi if allow_multi: images.append((self.addon.getLocalizedString(32005), "", "", "DefaultFolder.png")) # backgrounds supplied in our special skinsettings.xml file skinimages = self.skinsettings if skinimages.get(skinstring): for item in skinimages[skinstring]: if not item["condition"] or getCondVisibility( item["condition"]): images.append((item["label"], item["value"], item["description"], item["icon"])) # backgrounds provided by skinhelper if skinhelper_backgrounds: from skinshortcuts import get_skinhelper_backgrounds for label, image in get_skinhelper_backgrounds(): images.append((label, image, "Skin Helper Backgrounds", xbmc.getInfoLabel(image))) # resource addon images if resource_addon: from resourceaddons import get_resourceimages images += get_resourceimages(resource_addon) # create listitems listitems = [] for label, imagepath, label2, icon in images: listitem = xbmcgui.ListItem(label=label, label2=label2, iconImage=icon) listitem.setPath(imagepath) listitems.append(listitem) # show select dialog with choices dialog = DialogSelect("DialogSelect.xml", "", listing=listitems, windowtitle=windowheader, richlayout=True, getmorebutton=resource_addon, autofocuslabel=current_value) busyDialog("close") dialog.doModal() result = dialog.result del dialog if isinstance(result, bool): if result: # refresh listing requested by getmore button return self.select_image(skinstring, allow_multi, windowheader, resource_addon, skinhelper_backgrounds, current_value) elif result: label = result.getLabel().decode("utf-8") if label == self.addon.getLocalizedString(32004): # browse for single image custom_image = SkinSettings().save_skin_image( skinstring, False, self.addon.getLocalizedString(32004)) if custom_image: result.setPath(custom_image) else: return self.selectimage() elif label == self.addon.getLocalizedString(32005): # browse for image path custom_image = SkinSettings().save_skin_image( skinstring, True, self.addon.getLocalizedString(32005)) if custom_image: result.setPath(custom_image) else: return self.selectimage() # return values return result.getLabel().decode( "utf-8"), result.getfilename().decode("utf-8") # return empty values return "", ""
def create_colortheme(self): """create a colortheme from current skin color settings""" try: current_skinfont = None json_response = kodi_json("Settings.GetSettingValue", {"setting": "lookandfeel.font"}) if json_response: current_skinfont = json_response current_skincolors = None json_response = kodi_json("Settings.GetSettingValue", {"setting": "lookandfeel.skincolors"}) if json_response: current_skincolors = json_response # user has to enter name for the theme themename = xbmcgui.Dialog().input( self.addon.getLocalizedString(32023), type=xbmcgui.INPUT_ALPHANUM).decode("utf-8") if not themename: return busyDialog("activate") xbmc.executebuiltin( "Skin.SetString(SkinHelper.LastColorTheme,%s)" % themename.encode("utf-8")) # add screenshot custom_thumbnail = xbmcgui.Dialog().browse( 2, self.addon.getLocalizedString(32024), 'files') if custom_thumbnail: xbmcvfs.copy(custom_thumbnail, self.userthemes_path + themename + ".jpg") # read the guisettings file to get all skin settings from backuprestore import BackupRestore skinsettingslist = BackupRestore().get_skinsettings([ "color", "opacity", "texture", "panel", "colour", "background", "image" ]) newlist = [] if skinsettingslist: newlist.append(("THEMENAME", themename)) newlist.append( ("DESCRIPTION", self.addon.getLocalizedString(32025))) newlist.append( ("SKINTHEME", xbmc.getInfoLabel("Skin.CurrentTheme"))) newlist.append(("SKINFONT", current_skinfont)) newlist.append(("SKINCOLORS", current_skincolors)) # look for any images in the skin settings and translate them so they can # be included in the theme backup for skinsetting in skinsettingslist: setting_type = skinsetting[0] setting_name = skinsetting[1] setting_value = skinsetting[2] if setting_type == "string" and setting_value: if (setting_value and (setting_value.endswith(".png") or setting_value.endswith(".gif") or setting_value.endswith(".jpg")) and "resource://" not in setting_value): image = get_clean_image(setting_value) extension = image.split(".")[-1] newimage = "%s_%s.%s" % ( themename, normalize_string(setting_name), extension) newimage_path = self.userthemes_path + newimage if xbmcvfs.exists(image): xbmcvfs.copy(image, newimage_path) skinsetting = (setting_type, setting_name, newimage_path) newlist.append(skinsetting) # save guisettings text_file_path = self.userthemes_path + themename + ".theme" text_file = xbmcvfs.File(text_file_path, "w") text_file.write(repr(newlist)) text_file.close() busyDialog("close") xbmcgui.Dialog().ok(self.addon.getLocalizedString(32026), self.addon.getLocalizedString(32027)) except Exception as exc: busyDialog("close") log_exception(__name__, exc) xbmcgui.Dialog().ok(self.addon.getLocalizedString(32028), self.addon.getLocalizedString(32030), str(exc))
def load_colortheme(filename): """load colortheme from themefile""" busyDialog("activate") xbmcfile = xbmcvfs.File(filename) data = xbmcfile.read() xbmcfile.close() importstring = eval(data) skintheme = None skincolor = None skinfont = None current_skintheme = xbmc.getInfoLabel("Skin.CurrentTheme").decode( "utf-8") current_skinfont = None json_response = kodi_json("Settings.GetSettingValue", {"setting": "lookandfeel.font"}) if json_response: current_skinfont = json_response current_skincolors = None json_response = kodi_json("Settings.GetSettingValue", {"setting": "lookandfeel.skincolors"}) if json_response: current_skincolors = json_response settingslist = set() for skinsetting in importstring: if skinsetting[0] == "SKINTHEME": skintheme = skinsetting[1].decode('utf-8') elif skinsetting[0] == "SKINCOLORS": skincolor = skinsetting[1] elif skinsetting[0] == "SKINFONT": skinfont = skinsetting[1] elif skinsetting[0] == "THEMENAME": xbmc.executebuiltin( "Skin.SetString(SkinHelper.LastColorTheme,%s)" % skinsetting[1]) elif skinsetting[0] == "DESCRIPTION": xbmc.executebuiltin( "Skin.SetString(SkinHelper.LastColorTheme.Description,%s)" % skinsetting[1]) elif skinsetting[1].startswith("SkinHelper.ColorTheme"): continue else: setting = skinsetting[1] if isinstance(setting, unicode): setting = setting.encode("utf-8") if setting not in settingslist: settingslist.add(setting) if skinsetting[0] == "string": if skinsetting[2] is not "": xbmc.executebuiltin("Skin.SetString(%s,%s)" % (setting, skinsetting[2])) else: xbmc.executebuiltin("Skin.Reset(%s)" % setting) elif skinsetting[0] == "bool": if skinsetting[2] == "true": xbmc.executebuiltin("Skin.SetBool(%s)" % setting) else: xbmc.executebuiltin("Skin.Reset(%s)" % setting) xbmc.sleep(30) # change the skintheme, color and font if needed if skintheme and current_skintheme != skintheme: kodi_json("Settings.SetSettingValue", { "setting": "lookandfeel.skintheme", "value": skintheme }) if skincolor and current_skincolors != skincolor: kodi_json("Settings.SetSettingValue", { "setting": "lookandfeel.skincolors", "value": skincolor }) if skinfont and current_skinfont != skinfont and current_skinfont.lower( ) != "arial": kodi_json("Settings.SetSettingValue", { "setting": "lookandfeel.font", "value": skinfont }) busyDialog("close")
def setresourceaddon(addontype, skinstring="", header=""): """helper to let the user choose a resource addon and set that as skin string""" busyDialog("activate") cur_value = xbmc.getInfoLabel("Skin.String(%s.name)" % skinstring).decode("utf-8") listing = [] addon = xbmcaddon.Addon(ADDON_ID) if not header: header = addon.getLocalizedString(32010) # none option listitem = xbmcgui.ListItem(label=addon.getLocalizedString(32001), iconImage="DefaultAddonNone.png") listitem.setProperty("addonid", "none") listing.append(listitem) # custom path listitem = xbmcgui.ListItem(label=addon.getLocalizedString(32009), iconImage="DefaultFolder.png") listitem.setProperty("addonid", "custom") listing.append(listitem) # available resource addons for item in get_resourceaddons(addontype): label2 = "%s: %s" % (xbmc.getLocalizedString(21863), item["author"]) listitem = xbmcgui.ListItem(label=item["name"], label2=label2, iconImage=item["thumbnail"]) listitem.setPath(item["path"]) listitem.setProperty("addonid", item["addonid"]) listing.append(listitem) # special skinhelper paths if addontype == "resource.images.moviegenrefanart": label = addon.getLocalizedString(32019) listitem = xbmcgui.ListItem( label=label, label2="Skin Helper Service", iconImage= "special://home/addons/script.skin.helper.service/icon.png") listitem.setPath( "plugin://script.skin.helper.service/?action=moviegenrebackground&genre=" ) listitem.setProperty("addonid", "skinhelper.forgenre") listing.append(listitem) # show select dialog with choices dialog = DialogSelect("DialogSelect.xml", "", listing=listing, windowtitle=header, richlayout=True, getmorebutton=addontype, autofocuslabel=cur_value) dialog.doModal() result = dialog.result del dialog # process selection... if isinstance(result, bool) and result: # refresh listing requested by getmore button del addon return setresourceaddon(addontype, skinstring) elif result: addon_id = result.getProperty("addonid") addon_name = result.getLabel().decode("utf-8") if addon_id == "none" and skinstring: # None xbmc.executebuiltin('Skin.Reset(%s)' % skinstring) xbmc.executebuiltin('Skin.Reset(%s.ext)' % skinstring) xbmc.executebuiltin('Skin.SetString(%s.name,%s)' % (skinstring, addon_name)) xbmc.executebuiltin('Skin.SetString(%s.label,%s)' % (skinstring, addon_name)) xbmc.executebuiltin('Skin.Reset(%s.path)' % skinstring) xbmc.executebuiltin('Skin.Reset(%s.multi)' % skinstring) else: if addon_id == "custom": # custom path dialog = xbmcgui.Dialog() custom_path = dialog.browse(0, addon.getLocalizedString(32005), 'files') del dialog result.setPath(custom_path) addonpath = result.getfilename().decode("utf-8") if addonpath: is_multi, extension = get_multi_extension(addonpath) xbmc.executebuiltin('Skin.SetString(%s,%s)' % (skinstring, addonpath)) xbmc.executebuiltin('Skin.SetString(%s.path,%s)' % (skinstring, addonpath)) xbmc.executebuiltin('Skin.SetString(%s.name,%s)' % (skinstring, addon_name)) xbmc.executebuiltin('Skin.SetString(%s.label,%s)' % (skinstring, addon_name)) xbmc.executebuiltin('Skin.SetString(%s.ext,%s)' % (skinstring, extension)) if is_multi: xbmc.executebuiltin('Skin.SetBool(%s.multi)' % skinstring) else: xbmc.executebuiltin('Skin.Reset(%s.multi)' % skinstring) del addon