Author: andar
Revision: 5225
Log:
Add Extractor plugin
Diff:
Added: trunk/deluge/plugins/extractor/extractor/__init__.py
===================================================================
--- trunk/deluge/plugins/extractor/extractor/__init__.py
(rev 0)
+++ trunk/deluge/plugins/extractor/extractor/__init__.py 2009-05-02
02:13:23 UTC (rev 5225)
@@ -0,0 +1,47 @@
+#
+# __init__.py
+#
+# Copyright (C) 2009 Andrew Resch <[email protected]>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <[email protected]>
+# Copyright (C) 2007-2009 Andrew Resch <[email protected]>
+#
+# 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.
+#
+
+from deluge.plugins.init import PluginInitBase
+
+class CorePlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from core import Core as _plugin_cls
+ self._plugin_cls = _plugin_cls
+ super(CorePlugin, self).__init__(plugin_name)
+
+class GtkUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from gtkui import GtkUI as _plugin_cls
+ self._plugin_cls = _plugin_cls
+ super(GtkUIPlugin, self).__init__(plugin_name)
+
+class WebUIPlugin(PluginInitBase):
+ def __init__(self, plugin_name):
+ from webui import WebUI as _plugin_cls
+ self._plugin_cls = _plugin_cls
+ super(WebUIPlugin, self).__init__(plugin_name)
Added: trunk/deluge/plugins/extractor/extractor/common.py
===================================================================
--- trunk/deluge/plugins/extractor/extractor/common.py
(rev 0)
+++ trunk/deluge/plugins/extractor/extractor/common.py 2009-05-02 02:13:23 UTC
(rev 5225)
@@ -0,0 +1,27 @@
+#
+# common.py
+#
+# Copyright (C) 2009 Andrew Resch <[email protected]>
+#
+# 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.
+#
+
+def get_resource(filename):
+ import pkg_resources, os
+ return pkg_resources.resource_filename("extractor", os.path.join("data",
filename))
Added: trunk/deluge/plugins/extractor/extractor/core.py
===================================================================
--- trunk/deluge/plugins/extractor/extractor/core.py
(rev 0)
+++ trunk/deluge/plugins/extractor/extractor/core.py 2009-05-02 02:13:23 UTC
(rev 5225)
@@ -0,0 +1,114 @@
+#
+# core.py
+#
+# Copyright (C) 2009 Andrew Resch <[email protected]>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <[email protected]>
+# Copyright (C) 2007-2009 Andrew Resch <[email protected]>
+#
+# 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.
+#
+
+import os
+
+from twisted.internet.utils import getProcessValue
+
+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
+
+DEFAULT_PREFS = {
+ "extract_path": ""
+}
+
+# The first format is the source file, the second is the dest path
+EXTRACT_COMMANDS = {
+ ".rar": ["unrar", "x -o+ -y"],
+ ".zip": ["unzip", ""],
+ ".tar.gz": ["tar", "xvzf"],
+ ".tar.bz2": ["tar", "xvjf"],
+ ".tar.lzma": ["tar", "--lzma xvf"]
+}
+
+class Core(CorePluginBase):
+ def enable(self):
+ self.config = deluge.configmanager.ConfigManager("extractor.conf",
DEFAULT_PREFS)
+
component.get("EventManager").register_event_handler("TorrentFinishedEvent",
self._on_torrent_finished)
+
+ def disable(self):
+ pass
+
+ def update(self):
+ pass
+
+ def _on_torrent_finished(self, torrent_id):
+ """
+ This is called when a torrent finishes. We need to check to see if
there
+ are any files to extract.
+ """
+ # Get the save path
+ save_path =
component.get("TorrentManager")[torrent_id].get_status(["save_path"])["save_path"]
+ files = component.get("TorrentManager")[torrent_id].get_files()
+ for f in files:
+ ext = os.path.splitext(f["path"])
+ if ext in (".gz", ".bz2", ".lzma"):
+ # We need to check if this is a tar
+ if os.path.splitext(ext[0]) == ".tar":
+ cmd = EXTRACT_COMMANDS[".tar" + ext[1]]
+ else:
+ if ext[1] in EXTRACT_COMMANDS:
+ cmd = EXTRACT_COMMANDS[ext[1]]
+ else:
+ log.debug("Can't extract unknown file type: %s", ext[1])
+ continue
+
+ # Now that we have the cmd, lets run it to extract the files
+ fp = os.path.join(save_path, f["path"])
+ if os.path.exists(self.config["extract_path"]):
+ dest = self.config["extract_path"]
+ else:
+ dest = None
+
+ def on_extract_success(result, torrent_id):
+ # XXX: Emit an event
+ log.debug("Extract was successful for %s", torrent_id)
+
+ def on_extract_failed(result, torrent_id):
+ # XXX: Emit an event
+ log.debug("Extract failed for %s", torrent_id)
+
+ # Run the command and add some callbacks
+ d = getProcessValue(cmd[0], cmd[1:] + [fp], {}, dest)
+ d.addCallback(on_extract_success, torrent_id)
+ d.addErrback(on_extract_failed, torrent_id)
+
+ @export()
+ def set_config(self, config):
+ "sets the config dictionary"
+ for key in config.keys():
+ self.config[key] = config[key]
+ self.config.save()
+
+ @export()
+ def get_config(self):
+ "returns the config dictionary"
+ return self.config.config
Added: trunk/deluge/plugins/extractor/extractor/data/extractor_prefs.glade
===================================================================
--- trunk/deluge/plugins/extractor/extractor/data/extractor_prefs.glade
(rev 0)
+++ trunk/deluge/plugins/extractor/extractor/data/extractor_prefs.glade
2009-05-02 02:13:23 UTC (rev 5225)
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--Generated with glade3 3.4.5 on Fri May 1 18:23:42 2009 -->
+<glade-interface>
+ <widget class="GtkWindow" id="window1">
+ <child>
+ <widget class="GtkVBox" id="extractor_prefs_box">
+ <property name="visible">True</property>
+ <property name="spacing">5</property>
+ <child>
+ <widget class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="spacing">5</property>
+ <child>
+ <widget class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="spacing">5</property>
+ <child>
+ <widget class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Extract
to:</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFileChooserButton"
id="folderchooser_path">
+ <property name="visible">True</property>
+ <property
name="action">GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER</property>
+ <property name="title" translatable="yes">Select A
Folder</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entry_path">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </widget>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label"
translatable="yes"><b>General</b></property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+</glade-interface>
Added: trunk/deluge/plugins/extractor/extractor/gtkui.py
===================================================================
--- trunk/deluge/plugins/extractor/extractor/gtkui.py
(rev 0)
+++ trunk/deluge/plugins/extractor/extractor/gtkui.py 2009-05-02 02:13:23 UTC
(rev 5225)
@@ -0,0 +1,82 @@
+#
+# gtkui.py
+#
+# Copyright (C) 2009 Andrew Resch <[email protected]>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <[email protected]>
+# Copyright (C) 2007-2009 Andrew Resch <[email protected]>
+#
+# 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.
+#
+
+import gtk
+
+from deluge.log import LOG as log
+from deluge.ui.client import client
+from deluge.plugins.pluginbase import GtkPluginBase
+import deluge.component as component
+import deluge.common
+
+from common import get_resource
+
+class GtkUI(GtkPluginBase):
+ def enable(self):
+ self.glade = gtk.glade.XML(get_resource("extractor_prefs.glade"))
+
+ component.get("Preferences").add_page("Extractor",
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)
+
+
+ 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
+
+ def on_apply_prefs(self):
+ log.debug("applying prefs for Extractor")
+ if client.is_localhost():
+ path =
self.glade.get_widget("folderchooser_path").get_current_folder()
+ else:
+ path = self.glade.get_widget("entry_path").get_text()
+
+ config = {
+ "extract_path": path
+ }
+
+ 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()
+ else:
+ self.glade.get_widget("folderchooser_path").hide()
+ self.glade.get_widget("entry_path").show()
+ self.glade.get_widget("folderchooser_path").show()
+
+ def on_get_config(config):
+ if client.is_localhost():
+
self.glade.get_widget("folderchooser_path").set_current_folder(config["extract_path"])
+ else:
+
self.glade.get_widget("entry_path").set_text(config["extract_path"])
+
+ client.extractor.get_config().addCallback(on_get_config)
Added: trunk/deluge/plugins/extractor/extractor/webui.py
===================================================================
--- trunk/deluge/plugins/extractor/extractor/webui.py
(rev 0)
+++ trunk/deluge/plugins/extractor/extractor/webui.py 2009-05-02 02:13:23 UTC
(rev 5225)
@@ -0,0 +1,39 @@
+#
+# webui.py
+#
+# Copyright (C) 2009 Andrew Resch <[email protected]>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <[email protected]>
+# Copyright (C) 2007-2009 Andrew Resch <[email protected]>
+#
+# 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.
+#
+
+from deluge.log import LOG as log
+from deluge.ui.client import client
+from deluge import component
+from deluge.plugins.pluginbase import WebPluginBase
+
+class WebUI(WebPluginBase):
+ def enable(self):
+ pass
+
+ def disable(self):
+ pass
Added: trunk/deluge/plugins/extractor/setup.py
===================================================================
--- trunk/deluge/plugins/extractor/setup.py (rev 0)
+++ trunk/deluge/plugins/extractor/setup.py 2009-05-02 02:13:23 UTC (rev
5225)
@@ -0,0 +1,62 @@
+#
+# setup.py
+#
+# Copyright (C) 2009 Andrew Resch <[email protected]>
+#
+# Basic plugin template created by:
+# Copyright (C) 2008 Martijn Voncken <[email protected]>
+# Copyright (C) 2007-2009 Andrew Resch <[email protected]>
+#
+# 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.
+#
+
+from setuptools import setup
+
+__plugin_name__ = "Extractor"
+__author__ = "Andrew Resch"
+__author_email__ = "[email protected]"
+__version__ = "0.1"
+__url__ = "http://deluge-torrent.org"
+__license__ = "GPLv3"
+__description__ = "Extract files upon completion"
+__long_description__ = """"""
+__pkg_data__ = {__plugin_name__.lower(): ["template/*", "data/*"]}
+
+setup(
+ name=__plugin_name__,
+ version=__version__,
+ description=__description__,
+ author=__author__,
+ author_email=__author_email__,
+ url=__url__,
+ license=__license__,
+ long_description=__long_description__ if __long_description__ else
__description__,
+
+ packages=[__plugin_name__.lower()],
+ package_data = __pkg_data__,
+
+ entry_points="""
+ [deluge.plugin.core]
+ %s = %s:CorePlugin
+ [deluge.plugin.gtkui]
+ %s = %s:GtkUIPlugin
+ [deluge.plugin.webui]
+ %s = %s:WebUIPlugin
+ """ % ((__plugin_name__, __plugin_name__.lower())*3)
+)
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"deluge-commit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/deluge-commit?hl=en
-~----------~----~----~----~------~----~------~--~---