def do_GET(self):
        Logger.debug(self.path)
        data = self.path.split('/')
        code = 307
        headers = {}
        content = Utils.get_file_buffer()
        if len(data) > 4 and data[1] == self.server.service.name:
            try:
                driveid = data[2]
                provider = self.server.data()
                account_manager = AccountManager(
                    self.server.service.profile_path)
                provider.configure(account_manager, driveid)
                item = provider.get_item(item_driveid=data[3],
                                         item_id=data[4],
                                         include_download_info=True)
                headers['location'] = item['download_info']['url']
            except Exception as e:
                httpex = ExceptionUtils.extract_exception(e, HTTPError)
                if httpex:
                    code = httpex.code
                else:
                    code = 500

                ErrorReport.handle_exception(e)
                content.write(ExceptionUtils.full_stacktrace(e))
        else:
            code = 404
        self.write_response(code, content=content, headers=headers)
    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))
Beispiel #3
0
 def create_text_file(file_path, content):
     try:
         with KodiUtils.file(file_path, 'w') as f:
             f.write(Utils.str(content))
     except Exception as e:
         ErrorReport.handle_exception(e)
         return False
     return True
 def create_text_file(file_path, content):
     f = None
     try:
         f = KodiUtils.file(file_path, 'w')
         f.write(Utils.str(content))
     except Exception as e:
         ErrorReport.handle_exception(e)
         return False
     finally:
         if f:
             f.close()
     return True
    def download(item, download_path, provider, on_update_download=None):
        url = item['download_info']['url']
        headers = None
        if provider.download_requires_auth:
            headers = {"Authorization":"Bearer %s"%provider.get_access_tokens()['access_token']}
        try:
            req = Request(url, None, headers, download_path = download_path, on_update_download = on_update_download)
            req.request()
        except Exception as e:
            ErrorReport.handle_exception(e)
            return False
        return req.success

    
                
Beispiel #6
0
 def start(self):
     Logger.notice('Service \'%s\' started.' % self.name)
     self.cleanup_export_map()
     monitor = KodiUtils.get_system_monitor()
     startup = True
     while not self.abort:
         try:
             now = datetime.datetime.now()
             export_map = self.get_scheduled_export_map()
             if export_map:
                 self.process_schedules(export_map, now, startup)
             self.process_watch()
         except Exception as e:
             ErrorReport.handle_exception(e)
         startup = False
         if monitor.waitForAbort(60):
             break
     del monitor
     del self.provider
     Logger.notice('Service stopped.')
 def get_subtitles(self):
     try:
         from clouddrive.common.remote.request import Request
         from clouddrive.common.service.download import DownloadServiceUtil
         response = Request(self.getPlayingFile() + '?subtitles',
                            None).request_json()
         if response and 'driveid' in response and 'subtitles' in response:
             driveid = response['driveid']
             subtitles = response['subtitles']
             for subtitle in subtitles:
                 url = DownloadServiceUtil.build_download_url(
                     driveid,
                     Utils.default(
                         Utils.get_safe_value(subtitle, 'drive_id'),
                         driveid), subtitle['id'],
                     urllib.quote(Utils.str(subtitle['name'])))
                 Logger.debug('subtitle: %s' % url)
                 self.setSubtitles(url)
     except Exception as e:
         Logger.error(e)
         from clouddrive.common.remote.errorreport import ErrorReport
         ErrorReport.handle_exception(e)
Beispiel #8
0
 def _handle_exception(self, ex, show_error_dialog = True):
     stacktrace = ExceptionUtils.full_stacktrace(ex)
     rex = ExceptionUtils.extract_exception(ex, RequestException)
     uiex = ExceptionUtils.extract_exception(ex, UIException)
     httpex = ExceptionUtils.extract_exception(ex, HTTPError)
     urlex = ExceptionUtils.extract_exception(ex, URLError)
     line1 = self._common_addon.getLocalizedString(32027)
     line2 = Utils.unicode(ex)
     line3 = self._common_addon.getLocalizedString(32016)
     
     if uiex:
         line1 = self._common_addon.getLocalizedString(int(Utils.str(uiex)))
         line2 = Utils.unicode(uiex.root_exception)
     elif rex and rex.response:
         line1 += ' ' + Utils.unicode(rex)
         line2 = ExceptionUtils.extract_error_message(rex.response)
     send_report = True
     add_account_cmd = 'RunPlugin('+self._addon_url + '?' + urllib.urlencode({'action':'_add_account', 'content_type': self._content_type})+')'
     if isinstance(ex, AccountNotFoundException) or isinstance(ex, DriveNotFoundException):
         show_error_dialog = False
         if self._dialog.yesno(self._addon_name, self._common_addon.getLocalizedString(32063) % '\n'):
             KodiUtils.executebuiltin(add_account_cmd)
     elif rex and httpex:
         if httpex.code >= 500:
             line1 = self._common_addon.getLocalizedString(32035)
             line2 = None
             line3 = self._common_addon.getLocalizedString(32038)
         elif httpex.code >= 400:
             driveid = Utils.get_safe_value(self._addon_params, 'driveid')
             if driveid:
                 self._account_manager.load()
                 account = self._account_manager.get_account_by_driveid(driveid)
                 drive = self._account_manager.get_drive_by_driveid(driveid)
                 if KodiUtils.get_signin_server() in rex.request or httpex.code == 401:
                     send_report = False
                     show_error_dialog = False
                     if self._dialog.yesno(self._addon_name, self._common_addon.getLocalizedString(32046) % (self._get_display_name(account, drive, True), '\n')):
                         KodiUtils.executebuiltin(add_account_cmd)
                 elif httpex.code == 403:
                     line1 = self._common_addon.getLocalizedString(32019)
                     line2 = line3 = None
                 elif httpex.code == 404:
                     send_report = False
                     line1 = self._common_addon.getLocalizedString(32037)
                     line2 = line2 = None
                 else:
                     line1 = self._common_addon.getLocalizedString(32036)
                     line3 = self._common_addon.getLocalizedString(32038)
             else:
                 if KodiUtils.get_signin_server()+'/pin/' in rex.request and httpex.code == 404 and self._ip_before_pin:
                     ip_after_pin = Request(KodiUtils.get_signin_server() + '/ip', None).request()
                     if self._ip_before_pin != ip_after_pin:
                         send_report = False
                         line1 = self._common_addon.getLocalizedString(32072)
                         line2 = self._common_addon.getLocalizedString(32073) % (self._ip_before_pin, ip_after_pin,)
     elif urlex:
         reason = Utils.str(urlex.reason)
         line3 = self._common_addon.getLocalizedString(32074)
         if '[Errno 101]' in reason:
             line1 = self._common_addon.getLocalizedString(32076)
         elif '[Errno 11001]' in reason:
             line1 = self._common_addon.getLocalizedString(32077)
         elif 'CERTIFICATE_VERIFY_FAILED' in reason:
             line1 = self._common_addon.getLocalizedString(32078)
         else:
             line1 = self._common_addon.getLocalizedString(32075)
         
     report = '[%s] [%s]/[%s]\n\n%s\n%s\n%s\n\n%s' % (self._addonid, self._addon_version, self._common_addon_version, line1, line2, line3, stacktrace)
     if rex:
         report += '\n\n%s\nResponse:\n%s' % (rex.request, rex.response)
     report += '\n\nshow_error_dialog: %s' % show_error_dialog
     Logger.error(report)
     if show_error_dialog:
         self._dialog.ok(self._addon_name, line1, line2, line3)
     if send_report:
         report_error = KodiUtils.get_addon_setting('report_error', self._common_addon_id) == 'true'
         report_error_invite = KodiUtils.get_addon_setting('report_error_invite', self._common_addon_id) == 'true'
         if not report_error and not report_error_invite:
             if not self._dialog.yesno(self._addon_name, self._common_addon.getLocalizedString(32050), None, None, self._common_addon.getLocalizedString(32012), self._common_addon.getLocalizedString(32013)):
                 KodiUtils.set_addon_setting('report_error', 'true', self._common_addon_id)
             KodiUtils.set_addon_setting('report_error_invite', 'true', self._common_addon_id)
         ErrorReport.send_report(report)
    def do_GET(self):
        Logger.debug(self.path + ': Requested')
        if self._system_monitor.abortRequested():
            Logger.debug(self.path + ': abort requested')
            return
        data = self.path.split('/')
        size = len(data)
        cached_page = self._page_cache.get(self.path)
        if cached_page:
            if cached_page['pending']:
                Logger.debug(self.path + ': Already requested. Waiting for original request...')
                max_waiting_time = time.time() + 30
                while not self._system_monitor.abortRequested() and max_waiting_time > time.time() and cached_page['pending']:
                    if self._system_monitor.waitForAbort(1):
                        break
                    cached_page = self._page_cache.get(self.path)

            if not self._system_monitor.abortRequested():
                if cached_page['pending']:
                    self.write_response(504)
                    Logger.debug(self.path + ': 504 - Gateway timeout')
                    self._page_cache.remove(self.path)
                else:
                    if 'content' in cached_page and cached_page['content']:
                        content = Utils.get_file_buffer()
                        content.write(cached_page['content'])
                        cached_page['content'] = content
                    self.write_response(cached_page['response_code'], content=Utils.get_safe_value(cached_page, 'content'), headers=Utils.get_safe_value(cached_page, 'headers', {}))
                    Logger.debug(self.path + ': %d - Served from cache' % cached_page['response_code'])
        else:
            cached_page = {'pending': True}
            self._page_cache.set(self.path, cached_page)
            if size > 1 and data[1] == self.server.service.name:
                try:
                    if size == 2:
                        cached_page['response_code'] = 303
                        cached_page['headers'] = {'location': self.path + '/'}
                    elif size > 2 and data[2]:
                        cached_page = self.handle_resource_request(data)
                    else:
                        cached_page = self.show_addon_list()
                except Exception as e:
                    httpex = ExceptionUtils.extract_exception(e, HTTPError)
                    if httpex:
                        cached_page['response_code'] = httpex.code
                    else:
                        cached_page['response_code'] = 500
                    
                    ErrorReport.handle_exception(e)
                    content = Utils.get_file_buffer()
                    content.write(ExceptionUtils.full_stacktrace(e))
                    
                    cached_page['content'] = content
            else:
                cached_page['response_code'] = 404
            cached_page['pending'] = False
            content_value = None
            if 'content' in cached_page:
                content_value = cached_page['content'].getvalue()
            self.write_response(cached_page['response_code'], content=Utils.get_safe_value(cached_page, 'content'), headers=Utils.get_safe_value(cached_page, 'headers', {}))
            cached_page['content'] = content_value
            if Utils.get_safe_value(cached_page, 'response_code', 0) >= 500:
                self._page_cache.remove(self.path)
            else:
                self._page_cache.set(self.path, cached_page)
            Logger.debug(self.path + ': Response code ' + Utils.str(cached_page['response_code']))
Beispiel #10
0
 def process_watch(self):
     exports = self.export_manager.get_exports()
     update_library = {}
     changes_by_drive = {}
     for exportid in exports:
         export = exports[exportid]
         watch = Utils.get_safe_value(export, 'watch', False)
         exporting = Utils.get_safe_value(export, 'exporting', False)
         retry_changes = self.export_manager.get_retry_changes(exportid)
         if (watch or len(retry_changes) > 0) and not exporting:
             items_info = self.export_manager.get_items_info(exportid)
             if items_info:
                 export['exporting'] = True
                 export['origin'] = 'watch'
                 self.export_manager.save_export(export)
                 try:
                     driveid = export['driveid']
                     if driveid in changes_by_drive:
                         changes = changes_by_drive[driveid]
                     else:
                         self.provider.configure(self._account_manager,
                                                 export['driveid'])
                         changes = self.provider.changes()
                         changes_by_drive[driveid] = []
                         changes_by_drive[driveid].extend(changes)
                     pending_changes = self.export_manager.get_pending_changes(
                         exportid)
                     pending_changes.extend(retry_changes)
                     pending_changes.extend(changes)
                     if len(changes) > 0 or len(retry_changes) > 0:
                         self.export_manager.save_pending_changes(
                             exportid, pending_changes)
                     if len(retry_changes) > 0:
                         self.export_manager.save_retry_changes(
                             exportid, deque([]))
                     show_export_progress = KodiUtils.get_addon_setting(
                         'hide_export_progress') != 'true'
                     if pending_changes and show_export_progress:
                         self._export_progress_dialog_bg.update(
                             0, self._addon_name + ' ' +
                             self._common_addon.getLocalizedString(32088),
                             self._common_addon.getLocalizedString(32025))
                     if show_export_progress:
                         progress_listener = self._show_progress_after_change
                     else:
                         progress_listener = None
                     changes_done = self.process_pending_changes(
                         exportid, on_after_change=progress_listener)
                     if changes_done:
                         if Utils.get_safe_value(export, 'update_library',
                                                 False):
                             update_library[Utils.get_safe_value(
                                 export, 'content_type', 'None')] = True
                     for change in changes_done:
                         if change in changes_by_drive[driveid]:
                             changes_by_drive[driveid].remove(change)
                 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)
             else:
                 self.run_export(export)
     self._export_progress_dialog_bg.close()
     if update_library:
         if Utils.get_safe_value(update_library, 'video', False):
             KodiUtils.update_library('video')
         if Utils.get_safe_value(update_library, 'audio', False):
             KodiUtils.update_library('music')
 def _send_report(self, report):
     t = threading.Thread(target=ErrorReport().send_report, args=(report, ))
     t.setDaemon(True)
     t.start()