diff --git a/app/tools/yt.py b/app/tools/yt.py index b4500db5..ba358fc9 100644 --- a/app/tools/yt.py +++ b/app/tools/yt.py @@ -12,6 +12,7 @@ from urllib.parse import unquote from urllib.request import Request, urlopen, urlretrieve from app.commons import log +from app.ui.uicommons import show_notification _YT_PATTERN = re.compile(r"https://www.youtube.com/.+(?:v=)([\w-]{11}).*") _YT_LIST_PATTERN = re.compile(r"https://www.youtube.com/.+?(?:list=)([\w-]{18,})?.*") @@ -237,27 +238,32 @@ class YouTubeDL: except ModuleNotFoundError as e: log("YouTubeDLHelper error: {}".format(str(e))) raise YouTubeException(e) + except ImportError as e: + log("YouTubeDLHelper error: {}".format(str(e))) else: if self._update: if hasattr(youtube_dl.version, "__version__"): l_ver = self.get_last_release_id() cur_ver = youtube_dl.version.__version__ if youtube_dl.version.__version__ < l_ver: - msg = "youtube-dl has new release! Current: {}. Last: {}.".format(cur_ver, l_ver) + msg = "youtube-dl has new release!\nCurrent: {}. Last: {}.".format(cur_ver, l_ver) + show_notification(msg) log(msg) self._callback(msg, False) self.get_latest_release() self._DownloadError = youtube_dl.utils.DownloadError self._dl = youtube_dl.YoutubeDL(self._OPTIONS) - log("youtube-dl initialized...") + msg = "youtube-dl initialized..." + show_notification(msg) + log(msg) @staticmethod def get_last_release_id(): """ Getting last release id. """ url = "https://api.github.com/repos/ytdl-org/youtube-dl/releases/latest" with urlopen(url, timeout=10) as resp: - return json.load(resp).get("tag_name", "0") + return json.loads(resp.read().decode("utf-8")).get("tag_name", "0") def get_latest_release(self): try: @@ -265,7 +271,7 @@ class YouTubeDL: log("Getting the last youtube-dl release...") with urlopen(YouTubeDL._LATEST_RELEASE_URL, timeout=10) as resp: - r = json.load(resp) + r = json.loads(resp.read().decode("utf-8")) zip_url = r.get("zipball_url", None) if zip_url: zip_file = self._path + "yt.zip" @@ -288,6 +294,7 @@ class YouTubeDL: shutil.move(info.filename, "{}{}{}".format(self._path, sep, f)) shutil.rmtree(pref) msg = "Getting the last youtube-dl release is done!" + show_notification(msg) log(msg) self._callback(msg, False) return True diff --git a/app/ui/uicommons.py b/app/ui/uicommons.py index 3c3978da..ecd36ee0 100644 --- a/app/ui/uicommons.py +++ b/app/ui/uicommons.py @@ -15,7 +15,7 @@ MOD_MASK = Gdk.ModifierType.MOD2_MASK if IS_DARWIN else Gdk.ModifierType.CONTROL UI_RESOURCES_PATH = "app/ui/" if os.path.exists("app/ui/") else "ui/" LANG_PATH = UI_RESOURCES_PATH + "lang" GTK_PATH = os.environ.get("GTK_PATH", None) - +NOTIFY_IS_INIT = False IS_GNOME_SESSION = int(bool(os.environ.get("GNOME_DESKTOP_SESSION_ID"))) # Translation. TEXT_DOMAIN = "demon-editor" @@ -51,6 +51,14 @@ else: import locale locale.bindtextdomain(TEXT_DOMAIN, LANG_PATH) + # Init notify + try: + gi.require_version("Notify", "0.7") + from gi.repository import Notify + except ImportError: + pass + else: + NOTIFY_IS_INIT = Notify.init("DemonEditor") theme = Gtk.IconTheme.get_default() theme.append_search_path(GTK_PATH + "/share/icons" if GTK_PATH else UI_RESOURCES_PATH + "icons") @@ -75,7 +83,10 @@ DEFAULT_ICON = get_theme_icon(theme, "emblem-default", 16) @lru_cache(maxsize=1) def get_yt_icon(icon_name, size=24): - """ Getting YouTube icon. If the icon is not found in the icon themes, the "APPLY" icon is returned by default! """ + """ Getting YouTube icon. + + If the icon is not found in the icon themes, the "Info" icon is returned by default! + """ default_theme = Gtk.IconTheme.get_default() if default_theme.has_icon(icon_name): return default_theme.load_icon(icon_name, size, 0) @@ -92,6 +103,23 @@ def get_yt_icon(icon_name, size=24): return default_theme.load_icon(Gtk.STOCK_APPLY, size, 0) +def show_notification(message, timeout=10000, urgency=1): + """ Shows notification. + + @param message: text to display + @param timeout: milliseconds + @param urgency: 0 - low, 1 - normal, 2 - critical + """ + if IS_DARWIN: + # Since NSUserNotification has been deprecated, osascript will be used. + os.system("""osascript -e 'display notification "{}" with title "DemonEditor"'""".format(message)) + elif NOTIFY_IS_INIT: + notify = Notify.Notification.new("DemonEditor", message, "demon-editor") + notify.set_urgency(urgency) + notify.set_timeout(timeout) + notify.show() + + class KeyboardKey(Enum): """ The raw(hardware) codes of the keyboard keys. """ F = 3 if IS_DARWIN else 41