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:
xbmc.executebuiltin("ActivateWindow(busydialog)")
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)
xbmc.executebuiltin("Dialog.Close(busydialog)")
python类copy()的实例源码
def restore_colortheme(self):
'''restore zipbackup of colortheme to colorthemes folder'''
zip_path = xbmcgui.Dialog().browse(1, self.addon.getLocalizedString(32030), "files", ".zip")
if zip_path and zip_path.endswith(".zip"):
# create temp path
temp_path = u'special://temp/skinbackup/'
temp_zip = u"special://temp/colortheme.zip"
if xbmcvfs.exists(temp_path):
recursive_delete_dir(temp_path)
xbmcvfs.mkdir(temp_path)
# unzip to temp
xbmcvfs.copy(zip_path, temp_zip)
unzip_fromfile(temp_zip, temp_path)
for filename in xbmcvfs.listdir(temp_path)[1]:
filename = filename.decode("utf-8")
sourcefile = os.path.join(temp_path, filename)
destfile = os.path.join(self.userthemes_path, filename)
xbmcvfs.copy(sourcefile, destfile)
# cleanup temp
xbmcvfs.delete(temp_zip)
recursive_delete_dir(temp_path)
xbmcgui.Dialog().ok(self.addon.getLocalizedString(32026), self.addon.getLocalizedString(32027))
def process_image(image_url, art_type, imdb_id):
'''animated gifs need to be stored locally, otherwise they won't work'''
# make sure that our local path for the gif images exists
addon = xbmcaddon.Addon(ADDON_ID)
gifs_path = "%sanimatedgifs/" % addon.getAddonInfo('profile')
del addon
if not xbmcvfs.exists(gifs_path):
xbmcvfs.mkdirs(gifs_path)
# only process existing images
if not image_url or not xbmcvfs.exists(image_url):
return None
# copy the image to our local path and return the new path as value
local_filename = "%s%s_%s.gif" % (gifs_path, imdb_id, art_type)
if xbmcvfs.exists(local_filename):
xbmcvfs.delete(local_filename)
# we don't use xbmcvfs.copy because we want to wait for the action to complete
img = xbmcvfs.File(image_url)
img_data = img.readBytes()
img.close()
img = xbmcvfs.File(local_filename, 'w')
img.write(img_data)
img.close()
return local_filename
def download_image(filename, url):
'''download specific image to local folder'''
if not url:
return url
refresh_needed = False
if xbmcvfs.exists(filename) and filename == url:
# only overwrite if new image is different
return filename
else:
if xbmcvfs.exists(filename):
xbmcvfs.delete(filename)
refresh_needed = True
if xbmcvfs.copy(url, filename):
if refresh_needed:
refresh_image(filename)
return filename
return url
def copyUserDefinedFiles():
# Copy everything in the user directory to the addon directory
infoTrace("vpnproviders.py", "Copying user defined files from userdata directory")
source_path = getUserDataPath((user_def_str)+"/")
dest_path = getAddonPath(True, user_def_str + "/")
# Get the list of connection profiles and another list of strings to abuse for the selection screen
try:
files = getUserDataList(user_def_str, "*")
if len(files) == 0:
errorTrace("vpnproviders.py", "No User Defined files available to copy from " + source_path)
return False
for file in files:
name = file[file.rfind(getSeparator())+1:]
dest_file = dest_path + getSeparator() + name
xbmcvfs.copy(file, dest_file)
if not xbmcvfs.exists(dest_file): raise IOError('Failed to copy user def file ' + file + " to " + dest_file)
return True
except Exception as e:
errorTrace("vpnproviders.py", "Error copying files from " + source_path + " to " + dest_path)
errorTrace("vpnproviders.py", str(e))
return False
def populateSupportingFromGit(vpn_provider):
# Copy all files from download to the directory that are not .ovpn, ignoring the metadata
try:
filelist = getDownloadList(vpn_provider, "*")
debugTrace("Copying supporting files into addon directory for " + vpn_provider)
for file in filelist:
if not file.endswith(".ovpn") and not file.endswith("METADATA.txt"):
name = os.path.basename(file)
fullname = getAddonPath(True, vpn_provider + "/" + name)
xbmcvfs.copy(file, fullname)
if not xbmcvfs.exists(fullname): raise IOError('Failed to copy supporting file ' + file + " to " + fullname)
return True
except Exception as e:
errorTrace("vpnproviders.py", "Can't copy " + file + " for VPN " + vpn_provider)
errorTrace("vpnproviders.py", str(e))
return False
def set_icon_for_theme(filename):
'''sets an icon for an existing theme'''
iconpath = filename.replace(".theme", ".jpg")
dialog = xbmcgui.Dialog()
custom_thumbnail = dialog.browse(2, xbmc.getLocalizedString(1030), 'files')
if custom_thumbnail:
xbmcvfs.delete(iconpath)
xbmcvfs.copy(custom_thumbnail, iconpath)
backuprestore.py 文件源码
项目:script.skin.helper.skinbackup
作者: marcelveldt
项目源码
文件源码
阅读 23
收藏 0
点赞 0
评论 0
def backup(self, filters=None, backup_file="", silent=False):
'''create skin backup'''
if not filters:
filters = []
if not backup_file:
return
# create temp path
temp_path = self.create_temp()
zip_temp = u'%s/skinbackup-%s.zip' % (temp_path, datetime.now().strftime('%Y-%m-%d %H.%M'))
temp_path = temp_path + "skinbackup/"
# backup skinshortcuts preferences
if not filters or (filters and "skinshortcuts" in filters):
self.backup_skinshortcuts(temp_path + "skinshortcuts/")
# backup skin settings
if "skinshortcutsonly" not in filters:
skinsettings_path = os.path.join(temp_path, u"guisettings.txt")
self.backup_skinsettings(skinsettings_path, filters, temp_path)
# zip the backup
zip_temp = xbmc.translatePath(zip_temp).decode("utf-8")
zip_tofile(temp_path, zip_temp)
# copy file to destination - wait untill it's really copied
copy_file(zip_temp, backup_file, True)
# cleanup temp
recursive_delete_dir(temp_path)
xbmcvfs.delete(zip_temp)
# show success message
if not silent:
xbmcgui.Dialog().ok(self.addon.getLocalizedString(32004), self.addon.getLocalizedString(32005))
backuprestore.py 文件源码
项目:script.skin.helper.skinbackup
作者: marcelveldt
项目源码
文件源码
阅读 19
收藏 0
点赞 0
评论 0
def backup_skinshortcuts(self, dest_path):
'''backup skinshortcuts including images'''
source_path = u'special://profile/addon_data/script.skinshortcuts/'
if not xbmcvfs.exists(dest_path):
xbmcvfs.mkdir(dest_path)
for file in xbmcvfs.listdir(source_path)[1]:
file = file.decode("utf-8")
sourcefile = source_path + file
destfile = dest_path + file
if xbmc.getCondVisibility("SubString(Skin.String(skinshortcuts-sharedmenu),false)"):
# User is not sharing menu, so strip the skin name out of the destination file
destfile = destfile.replace("%s." % (xbmc.getSkinDir()), "")
if (file.endswith(".DATA.xml") and (not xbmc.getCondVisibility(
"SubString(Skin.String(skinshortcuts-sharedmenu),false)") or file.startswith(xbmc.getSkinDir()))):
xbmcvfs.copy(sourcefile, destfile)
# parse shortcuts file and look for any images - if found copy them to addon folder
self.backup_skinshortcuts_images(destfile, dest_path)
elif file.endswith(".properties") and xbmc.getSkinDir() in file:
if xbmc.getSkinDir() in file:
destfile = dest_path + file.replace(xbmc.getSkinDir(), "SKINPROPERTIES")
copy_file(sourcefile, destfile)
self.backup_skinshortcuts_properties(destfile, dest_path)
else:
# just copy the remaining files
copy_file(sourcefile, destfile)
backuprestore.py 文件源码
项目:script.skin.helper.skinbackup
作者: marcelveldt
项目源码
文件源码
阅读 27
收藏 0
点赞 0
评论 0
def backup_skinshortcuts_images(shortcutfile, dest_path):
'''parse skinshortcuts file and copy images to backup location'''
shortcutfile = xbmc.translatePath(shortcutfile).decode("utf-8")
doc = parse(shortcutfile)
listing = doc.documentElement.getElementsByTagName('shortcut')
for shortcut in listing:
defaultid = shortcut.getElementsByTagName('defaultID')
if defaultid:
defaultid = defaultid[0].firstChild
if defaultid:
defaultid = defaultid.data
if not defaultid:
defaultid = shortcut.getElementsByTagName('label')[0].firstChild.data
thumb = shortcut.getElementsByTagName('thumb')
if thumb:
thumb = thumb[0].firstChild
if thumb:
thumb = thumb.data
if thumb and (thumb.endswith(".jpg") or thumb.endswith(".png") or thumb.endswith(".gif")):
thumb = get_clean_image(thumb)
extension = thumb.split(".")[-1]
newthumb = os.path.join(dest_path, "%s-thumb-%s.%s" %
(xbmc.getSkinDir(), normalize_string(defaultid), extension))
newthumb_vfs = "special://profile/addon_data/script.skinshortcuts/%s-thumb-%s.%s" % (
xbmc.getSkinDir(), normalize_string(defaultid), extension)
if xbmcvfs.exists(thumb):
copy_file(thumb, newthumb)
shortcut.getElementsByTagName('thumb')[0].firstChild.data = newthumb_vfs
# write changes to skinshortcuts file
shortcuts_file = xbmcvfs.File(shortcutfile, "w")
shortcuts_file.write(doc.toxml(encoding='utf-8'))
shortcuts_file.close()
def copy_file(source, destination, do_wait=False):
'''copy a file on the filesystem, wait for the action to be completed'''
if xbmcvfs.exists(destination):
delete_file(destination)
xbmcvfs.copy(source, destination)
if do_wait:
count = 20
while count:
xbmc.sleep(500) # this first sleep is intentional
if xbmcvfs.exists(destination):
break
count -= 1
def onInitialized(success):
if success:
channelList = database.getChannelList(onlyVisible=False)
xbmcvfs.mkdirs("special://profile/addon_data/script.tvguide.fullscreen/channel_logos/")
for channel in channelList:
from_file = channel.logo
regex = '[%s]' % re.escape('[]/\:')
xbmc.log(regex)
to_file = "special://profile/addon_data/script.tvguide.fullscreen/channel_logos/%s.png" % re.sub(regex,' ',channel.title)
xbmcvfs.copy(from_file,to_file)
database.close(onAutoplaysCleared)
else:
database.close()
def close(self):
if not self.isClosing:
self.isClosing = True
if self.player.isPlaying():
if ADDON.getSetting('stop.on.exit') == "true":
self.player.stop()
self.clear_catchup()
f = xbmcvfs.File('special://profile/addon_data/script.tvguide.fullscreen/tvdb.pickle','wb')
try:
pickle.dump(self.tvdb_urls,f)
except:
pass
f.close()
file_name = 'special://profile/addon_data/script.tvguide.fullscreen/custom_stream_urls_autosave.ini'
xbmcvfs.copy(file_name,file_name+".last")
f = xbmcvfs.File(file_name,'wb')
if self.database:
stream_urls = self.database.getCustomStreamUrls()
for (name,stream) in stream_urls:
write_str = "%s=%s\n" % (name,stream)
f.write(write_str.encode("utf8"))
f.close()
if self.database:
self.database.close(super(TVGuide, self).close)
else:
super(TVGuide, self).close()
def generateBlackbox():
files = getProfileList("blackbox")
destination_path = getProviderPath("blackbox" + "/")
for file in files:
xbmcvfs.copy(file, destination_path + os.path.basename(file))
generateMetaData("blackbox", MINIMUM_LEVEL)
def generateVanishedVPN():
files = getProfileList("VanishedVPN")
destination_path = getProviderPath("VanishedVPN" + "/")
for file in files:
xbmcvfs.copy(file, destination_path + os.path.basename(file))
generateMetaData("VanishedVPN", MINIMUM_LEVEL)
def generateVPNArea():
files = getProfileList("VPNArea")
destination_path = getProviderPath("VPNArea" + "/")
for file in files:
xbmcvfs.copy(file, destination_path + os.path.basename(file))
generateMetaData("VPNArea", MINIMUM_LEVEL)
backuprestore.py 文件源码
项目:script.skin.helper.skinbackup
作者: marcelveldt
项目源码
文件源码
阅读 23
收藏 0
点赞 0
评论 0
def restore(self, filename="", silent=False):
'''restore skin settings from file'''
if not filename:
filename = self.get_restorefilename()
progressdialog = None
if not silent:
progressdialog = xbmcgui.DialogProgress(self.addon.getLocalizedString(32006))
progressdialog.create(self.addon.getLocalizedString(32007))
if filename and xbmcvfs.exists(filename):
# create temp path
temp_path = self.create_temp()
if not filename.endswith("zip"):
# assume that passed filename is actually a skinsettings file
skinsettingsfile = filename
else:
# copy zip to temp directory and unzip
skinsettingsfile = temp_path + "guisettings.txt"
if progressdialog:
progressdialog.update(0, "unpacking backup...")
zip_temp = u'%sskinbackup-%s.zip' % (ADDON_DATA, datetime.now().strftime('%Y-%m-%d-%H-%M'))
copy_file(filename, zip_temp, True)
unzip_fromfile(zip_temp, temp_path)
delete_file(zip_temp)
# copy skinshortcuts preferences
self.restore_skinshortcuts(temp_path)
# restore any custom skin images or themes
for directory in ["custom_images/", "themes/"]:
custom_images_folder = u"special://profile/addon_data/%s/%s" % (xbmc.getSkinDir(), directory)
custom_images_folder_temp = temp_path + directory
if xbmcvfs.exists(custom_images_folder_temp):
for file in xbmcvfs.listdir(custom_images_folder_temp)[1]:
xbmcvfs.copy(custom_images_folder_temp + file,
custom_images_folder + file)
# restore guisettings
if xbmcvfs.exists(skinsettingsfile):
self.restore_guisettings(skinsettingsfile, progressdialog)
# cleanup temp
recursive_delete_dir(temp_path)
progressdialog.close()
if not silent:
xbmcgui.Dialog().ok(self.addon.getLocalizedString(32006), self.addon.getLocalizedString(32009))
def download_artwork(folderpath, artwork):
'''download artwork to local folder'''
efa_path = ""
new_dict = {}
if not xbmcvfs.exists(folderpath):
xbmcvfs.mkdir(folderpath)
for key, value in artwork.iteritems():
if key == "fanart":
new_dict[key] = download_image(os.path.join(folderpath, "fanart.jpg"), value)
elif key == "thumb":
new_dict[key] = download_image(os.path.join(folderpath, "folder.jpg"), value)
elif key == "discart":
new_dict[key] = download_image(os.path.join(folderpath, "disc.png"), value)
elif key == "banner":
new_dict[key] = download_image(os.path.join(folderpath, "banner.jpg"), value)
elif key == "clearlogo":
new_dict[key] = download_image(os.path.join(folderpath, "logo.png"), value)
elif key == "clearart":
new_dict[key] = download_image(os.path.join(folderpath, "clearart.png"), value)
elif key == "characterart":
new_dict[key] = download_image(os.path.join(folderpath, "characterart.png"), value)
elif key == "poster":
new_dict[key] = download_image(os.path.join(folderpath, "poster.jpg"), value)
elif key == "landscape":
new_dict[key] = download_image(os.path.join(folderpath, "landscape.jpg"), value)
elif key == "thumbback":
new_dict[key] = download_image(os.path.join(folderpath, "thumbback.jpg"), value)
elif key == "spine":
new_dict[key] = download_image(os.path.join(folderpath, "spine.jpg"), value)
elif key == "fanarts" and value:
# copy extrafanarts only if the directory doesn't exist at all
delim = "\\" if "\\" in folderpath else "/"
efa_path = "%sextrafanart" % folderpath + delim
if not xbmcvfs.exists(efa_path):
xbmcvfs.mkdir(efa_path)
images = []
for count, image in enumerate(value):
image = download_image(os.path.join(efa_path, "fanart%s.jpg" % count), image)
images.append(image)
if LIMIT_EXTRAFANART and count == LIMIT_EXTRAFANART:
break
new_dict[key] = images
elif key == "posters" and value:
# copy extraposters only if the directory doesn't exist at all
delim = "\\" if "\\" in folderpath else "/"
efa_path = "%sextraposter" % folderpath + delim
if not xbmcvfs.exists(efa_path):
xbmcvfs.mkdir(efa_path)
images = []
for count, image in enumerate(value):
image = download_image(os.path.join(efa_path, "poster%s.jpg" % count), image)
images.append(image)
if LIMIT_EXTRAFANART and count == LIMIT_EXTRAFANART:
break
new_dict[key] = images
else:
new_dict[key] = value
if efa_path:
new_dict["extrafanart"] = efa_path
return new_dict