def removeCollection(self, name, link): if name in [None, ""]: return collectionCtrl = CollectSets() collectionDetails = collectionCtrl.loadCollection(link) filesToDelete = [] # If the file was not processed just don't display anything if collectionDetails not in [None, ""]: screensaverFolder = Settings.getScreensaverFolder() for videoItem in collectionDetails['videos']: # If theme exists we need to check if we want to delete it if screensaverFolder not in [None, ""]: videoLocation = os_path_join(screensaverFolder, videoItem['filename']) log("VideoScreensaverPlugin: Checking if %s already downloaded to %s" % (videoItem['filename'], videoLocation)) if xbmcvfs.exists(videoLocation): filesToDelete.append(videoLocation) # If there are possible files to delete, then prompt the user to see if we should if len(filesToDelete) > 0: needDelete = xbmcgui.Dialog().yesno(ADDON.getLocalizedString(32005), ADDON.getLocalizedString(32086)) if needDelete: for vidFile in filesToDelete: xbmcvfs.delete(vidFile) # Now remove the actual collection collectionCtrl.removeCustomCollection(name) del collectionCtrl # Now reload the screen to reflect the change xbmc.executebuiltin("Container.Refresh")
def _getContextMenu(self, videoItem): ctxtMenu = [] # Check if the file has already been downloaded if self._getVideoLocation(Settings.getScreensaverFolder(), videoItem['filename']) in [None, ""]: # If not already exists, add a download option cmd = self._build_url({'mode': 'download', 'name': videoItem['name'], 'filename': videoItem['filename'], 'primary': videoItem['primary']}) ctxtMenu.append((ADDON.getLocalizedString(32013), 'RunPlugin(%s)' % cmd)) # If not already exists, add a download option cmd = self._build_url({'mode': 'play', 'name': videoItem['name'], 'filename': videoItem['primary']}) ctxtMenu.append((ADDON.getLocalizedString(32019), 'RunPlugin(%s)' % cmd)) else: # If already exists then add a play option cmd = self._build_url({'mode': 'play', 'name': videoItem['name'], 'filename': videoItem['filename']}) ctxtMenu.append((ADDON.getLocalizedString(32015), 'RunPlugin(%s)' % cmd)) # If already exists then add a delete option cmd = self._build_url({'mode': 'delete', 'name': videoItem['name'], 'filename': videoItem['filename']}) ctxtMenu.append((ADDON.getLocalizedString(32014), 'RunPlugin(%s)' % cmd)) # Check if we need a menu item to enable and disable the videos if videoItem['enabled']: cmd = self._build_url({'mode': 'enable', 'disable': 'true', 'filename': videoItem['filename']}) ctxtMenu.append((ADDON.getLocalizedString(32017), 'RunPlugin(%s)' % cmd)) else: cmd = self._build_url({'mode': 'enable', 'disable': 'false', 'filename': videoItem['filename']}) ctxtMenu.append((ADDON.getLocalizedString(32018), 'RunPlugin(%s)' % cmd)) return ctxtMenu
def viewCollection(self, name, link): log("VideoScreensaverPlugin: %s (%s)" % (name, link)) collectionCtrl = CollectSets() collectionDetails = collectionCtrl.loadCollection(link) del collectionCtrl # If the file was not processed just don't display anything if collectionDetails in [None, ""]: return screensaverFolder = Settings.getScreensaverFolder() for videoItem in collectionDetails['videos']: displayName = videoItem['name'] if videoItem['enabled'] is False: displayName = "%s %s" % (ADDON.getLocalizedString(32016), displayName) # Create the list-item for this video li = xbmcgui.ListItem(displayName, iconImage=videoItem['image']) if videoItem['duration'] not in [None, "", 0]: li.setInfo('video', {'Duration': videoItem['duration']}) # Set the background image # if videoItem['fanart'] is not None: # li.setProperty("Fanart_Image", videoItem['fanart']) # If theme already exists flag it using the play count # This will normally put a tick on the GUI if screensaverFolder not in [None, ""]: if self._getVideoLocation( screensaverFolder, videoItem['filename']) not in [None, ""]: li.setInfo('video', {'PlayCount': 1}) li.addContextMenuItems(self._getContextMenu( videoItem, collectionDetails['builtin']), replaceItems=True) url = self._build_url({ 'mode': 'download', 'name': videoItem['name'], 'filename': videoItem['filename'], 'primary': videoItem['primary'], 'builtin': collectionDetails['builtin'] }) xbmcplugin.addDirectoryItem(handle=self.addon_handle, url=url, listitem=li, isFolder=False) xbmcplugin.endOfDirectory(self.addon_handle)
def play(self, name, filename): log("VideoScreensaverPlugin: Playing %s" % name) destination = filename if not filename.startswith('http'): screensaverFolder = Settings.getScreensaverFolder() destination = self._getVideoLocation(screensaverFolder, filename) # Check to see if there is already a file present if destination not in [None, ""]: player = xbmc.Player() player.play(destination) del player else: log("VideoScreensaverPlugin: Files does not exists %s" % destination)
def delete(self, name, filename): log("VideoScreensaverPlugin: Deleting %s" % name) screensaverFolder = Settings.getScreensaverFolder() destination = self._getVideoLocation(screensaverFolder, filename) # Check to see if there is already a file present if destination not in [None, ""]: deleteFile = xbmcgui.Dialog().yesno(ADDON.getLocalizedString(32005), ADDON.getLocalizedString(32014), name) if deleteFile: log("VideoScreensaverPlugin: Removing existing file %s" % destination) xbmcvfs.delete(destination) # Now reload the screen to reflect the change xbmc.executebuiltin("Container.Refresh") else: log("VideoScreensaverPlugin: Files does not exists %s" % destination)
def delete(self, name, filename): log("VideoScreensaverPlugin: Deleting %s" % name) screensaverFolder = Settings.getScreensaverFolder() destination = self._getVideoLocation(screensaverFolder, filename) # Check to see if there is already a file present if destination not in [None, ""]: deleteFile = xbmcgui.Dialog().yesno( ADDON.getLocalizedString(32005), ADDON.getLocalizedString(32014), name) if deleteFile: log("VideoScreensaverPlugin: Removing existing file %s" % destination) xbmcvfs.delete(destination) # Now reload the screen to reflect the change xbmc.executebuiltin("Container.Refresh") else: log("VideoScreensaverPlugin: Files does not exists %s" % destination)
def viewCollection(self, name, link): log("VideoScreensaverPlugin: %s (%s)" % (name, link)) collectionCtrl = CollectSets() collectionDetails = collectionCtrl.loadCollection(link) del collectionCtrl # If the file was not processed just don't display anything if collectionDetails in [None, ""]: return screensaverFolder = Settings.getScreensaverFolder() for videoItem in collectionDetails['videos']: displayName = videoItem['name'] if videoItem['enabled'] is False: displayName = "%s %s" % (ADDON.getLocalizedString(32016), displayName) # Create the list-item for this video li = xbmcgui.ListItem(displayName, iconImage=videoItem['image']) if videoItem['duration'] not in [None, "", 0]: li.setInfo('video', {'Duration': videoItem['duration']}) # Set the background image # if videoItem['fanart'] is not None: # li.setProperty("Fanart_Image", videoItem['fanart']) # If theme already exists flag it using the play count # This will normally put a tick on the GUI if screensaverFolder not in [None, ""]: if self._getVideoLocation(screensaverFolder, videoItem['filename']) not in [None, ""]: li.setInfo('video', {'PlayCount': 1}) li.addContextMenuItems(self._getContextMenu(videoItem), replaceItems=True) url = self._build_url({'mode': 'download', 'name': videoItem['name'], 'filename': videoItem['filename'], 'primary': videoItem['primary']}) xbmcplugin.addDirectoryItem(handle=self.addon_handle, url=url, listitem=li, isFolder=False) xbmcplugin.endOfDirectory(self.addon_handle)
def removeCollection(self, name, link): if name in [None, ""]: return collectionCtrl = CollectSets() collectionDetails = collectionCtrl.loadCollection(link) filesToDelete = [] # If the file was not processed just don't display anything if collectionDetails not in [None, ""]: screensaverFolder = Settings.getScreensaverFolder() for videoItem in collectionDetails['videos']: # If theme exists we need to check if we want to delete it if screensaverFolder not in [None, ""]: videoLocation = os_path_join(screensaverFolder, videoItem['filename']) log("VideoScreensaverPlugin: Checking if %s already downloaded to %s" % (videoItem['filename'], videoLocation)) if xbmcvfs.exists(videoLocation): filesToDelete.append(videoLocation) # If there are possible files to delete, then prompt the user to see if we should if len(filesToDelete) > 0: needDelete = xbmcgui.Dialog().yesno( ADDON.getLocalizedString(32005), ADDON.getLocalizedString(32086)) if needDelete: for vidFile in filesToDelete: xbmcvfs.delete(vidFile) # Now remove the actual collection collectionCtrl.removeCustomCollection(name) del collectionCtrl # Now reload the screen to reflect the change xbmc.executebuiltin("Container.Refresh")
def _getPlaylist(self): playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) # Note: The playlist clear option seems to impact all playlist settings, # so will remove the repeat settings on a playlist that is currently playing, # not just this instance - a bit nasty, but not much we can do about it playlist.clear() # Check to see if we should be using a video from the schedule scheduleEntry = self.scheduler.getScheduleEntry() if scheduleEntry != -1: # There is an item scheduled, so check to see if the item has actually changed if scheduleEntry == self.currentScheduleItem: return None # Set the entry we are about to play self.currentScheduleItem = scheduleEntry # Get the actual video file that should be played scheduledVideo = self.scheduler.getScheduleVideo(scheduleEntry) # Do a quick check to see if the video exists if xbmcvfs.exists(scheduledVideo): log("Screensaver video for scheduled item %d is: %s" % (scheduleEntry, scheduledVideo)) playlist.add(scheduledVideo) # Check if we are showing all the videos in a given folder elif Settings.isFolderSelection(): videosFolder = Settings.getScreensaverFolder() # Check if we are dealing with a Folder of videos if videosFolder not in [None, ""]: if dir_exists(videosFolder): self.currentScheduleItem = -1 files = self._getAllFilesInDirectory(videosFolder) # Check if we are limiting to a single folder per session if Settings.isLimitSessionToSingleCollection(): # Select just one file at random singleVideo = random.choice(files) # Check if this file is part of a collection justFilename = (os_path_split(singleVideo))[-1] collectionCtrl = CollectSets() collectionVideos = collectionCtrl.getFilesInSameCollection(justFilename) del collectionCtrl # If it is part of a collection, then limit to only files in # this collection if len(collectionVideos) > 0: log("Screensaver restricting to collection containing %s" % singleVideo) # Check each of the videos to see which are in the collection collectionFileList = [] for aFile in files: # Get just the filename aFilename = (os_path_split(aFile))[-1] if aFilename in collectionVideos: log("Screensaver including collection video %s" % aFile) collectionFileList.append(aFile) else: log("Screensaver excluding non collection video %s" % aFile) else: log("Screensaver restricting to directory containing %s" % singleVideo) # Not in a collection, so just gather the files in the same directory # Get the directory that file was part of parentPath = (os_path_split(singleVideo))[0] # Now only select videos from that directory files = self._getAllFilesInDirectory(parentPath, False) # Now shuffle the playlist to ensure that if there are more # than one video a different one starts each time random.shuffle(files) for vidFile in files: log("Screensaver video in directory is: %s" % vidFile) playlist.add(vidFile) else: # Must be dealing with a single file videoFile = Settings.getScreensaverVideo() # Check to make sure the screensaver video file exists if videoFile not in [None, ""]: if xbmcvfs.exists(videoFile): self.currentScheduleItem = -1 log("Screensaver video is: %s" % videoFile) playlist.add(videoFile) # If there are no videos in the playlist yet, then display an error if playlist.size() < 1: errorLocation = Settings.getScreensaverVideo() if Settings.isFolderSelection(): errorLocation = Settings.getScreensaverFolder() log("No Screensaver file set or not valid %s" % errorLocation) cmd = 'Notification("{0}", "{1}", 3000, "{2}")'.format(ADDON.getLocalizedString(32300).encode('utf-8'), errorLocation, ADDON.getAddonInfo('icon')) xbmc.executebuiltin(cmd) return None return playlist
def _getPlaylist(self): playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) # Note: The playlist clear option seems to impact all playlist settings, # so will remove the repeat settings on a playlist that is currently playing, # not just this instance - a bit nasty, but not much we can do about it playlist.clear() # Check to see if we should be using a video from the schedule scheduleEntry = self.scheduler.getScheduleEntry() if scheduleEntry != -1: # There is an item scheduled, so check to see if the item has actually changed if scheduleEntry == self.currentScheduleItem: return None # Set the entry we are about to play self.currentScheduleItem = scheduleEntry # Get the actual video file that should be played scheduledVideo = self.scheduler.getScheduleVideo(scheduleEntry) # Do a quick check to see if the video exists if xbmcvfs.exists(scheduledVideo): log("Screensaver video for scheduled item %d is: %s" % (scheduleEntry, scheduledVideo)) playlist.add(scheduledVideo) # Check if we are showing all the videos in a given folder elif Settings.isFolderSelection(): videosFolder = Settings.getScreensaverFolder() # Check if we are dealing with a Folder of videos if videosFolder not in [None, ""]: if dir_exists(videosFolder): self.currentScheduleItem = -1 files = self._getAllFilesInDirectory(videosFolder) # Check if we are limiting to a single folder per session if Settings.isLimitSessionToSingleCollection(): # Select just one file at random singleVideo = random.choice(files) # Check if this file is part of a collection justFilename = (os_path_split(singleVideo))[-1] collectionCtrl = CollectSets() collectionVideos = collectionCtrl.getFilesInSameCollection( justFilename) del collectionCtrl # If it is part of a collection, then limit to only files in # this collection if len(collectionVideos) > 0: log("Screensaver restricting to collection containing %s" % singleVideo) # Check each of the videos to see which are in the collection collectionFileList = [] for aFile in files: # Get just the filename aFilename = (os_path_split(aFile))[-1] if aFilename in collectionVideos: log("Screensaver including collection video %s" % aFile) collectionFileList.append(aFile) else: log("Screensaver excluding non collection video %s" % aFile) else: log("Screensaver restricting to directory containing %s" % singleVideo) # Not in a collection, so just gather the files in the same directory # Get the directory that file was part of parentPath = (os_path_split(singleVideo))[0] # Now only select videos from that directory files = self._getAllFilesInDirectory( parentPath, False) # Now shuffle the playlist to ensure that if there are more # than one video a different one starts each time random.shuffle(files) for vidFile in files: log("Screensaver video in directory is: %s" % vidFile) playlist.add(vidFile) else: # Must be dealing with a single file videoFile = Settings.getScreensaverVideo() # Check to make sure the screensaver video file exists if videoFile not in [None, ""]: if xbmcvfs.exists(videoFile): self.currentScheduleItem = -1 log("Screensaver video is: %s" % videoFile) playlist.add(videoFile) # If there are no videos in the playlist yet, then display an error if playlist.size() < 1: errorLocation = Settings.getScreensaverVideo() if Settings.isFolderSelection(): errorLocation = Settings.getScreensaverFolder() log("No Screensaver file set or not valid %s" % errorLocation) cmd = 'Notification("{0}", "{1}", 3000, "{2}")'.format( ADDON.getLocalizedString(32300).encode('utf-8'), errorLocation, ADDON.getAddonInfo('icon')) xbmc.executebuiltin(cmd) return None return playlist
def download(self, name, filename, downloadURL): log("VideoScreensaverPlugin: Downloading %s" % name) tmpdestination = os_path_join(Settings.getTempFolder(), filename) destination = os_path_join(Settings.getScreensaverFolder(), filename) # Check to see if there is already a file present if xbmcvfs.exists(destination): useExisting = xbmcgui.Dialog().yesno(ADDON.getLocalizedString(32005), ADDON.getLocalizedString(32301), name, ADDON.getLocalizedString(32302)) if useExisting: # Don't want to overwrite, so nothing to do log("Download: Reusing existing video file %s" % destination) return else: log("Download: Removing existing file %s ready for fresh download" % destination) xbmcvfs.delete(destination) # Create a progress dialog for the download downloadProgressDialog = xbmcgui.DialogProgress() downloadProgressDialog.create(ADDON.getLocalizedString(32303), name, filename, destination) # Callback method to report progress def _report_hook(count, blocksize, totalsize): percent = int(float(count * blocksize * 100) / totalsize) downloadProgressDialog.update(percent, name, filename, destination) if downloadProgressDialog.iscanceled(): log("Download: Operation cancelled") raise ValueError('Download Cancelled') try: log("Download: Using server: %s" % downloadURL) # Now retrieve the actual file fp, h = urllib.urlretrieve(downloadURL, tmpdestination, _report_hook) log(h) # Check to make sure that the file created downloaded correctly st = xbmcvfs.Stat(tmpdestination) fileSize = st.st_size() log("Download: Size of file %s is %d" % (tmpdestination, fileSize)) # Check for something that has a size greater than zero (in case some OSs do not # support looking at the size), but less that 1,000,000 (As all our files are # larger than that if (fileSize > 0) and (fileSize < 1000000): log("Download: Detected that file %s did not download correctly as file size is only %d" % (downloadURL, fileSize)) xbmcgui.Dialog().ok(ADDON.getLocalizedString(32005), ADDON.getLocalizedString(32306)) else: log("Download: Copy from %s to %s" % (tmpdestination, destination)) copy = xbmcvfs.copy(tmpdestination, destination) if copy: log("Download: Copy Successful") else: log("Download: Copy Failed") xbmcvfs.delete(tmpdestination) except ValueError: # This was a cancel by the user, so remove any file that may be part downloaded if xbmcvfs.exists(tmpdestination): xbmcvfs.delete(tmpdestination) except: log("Download: Theme download Failed!!!", xbmc.LOGERROR) log("Download: %s" % traceback.format_exc(), xbmc.LOGERROR) # Make sure the progress dialog has been closed downloadProgressDialog.close() # Now reload the screen to reflect the change xbmc.executebuiltin("Container.Refresh")
def _getContextMenu(self, videoItem, builtin='false'): ctxtMenu = [] # Check if the file has already been downloaded if self._getVideoLocation(Settings.getScreensaverFolder(), videoItem['filename']) in [None, ""]: # If not already exists, add a download option cmd = self._build_url({ 'mode': 'download', 'name': videoItem['name'], 'filename': videoItem['filename'], 'primary': videoItem['primary'] }) ctxtMenu.append( (ADDON.getLocalizedString(32013), 'RunPlugin(%s)' % cmd)) # Only add the play option if it is not a built in video if builtin != 'true': cmd = self._build_url({ 'mode': 'play', 'name': videoItem['name'], 'filename': videoItem['primary'] }) ctxtMenu.append( (ADDON.getLocalizedString(32019), 'RunPlugin(%s)' % cmd)) else: # If already exists then add a play option cmd = self._build_url({ 'mode': 'play', 'name': videoItem['name'], 'filename': videoItem['filename'] }) ctxtMenu.append( (ADDON.getLocalizedString(32015), 'RunPlugin(%s)' % cmd)) # If already exists then add a delete option cmd = self._build_url({ 'mode': 'delete', 'name': videoItem['name'], 'filename': videoItem['filename'] }) ctxtMenu.append( (ADDON.getLocalizedString(32014), 'RunPlugin(%s)' % cmd)) # Check if we need a menu item to enable and disable the videos if videoItem['enabled']: cmd = self._build_url({ 'mode': 'enable', 'disable': 'true', 'filename': videoItem['filename'] }) ctxtMenu.append( (ADDON.getLocalizedString(32017), 'RunPlugin(%s)' % cmd)) else: cmd = self._build_url({ 'mode': 'enable', 'disable': 'false', 'filename': videoItem['filename'] }) ctxtMenu.append( (ADDON.getLocalizedString(32018), 'RunPlugin(%s)' % cmd)) return ctxtMenu
def download(self, name, filename, downloadURL): log("VideoScreensaverPlugin: Downloading %s" % name) tmpdestination = os_path_join(Settings.getTempFolder(), filename) destination = os_path_join(Settings.getScreensaverFolder(), filename) # Check to see if there is already a file present if xbmcvfs.exists(destination): useExisting = xbmcgui.Dialog().yesno( ADDON.getLocalizedString(32005), ADDON.getLocalizedString(32301), name, ADDON.getLocalizedString(32302)) if useExisting: # Don't want to overwrite, so nothing to do log("Download: Reusing existing video file %s" % destination) return else: log("Download: Removing existing file %s ready for fresh download" % destination) xbmcvfs.delete(destination) # Create a progress dialog for the download downloadProgressDialog = xbmcgui.DialogProgress() downloadProgressDialog.create(ADDON.getLocalizedString(32303), name, filename, destination) # Callback method to report progress def _report_hook(count, blocksize, totalsize): percent = int(float(count * blocksize * 100) / totalsize) downloadProgressDialog.update(percent, name, filename, destination) if downloadProgressDialog.iscanceled(): log("Download: Operation cancelled") raise ValueError('Download Cancelled') try: log("Download: Using server: %s" % downloadURL) # Now retrieve the actual file fp, h = urllib.urlretrieve(downloadURL, tmpdestination, _report_hook) log(h) # Check to make sure that the file created downloaded correctly st = xbmcvfs.Stat(tmpdestination) fileSize = st.st_size() log("Download: Size of file %s is %d" % (tmpdestination, fileSize)) # Check for something that has a size greater than zero (in case some OSs do not # support looking at the size), but less that 1,000,000 (As all our files are # larger than that if (fileSize > 0) and (fileSize < 1000000): log("Download: Detected that file %s did not download correctly as file size is only %d" % (downloadURL, fileSize)) xbmcgui.Dialog().ok(ADDON.getLocalizedString(32005), ADDON.getLocalizedString(32306)) else: log("Download: Copy from %s to %s" % (tmpdestination, destination)) copy = xbmcvfs.copy(tmpdestination, destination) if copy: log("Download: Copy Successful") else: log("Download: Copy Failed") xbmcvfs.delete(tmpdestination) except ValueError: # This was a cancel by the user, so remove any file that may be part downloaded if xbmcvfs.exists(tmpdestination): xbmcvfs.delete(tmpdestination) except: log("Download: Theme download Failed!!!", xbmc.LOGERROR) log("Download: %s" % traceback.format_exc(), xbmc.LOGERROR) # Make sure the progress dialog has been closed downloadProgressDialog.close() # Now reload the screen to reflect the change xbmc.executebuiltin("Container.Refresh")