You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
6.4 KiB
199 lines
6.4 KiB
#!/usr/bin/python3 -OO
|
|
# Copyright 2007-2021 The SABnzbd-Team <team@sabnzbd.org>
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
"""
|
|
sabtray.py - Systray icon for SABnzbd on Windows, contributed by Jan Schejbal
|
|
"""
|
|
|
|
import os
|
|
import logging
|
|
from time import sleep
|
|
|
|
import sabnzbd
|
|
from sabnzbd.panic import launch_a_browser
|
|
import sabnzbd.api as api
|
|
import sabnzbd.cfg as cfg
|
|
from sabnzbd.misc import to_units
|
|
|
|
# contains the tray icon, which demands its own thread
|
|
from sabnzbd.utils.systrayiconthread import SysTrayIconThread
|
|
|
|
|
|
class SABTrayThread(SysTrayIconThread):
|
|
sabicons = {
|
|
"default": "icons/sabnzbd16_32.ico",
|
|
"green": "icons/sabnzbd16_32green.ico",
|
|
"pause": "icons/sabnzbd16_32paused.ico",
|
|
}
|
|
|
|
def __init__(self):
|
|
# Wait for translated texts to be loaded
|
|
while not sabnzbd.WEBUI_READY:
|
|
sleep(0.2)
|
|
logging.debug("language file not loaded, waiting")
|
|
|
|
self.sabpaused = False
|
|
self.counter = 0
|
|
self.set_texts()
|
|
|
|
menu_options = (
|
|
(T("Show interface"), None, self.browse),
|
|
(T("Open complete folder"), None, self.opencomplete),
|
|
("SEPARATOR", None, None),
|
|
(T("Pause") + "/" + T("Resume"), None, self.pauseresume),
|
|
(
|
|
T("Pause for"),
|
|
None,
|
|
(
|
|
(T("Pause for 5 minutes"), None, self.pausefor5min),
|
|
(T("Pause for 15 minutes"), None, self.pausefor15min),
|
|
(T("Pause for 30 minutes"), None, self.pausefor30min),
|
|
(T("Pause for 1 hour"), None, self.pausefor1hour),
|
|
(T("Pause for 3 hours"), None, self.pausefor3hour),
|
|
(T("Pause for 6 hours"), None, self.pausefor6hour),
|
|
),
|
|
),
|
|
("SEPARATOR", None, None),
|
|
(T("Read all RSS feeds"), None, self.rss),
|
|
("SEPARATOR", None, None),
|
|
(
|
|
T("Troubleshoot"),
|
|
None,
|
|
(
|
|
(T("Restart"), None, self.restart_sab),
|
|
(T("Restart without login"), None, self.nologin),
|
|
(T("Restart") + " - 127.0.0.1:8080", None, self.defhost),
|
|
),
|
|
),
|
|
(T("Shutdown"), None, self.shutdown),
|
|
)
|
|
|
|
super().__init__(self.sabicons["default"], "SABnzbd", menu_options, None, 0, "SabTrayIcon")
|
|
|
|
def set_texts(self):
|
|
""" Cache texts for performance, doUpdates is called often """
|
|
self.txt_idle = T("Idle")
|
|
self.txt_paused = T("Paused")
|
|
self.txt_remaining = T("Remaining")
|
|
|
|
# called every few ms by SysTrayIconThread
|
|
def doUpdates(self):
|
|
""" Update menu info, once every 10 calls """
|
|
self.counter += 1
|
|
if self.counter > 10:
|
|
self.sabpaused, bytes_left, bpsnow, time_left = api.fast_queue()
|
|
mb_left = to_units(bytes_left)
|
|
speed = to_units(bpsnow)
|
|
|
|
if self.sabpaused:
|
|
if bytes_left > 0:
|
|
self.hover_text = "%s - %s: %sB" % (self.txt_paused, self.txt_remaining, mb_left)
|
|
else:
|
|
self.hover_text = self.txt_paused
|
|
self.icon = self.sabicons["pause"]
|
|
elif bytes_left > 0:
|
|
self.hover_text = "%sB/s - %s: %sB (%s)" % (speed, self.txt_remaining, mb_left, time_left)
|
|
self.icon = self.sabicons["green"]
|
|
else:
|
|
self.hover_text = self.txt_idle
|
|
self.icon = self.sabicons["default"]
|
|
self.hover_text = "SABnzbd %s\n%s" % (sabnzbd.__version__, self.hover_text)
|
|
self.refresh_icon()
|
|
self.counter = 0
|
|
|
|
# left-click handler
|
|
def click(self, *args):
|
|
# Make sure to stop the timer
|
|
self.stop_click_timer()
|
|
# Pause/resume and force update of icon/text
|
|
self.pauseresume(None)
|
|
self.counter = 11
|
|
|
|
# menu handler
|
|
def opencomplete(self, icon):
|
|
try:
|
|
os.startfile(cfg.complete_dir.get_path())
|
|
except OSError:
|
|
pass
|
|
|
|
# menu handler
|
|
def browse(self, icon):
|
|
launch_a_browser(sabnzbd.BROWSER_URL, True)
|
|
|
|
# menu handler
|
|
def pauseresume(self, icon):
|
|
if self.sabpaused:
|
|
self.resume()
|
|
else:
|
|
self.pause()
|
|
|
|
def pausefor(self, minutes):
|
|
""" Need function for each pause-timer """
|
|
sabnzbd.Scheduler.plan_resume(minutes)
|
|
|
|
def pausefor5min(self, icon):
|
|
self.pausefor(5)
|
|
|
|
def pausefor15min(self, icon):
|
|
self.pausefor(15)
|
|
|
|
def pausefor30min(self, icon):
|
|
self.pausefor(30)
|
|
|
|
def pausefor1hour(self, icon):
|
|
self.pausefor(60)
|
|
|
|
def pausefor3hour(self, icon):
|
|
self.pausefor(3 * 60)
|
|
|
|
def pausefor6hour(self, icon):
|
|
self.pausefor(6 * 60)
|
|
|
|
def restart_sab(self, icon):
|
|
self.hover_text = T("Restart")
|
|
logging.info("Restart requested by tray")
|
|
sabnzbd.trigger_restart()
|
|
|
|
def rss(self, icon):
|
|
self.hover_text = T("Read all RSS feeds")
|
|
sabnzbd.Scheduler.force_rss()
|
|
|
|
def nologin(self, icon):
|
|
sabnzbd.cfg.username.set("")
|
|
sabnzbd.cfg.password.set("")
|
|
sabnzbd.config.save_config()
|
|
self.hover_text = T("Restart")
|
|
sabnzbd.trigger_restart()
|
|
|
|
def defhost(self, icon):
|
|
sabnzbd.cfg.cherryhost.set("127.0.0.1")
|
|
sabnzbd.cfg.enable_https.set(False)
|
|
sabnzbd.config.save_config()
|
|
self.hover_text = T("Restart")
|
|
sabnzbd.trigger_restart()
|
|
|
|
def shutdown(self, icon):
|
|
self.hover_text = T("Shutdown")
|
|
sabnzbd.shutdown_program()
|
|
|
|
def pause(self):
|
|
sabnzbd.Scheduler.plan_resume(0)
|
|
sabnzbd.Downloader.pause()
|
|
|
|
def resume(self):
|
|
sabnzbd.Scheduler.plan_resume(0)
|
|
sabnzbd.unpause_all()
|
|
|