def runJob(self, cronJob, override_notification=False): utils.log("running command " + cronJob.name) if (cronJob.show_notification == "true" or override_notification): #show a notification that this command is running utils.showNotification("Cron", cronJob.name + " is executing") #run the command xbmc.executebuiltin(cronJob.command)
def runJob(self,cronJob,override_notification = False): utils.log("running command " + cronJob.name + " for addon " + cronJob.addon) if(cronJob.show_notification == "true" or override_notification): #show a notification that this command is running utils.showNotification("Cron", cronJob.name + " is executing") #run the command xbmc.executebuiltin(cronJob.command)
def main(): d = getDateTime() # Global app app = QApplication(sys.argv) QApplication.setQuitOnLastWindowClosed(False) qIcon = QIcon('icons/shotty.png') app.setWindowIcon(qIcon) shotty = ShottyFullscreen() showNotification('Shotty', 'Running in the background') tray = QSystemTrayIcon() if tray.isSystemTrayAvailable(): tray.setIcon(QIcon('icons/shotty.png')) tray.setVisible(True) tray.show() # Add a menu trayMenu = QMenu() region_screenshot_action = QAction(QIcon("icons/screenshot.png"), 'Take region screenshot') full_screenshot_action = QAction(QIcon("icons/screenshot.png"), 'Take screenshot') settings_action = QAction(QIcon("icons/settings.png"), 'Settings') about_action = QAction(QIcon("icons/info.png"), 'About') exit_action = QAction(QIcon("icons/exit.png"), 'Exit Shoty') exit_action.triggered.connect(app.exit) about_action.triggered.connect(shotty.showShottyAboutWindow) region_screenshot_action.triggered.connect(shotty.initUI) # We need to pass checked because connect passes # a bool arg as first param full_screenshot_action.triggered.connect( lambda checked, date=getDateTime( ), x1=-1, y1=-1, x2=-1, y2=-1, im=screenshot( ): shotty.saveScreenShot(date, x1, y1, x2, y2, im=im[:, :, :3])) trayMenu.addAction(region_screenshot_action) trayMenu.addAction(full_screenshot_action) trayMenu.addAction(settings_action) trayMenu.addAction(about_action) trayMenu.addAction(exit_action) tray.setContextMenu(trayMenu) else: print("[ERROR] Can't instantiate tray icon") sys.exit(app.exec_())
def playfromStream(self, item, versionIndex): version = item.versions[versionIndex] chanUrl = self.vader.build_stream_url(version['id']) r = requests.get(chanUrl, allow_redirects=False) chanUrl = r.headers['Location'] listitem = xbmcgui.ListItem(path=chanUrl) listitem = xbmcgui.ListItem('{title} - {channel}'.format( title=item.getLabel(), channel=version['name'], path=chanUrl)) if '.mpd' in chanUrl: listitem.setProperty('inputstreamaddon', 'inputstream.adaptive') listitem.setProperty('inputstream.adaptive.manifest_type', 'mpd') # xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, listitem) self.player.play(chanUrl, listitem) xbmc.sleep(1000) if not self.player.isPlaying(): utils.showNotification( 'Match Center', 'Stream could not be played. Please try again later.')
def saveScreenShot(self, filename, x1, y1, x2, y2, im="self"): if getExtension(filename) == '': filename += '.png' if im == "self": im = self.im if x1 == -1: h, w, _ = im.shape qScreen = QImage(im.copy(), w, h, QImage.Format_RGB888).rgbSwapped() else: crop_im = im[y1:y2, x1:x2, :].copy() h, w, _ = crop_im.shape qScreen = QImage(crop_im, w, h, QImage.Format_RGB888).rgbSwapped() self.saveImageThread = SaveImageThread(qScreen, filename) self.saveImageThread.start() # Connect the signal from the thread to the finished method self.saveImageThread.signal.connect( lambda checked, title='Shotty', msg='Image saved: {}'.format( filename): showNotification(title, msg))
def run(self,mode=-1,progressOverride=False): #set windows setting to true window = xbmcgui.Window(10000) window.setProperty(utils.__addon_id__ + ".running","true") #append backup folder name progressBarTitle = utils.getString(30010) + " - " if(mode == self.Backup and self.remote_vfs.root_path != ''): if(utils.getSetting("compress_backups") == 'true'): #delete old temp file if(self.xbmc_vfs.exists(xbmc.translatePath('special://temp/xbmc_backup_temp.zip'))): if(not self.xbmc_vfs.rmfile(xbmc.translatePath('special://temp/xbmc_backup_temp.zip'))): #we had some kind of error deleting the old file xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30096),utils.getString(30097)) return #save the remote file system and use the zip vfs self.saved_remote_vfs = self.remote_vfs self.remote_vfs = ZipFileSystem(xbmc.translatePath("special://temp/xbmc_backup_temp.zip"),"w") self.remote_vfs.set_root(self.remote_vfs.root_path + time.strftime("%Y%m%d%H%M") + "/") progressBarTitle = progressBarTitle + utils.getString(30023) + ": " + utils.getString(30016) elif(mode == self.Restore and self.restore_point != None and self.remote_vfs.root_path != ''): if(self.restore_point.split('.')[-1] != 'zip'): self.remote_vfs.set_root(self.remote_vfs.root_path + self.restore_point + "/") progressBarTitle = progressBarTitle + utils.getString(30023) + ": " + utils.getString(30017) else: #kill the program here self.remote_vfs = None return utils.log(utils.getString(30047) + ": " + self.xbmc_vfs.root_path) utils.log(utils.getString(30048) + ": " + self.remote_vfs.root_path) #setup the progress bar self.progressBar = BackupProgressBar(progressOverride) self.progressBar.create(progressBarTitle,utils.getString(30049) + "......") if(mode == self.Backup): utils.log(utils.getString(30023) + " - " + utils.getString(30016)) #check if remote path exists if(self.remote_vfs.exists(self.remote_vfs.root_path)): #may be data in here already utils.log(utils.getString(30050)) else: #make the remote directory self.remote_vfs.mkdir(self.remote_vfs.root_path) #create a validation file for backup rotation writeCheck = self._createValidationFile() if(not writeCheck): #we may not be able to write to this destination for some reason shouldContinue = xbmcgui.Dialog().yesno(utils.getString(30089),utils.getString(30090), utils.getString(30044),autoclose=25000) if(not shouldContinue): return utils.log(utils.getString(30051)) allFiles = [] fileManager = FileManager(self.xbmc_vfs) #go through each of the user selected items and write them to the backup store if(utils.getSetting('backup_addons') == 'true'): fileManager.addFile("-" + xbmc.translatePath('special://home/addons')) fileManager.walkTree(xbmc.translatePath('special://home/addons')) fileManager.addFile("-" + xbmc.translatePath('special://home/userdata')) if(utils.getSetting('backup_addon_data') == 'true'): fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/addon_data')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/addon_data')) if(utils.getSetting('backup_database') == 'true'): fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/Database')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/Database')) if(utils.getSetting("backup_playlists") == 'true'): fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/playlists')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/playlists')) if(utils.getSetting('backup_profiles') == 'true'): fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/profiles')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/profiles')) if(utils.getSetting("backup_thumbnails") == "true"): fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/Thumbnails')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/Thumbnails')) if(utils.getSetting("backup_config") == "true"): fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/keymaps')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/keymaps')) fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/peripheral_data')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/peripheral_data')) fileManager.addFile('-' + xbmc.translatePath('special://home/userdata/library')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/library')) #this part is an oddity dirs,configFiles = self.xbmc_vfs.listdir(xbmc.translatePath('special://home/userdata/')) for aFile in configFiles: if(aFile.endswith(".xml")): fileManager.addFile(xbmc.translatePath('special://home/userdata/') + aFile) #add to array self.filesTotal = fileManager.size() allFiles.append({"source":self.xbmc_vfs.root_path,"dest":self.remote_vfs.root_path,"files":fileManager.getFiles()}) orig_base_path = self.remote_vfs.root_path #check if there are custom directories if(utils.getSetting('custom_dir_1_enable') == 'true' and utils.getSetting('backup_custom_dir_1') != ''): #create a special remote path with hash self.xbmc_vfs.set_root(utils.getSetting('backup_custom_dir_1')) fileManager.addFile("-custom_" + self._createCRC(self.xbmc_vfs.root_path)) #walk the directory fileManager.walkTree(self.xbmc_vfs.root_path) self.filesTotal = self.filesTotal + fileManager.size() allFiles.append({"source":self.xbmc_vfs.root_path,"dest":self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path),"files":fileManager.getFiles()}) if(utils.getSetting('custom_dir_2_enable') == 'true' and utils.getSetting('backup_custom_dir_2') != ''): #create a special remote path with hash self.xbmc_vfs.set_root(utils.getSetting('backup_custom_dir_2')) fileManager.addFile("-custom_" + self._createCRC(self.xbmc_vfs.root_path)) #walk the directory fileManager.walkTree(self.xbmc_vfs.root_path) self.filesTotal = self.filesTotal + fileManager.size() allFiles.append({"source":self.xbmc_vfs.root_path,"dest":self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path),"files":fileManager.getFiles()}) #backup all the files self.filesLeft = self.filesTotal for fileGroup in allFiles: self.xbmc_vfs.set_root(fileGroup['source']) self.remote_vfs.set_root(fileGroup['dest']) filesCopied = self.backupFiles(fileGroup['files'],self.xbmc_vfs,self.remote_vfs) if(not filesCopied): utils.showNotification(utils.getString(30092)) utils.log(utils.getString(30092)) #reset remote and xbmc vfs self.xbmc_vfs.set_root("special://home/") self.remote_vfs.set_root(orig_base_path) if(utils.getSetting("compress_backups") == 'true'): #send the zip file to the real remote vfs zip_name = self.remote_vfs.root_path[:-1] + ".zip" self.remote_vfs.cleanup() self.xbmc_vfs.rename(xbmc.translatePath("special://temp/xbmc_backup_temp.zip"), xbmc.translatePath("special://temp/" + zip_name)) fileManager.addFile(xbmc.translatePath("special://temp/" + zip_name)) #set root to data dir home self.xbmc_vfs.set_root(xbmc.translatePath("special://temp/")) self.remote_vfs = self.saved_remote_vfs self.progressBar.updateProgress(98, utils.getString(30088)) fileCopied = self.backupFiles(fileManager.getFiles(),self.xbmc_vfs, self.remote_vfs) if(not fileCopied): #zip archive copy filed, inform the user shouldContinue = xbmcgui.Dialog().ok(utils.getString(30089),utils.getString(30090), utils.getString(30091)) #delete the temp zip file self.xbmc_vfs.rmfile(xbmc.translatePath("special://temp/" + zip_name)) #remove old backups self._rotateBackups() elif (mode == self.Restore): utils.log(utils.getString(30023) + " - " + utils.getString(30017)) #catch for if the restore point is actually a zip file if(self.restore_point.split('.')[-1] == 'zip'): self.progressBar.updateProgress(2, utils.getString(30088)) utils.log("copying zip file: " + self.restore_point) #set root to data dir home self.xbmc_vfs.set_root(xbmc.translatePath("special://temp/")) if(not self.xbmc_vfs.exists(xbmc.translatePath("special://temp/" + self.restore_point))): #copy just this file from the remote vfs zipFile = [] zipFile.append(self.remote_base_path + self.restore_point) self.backupFiles(zipFile,self.remote_vfs, self.xbmc_vfs) else: utils.log("zip file exists already") #extract the zip file zip_vfs = ZipFileSystem(xbmc.translatePath("special://temp/"+ self.restore_point),'r') zip_vfs.extract(xbmc.translatePath("special://temp/")) zip_vfs.cleanup() #set the new remote vfs and fix xbmc path self.remote_vfs = XBMCFileSystem(xbmc.translatePath("special://temp/" + self.restore_point.split(".")[0] + "/")) self.xbmc_vfs.set_root(xbmc.translatePath("special://home/")) #for restores remote path must exist if(not self.remote_vfs.exists(self.remote_vfs.root_path)): xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30045),self.remote_vfs.root_path) return if(not self._checkValidationFile(self.remote_vfs.root_path)): #don't continue return utils.log(utils.getString(30051)) allFiles = [] fileManager = FileManager(self.remote_vfs) #go through each of the user selected items and write them to the backup store if(utils.getSetting("backup_config") == "true"): #check for the existance of an advancedsettings file if(self.remote_vfs.exists(self.remote_vfs.root_path + "userdata/advancedsettings.xml") and not self.skip_advanced): #let the user know there is an advanced settings file present restartXbmc = xbmcgui.Dialog().yesno(utils.getString(30038),utils.getString(30039),utils.getString(30040), utils.getString(30041)) if(restartXbmc): #add only this file to the file list fileManager.addFile(self.remote_vfs.root_path + "userdata/advancedsettings.xml") self.backupFiles(fileManager.getFiles(),self.remote_vfs,self.xbmc_vfs) #let the service know to resume this backup on startup self._createResumeBackupFile() #do not continue running xbmcgui.Dialog().ok(utils.getString(30077),utils.getString(30078)) return fileManager.addFile('-' + self.remote_vfs.root_path + 'userdata/keymaps') fileManager.walkTree(self.remote_vfs.root_path + "userdata/keymaps") fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/peripheral_data") fileManager.walkTree(self.remote_vfs.root_path + "userdata/peripheral_data") fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/library") fileManager.walkTree(self.remote_vfs.root_path + "userdata/library") #this part is an oddity dirs,configFiles = self.remote_vfs.listdir(self.remote_vfs.root_path + "userdata/") for aFile in configFiles: if(aFile.endswith(".xml")): fileManager.addFile(self.remote_vfs.root_path + "userdata/" + aFile) if(utils.getSetting('backup_addons') == 'true'): fileManager.addFile('-' + self.remote_vfs.root_path + "addons") fileManager.walkTree(self.remote_vfs.root_path + "addons") self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata')) if(utils.getSetting('backup_addon_data') == 'true'): fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/addon_data") fileManager.walkTree(self.remote_vfs.root_path + "userdata/addon_data") if(utils.getSetting('backup_database') == 'true'): fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/Database") fileManager.walkTree(self.remote_vfs.root_path + "userdata/Database") if(utils.getSetting("backup_playlists") == 'true'): fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/playlists") fileManager.walkTree(self.remote_vfs.root_path + "userdata/playlists") if(utils.getSetting('backup_profiles') == 'true'): fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/profiles") fileManager.walkTree(self.remote_vfs.root_path + "userdata/profiles") if(utils.getSetting("backup_thumbnails") == "true"): fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/Thumbnails") fileManager.walkTree(self.remote_vfs.root_path + "userdata/Thumbnails") #add to array self.filesTotal = fileManager.size() allFiles.append({"source":self.remote_vfs.root_path,"dest":self.xbmc_vfs.root_path,"files":fileManager.getFiles()}) #check if there are custom directories if(utils.getSetting('custom_dir_1_enable') == 'true' and utils.getSetting('backup_custom_dir_1') != ''): self.xbmc_vfs.set_root(utils.getSetting('backup_custom_dir_1')) if(self.remote_vfs.exists(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path))): #index files to restore fileManager.walkTree(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path)) self.filesTotal = self.filesTotal + fileManager.size() allFiles.append({"source":self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path),"dest":self.xbmc_vfs.root_path,"files":fileManager.getFiles()}) else: xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30045),self.remote_vfs.root_path + "custom_" + self._createCRC(utils.getSetting('backup_custom_dir_1'))) if(utils.getSetting('custom_dir_2_enable') == 'true' and utils.getSetting('backup_custom_dir_2') != ''): self.xbmc_vfs.set_root(utils.getSetting('backup_custom_dir_2')) if(self.remote_vfs.exists(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path))): #index files to restore fileManager.walkTree(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path)) self.filesTotal = self.filesTotal + fileManager.size() allFiles.append({"source":self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path),"dest":self.xbmc_vfs.root_path,"files":fileManager.getFiles()}) else: xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30045),self.remote_vfs.root_path + "custom_" + self._createCRC(utils.getSetting('backup_custom_dir_2'))) #restore all the files self.filesLeft = self.filesTotal for fileGroup in allFiles: self.remote_vfs.set_root(fileGroup['source']) self.xbmc_vfs.set_root(fileGroup['dest']) self.backupFiles(fileGroup['files'],self.remote_vfs,self.xbmc_vfs) if(self.restore_point.split('.')[-1] == 'zip'): #delete the zip file and the extracted directory self.xbmc_vfs.rmfile(xbmc.translatePath("special://temp/" + self.restore_point)) self.xbmc_vfs.rmdir(self.remote_vfs.root_path) if(utils.getSetting("backup_config") == "true"): #update the guisettings information (or what we can from it) gui_settings = GuiSettingsManager('special://home/userdata/guisettings.xml') gui_settings.run() #call update addons to refresh everything xbmc.executebuiltin('UpdateLocalAddons') self.xbmc_vfs.cleanup() self.remote_vfs.cleanup() self.progressBar.close() #reset the window setting window.setProperty(utils.__addon_id__ + ".running","")
def run(self,mode=-1,progressOverride=False): #set windows setting to true window = xbmcgui.Window(10000) window.setProperty(utils.__addon_id__ + ".running","true") #append backup folder name progressBarTitle = utils.getString(30010) + " - " if(mode == self.Backup and self.remote_vfs.root_path != ''): if(utils.getSetting("compress_backups") == 'true'): #delete old temp file if(self.xbmc_vfs.exists(xbmc.translatePath('special://temp/xbmc_backup_temp.zip'))): if(not self.xbmc_vfs.rmfile(xbmc.translatePath('special://temp/xbmc_backup_temp.zip'))): #we had some kind of error deleting the old file xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30096),utils.getString(30097)) return #save the remote file system and use the zip vfs self.saved_remote_vfs = self.remote_vfs self.remote_vfs = ZipFileSystem(xbmc.translatePath("special://temp/xbmc_backup_temp.zip"),"w") self.remote_vfs.set_root(self.remote_vfs.root_path + time.strftime("%Y%m%d%H%M") + "/") progressBarTitle = progressBarTitle + utils.getString(30023) + ": " + utils.getString(30016) elif(mode == self.Restore and self.restore_point != None and self.remote_vfs.root_path != ''): if(self.restore_point.split('.')[-1] != 'zip'): self.remote_vfs.set_root(self.remote_vfs.root_path + self.restore_point + "/") progressBarTitle = progressBarTitle + utils.getString(30023) + ": " + utils.getString(30017) else: #kill the program here self.remote_vfs = None return utils.log(utils.getString(30047) + ": " + self.xbmc_vfs.root_path) utils.log(utils.getString(30048) + ": " + self.remote_vfs.root_path) #setup the progress bar self.progressBar = BackupProgressBar(progressOverride) self.progressBar.create(progressBarTitle,utils.getString(30049) + "......") if(mode == self.Backup): utils.log(utils.getString(30023) + " - " + utils.getString(30016)) #check if remote path exists if(self.remote_vfs.exists(self.remote_vfs.root_path)): #may be data in here already utils.log(utils.getString(30050)) else: #make the remote directory self.remote_vfs.mkdir(self.remote_vfs.root_path) #create a validation file for backup rotation writeCheck = self._createValidationFile() if(not writeCheck): #we may not be able to write to this destination for some reason shouldContinue = xbmcgui.Dialog().yesno(utils.getString(30089),utils.getString(30090), utils.getString(30044),autoclose=25000) if(not shouldContinue): return utils.log(utils.getString(30051)) allFiles = [] fileManager = FileManager(self.xbmc_vfs) #go through each of the user selected items and write them to the backup store if(utils.getSetting('backup_addons') == 'true'): fileManager.addFile("-" + xbmc.translatePath('special://home/addons')) fileManager.walkTree(xbmc.translatePath('special://home/addons')) fileManager.addFile("-" + xbmc.translatePath('special://home/userdata')) if(utils.getSetting('backup_addon_data') == 'true'): fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/addon_data')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/addon_data')) if(utils.getSetting('backup_database') == 'true'): fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/Database')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/Database')) if(utils.getSetting("backup_playlists") == 'true'): fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/playlists')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/playlists')) if(utils.getSetting('backup_profiles') == 'true'): fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/profiles')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/profiles')) if(utils.getSetting("backup_thumbnails") == "true"): fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/Thumbnails')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/Thumbnails')) if(utils.getSetting("backup_config") == "true"): fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/keymaps')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/keymaps')) fileManager.addFile("-" + xbmc.translatePath('special://home/userdata/peripheral_data')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/peripheral_data')) fileManager.addFile('-' + xbmc.translatePath('special://home/userdata/library')) fileManager.walkTree(xbmc.translatePath('special://home/userdata/library')) #this part is an oddity dirs,configFiles = self.xbmc_vfs.listdir(xbmc.translatePath('special://home/userdata/')) for aFile in configFiles: if(aFile.endswith(".xml")): fileManager.addFile(xbmc.translatePath('special://home/userdata/') + aFile) #add to array self.filesTotal = fileManager.size() allFiles.append({"source":self.xbmc_vfs.root_path,"dest":self.remote_vfs.root_path,"files":fileManager.getFiles()}) orig_base_path = self.remote_vfs.root_path #check if there are custom directories if(utils.getSetting('custom_dir_1_enable') == 'true' and utils.getSetting('backup_custom_dir_1') != ''): #create a special remote path with hash self.xbmc_vfs.set_root(utils.getSetting('backup_custom_dir_1')) fileManager.addFile("-custom_" + self._createCRC(self.xbmc_vfs.root_path)) #walk the directory fileManager.walkTree(self.xbmc_vfs.root_path) self.filesTotal = self.filesTotal + fileManager.size() allFiles.append({"source":self.xbmc_vfs.root_path,"dest":self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path),"files":fileManager.getFiles()}) if(utils.getSetting('custom_dir_2_enable') == 'true' and utils.getSetting('backup_custom_dir_2') != ''): #create a special remote path with hash self.xbmc_vfs.set_root(utils.getSetting('backup_custom_dir_2')) fileManager.addFile("-custom_" + self._createCRC(self.xbmc_vfs.root_path)) #walk the directory fileManager.walkTree(self.xbmc_vfs.root_path) self.filesTotal = self.filesTotal + fileManager.size() allFiles.append({"source":self.xbmc_vfs.root_path,"dest":self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path),"files":fileManager.getFiles()}) #backup all the files self.filesLeft = self.filesTotal for fileGroup in allFiles: self.xbmc_vfs.set_root(fileGroup['source']) self.remote_vfs.set_root(fileGroup['dest']) filesCopied = self.backupFiles(fileGroup['files'],self.xbmc_vfs,self.remote_vfs) if(not filesCopied): utils.showNotification(utils.getString(30092)) utils.log(utils.getString(30092)) #reset remote and xbmc vfs self.xbmc_vfs.set_root("special://home/") self.remote_vfs.set_root(orig_base_path) if(utils.getSetting("compress_backups") == 'true'): #send the zip file to the real remote vfs zip_name = self.remote_vfs.root_path[:-1] + ".zip" self.remote_vfs.cleanup() self.xbmc_vfs.rename(xbmc.translatePath("special://temp/xbmc_backup_temp.zip"), xbmc.translatePath("special://temp/" + zip_name)) fileManager.addFile(xbmc.translatePath("special://temp/" + zip_name)) #set root to data dir home self.xbmc_vfs.set_root(xbmc.translatePath("special://temp/")) self.remote_vfs = self.saved_remote_vfs self.progressBar.updateProgress(98, utils.getString(30088)) fileCopied = self.backupFiles(fileManager.getFiles(),self.xbmc_vfs, self.remote_vfs) if(not fileCopied): #zip archive copy filed, inform the user shouldContinue = xbmcgui.Dialog().ok(utils.getString(30089),utils.getString(30090), utils.getString(30091)) #delete the temp zip file self.xbmc_vfs.rmfile(xbmc.translatePath("special://temp/" + zip_name)) #remove old backups self._rotateBackups() elif (mode == self.Restore): utils.log(utils.getString(30023) + " - " + utils.getString(30017)) #catch for if the restore point is actually a zip file if(self.restore_point.split('.')[-1] == 'zip'): self.progressBar.updateProgress(2, utils.getString(30088)) utils.log("copying zip file: " + self.restore_point) #set root to data dir home self.xbmc_vfs.set_root(xbmc.translatePath("special://temp/")) if(not self.xbmc_vfs.exists(xbmc.translatePath("special://temp/" + self.restore_point))): #copy just this file from the remote vfs zipFile = [] zipFile.append(self.remote_base_path + self.restore_point) self.backupFiles(zipFile,self.remote_vfs, self.xbmc_vfs) else: utils.log("zip file exists already") #extract the zip file zip_vfs = ZipFileSystem(xbmc.translatePath("special://temp/"+ self.restore_point),'r') extractor = ZipExtractor() if(not extractor.extract(zip_vfs, xbmc.translatePath("special://temp/"), self.progressBar)): #we had a problem extracting the archive, delete everything zip_vfs.cleanup() self.xbmc_vfs.rmfile(xbmc.translatePath("special://temp/" + self.restore_point)) xbmcgui.Dialog.ok(utils.getSetting(30010),utils.getString(30101)) return zip_vfs.cleanup() self.progressBar.updateProgress(0,utils.getString(30049) + "......") #set the new remote vfs and fix xbmc path self.remote_vfs = XBMCFileSystem(xbmc.translatePath("special://temp/" + self.restore_point.split(".")[0] + "/")) self.xbmc_vfs.set_root(xbmc.translatePath("special://home/")) #for restores remote path must exist if(not self.remote_vfs.exists(self.remote_vfs.root_path)): xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30045),self.remote_vfs.root_path) return if(not self._checkValidationFile(self.remote_vfs.root_path)): #don't continue return utils.log(utils.getString(30051)) allFiles = [] fileManager = FileManager(self.remote_vfs) #go through each of the user selected items and write them to the backup store if(utils.getSetting("backup_config") == "true"): #check for the existance of an advancedsettings file if(self.remote_vfs.exists(self.remote_vfs.root_path + "userdata/advancedsettings.xml") and not self.skip_advanced): #let the user know there is an advanced settings file present restartXbmc = xbmcgui.Dialog().yesno(utils.getString(30038),utils.getString(30039),utils.getString(30040), utils.getString(30041)) if(restartXbmc): #add only this file to the file list fileManager.addFile(self.remote_vfs.root_path + "userdata/advancedsettings.xml") self.backupFiles(fileManager.getFiles(),self.remote_vfs,self.xbmc_vfs) #let the service know to resume this backup on startup self._createResumeBackupFile() #do not continue running xbmcgui.Dialog().ok(utils.getString(30077),utils.getString(30078)) return fileManager.addFile('-' + self.remote_vfs.root_path + 'userdata/keymaps') fileManager.walkTree(self.remote_vfs.root_path + "userdata/keymaps") fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/peripheral_data") fileManager.walkTree(self.remote_vfs.root_path + "userdata/peripheral_data") fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/library") fileManager.walkTree(self.remote_vfs.root_path + "userdata/library") #this part is an oddity dirs,configFiles = self.remote_vfs.listdir(self.remote_vfs.root_path + "userdata/") for aFile in configFiles: if(aFile.endswith(".xml")): fileManager.addFile(self.remote_vfs.root_path + "userdata/" + aFile) if(utils.getSetting('backup_addons') == 'true'): fileManager.addFile('-' + self.remote_vfs.root_path + "addons") fileManager.walkTree(self.remote_vfs.root_path + "addons") self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata')) if(utils.getSetting('backup_addon_data') == 'true'): fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/addon_data") fileManager.walkTree(self.remote_vfs.root_path + "userdata/addon_data") if(utils.getSetting('backup_database') == 'true'): fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/Database") fileManager.walkTree(self.remote_vfs.root_path + "userdata/Database") if(utils.getSetting("backup_playlists") == 'true'): fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/playlists") fileManager.walkTree(self.remote_vfs.root_path + "userdata/playlists") if(utils.getSetting('backup_profiles') == 'true'): fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/profiles") fileManager.walkTree(self.remote_vfs.root_path + "userdata/profiles") if(utils.getSetting("backup_thumbnails") == "true"): fileManager.addFile('-' + self.remote_vfs.root_path + "userdata/Thumbnails") fileManager.walkTree(self.remote_vfs.root_path + "userdata/Thumbnails") #add to array self.filesTotal = fileManager.size() allFiles.append({"source":self.remote_vfs.root_path,"dest":self.xbmc_vfs.root_path,"files":fileManager.getFiles()}) #check if there are custom directories if(utils.getSetting('custom_dir_1_enable') == 'true' and utils.getSetting('backup_custom_dir_1') != ''): self.xbmc_vfs.set_root(utils.getSetting('backup_custom_dir_1')) if(self.remote_vfs.exists(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path) + "/")): #index files to restore fileManager.walkTree(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path)) self.filesTotal = self.filesTotal + fileManager.size() allFiles.append({"source":self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path),"dest":self.xbmc_vfs.root_path,"files":fileManager.getFiles()}) else: utils.log("error path not found: " + self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path)) xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30045),self.remote_vfs.root_path + "custom_" + self._createCRC(utils.getSetting('backup_custom_dir_1'))) if(utils.getSetting('custom_dir_2_enable') == 'true' and utils.getSetting('backup_custom_dir_2') != ''): self.xbmc_vfs.set_root(utils.getSetting('backup_custom_dir_2')) if(self.remote_vfs.exists(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path) + "/")): #index files to restore fileManager.walkTree(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path)) self.filesTotal = self.filesTotal + fileManager.size() allFiles.append({"source":self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path),"dest":self.xbmc_vfs.root_path,"files":fileManager.getFiles()}) else: utils.log("error path not found: " + self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path)) xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30045),self.remote_vfs.root_path + "custom_" + self._createCRC(utils.getSetting('backup_custom_dir_2'))) #restore all the files self.filesLeft = self.filesTotal for fileGroup in allFiles: self.remote_vfs.set_root(fileGroup['source']) self.xbmc_vfs.set_root(fileGroup['dest']) self.backupFiles(fileGroup['files'],self.remote_vfs,self.xbmc_vfs) self.progressBar.updateProgress(99,"Clean up operations .....") if(self.restore_point.split('.')[-1] == 'zip'): #delete the zip file and the extracted directory self.xbmc_vfs.rmfile(xbmc.translatePath("special://temp/" + self.restore_point)) self.xbmc_vfs.rmdir(self.remote_vfs.root_path) if(utils.getSetting("backup_config") == "true"): #update the guisettings information (or what we can from it) gui_settings = GuiSettingsManager('special://home/userdata/guisettings.xml') gui_settings.run() #call update addons to refresh everything xbmc.executebuiltin('UpdateLocalAddons') self.xbmc_vfs.cleanup() self.remote_vfs.cleanup() self.progressBar.close() #reset the window setting window.setProperty(utils.__addon_id__ + ".running","")
def show_notification(self, message): if self.last_notification_message != message: self.last_notification_message = message showNotification(message)