Пример #1
0
 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))
Пример #3
0
 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
Пример #5
0
 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
Пример #6
0
 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
Пример #7
0
 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