Пример #1
0
    def __init__(self):
        super(SciHubEVA, self).__init__()

        self._conf = SciHubConf('SciHubEVA.conf')
        self._qt_quick_controls2_conf = SciHubConf(
            'qtquickcontrols2.conf', space_around_delimiters=False)

        self._engine = QQmlApplicationEngine()
        self._engine.rootContext().setContextProperty(
            'PYTHON_VERSION', '.'.join(str(v) for v in sys.version_info[:3]))
        self._engine.rootContext().setContextProperty(
            'QT_VERSION', PySide2.QtCore.qVersion())
        self._engine.load('qrc:/ui/SciHubEVA.qml')
        self._window = self._engine.rootObjects()[0]
        self._connect()

        self._scihub_preferences = SciHubPreferences(
            self._conf, self._qt_quick_controls2_conf)
        self._scihub_captcha = SciHubCaptcha(self, log=self.log)
        self._captcha_query = None

        save_to_dir = self._conf.get('common', 'save_to_dir')
        if not save_to_dir or save_to_dir.strip() == '':
            self._save_to_dir = None
        else:
            self._save_to_dir = save_to_dir
            self.loadSaveToDir.emit(save_to_dir)

        self._query_list = None
        self._query_list_length = 0

        self._captcha_img_file = None
Пример #2
0
    def __init__(self):
        super(SciHubEVA, self).__init__()

        self._conf = SciHubConf('SciHubEVA.conf')
        self._qt_quick_controls2_conf = SciHubConf(
            'qtquickcontrols2.conf', space_around_delimiters=False)

        self._engine = QQmlApplicationEngine()
        self._engine.rootContext().setContextProperty(
            'PYTHON_VERSION', '.'.join(str(v) for v in sys.version_info[:3]))
        self._engine.rootContext().setContextProperty(
            'QT_VERSION', PySide2.QtCore.qVersion())
        self._engine.load('qrc:/ui/SciHubEVA.qml')
        self._window = self._engine.rootObjects()[0]
        self._connect()

        self._scihub_preferences = SciHubPreferences(
            self._conf, self._qt_quick_controls2_conf)
        self._scihub_captcha = SciHubCaptcha(self, log=self.log)
        self._captcha_query = None

        self._input = None
        save_to_dir = self._conf.get('common', 'save_to_dir')
        if not save_to_dir or save_to_dir.strip() == '':
            self._save_to_dir = None
        else:
            self._save_to_dir = save_to_dir
            self.loadSaveToDir.emit(save_to_dir)

        self._query_list = None
        self._query_list_length = 0

        self._captcha_img_file_path = None

        self._logger = logging.getLogger('SciHubEVA')
        self._logger.setLevel(logging.DEBUG)

        formatter = logging.Formatter(
            '%(asctime)s - %(levelname)s - %(message)s')
        log_file_name_prefix = str(get_log_directory() / 'SciHubEVA.log')
        handler = TimedRotatingFileHandler(filename=log_file_name_prefix,
                                           when='D')
        handler.setFormatter(formatter)
        handler.setLevel(logging.DEBUG)

        self._logger.addHandler(handler)

        self._h2t = html2text.HTML2Text()
        self._h2t.ignore_links = True
Пример #3
0
    def __init__(self):
        super(SciHubEVA, self).__init__()

        self._conf = SciHubConf()

        self._engine = QQmlApplicationEngine()
        self._engine.load('qrc:/ui/SciHubEVA.qml')
        self._window = self._engine.rootObjects()[0]
        self._connect()

        self._scihub_preferences = SciHubPreferences(self._conf)

        save_to_dir = self._conf.get('common', 'save_to_dir')
        if not save_to_dir or save_to_dir.strip() == '':
            self._save_to_dir = None
        else:
            self._save_to_dir = save_to_dir
            self.setSaveToDir.emit(save_to_dir)
Пример #4
0
    def __init__(self):
        super(SciHubEVA, self).__init__()

        self._conf = SciHubConf('SciHubEVA.conf')
        self._qt_quick_controls2_conf = SciHubConf(
            'qtquickcontrols2.conf', space_around_delimiters=False)

        self._engine = QQmlApplicationEngine()
        self._engine.load('qrc:/ui/SciHubEVA.qml')
        self._window = self._engine.rootObjects()[0]
        self._connect()

        self._scihub_preferences = SciHubPreferences(
            self._conf, self._qt_quick_controls2_conf)
        self._scihub_captcha = SciHubCaptcha(self, log=self.log)
        self._captcha_query = None

        save_to_dir = self._conf.get('common', 'save_to_dir')
        if not save_to_dir or save_to_dir.strip() == '':
            self._save_to_dir = None
        else:
            self._save_to_dir = save_to_dir
            self.setSaveToDir.emit(save_to_dir)
Пример #5
0
class SciHubEVA(QObject):
    beforeRampage = pyqtSignal()
    afterRampage = pyqtSignal()

    showErrorMessage = pyqtSignal(str, str)
    showInfoMessage = pyqtSignal(str, str)

    setSaveToDir = pyqtSignal(str)
    appendLogs = pyqtSignal(str)

    def __init__(self):
        super(SciHubEVA, self).__init__()

        self._conf = SciHubConf()

        self._engine = QQmlApplicationEngine()
        self._engine.load('qrc:/ui/SciHubEVA.qml')
        self._window = self._engine.rootObjects()[0]
        self._connect()

        self._scihub_preferences = SciHubPreferences(self._conf)

        save_to_dir = self._conf.get('common', 'save_to_dir')
        if not save_to_dir or save_to_dir.strip() == '':
            self._save_to_dir = None
        else:
            self._save_to_dir = save_to_dir
            self.setSaveToDir.emit(save_to_dir)

    def _connect(self):
        # Connect QML signals to PyQt slots
        self._window.saveToDir.connect(self.saveToDir)
        self._window.rampage.connect(self.rampage)
        self._window.showWindowPreference.connect(self.showWindowPreferences)

        # Connect PyQt signals to QML slots
        self.beforeRampage.connect(self._window.beforeRampage)
        self.afterRampage.connect(self._window.afterRampage)

        self.showErrorMessage.connect(self._window.showErrorMessage)
        self.showInfoMessage.connect(self._window.showInfoMessage)

        self.setSaveToDir.connect(self._window.setSaveToDir)
        self.appendLogs.connect(self._window.appendLogs)

    @property
    def conf(self):
        return self._conf

    @pyqtSlot(str)
    def saveToDir(self, directory):
        self._save_to_dir = directory
        self._conf.set('common', 'save_to_dir', directory)

    @pyqtSlot()
    def showWindowPreferences(self):
        self._scihub_preferences.loadFromConf()
        self._scihub_preferences.showWindowPreferences.emit()

    @pyqtSlot(str)
    def rampage(self, query):
        scihub_api = SciHubAPI(query, callback=self._afterRampage, conf=self._conf, log=self._log)
        self._beforeRampage()
        scihub_api.start()

    def _beforeRampage(self):
        self.beforeRampage.emit()

    def _afterRampage(self):
        self.afterRampage.emit()

    def _log(self, message, type = None):
        if type:
            log_formater = '[{type}] - {message}'
        else:
            log_formater = '{message}'

        self.appendLogs.emit(log_formater.format(type=type, message=message))
Пример #6
0
class SciHubEVA(QObject):
    beforeRampage = Signal()
    afterRampage = Signal()

    loadSaveToDir = Signal(str)
    appendLogs = Signal(str, str)

    def __init__(self):
        super(SciHubEVA, self).__init__()

        self._conf = SciHubConf('SciHubEVA.conf')
        self._qt_quick_controls2_conf = SciHubConf(
            'qtquickcontrols2.conf', space_around_delimiters=False)

        self._engine = QQmlApplicationEngine()
        self._engine.rootContext().setContextProperty(
            'PYTHON_VERSION', '.'.join(str(v) for v in sys.version_info[:3]))
        self._engine.rootContext().setContextProperty(
            'QT_VERSION', PySide2.QtCore.qVersion())
        self._engine.load('qrc:/ui/SciHubEVA.qml')
        self._window = self._engine.rootObjects()[0]
        self._connect()

        self._scihub_preferences = SciHubPreferences(
            self._conf, self._qt_quick_controls2_conf)
        self._scihub_captcha = SciHubCaptcha(self, log=self.log)
        self._captcha_query = None

        save_to_dir = self._conf.get('common', 'save_to_dir')
        if not save_to_dir or save_to_dir.strip() == '':
            self._save_to_dir = None
        else:
            self._save_to_dir = save_to_dir
            self.loadSaveToDir.emit(save_to_dir)

        self._query_list = None
        self._query_list_length = 0

        self._captcha_img_file = None

    def _connect(self):
        # Connect QML signals to PyQt slots
        self._window.setSaveToDir.connect(self.setSaveToDir)
        self._window.showSaveToDir.connect(self.showSaveToDir)
        self._window.rampage.connect(self.rampage)
        self._window.showWindowPreference.connect(self.showWindowPreference)

        # Connect PyQt signals to QML slots
        self.beforeRampage.connect(self._window.beforeRampage)
        self.afterRampage.connect(self._window.afterRampage)

        self.loadSaveToDir.connect(self._window.loadSaveToDir)
        self.appendLogs.connect(self._window.appendLogs)

    @property
    def conf(self):
        return self._conf

    @Slot(str)
    def setSaveToDir(self, directory):
        self._save_to_dir = directory
        self._conf.set('common', 'save_to_dir', directory)

    @Slot(str)
    def showSaveToDir(self, directory):
        if os.path.exists(directory):
            show_directory(directory)

    @Slot()
    def showWindowPreference(self):
        self._scihub_preferences.load_from_conf()
        self._scihub_preferences.showWindowPreferences.emit()

    @Slot(str)
    def rampage(self, input):
        """Download PDF with input

        Args:
            input: query or query list file path

        """

        if os.path.exists(input):
            if is_text_file(input):
                self._query_list = deque()

                with open(input, 'rt') as f:
                    for line in f:
                        cleaned_line = line.strip()
                        if cleaned_line != '':
                            self._query_list.append(cleaned_line)

                self._query_list_length = len(self._query_list)
                self.rampage_query_list()
            else:
                self.log('<hr/>')
                self.log(self.tr('Query list file is not a text file!'),
                         'ERROR')
        elif is_range_query(input):
            self._query_list = deque(gen_range_query_list(input))
            self._query_list_length = len(self._query_list)
            self.rampage_query_list()
        else:
            self.rampage_query(input)

    def rampage_query_list(self):
        """Download PDF with query list (self._query_list)

        """

        if self._query_list and len(self._query_list) > 0:
            self.log('<hr/>')
            self.log(
                self.tr('Dealing with {}/{} query ...').format(
                    self._query_list_length - len(self._query_list) + 1,
                    self._query_list_length))

            self.rampage_query(self._query_list.popleft())

    def rampage_query(self, query):
        """Download PDF with query

        Args:
            query: Query of input

        """

        scihub_api = SciHubAPI(query,
                               callback=self.rampage_callback,
                               rampage_type=SciHubRampageType.INPUT,
                               conf=self._conf,
                               log=self.log)
        self.beforeRampage.emit()
        scihub_api.start()

    def rampage_with_captcha(self, captcha_answer):
        """ Download PDF with captcha query (self._captcha_query) and captcha answer

        Args:
            captcha_answer: Captcha answer

        """

        scihub_api = SciHubAPI(
            self._captcha_query,
            callback=self.rampage_callback,
            rampage_type=SciHubRampageType.PDF_CAPTCHA_RESPONSE,
            conf=self._conf,
            log=self.log,
            captcha_answer=captcha_answer)

        if self._captcha_img_file:
            self._captcha_img_file.close()

        self.beforeRampage.emit()
        scihub_api.start()

    def rampage_callback(self, res, err):
        """Callback function

        Args:
            res: Result from last round rampage
            err: Error

        """

        if err == SciHubError.BLOCKED_BY_CAPTCHA:
            self.show_captcha(res)
        elif self._query_list:
            self.rampage_query_list()
        else:
            self.afterRampage.emit()

    def show_captcha(self, pdf_captcha_response):
        """Callback function for PDF captcha response

        Args:
            pdf_captcha_response: PDF captcha response

        """

        self._captcha_query = pdf_captcha_response

        scihub_api = SciHubAPI('', log=self.log, conf=self._conf)
        _, captcha_img_url = scihub_api.get_captcha_info(pdf_captcha_response)
        self._captcha_img_file = scihub_api.download_captcha_img(
            captcha_img_url)
        captcha_img_local_url = 'file://' + self._captcha_img_file.name

        self._scihub_captcha.showWindowCaptcha.emit(captcha_img_local_url)

    def log(self, message, level=None):
        self.appendLogs.emit(message, level)
Пример #7
0
class SciHubEVA(QObject):
    beforeRampage = pyqtSignal()
    afterRampage = pyqtSignal()

    showErrorMessage = pyqtSignal(str, str)
    showInfoMessage = pyqtSignal(str, str)

    setSaveToDir = pyqtSignal(str)
    appendLogs = pyqtSignal(str)

    def __init__(self):
        super(SciHubEVA, self).__init__()

        self._conf = SciHubConf()

        self._engine = QQmlApplicationEngine()
        self._engine.load('qrc:/ui/SciHubEVA.qml')
        self._window = self._engine.rootObjects()[0]
        self._connect()

        self._scihub_preferences = SciHubPreferences(self._conf)
        self._scihub_captcha = SciHubCaptcha(self, log=self.log)
        self._captcha_query = None

        save_to_dir = self._conf.get('common', 'save_to_dir')
        if not save_to_dir or save_to_dir.strip() == '':
            self._save_to_dir = None
        else:
            self._save_to_dir = save_to_dir
            self.setSaveToDir.emit(save_to_dir)

    def _connect(self):
        # Connect QML signals to PyQt slots
        self._window.saveToDir.connect(self.saveToDir)
        self._window.rampage.connect(self.rampage)
        self._window.showWindowPreference.connect(self.showWindowPreferences)

        # Connect PyQt signals to QML slots
        self.beforeRampage.connect(self._window.beforeRampage)
        self.afterRampage.connect(self._window.afterRampage)

        self.showErrorMessage.connect(self._window.showErrorMessage)
        self.showInfoMessage.connect(self._window.showInfoMessage)

        self.setSaveToDir.connect(self._window.setSaveToDir)
        self.appendLogs.connect(self._window.appendLogs)

    @property
    def conf(self):
        return self._conf

    @pyqtSlot(str)
    def saveToDir(self, directory):
        self._save_to_dir = directory
        self._conf.set('common', 'save_to_dir', directory)

    @pyqtSlot()
    def showWindowPreferences(self):
        self._scihub_preferences.loadFromConf()
        self._scihub_preferences.showWindowPreferences.emit()

    @pyqtSlot(str)
    def rampage(self, input_query):
        """Download PDF with query of input

        Args:
            input_query: Query of input

        """

        scihub_api = SciHubAPI(input_query,
                               callback=self.rampage_callback,
                               rampage_type=SciHubRampageType.INPUT,
                               conf=self._conf,
                               log=self.log)
        self.beforeRampage.emit()
        scihub_api.start()

    def rampageWithCaptchar(self, captcha_answer):
        """ Download PDF with captcha query (self._captcha_query) and captcha answer

        Args:
            captcha_answer: Captcha answer

        """

        scihub_api = SciHubAPI(
            self._captcha_query,
            callback=self.rampage_callback,
            rampage_type=SciHubRampageType.PDF_CAPTCHA_RESPONSE,
            conf=self._conf,
            log=self.log,
            captcha_answer=captcha_answer)

        self.beforeRampage.emit()
        scihub_api.start()

    def rampage_callback(self, res, err):
        """Callback function

        Args:
            res: Result from last round rampage
            err: Error

        """

        if err == SciHubError.BLOCKED_BY_CAPTCHA:
            self.captcha_callback(res)
        else:
            self.afterRampage.emit()

    def captcha_callback(self, pdf_captcha_response):
        """Callback function for PDF captcha response

        Args:
            pdf_captcha_response: PDF captcha response

        """

        self._captcha_query = pdf_captcha_response
        _, captcha_img_url = SciHubAPI.get_captcha_info(pdf_captcha_response)
        self._scihub_captcha.showWindowCaptcha.emit(captcha_img_url)

    def log(self, message, level=None):
        if level:
            log_formater = '[{level}] - {message}'
        else:
            log_formater = '{message}'

        self.appendLogs.emit(log_formater.format(level=level, message=message))
Пример #8
0
class SciHubEVA(QObject):
    beforeRampage = Signal()
    afterRampage = Signal()

    loadSaveToDir = Signal(str)
    appendLogs = Signal(str, str)

    def __init__(self):
        super(SciHubEVA, self).__init__()

        self._conf = SciHubConf('SciHubEVA.conf')
        self._qt_quick_controls2_conf = SciHubConf(
            'qtquickcontrols2.conf', space_around_delimiters=False)

        self._engine = QQmlApplicationEngine()
        self._engine.rootContext().setContextProperty(
            'PYTHON_VERSION', '.'.join(str(v) for v in sys.version_info[:3]))
        self._engine.rootContext().setContextProperty(
            'QT_VERSION', PySide2.QtCore.qVersion())
        self._engine.load('qrc:/ui/SciHubEVA.qml')
        self._window = self._engine.rootObjects()[0]
        self._connect()

        self._scihub_preferences = SciHubPreferences(
            self._conf, self._qt_quick_controls2_conf)
        self._scihub_captcha = SciHubCaptcha(self, log=self.log)
        self._captcha_query = None

        self._input = None
        save_to_dir = self._conf.get('common', 'save_to_dir')
        if not save_to_dir or save_to_dir.strip() == '':
            self._save_to_dir = None
        else:
            self._save_to_dir = save_to_dir
            self.loadSaveToDir.emit(save_to_dir)

        self._query_list = None
        self._query_list_length = 0

        self._captcha_img_file_path = None

        self._logger = logging.getLogger('SciHubEVA')
        self._logger.setLevel(logging.DEBUG)

        formatter = logging.Formatter(
            '%(asctime)s - %(levelname)s - %(message)s')
        log_file_name_prefix = str(get_log_directory() / 'SciHubEVA.log')
        handler = TimedRotatingFileHandler(filename=log_file_name_prefix,
                                           when='D')
        handler.setFormatter(formatter)
        handler.setLevel(logging.DEBUG)

        self._logger.addHandler(handler)

        self._h2t = html2text.HTML2Text()
        self._h2t.ignore_links = True

    def _connect(self):
        # Connect QML signals to PyQt slots
        self._window.setSaveToDir.connect(self.setSaveToDir)
        self._window.openSaveToDir.connect(self.openSaveToDir)
        self._window.rampage.connect(self.rampage)
        self._window.showWindowPreference.connect(self.showWindowPreference)
        self._window.openLogFile.connect(self.openLogFile)
        self._window.openLogDirectory.connect(self.openLogDirectory)

        # Connect PyQt signals to QML slots
        self.beforeRampage.connect(self._window.beforeRampage)
        self.afterRampage.connect(self._window.afterRampage)

        self.loadSaveToDir.connect(self._window.loadSaveToDir)
        self.appendLogs.connect(self._window.appendLogs)

    @property
    def conf(self):
        return self._conf

    @Slot(str)
    def setSaveToDir(self, directory):
        self._save_to_dir = directory
        self._conf.set('common', 'save_to_dir', directory)

    @Slot(str)
    def openSaveToDir(self, directory):
        if os.path.exists(directory):
            open_directory(directory)

    @Slot()
    def showWindowPreference(self):
        self._scihub_preferences.load_from_conf()
        self._scihub_preferences.showWindowPreferences.emit()

    @Slot()
    def openLogFile(self):
        open_file(str(get_log_directory() / 'SciHubEVA.log'))

    @Slot()
    def openLogDirectory(self):
        open_directory(str(get_log_directory()))

    @Slot(str)
    def rampage(self, input):
        """Download PDF with input

        Args:
            input: query or query list file path

        """

        self._input = input

        if os.path.exists(input):
            if is_text_file(input):
                self._query_list = deque()

                with open(input, 'rt') as f:
                    for line in f:
                        cleaned_line = line.strip()
                        if cleaned_line != '':
                            self._query_list.append(cleaned_line)

                self._query_list_length = len(self._query_list)
                self.rampage_query_list()
            else:
                self.log('<hr/>')
                self.log(self.tr('Query list file is not a text file!'),
                         logging.ERROR)
        elif is_range_query(input):
            self._query_list = deque(gen_range_query_list(input))
            self._query_list_length = len(self._query_list)
            self.rampage_query_list()
        else:
            self.rampage_query(input)

    def rampage_query_list(self):
        """Download PDF with query list (self._query_list)

        """

        if self._query_list and len(self._query_list) > 0:
            self.log('<hr/>')
            self.log(
                self.tr('Dealing with {}/{} query ...').format(
                    self._query_list_length - len(self._query_list) + 1,
                    self._query_list_length))

            self.rampage_query(self._query_list.popleft())

    def rampage_query(self, query):
        """Download PDF with query

        Args:
            query: Query of input

        """

        scihub_api = SciHubAPI(self._input,
                               query,
                               callback=self.rampage_callback,
                               rampage_type=SciHubRampageType.INPUT,
                               conf=self._conf,
                               log=self.log)
        self.beforeRampage.emit()
        scihub_api.start()

    def rampage_with_captcha(self, captcha_answer):
        """ Download PDF with captcha query (self._captcha_query) and captcha answer

        Args:
            captcha_answer: Captcha answer

        """

        if os.path.exists(self._captcha_img_file_path) and os.path.isfile(
                self._captcha_img_file_path):
            os.remove(self._captcha_img_file_path)

        scihub_api = SciHubAPI(
            self._input,
            self._captcha_query,
            callback=self.rampage_callback,
            rampage_type=SciHubRampageType.PDF_CAPTCHA_RESPONSE,
            conf=self._conf,
            log=self.log,
            captcha_answer=captcha_answer)

        self.beforeRampage.emit()
        scihub_api.start()

    def rampage_callback(self, res, err):
        """Callback function

        Args:
            res: Result from last round rampage
            err: Error

        """

        if err == SciHubError.BLOCKED_BY_CAPTCHA:
            self.show_captcha(res)
        elif self._query_list:
            self.rampage_query_list()
        else:
            self.afterRampage.emit()

    def show_captcha(self, pdf_captcha_response):
        """Callback function for PDF captcha response

        Args:
            pdf_captcha_response: PDF captcha response

        """

        self._captcha_query = pdf_captcha_response

        scihub_api = SciHubAPI(self._input,
                               None,
                               log=self.log,
                               conf=self._conf)
        _, captcha_img_url = scihub_api.get_captcha_info(pdf_captcha_response)
        captcha_img_file = scihub_api.download_captcha_img(captcha_img_url)
        self._captcha_img_file_path = Path(captcha_img_file.name).as_posix()
        captcha_img_local_uri = Path(captcha_img_file.name).as_uri()

        self._scihub_captcha.showWindowCaptcha.emit(captcha_img_local_uri)

    def log(self, message: str, level=None):
        self.appendLogs.emit(message,
                             logging.getLevelName(level) if level else '')

        text_message = self._h2t.handle(message).strip()
        if text_message and text_message != '':
            self._logger.log(level if level else logging.INFO, text_message)