src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyDownloader.py

Fri, 04 Nov 2022 13:52:26 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 04 Nov 2022 13:52:26 +0100
branch
eric7
changeset 9473
3f23dbf37dbe
parent 9413
80c06d472826
child 9482
a2bc06a54d9d
permissions
-rw-r--r--

Resorted the import statements using isort.

# -*- coding: utf-8 -*-

# Copyright (c) 2012 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing the downloader for GreaseMonkey scripts.
"""

import os
import pathlib

from PyQt6.QtCore import QObject, QSettings, pyqtSignal, pyqtSlot
from PyQt6.QtNetwork import QNetworkReply, QNetworkRequest

from eric7.WebBrowser.WebBrowserWindow import WebBrowserWindow


class GreaseMonkeyDownloader(QObject):
    """
    Class implementing the downloader for GreaseMonkey scripts.

    @signal finished(fileName) emitted to indicate the end of a script download
        (str)
    @signal error() emitted to indicate a script download error
    """

    finished = pyqtSignal(str)
    error = pyqtSignal()

    DownloadMainScript = 1
    DownloadRequireScript = 2

    def __init__(self, url, manager, mode):
        """
        Constructor

        @param url URL to download script from
        @type QUrl
        @param manager reference to the GreaseMonkey manager
        @type GreaseMonkeyManager
        @param mode download mode
        @type int (one of DownloadMainScript, DownloadRequireScript)
        """
        super().__init__()

        self.__manager = manager

        self.__reply = WebBrowserWindow.networkManager().get(QNetworkRequest(url))
        if mode == GreaseMonkeyDownloader.DownloadMainScript:
            self.__reply.finished.connect(self.__scriptDownloaded)
        else:
            self.__reply.finished.connect(self.__requireDownloaded)

        self.__fileName = ""

    def updateScript(self, fileName):
        """
        Public method to set the file name for the script to be downloaded.

        @param fileName file name for the script
        @type str
        """
        self.__fileName = fileName

    @pyqtSlot()
    def __scriptDownloaded(self):
        """
        Private slot to handle the finished download of a script.
        """
        self.deleteLater()
        self.__reply.deleteLater()

        if self.__reply.error() != QNetworkReply.NetworkError.NoError:
            self.error.emit()
            return

        response = bytes(self.__reply.readAll()).decode()

        if "// ==UserScript==" not in response:
            self.error.emit()
            return

        if not self.__fileName:
            from eric7.WebBrowser.Tools import WebBrowserTools

            filePath = os.path.join(
                self.__manager.scriptsDirectory(),
                WebBrowserTools.getFileNameFromUrl(self.__reply.url()),
            )
            self.__fileName = WebBrowserTools.ensureUniqueFilename(filePath)

        try:
            with open(self.__fileName, "w", encoding="utf-8") as f:
                f.write(response)
        except OSError:
            self.error.emit()
            return

        self.finished.emit(self.__fileName)

    @pyqtSlot()
    def __requireDownloaded(self):
        """
        Private slot to handle the finished download of a required script.
        """
        self.deleteLater()
        self.__reply.deleteLater()

        if self.__reply.error() != QNetworkReply.NetworkError.NoError:
            self.error.emit()
            return

        response = bytes(self.__reply.readAll()).decode()

        if not response:
            self.error.emit()
            return

        settings = QSettings(
            os.path.join(self.__manager.requireScriptsDirectory(), "requires.ini"),
            QSettings.Format.IniFormat,
        )
        settings.beginGroup("Files")

        if not self.__fileName:
            self.__fileName = settings.value(self.__reply.request().url().toString())
            if not self.__fileName:
                name = pathlib.Path(self.__reply.request().url().path()).name
                if not name:
                    name = "require.js"
                elif not name.endswith(".js"):
                    name += ".js"
                filePath = os.path.join(self.__manager.requireScriptsDirectory(), name)
                from eric7.WebBrowser.Tools import WebBrowserTools

                self.__fileName = WebBrowserTools.ensureUniqueFilename(filePath, "{0}")
            if not pathlib.Path(self.__fileName).is_absolute():
                self.__fileName = os.path.join(
                    self.__manager.requireScriptsDirectory(), self.__fileName
                )

        try:
            with open(self.__fileName, "w", encoding="utf-8") as f:
                f.write(response)
        except OSError:
            self.error.emit()
            return

        settings.setValue(
            self.__reply.request().url().toString(), pathlib.Path(self.__fileName).name
        )

        self.finished.emit(self.__fileName)

eric ide

mercurial