diff --git a/.gitignore b/.gitignore index 3c5cc32..a45b2cf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,10 @@ .DS_Store .AppleDouble .LSOverride - +.idea # Icon must end with two \r -Icon +Icon + # Thumbnails ._* diff --git a/setup.py b/setup.py index a15e44f..480251b 100644 --- a/setup.py +++ b/setup.py @@ -1,52 +1,25 @@ -# -# setup.py +# -*- coding: utf-8 -*- # # Copyright (C) 2009 Andrew Resch -# Copyright (C) 2015 Chris Yereaztian # # Basic plugin template created by: # Copyright (C) 2008 Martijn Voncken # Copyright (C) 2007-2009 Andrew Resch # -# Deluge is free software. -# -# You may redistribute it and/or modify it under the terms of the -# GNU General Public License, as published by the Free Software -# Foundation; either version 3 of the License, or (at your option) -# any later version. -# -# deluge 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 deluge. If not, write to: -# The Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor -# Boston, MA 02110-1301, USA. -# -# In addition, as a special exception, the copyright holders give -# permission to link the code of portions of this program with the OpenSSL -# library. -# You must obey the GNU General Public License in all respects for all of -# the code used other than OpenSSL. If you modify file(s) with this -# exception, you may extend this exception to your version of the file(s), -# but you are not obligated to do so. If you do not wish to do so, delete -# this exception statement from your version. If you delete this exception -# statement from all source files in the program, then also delete it here. -# +# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with +# the additional special exception to link portions of this program with the OpenSSL library. +# See LICENSE for more details. # -from setuptools import setup +from setuptools import find_packages, setup -__plugin_name__ = "SimpleExtractor" -__author__ = "Chris Yereaztian" -__author_email__ = "chris.yereaztian@gmail.com" -__version__ = "0.4.1" -__url__ = "github.com/cvarta/deluge-extractor" -__license__ = "GPLv3" -__description__ = "Extract files upon torrent completion" +__plugin_name__ = 'SimpleExtractor' +__author__ = 'Digitalhigh' +__author_email__ = 'donate.to.digitalhigh@gmail.com' +__version__ = '0.7' +__url__ = 'github.com/d8ahazard/deluge-extractor' +__license__ = 'GPLv3' +__description__ = 'Extract files upon torrent completion' __long_description__ = """ Extract files upon torrent completion @@ -57,7 +30,7 @@ Windows support: .rar, .zip, .tar, .7z, .xz, .lzma Note: Will not extract with 'Move Completed' enabled """ -__pkg_data__ = {__plugin_name__.lower(): ["template/*", "data/*"]} +__pkg_data__ = {'deluge_' + __plugin_name__.lower(): ['data/*']} setup( name=__plugin_name__, @@ -68,16 +41,15 @@ setup( url=__url__, license=__license__, long_description=__long_description__ if __long_description__ else __description__, - - packages=[__plugin_name__.lower()], - package_data = __pkg_data__, - + packages=find_packages(), + package_data=__pkg_data__, entry_points=""" [deluge.plugin.core] - %s = %s:CorePlugin - [deluge.plugin.gtkui] - %s = %s:GtkUIPlugin + %s = deluge_%s:CorePlugin + [deluge.plugin.gtk3ui] + %s = deluge_%s:GtkUIPlugin [deluge.plugin.web] - %s = %s:WebUIPlugin - """ % ((__plugin_name__, __plugin_name__.lower())*3) + %s = deluge_%s:WebUIPlugin + """ + % ((__plugin_name__, __plugin_name__.lower()) * 3), ) diff --git a/simpleextractor/__init__.py b/simpleextractor/__init__.py index c78100f..829d061 100644 --- a/simpleextractor/__init__.py +++ b/simpleextractor/__init__.py @@ -39,6 +39,7 @@ # from deluge.plugins.init import PluginInitBase +from __future__ import unicode_literals class CorePlugin(PluginInitBase): def __init__(self, plugin_name): diff --git a/simpleextractor/common.py b/simpleextractor/common.py index 950c719..4c9db09 100644 --- a/simpleextractor/common.py +++ b/simpleextractor/common.py @@ -1,39 +1,23 @@ +# -*- coding: utf-8 -*- # -# common.py -# -# Copyright (C) 2009 Andrew Resch -# Copyright (C) 2015 Chris Yereaztian -# -# Deluge is free software. -# -# You may redistribute it and/or modify it under the terms of the -# GNU General Public License, as published by the Free Software -# Foundation; either version 3 of the License, or (at your option) -# any later version. -# -# deluge 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 deluge. If not, write to: -# The Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor -# Boston, MA 02110-1301, USA. -# -# In addition, as a special exception, the copyright holders give -# permission to link the code of portions of this program with the OpenSSL -# library. -# You must obey the GNU General Public License in all respects for all of -# the code used other than OpenSSL. If you modify file(s) with this -# exception, you may extend this exception to your version of the file(s), -# but you are not obligated to do so. If you do not wish to do so, delete -# this exception statement from your version. If you delete this exception -# statement from all source files in the program, then also delete it here. +# Basic plugin template created by: +# Copyright (C) 2008 Martijn Voncken +# 2007-2009 Andrew Resch +# 2009 Damien Churchill +# 2010 Pedro Algarvio +# 2017 Calum Lind # +# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with +# the additional special exception to link portions of this program with the OpenSSL library. +# See LICENSE for more details. # +from __future__ import unicode_literals + +import os.path + +from pkg_resources import resource_filename + + def get_resource(filename): - import pkg_resources, os - return pkg_resources.resource_filename("simpleextractor", os.path.join("data", filename)) + return resource_filename(__package__, os.path.join('data', filename)) diff --git a/simpleextractor/core.py b/simpleextractor/core.py index 2d57f5d..3f4886d 100644 --- a/simpleextractor/core.py +++ b/simpleextractor/core.py @@ -1,60 +1,34 @@ -# -# core.py +# -*- coding: utf-8 -*- # # Copyright (C) 2009 Andrew Resch -# Copyright (C) 2015 Chris Yereaztian # # Basic plugin template created by: # Copyright (C) 2008 Martijn Voncken # Copyright (C) 2007-2009 Andrew Resch # -# Deluge is free software. -# -# You may redistribute it and/or modify it under the terms of the -# GNU General Public License, as published by the Free Software -# Foundation; either version 3 of the License, or (at your option) -# any later version. -# -# deluge 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 deluge. If not, write to: -# The Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor -# Boston, MA 02110-1301, USA. -# -# In addition, as a special exception, the copyright holders give -# permission to link the code of portions of this program with the OpenSSL -# library. -# You must obey the GNU General Public License in all respects for all of -# the code used other than OpenSSL. If you modify file(s) with this -# exception, you may extend this exception to your version of the file(s), -# but you are not obligated to do so. If you do not wish to do so, delete -# this exception statement from your version. If you delete this exception -# statement from all source files in the program, then also delete it here. -# +# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with +# the additional special exception to link portions of this program with the OpenSSL library. +# See LICENSE for more details. # +from __future__ import unicode_literals + +import errno +import logging import os -from twisted.internet.utils import getProcessValue +from twisted.internet.utils import getProcessOutputAndValue +from twisted.python.procutils import which -from deluge.log import LOG as log -from deluge.plugins.pluginbase import CorePluginBase import deluge.component as component import deluge.configmanager -from deluge.core.rpcserver import export from deluge.common import windows_check -from extractor.which import which +from deluge.core.rpcserver import export +from deluge.plugins.pluginbase import CorePluginBase -DEFAULT_PREFS = { - "extract_path": "", - "use_name_folder": False, - "in_place_extraction": True -} +log = logging.getLogger(__name__) + +DEFAULT_PREFS = {'extract_path': '', 'use_name_folder': True, 'in_place_extraction': True} if windows_check(): win_7z_exes = [ @@ -63,69 +37,84 @@ if windows_check(): 'C:\\Program Files (x86)\\7-Zip\\7z.exe', ] - import _winreg try: - hkey = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, "Software\\7-Zip") + import winreg + except ImportError: + import _winreg as winreg # For Python 2. + + try: + hkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, 'Software\\7-Zip') except WindowsError: pass else: - win_7z_path = os.path.join(_winreg.QueryValueEx(hkey, "Path")[0], "7z.exe") - _winreg.CloseKey(hkey) + win_7z_path = os.path.join(winreg.QueryValueEx(hkey, 'Path')[0], '7z.exe') + winreg.CloseKey(hkey) win_7z_exes.insert(1, win_7z_path) - switch_7z = "x -y" - ## Future suport: - ## 7-zip cannot extract tar.* with single command. + switch_7z = 'x -y' + # Future suport: + # 7-zip cannot extract tar.* with single command. # ".tar.gz", ".tgz", # ".tar.bz2", ".tbz", # ".tar.lzma", ".tlz", # ".tar.xz", ".txz", - exts_7z = [ - ".rar", ".zip", ".tar", - ".7z", ".xz", ".lzma", - ] + exts_7z = ['.rar', '.zip', '.tar', '.7z', '.xz', '.lzma'] for win_7z_exe in win_7z_exes: if which(win_7z_exe): EXTRACT_COMMANDS = dict.fromkeys(exts_7z, [win_7z_exe, switch_7z]) break else: - required_cmds=["unrar", "unzip", "tar", "unxz", "unlzma", "7zr", "bunzip2"] - ## Possible future suport: + required_cmds = ['unrar', 'unzip', 'tar', 'unxz', 'unlzma', '7zr', 'bunzip2'] + # Possible future suport: # gunzip: gz (cmd will delete original archive) - ## the following do not extract to dest dir + # the following do not extract to dest dir # ".xz": ["xz", "-d --keep"], # ".lzma": ["xz", "-d --format=lzma --keep"], # ".bz2": ["bzip2", "-d --keep"], EXTRACT_COMMANDS = { - ".rar": ["unrar", "x -o+ -y"], - ".tar": ["tar", "-xf"], - ".zip": ["unzip", ""], - ".tar.gz": ["tar", "-xzf"], ".tgz": ["tar", "-xzf"], - ".tar.bz2": ["tar", "-xjf"], ".tbz": ["tar", "-xjf"], - ".tar.lzma": ["tar", "--lzma -xf"], ".tlz": ["tar", "--lzma -xf"], - ".tar.xz": ["tar", "--xz -xf"], ".txz": ["tar", "--xz -xf"], - ".7z": ["7zr", "x"], + '.rar': ['unrar', 'x -o+ -y'], + '.tar': ['tar', '-xf'], + '.zip': ['unzip', ''], + '.tar.gz': ['tar', '-xzf'], + '.tgz': ['tar', '-xzf'], + '.tar.bz2': ['tar', '-xjf'], + '.tbz': ['tar', '-xjf'], + '.tar.lzma': ['tar', '--lzma -xf'], + '.tlz': ['tar', '--lzma -xf'], + '.tar.xz': ['tar', '--xz -xf'], + '.txz': ['tar', '--xz -xf'], + '.7z': ['7zr', 'x'], } # Test command exists and if not, remove. - for cmd in required_cmds: - if not which(cmd): - for k,v in EXTRACT_COMMANDS.items(): - if cmd in v[0]: - log.warning("EXTRACTOR: %s not found, disabling support for %s", cmd, k) + for command in required_cmds: + if not which(command): + for k, v in list(EXTRACT_COMMANDS.items()): + if command in v[0]: + log.warning('%s not found, disabling support for %s', command, k) del EXTRACT_COMMANDS[k] if not EXTRACT_COMMANDS: - raise Exception("EXTRACTOR: No archive extracting programs found, plugin will be disabled") + raise Exception('No archive extracting programs found, plugin will be disabled') + class Core(CorePluginBase): def enable(self): - self.config = deluge.configmanager.ConfigManager("simpleextractor.conf", DEFAULT_PREFS) - if not self.config["extract_path"]: - self.config["extract_path"] = deluge.configmanager.ConfigManager("core.conf")["download_location"] - component.get("EventManager").register_event_handler("TorrentFinishedEvent", self._on_torrent_finished) + self.config = deluge.configmanager.ConfigManager( + 'extractor.conf', DEFAULT_PREFS + ) + if not self.config['extract_path']: + self.config['extract_path'] = deluge.configmanager.ConfigManager( + 'core.conf' + )['download_location'] + component.get('EventManager').register_event_handler( + 'TorrentFinishedEvent', self._on_torrent_finished + ) + def disable(self): - component.get("EventManager").deregister_event_handler("TorrentFinishedEvent", self._on_torrent_finished) + component.get('EventManager').deregister_event_handler( + 'TorrentFinishedEvent', self._on_torrent_finished + ) def update(self): pass @@ -134,28 +123,31 @@ class Core(CorePluginBase): """ This is called when a torrent finishes and checks if any files to extract. """ - tid = component.get("TorrentManager").torrents[torrent_id] - tid_status = tid.get_status(["save_path", "name"]) + tid = component.get('TorrentManager').torrents[torrent_id] + tid_status = tid.get_status(['download_location', 'name']) files = tid.get_files() for f in files: - file_root, file_ext = os.path.splitext(f["path"]) + file_root, file_ext = os.path.splitext(f['path']) file_ext_sec = os.path.splitext(file_root)[1] if file_ext_sec and file_ext_sec + file_ext in EXTRACT_COMMANDS: file_ext = file_ext_sec + file_ext elif file_ext not in EXTRACT_COMMANDS or file_ext_sec == '.tar': - log.warning("EXTRACTOR: Can't extract file with unknown file type: %s" % f["path"]) + log.debug('Cannot extract file with unknown file type: %s', f['path']) continue + elif file_ext == '.rar' and 'part' in file_ext_sec: + part_num = file_ext_sec.split('part')[1] + if part_num.isdigit() and int(part_num) != 1: + log.debug('Skipping remaining multi-part rar files: %s', f['path']) + continue + cmd = EXTRACT_COMMANDS[file_ext] - - # Now that we have the cmd, lets run it to extract the files - fpath = os.path.join(tid_status["save_path"], os.path.normpath(f["path"])) - - # Get the destination path - dest = os.path.normpath(self.config["extract_path"]) - if self.config["use_name_folder"]: - name = tid_status["name"] - dest = os.path.join(dest, name) + fpath = os.path.join( + tid_status['download_location'], os.path.normpath(f['path']) + ) + dest = os.path.normpath(self.config['extract_path']) + if self.config['use_name_folder']: + dest = os.path.join(dest, tid_status['name']) # Override destination if in_place_extraction is set if self.config["in_place_extraction"]: @@ -165,34 +157,44 @@ class Core(CorePluginBase): # Create the destination folder if it doesn't exist if not os.path.exists(dest): - try: - os.makedirs(dest) - except Exception, e: - log.error("EXTRACTOR: Error creating destination folder: %s", e) - return + try: + os.makedirs(dest) + except OSError as ex: + if not (ex.errno == errno.EEXIST and os.path.isdir(dest)): + log.error('Error creating destination folder: %s', ex) + break - def on_extract_success(result, torrent_id, fpath): - # XXX: Emit an event - log.info("EXTRACTOR: Extract successful: %s (%s)", fpath, torrent_id) + def on_extract(result, torrent_id, fpath): + # Check command exit code. + if not result[2]: + log.info('Extract successful: %s (%s)', fpath, torrent_id) + else: + log.error( + 'Extract failed: %s (%s) %s', fpath, torrent_id, result[1] + ) - def on_extract_failed(result, torrent_id, fpath): - # XXX: Emit an event - log.error("EXTRACTOR: Extract failed: %s (%s)", fpath, torrent_id) - - # Run the command and add some callbacks - log.debug("EXTRACTOR: Extracting %s with %s %s to %s", fpath, cmd[0], cmd[1], dest) - d = getProcessValue(cmd[0], cmd[1].split() + [str(fpath)], {}, str(dest)) - d.addCallback(on_extract_success, torrent_id, fpath) - d.addErrback(on_extract_failed, torrent_id, fpath) + # Run the command and add callback. + log.debug( + 'Extracting %s from %s with %s %s to %s', + fpath, + torrent_id, + cmd[0], + cmd[1], + dest, + ) + d = getProcessOutputAndValue( + cmd[0], cmd[1].split() + [str(fpath)], os.environ, str(dest) + ) + d.addCallback(on_extract, torrent_id, fpath) @export def set_config(self, config): - "sets the config dictionary" - for key in config.keys(): + """Sets the config dictionary.""" + for key in config: self.config[key] = config[key] self.config.save() @export def get_config(self): - "returns the config dictionary" + """Returns the config dictionary.""" return self.config.config diff --git a/simpleextractor/data/simpleextractor.js b/simpleextractor/data/simpleextractor.js index a43b0b5..a105ba2 100644 --- a/simpleextractor/data/simpleextractor.js +++ b/simpleextractor/data/simpleextractor.js @@ -2,7 +2,7 @@ * simpleextractor.js * * Copyright (c) Damien Churchill 2010 - * Copyright (C) 2015 Chris Yereaztian + * Copyright (C) Digitalhigh 2019 * * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with * the additional special exception to link portions of this program with the OpenSSL library. diff --git a/simpleextractor/data/simpleextractor_prefs.glade b/simpleextractor/data/simpleextractor_prefs.ui similarity index 55% rename from simpleextractor/data/simpleextractor_prefs.glade rename to simpleextractor/data/simpleextractor_prefs.ui index 2dfc7e9..6f34b44 100644 --- a/simpleextractor/data/simpleextractor_prefs.glade +++ b/simpleextractor/data/simpleextractor_prefs.ui @@ -1,31 +1,42 @@ - - - - - + + + + + + False - + + + + True + False 5 + vertical - + True + False 0 none - + True + False 5 5 + vertical - + True + False 5 - + True + False Extract to: - + False False @@ -33,31 +44,41 @@ - + True + False - + + False select-folder Select A Folder - + + True + True 0 - + True - + False + False + + True + True 1 - + + True + True 1 - + False False @@ -65,53 +86,38 @@ - + Create torrent name sub-folder True True False - This option will create a sub-folder using the torrent's name within the selected extract folder and put the extracted files there. + This option will create a sub-folder using the torrent's name within the selected extract folder and put the extracted files there. True - + False False 1 - - - Extract torrent in place - True - True - False - This option will extract the torrent in place. - True - - - False - False - 1 - - - + - - + + True + False <b>General</b> True - - - label_item - + - + + True + True 0 - + - - + + diff --git a/simpleextractor/gtkui.py b/simpleextractor/gtkui.py index dac45ec..6fed7fb 100644 --- a/simpleextractor/gtkui.py +++ b/simpleextractor/gtkui.py @@ -1,98 +1,98 @@ -# -# gtkui.py +# -*- coding: utf-8 -*- # # Copyright (C) 2009 Andrew Resch -# Copyright (C) 2015 Chris Yereaztian # # Basic plugin template created by: # Copyright (C) 2008 Martijn Voncken # Copyright (C) 2007-2009 Andrew Resch # -# Deluge is free software. -# -# You may redistribute it and/or modify it under the terms of the -# GNU General Public License, as published by the Free Software -# Foundation; either version 3 of the License, or (at your option) -# any later version. -# -# deluge 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 deluge. If not, write to: -# The Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor -# Boston, MA 02110-1301, USA. -# -# In addition, as a special exception, the copyright holders give -# permission to link the code of portions of this program with the OpenSSL -# library. -# You must obey the GNU General Public License in all respects for all of -# the code used other than OpenSSL. If you modify file(s) with this -# exception, you may extend this exception to your version of the file(s), -# but you are not obligated to do so. If you do not wish to do so, delete -# this exception statement from your version. If you delete this exception -# statement from all source files in the program, then also delete it here. -# +# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with +# the additional special exception to link portions of this program with the OpenSSL library. +# See LICENSE for more details. # -import gtk +from __future__ import unicode_literals -from deluge.log import LOG as log -from deluge.ui.client import client -from deluge.plugins.pluginbase import GtkPluginBase +import logging + +import gi # isort:skip (Required before Gtk import). + +gi.require_version('Gtk', '3.0') # NOQA: E402 + +# isort:imports-thirdparty +from gi.repository import Gtk + +# isort:imports-firstparty import deluge.component as component -import deluge.common +from deluge.plugins.pluginbase import Gtk3PluginBase +from deluge.ui.client import client -from common import get_resource +# isort:imports-localfolder +from .common import get_resource -class GtkUI(GtkPluginBase): +log = logging.getLogger(__name__) + + +class GtkUI(Gtk3PluginBase): def enable(self): - self.glade = gtk.glade.XML(get_resource("simpleextractor_prefs.glade")) + self.builder = Gtk.Builder() + self.builder.add_from_file(get_resource('extractor_prefs.ui')) - component.get("Preferences").add_page(_("SimpleExtractor"), self.glade.get_widget("extractor_prefs_box")) - component.get("PluginManager").register_hook("on_apply_prefs", self.on_apply_prefs) - component.get("PluginManager").register_hook("on_show_prefs", self.on_show_prefs) + component.get('Preferences').add_page( + _('Extractor'), self.builder.get_object('extractor_prefs_box') + ) + component.get('PluginManager').register_hook( + 'on_apply_prefs', self.on_apply_prefs + ) + component.get('PluginManager').register_hook( + 'on_show_prefs', self.on_show_prefs + ) self.on_show_prefs() def disable(self): - component.get("Preferences").remove_page(_("Extractor")) - component.get("PluginManager").deregister_hook("on_apply_prefs", self.on_apply_prefs) - component.get("PluginManager").deregister_hook("on_show_prefs", self.on_show_prefs) - del self.glade + component.get('Preferences').remove_page(_('Extractor')) + component.get('PluginManager').deregister_hook( + 'on_apply_prefs', self.on_apply_prefs + ) + component.get('PluginManager').deregister_hook( + 'on_show_prefs', self.on_show_prefs + ) + del self.builder def on_apply_prefs(self): - log.debug("applying prefs for Extractor") + log.debug('applying prefs for Extractor') if client.is_localhost(): - path = self.glade.get_widget("folderchooser_path").get_filename() + path = self.builder.get_object('folderchooser_path').get_filename() else: - path = self.glade.get_widget("entry_path").get_text() + path = self.builder.get_object('entry_path').get_text() config = { - "extract_path": path, - "use_name_folder": self.glade.get_widget("chk_use_name").get_active(), - "in_place_extraction": self.glade.get_widget("chk_in_place_extraction").get_active() + 'extract_path': path, + 'use_name_folder': self.builder.get_object('chk_use_name').get_active(), + 'in_place_extraction': self.builder.get_object("chk_in_place_extraction").get_active() } client.extractor.set_config(config) def on_show_prefs(self): if client.is_localhost(): - self.glade.get_widget("folderchooser_path").show() - self.glade.get_widget("entry_path").hide() + self.builder.get_object('folderchooser_path').show() + self.builder.get_object('entry_path').hide() else: - self.glade.get_widget("folderchooser_path").hide() - self.glade.get_widget("entry_path").show() + self.builder.get_object('folderchooser_path').hide() + self.builder.get_object('entry_path').show() def on_get_config(config): if client.is_localhost(): - self.glade.get_widget("folderchooser_path").set_current_folder(config["extract_path"]) + self.builder.get_object('folderchooser_path').set_current_folder( + config['extract_path'] + ) else: - self.glade.get_widget("entry_path").set_text(config["extract_path"]) + self.builder.get_object('entry_path').set_text(config['extract_path']) - self.glade.get_widget("chk_use_name").set_active(config["use_name_folder"]) - self.glade.get_widget("chk_in_place_extraction").set_active(config["in_place_extraction"]) + self.builder.get_object('chk_use_name').set_active( + config['use_name_folder'] + ) + self.builder.get_object('chk_in_place_extraction').set_active(config['in_place_extraction']) client.extractor.get_config().addCallback(on_get_config) diff --git a/simpleextractor/webui.py b/simpleextractor/webui.py index 003c119..3b5b22d 100644 --- a/simpleextractor/webui.py +++ b/simpleextractor/webui.py @@ -1,5 +1,4 @@ -# -# webui.py +# -*- coding: utf-8 -*- # # Copyright (C) 2009 Andrew Resch # @@ -7,49 +6,23 @@ # Copyright (C) 2008 Martijn Voncken # Copyright (C) 2007-2009 Andrew Resch # -# Deluge is free software. -# -# You may redistribute it and/or modify it under the terms of the -# GNU General Public License, as published by the Free Software -# Foundation; either version 3 of the License, or (at your option) -# any later version. -# -# deluge 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 deluge. If not, write to: -# The Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor -# Boston, MA 02110-1301, USA. -# -# In addition, as a special exception, the copyright holders give -# permission to link the code of portions of this program with the OpenSSL -# library. -# You must obey the GNU General Public License in all respects for all of -# the code used other than OpenSSL. If you modify file(s) with this -# exception, you may extend this exception to your version of the file(s), -# but you are not obligated to do so. If you do not wish to do so, delete -# this exception statement from your version. If you delete this exception -# statement from all source files in the program, then also delete it here. -# +# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with +# the additional special exception to link portions of this program with the OpenSSL library. +# See LICENSE for more details. # -from deluge.log import LOG as log -from deluge.ui.client import client -from deluge import component +from __future__ import unicode_literals + +import logging + from deluge.plugins.pluginbase import WebPluginBase -from common import get_resource +from .common import get_resource + +log = logging.getLogger(__name__) + class WebUI(WebPluginBase): - def enable(self): - pass - def disable(self): - pass - - scripts = [get_resource("simpleextractor.js")] + scripts = [get_resource('simpleextractor.js')] debug_scripts = scripts diff --git a/simpleextractor/which.py b/simpleextractor/which.py deleted file mode 100644 index a41a529..0000000 --- a/simpleextractor/which.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -which.py : Same as the Unix "which" command: tests if an executable exists and returns name -""" -def which(program): - # Author Credit: Jay @ http://stackoverflow.com/a/377028 - import os - def is_exe(fpath): - return os.path.isfile(fpath) and os.access(fpath, os.X_OK) - - fpath, fname = os.path.split(program) - if fpath: - if is_exe(program): - return program - else: - for path in os.environ["PATH"].split(os.pathsep): - exe_file = os.path.join(path, program) - if is_exe(exe_file): - return exe_file - - return None