def _run_export(self, driveid, item_id=None): export_manager = ExportManager(self._account_manager._addon_data_path) export = export_manager.load()[item_id] Logger.debug('Running export:') Logger.debug(export) if Utils.get_safe_value(export, 'exporting', False): self._dialog.ok( self._addon_name, self._common_addon.getLocalizedString(32059) + ' ' + self._common_addon.getLocalizedString(32038)) else: export['exporting'] = True export_manager.save() export_folder = export['destination_folder'] if xbmcvfs.exists(export_folder): self.get_provider().configure(self._account_manager, driveid) self._export_progress_dialog_bg.create( self._addon_name + ' ' + self._common_addon.getLocalizedString(32024), self._common_addon.getLocalizedString(32025)) self._export_progress_dialog_bg.update(0) item = self.get_provider().get_item(export['item_driveid'], item_id) if self.cancel_operation(): return if self._child_count_supported: self._exporting_target = int(item['folder']['child_count']) self._exporting_target += 1 folder_name = Utils.unicode(item['name']) folder_path = os.path.join( os.path.join(export_folder, folder_name), '') if self._addon.getSetting( 'clean_folder') != 'true' or not xbmcvfs.exists( folder_path) or self._remove_folder(folder_path): self._exporting = item_id export_items_info = {} ExportManager.add_item_info(export_items_info, item_id, folder_name, folder_path, None) self.__export_folder(driveid, item, export_folder, export, export_items_info) export_manager.save_items_info(item_id, export_items_info) if Utils.get_safe_value(export, 'update_library', False) and self._content_type: database = self._content_type if database == 'audio': database = 'music' KodiUtils.update_library(database) else: error = self._common_addon.getLocalizedString( 32066) % folder_path Logger.debug(error) self._dialog.ok(self._addon_name, error) self._export_progress_dialog_bg.close() else: error = self._common_addon.getLocalizedString( 32026) % export_folder Logger.debug(error) self._dialog.ok(self._addon_name, error) export['exporting'] = False export_manager.save()
def run_export(self, export): exporting = Utils.get_safe_value(export, 'exporting', False) Logger.debug('Run export requested. Exporting = %s' % (exporting, )) if not exporting: export['exporting'] = True export['origin'] = 'schedule' self.export_manager.save_export(export) try: self._export_progress_dialog_bg.create( self._addon_name + ' ' + self._common_addon.getLocalizedString(32024), self._common_addon.getLocalizedString(32025)) export_folder = export['destination_folder'] if not KodiUtils.file_exists(export_folder): Logger.debug('creating folder: %s' % (export_folder, )) if not KodiUtils.mkdirs(export_folder): Logger.debug('unable to create folder %s' % (export_folder, )) if KodiUtils.file_exists(export_folder): driveid = export['driveid'] self.provider.configure(self._account_manager, driveid) exportid = export['id'] items_info = {} ExportManager.add_item_info(items_info, 'root-folder', None, export_folder, None, 'folder') self.export_manager.save_items_info(exportid, items_info) item = self.provider.get_item(export['item_driveid'], exportid) item.update({ 'parent': 'root-folder', 'origin': 'schedule' }) self.export_manager.save_pending_changes( exportid, deque([item])) self.export_manager.save_retry_changes(exportid, deque([])) self.process_pending_changes( exportid, on_before_change=self._show_progress_before_change) if Utils.get_safe_value(export, 'update_library', False): if Utils.get_safe_value(export, 'content_type', '') == 'audio': KodiUtils.update_library('music') else: KodiUtils.update_library('video') except Exception as e: ErrorReport.handle_exception(e) KodiUtils.show_notification( self._common_addon.getLocalizedString(32027) + ' ' + Utils.unicode(e)) finally: export['exporting'] = False del export['origin'] self.export_manager.save_export(export) self._export_progress_dialog_bg.close() else: KodiUtils.show_notification( self._common_addon.getLocalizedString(32059) + ' ' + self._common_addon.getLocalizedString(32038))
def __export_folder(self, driveid, folder, export_folder, export, items_info): folder_id = Utils.str(folder['id']) folder_name = Utils.unicode(folder['name']) folder_path = os.path.join(os.path.join(export_folder, folder_name), '') if not xbmcvfs.exists(folder_path): try: xbmcvfs.mkdirs(folder_path) except: if self._system_monitor.waitForAbort(3): return xbmcvfs.mkdirs(folder_path) items = self.get_provider().get_folder_items( Utils.default(Utils.get_safe_value(folder, 'drive_id'), driveid), folder['id']) if self.cancel_operation(): return for item in items: if 'folder' in item: if self._child_count_supported: self._exporting_target += int( item['folder']['child_count']) else: self._exporting_target += 1 for item in items: is_folder = 'folder' in item item_id = Utils.str(item['id']) item_name = Utils.unicode(item['name']) item_name_extension = item['name_extension'] file_path = os.path.join(folder_path, item_name) if is_folder: ExportManager.add_item_info(items_info, item_id, item_name, os.path.join(file_path, ''), folder_id) self.__export_folder(driveid, item, folder_path, export, items_info) elif (('video' in item or item_name_extension in self._video_file_extensions) and export['content_type'] == 'video') or ( 'audio' in item and export['content_type'] == 'audio'): item_name += ExportManager._strm_extension file_path += ExportManager._strm_extension ExportManager.create_strm(driveid, item, file_path, export['content_type'], self._addon_url) ExportManager.add_item_info(items_info, item_id, item_name, file_path, folder_id) self._exporting_count += 1 p = int(self._exporting_count / float(self._exporting_target) * 100) if self._exporting_percent < p: self._exporting_percent = p self._export_progress_dialog_bg.update( self._exporting_percent, self._addon_name + ' ' + self._common_addon.getLocalizedString(32024), file_path[len(export['destination_folder']):])
def process_change(self, change, items_info, export): change_type = None changed_item_id = change['id'] Logger.debug('Change: %s' % Utils.str(change)) if changed_item_id != export['id']: changed_item_name = change['name'] deleted = Utils.get_safe_value(change, 'deleted') parent_id = change['parent'] is_folder = 'folder' in change if not is_folder: changed_item_name += ExportManager._strm_extension if changed_item_id in items_info: item_info = items_info[changed_item_id] Logger.debug('item_info: %s' % Utils.str(item_info)) item_info_path = item_info['full_local_path'] if KodiUtils.file_exists(item_info_path): if deleted: change_type = self.process_change_delete(items_info, changed_item_id, is_folder) elif parent_id != item_info['parent'] or changed_item_name != item_info['name']: if parent_id in items_info: change_type = 'move' Logger.debug('Change is move') parent_item_info = items_info[parent_id] parent_item_path = parent_item_info['full_local_path'] new_path = os.path.join(parent_item_path, changed_item_name) if is_folder: new_path = os.path.join(new_path, '') if KodiUtils.file_rename(item_info_path, new_path): ExportManager.remove_item_info(items_info, changed_item_id) ExportManager.add_item_info(items_info, changed_item_id, changed_item_name, new_path, parent_id) else: change_type = 'retry' else: Logger.debug('Change is move but parent not in item list. Change is delete') change_type = self.process_change_delete(items_info, changed_item_id, is_folder) else: Logger.debug('Invalid state. Changed item not found: %s. Deleting from item list.' % item_info_path) change_type = self.process_change_delete(items_info, changed_item_id, is_folder) elif parent_id in items_info and not deleted: content_type = export['content_type'] item_name_extension = change['name_extension'] if is_folder or (('video' in change or item_name_extension in self._video_file_extensions) and content_type == 'video') or ('audio' in change and content_type == 'audio'): change_type = 'add' Logger.debug('Change is new item') parent_item_info = items_info[parent_id] parent_item_path = parent_item_info['full_local_path'] new_path = os.path.join(parent_item_path, changed_item_name) if is_folder: new_path = os.path.join(new_path, '') if not KodiUtils.mkdirs(new_path): change_type = 'retry' else: ExportManager.create_strm(export['driveid'], change, new_path, content_type, 'plugin://%s/' % self.addonid) if change_type != 'retry': ExportManager.add_item_info(items_info, changed_item_id, changed_item_name, new_path, parent_id) Logger.debug('change type: %s ' % Utils.str(change_type)) return change_type
def process_change_move(self, change, items_info): change_type = 'move' parent_id = Utils.get_safe_value(change, 'parent', '') parent_item_info = items_info[parent_id] parent_item_path = parent_item_info['full_local_path'] changed_item_id = change['id'] changed_item_name = Utils.get_safe_value(change, 'name', '') changed_item_extension = Utils.get_safe_value(change, 'name_extension', '') changed_item_mimetype = Utils.get_safe_value(change, 'mimetype', '') item_info = items_info[changed_item_id] item_type = item_info['type'] is_folder = item_type == 'folder' item_info_path = item_info['full_local_path'] new_path = os.path.join(Utils.unicode(parent_item_path), Utils.unicode(changed_item_name)) if is_folder: change_type += '_folder' new_path = os.path.join(new_path, '') else: change_type += '_file' if changed_item_extension in self._video_file_extensions or 'video' in changed_item_mimetype or 'video' in change: new_path += '.strm' Logger.debug('%s from: %s to: %s' % ( change_type, item_info_path, new_path, )) if KodiUtils.file_exists(new_path): Logger.debug('location already exists: %s. removing...' % (new_path, )) if is_folder: Utils.remove_folder(item_info_path, self._system_monitor) else: KodiUtils.file_delete(item_info_path) if not KodiUtils.file_rename(item_info_path, new_path): change_type += '_retry' ExportManager.add_item_info(items_info, changed_item_id, Utils.unicode(changed_item_name), new_path, parent_id, item_type) return change_type
def process_change_create(self, change, items_info, export): content_type = export['content_type'] changed_item_id = change['id'] changed_item_name = Utils.get_safe_value(change, 'name', '') changed_item_extension = Utils.get_safe_value(change, 'name_extension', '') parent_id = Utils.get_safe_value(change, 'parent', '') is_folder = 'folder' in change item_type = 'folder' if is_folder else 'file' parent_item_info = Utils.get_safe_value(items_info, parent_id) if parent_item_info: parent_item_path = parent_item_info['full_local_path'] new_path = os.path.join(Utils.unicode(parent_item_path), Utils.unicode(changed_item_name)) change_type = 'create' if is_folder: change_type += '_folder' new_path = os.path.join(new_path, '') if parent_id == 'root-folder' and KodiUtils.get_addon_setting( 'clean_folder') == 'true' and KodiUtils.file_exists( new_path): if not Utils.remove_folder(new_path): error = self._common_addon.getLocalizedString( 32066) % new_path KodiUtils.show_notification(error) Logger.debug(error) if not KodiUtils.file_exists(new_path): Logger.debug('creating folder: %s' % (new_path, )) if not KodiUtils.mkdir(new_path): change_type += '_retry' Logger.debug('unable to create folder %s' % (new_path, )) else: change_type += '_ignored' Logger.debug('folder %s already exists' % (new_path, )) else: download_artwork = 'download_artwork' in export and export[ 'download_artwork'] is_download = changed_item_extension \ and ( changed_item_extension in ['strm', 'nomedia'] or ( download_artwork and ( changed_item_extension in ['nfo'] or ( changed_item_extension in ['jpg', 'png'] and ( any(s in changed_item_name for s in self._artwork_file_extensions) or parent_item_info['name'] in ['.actors', 'extrafanart'] ) ) ) ) ) if is_download: Logger.debug('downloading file: %s' % (new_path, )) change_type = 'download_file' cloud_size = Utils.get_safe_value(change, 'size', 0) local_size = KodiUtils.file(new_path).size() if cloud_size != local_size: Logger.debug( 'Download requested. File changed: Local file size (%s) - cloud file size (%s)' % ( Utils.str(local_size), Utils.str(cloud_size), )) if not ExportManager.download(change, new_path, self.provider): change_type += "_retry" Logger.debug('Unable to download file: %s' % (new_path, )) else: change_type += '_ignored' Logger.debug( 'Download ignored: Local file size (%s) is equal to cloud file size (%s)' % ( Utils.str(local_size), Utils.str(cloud_size), )) else: is_stream_file = (('video' in change or (changed_item_extension and changed_item_extension in self._video_file_extensions)) and content_type == 'video') \ or (('audio' in change or (changed_item_extension and changed_item_extension in self._audio_file_extensions)) and content_type == 'audio') if is_stream_file: change_type += '_file' if KodiUtils.get_addon_setting( 'no_extension_strm') == 'true': new_path = Utils.remove_extension(new_path) new_path += ExportManager._strm_extension strm_content = ExportManager.get_strm_link( export['driveid'], change, content_type, 'plugin://%s/' % self.addonid) Logger.debug('creating strm file: %s' % (new_path, )) if not KodiUtils.file_exists( new_path) or KodiUtils.file( new_path).size() != len(strm_content): if not ExportManager.create_text_file( new_path, strm_content): change_type += '_retry' else: change_type += '_ignored' Logger.debug( 'ignoring strm creation: %s, strm file already exists. same expected size.' % (new_path, )) else: change_type = None Logger.debug('ignoring file: %s' % (new_path, )) if change_type: ExportManager.add_item_info(items_info, changed_item_id, Utils.unicode(changed_item_name), new_path, parent_id, item_type) else: Logger.debug('invalid state. no parent info found') change_type = None return change_type
def process_change(self, change, items_info, export): change_type = None changed_item_id = change['id'] Logger.debug('Change: %s' % Utils.str(change)) if changed_item_id != export['id']: changed_item_name = Utils.get_safe_value(change, 'name', '') deleted = Utils.get_safe_value(change, 'removed') parent_id = Utils.get_safe_value(change, 'parent', '') if changed_item_id in items_info: item_info = items_info[changed_item_id] item_type = item_info['type'] is_folder = item_type == 'folder' Logger.debug('item_info: %s' % Utils.str(item_info)) item_info_path = item_info['full_local_path'] if KodiUtils.file_exists(item_info_path): if deleted: change_type = self.process_change_delete( items_info, changed_item_id, is_folder) elif parent_id != item_info[ 'parent'] or changed_item_name != item_info['name']: if parent_id in items_info: change_type = 'move' Logger.debug('Change is move') parent_item_info = items_info[parent_id] parent_item_path = parent_item_info[ 'full_local_path'] new_path = os.path.join( parent_item_path, Utils.unicode(changed_item_name)) if is_folder: new_path = os.path.join(new_path, '') if KodiUtils.file_rename(item_info_path, new_path): ExportManager.remove_item_info( items_info, changed_item_id) ExportManager.add_item_info( items_info, changed_item_id, Utils.unicode(changed_item_name), new_path, parent_id, item_type) else: change_type = 'retry' else: Logger.debug( 'Change is move but parent not in item list. Change is delete' ) change_type = self.process_change_delete( items_info, changed_item_id, is_folder) else: Logger.debug( 'Invalid state. Changed item not found: %s. Deleting from item list.' % item_info_path) change_type = self.process_change_delete( items_info, changed_item_id, is_folder) elif parent_id in items_info and not deleted: is_folder = 'application/vnd.google-apps.folder' in change.get( 'mimetype') content_type = export['content_type'] item_name_extension = change['name_extension'] is_stream_file = ( ('video' in change or item_name_extension in self._video_file_extensions) and content_type == 'video') or ('audio' in change and content_type == 'audio') item_type = 'folder' if is_folder else 'file' if is_folder or is_stream_file or ( export['nfo_export'] and ('nfo' in item_name_extension or 'text/x-nfo' in change.get("mimetype"))): change_type = 'add' Logger.debug('Change is new item') parent_item_info = items_info[parent_id] parent_item_path = parent_item_info['full_local_path'] new_path = os.path.join(parent_item_path, Utils.unicode(changed_item_name)) if is_folder: new_path = os.path.join(new_path, '') if not KodiUtils.mkdirs(new_path): change_type = 'retry' elif is_stream_file: new_path += '.strm' ExportManager.create_strm( export['driveid'], change, new_path, content_type, 'plugin://%s/' % self.addonid) else: ExportManager.create_nfo( export['driveid'], change, Utils.unicode(changed_item_name), new_path) if change_type != 'retry': ExportManager.add_item_info( items_info, changed_item_id, Utils.unicode(changed_item_name), new_path, parent_id, item_type) Logger.debug('change type: %s ' % Utils.str(change_type)) return change_type