Author: andar

Revision: 5712

Log:
        Apply patch from David Mohr to make core.py more 1.2 compatible

Diff:
Modified: trunk/deluge/plugins/feeder/feeder/core.py
===================================================================
--- trunk/deluge/plugins/feeder/feeder/core.py  2009-09-01 22:39:34 UTC (rev 
5711)
+++ trunk/deluge/plugins/feeder/feeder/core.py  2009-09-02 22:36:34 UTC (rev 
5712)
@@ -1,11 +1,12 @@
 #
 # core.py
 #
+# Copyright (C) 2009 David Mohr <[email protected]>
 # Copyright (C) 2008 Fredrik Eriksson <[email protected]>
 #
 # Basic plugin template created by:
 # Copyright (C) 2008 Martijn Voncken <[email protected]>
-# Copyright (C) 2007, 2008 Andrew Resch <[email protected]>
+# Copyright (C) 2007-2009 Andrew Resch <[email protected]>
 #
 # Deluge is free software.
 #
@@ -21,9 +22,9 @@
 #
 # 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.
+#      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
@@ -33,25 +34,32 @@
 #    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.
+#
 
-
 import feedparser # for parsing rss feeds
-import gobject # for the update timer
-import threading # for threaded updates
-import re # for regular expressions
+import threading  # for threaded updates
+import re         # for regular expressions
 
-
-import deluge
-import string
 from deluge.log import LOG as log
-from deluge.plugins.corepluginbase import CorePluginBase
-from deluge import component
-from deluge.plugins.coreclient import client #1.1 and later only
-#client: see http://dev.deluge-torrent.org/wiki/Development/UiClient#Remoteapi
+from deluge.plugins.pluginbase import CorePluginBase
+import deluge.component as component
+import deluge.configmanager
+from deluge.core.rpcserver import export
 
-"""Help classes"""
+DEFAULT_PREFS = {
+    "feeds": {},
+    "filters": {},
+    "updatetime": 15,
+    "history": []
+}
+
+# Helper classes
+
 class Feed:
-    "Class for the Feed object (containging feed configurations)"
+    """
+    Class for the Feed object (containging feed configurations)
+    """
     def __init__(self):
         self.url = ""
         self.updatetime = 15
@@ -63,8 +71,11 @@
         self.url = config['url']
         self.updatetime = config['updatetime']
 
+
 class Filter:
-    "Class for the Filter object (containing filter configurations)"   
+    """
+    Class for the Filter object (containing filter configurations)
+    """
 
     def __init__(self):
         self.regex = ""
@@ -74,7 +85,7 @@
 
         # by default, set the configuration to match
         # the per-torrent settings in deluge
-        def_conf = client.get_config() 
+        def_conf = component.get("Core").get_config()
         self.max_download_speed = def_conf['max_download_speed_per_torrent']
         self.max_upload_speed = def_conf['max_upload_speed_per_torrent']
         self.max_connections = def_conf['max_connections_per_torrent']
@@ -86,9 +97,9 @@
         self.stop_at_ratio = def_conf['stop_seed_at_ratio']
         self.stop_ratio = def_conf['stop_seed_ratio']
         self.remove_at_ratio = def_conf['remove_seed_at_ratio']
-        
+
     def get_config(self):
-        def_conf = client.get_config()
+        def_conf = component.get("Core").get_config()
 
         try:
             tmp = self.active
@@ -105,13 +116,13 @@
             self.stop_at_ratio = def_conf['stop_seed_at_ratio']
             self.stop_ratio = def_conf['stop_seed_ratio']
             self.remove_at_ratio = def_conf['remove_seed_at_ratio']
-        
+
         conf = {
             'regex': self.regex,
             'feeds': self.feeds,
             'all_feeds': self.all_feeds,
             'active' : self.active,
-            'max_download_speed': self.max_download_speed, 
+            'max_download_speed': self.max_download_speed,
             'max_upload_speed': self.max_upload_speed,
             'max_connections': self.max_connections,
             'max_upload_slots': self.max_upload_slots,
@@ -141,50 +152,208 @@
         self.stop_at_ratio = conf['stop_at_ratio']
 
 
-DEFAULT_PREFS = {
-    "feeds": {},
-    "filters": {},
-    "updatetime": 15,
-    "history": []
-}
+class Timer:
+    def Timer(self, curr_time, timeout, callback, data):
+        self.timeout = curr_time + timeout
+        """Timeout is specified in seconds, since it is used by the update() 
method"""
+        self.callback = callback
+        self.data = data
 
-class Core(CorePluginBase):
+    def check_timeout(self, curr_time):
+        return curr_time == self.timeout
 
+    def execute(self):
+        self.callback(data)
 
 
-    """=============enable/disable functions============="""
-
+class Core(CorePluginBase):
     def enable(self):
-        #initiate variables
         self.config = deluge.configmanager.ConfigManager("feeder.conf", 
DEFAULT_PREFS)
         self.feeds = {}
         self.timers = {}
         self.history = self.config['history']
+        self.time = 0
 
         # Setting default timer to configured update time
         for feed in self.config['feeds']:
-            self.timers[feed] = gobject.timeout_add(
-                self.config['feeds'][feed].updatetime * 60 * 1000, 
+            self.timers[feed] = Timer( self,time,
+                self.config['feeds'][feed].updatetime * 60,
                 self.update_feed, feed )
 
         # update all feeds on startup
         self.update_feeds()
 
+
     def disable(self):
         self.config['history'] = self.history
         self.config.save()
 
 
+    def update(self):
+        self.time += 1
+        for timer in self.timers:
+            if timer.check_timeout(time):
+                timer.execute()
 
-    """=============Internal functions============="""
 
+
+#=================Exported functions==================
+
+    @export
+    def set_config(self, config):
+        """sets the config dictionary"""
+        for key in config.keys():
+            self.config[key] = config[key]
+        self.config.save()
+
+####################Configuration Getters##################
+
+    @export
+    def get_config(self):
+        """returns the config dictionary"""
+        return self.config.config
+
+    @export
+     def get_feed_config(self, feedname):
+        """Returns configuration for a feed"""
+        return self.config['feeds'][feedname].get_config()
+
+    @export
+     def get_filter_config(self, filtername):
+        """Returns a configuration for a filter"""
+        return self.config['filters'][filtername].get_config()
+
+####################Information Getters####################
+
+    @export
+     def get_feeds(self):
+        """Returns a list of the configured feeds"""
+        feeds = []
+        for feedname in self.config['feeds']:
+            feeds.append(feedname)
+        feeds.sort(key=string.lower)
+        return feeds
+
+    @export
+     def get_filters(self):
+        """Returns a list of all available filters"""
+        filters = []
+        for filter in self.config['filters']:
+            filters.append(filter)
+        filters.sort(key=string.lower)
+        return filters
+
+    @export
+     def get_items(self, feedname):
+        """Returns a dictionary with feedname:link"""
+        try:
+            items = {}
+            feed = self.feeds[feedname]
+            for entry in feed['entries']:
+                items[entry.title] = entry.link
+        except Exception, e:
+            items = {}
+            log.warning("Feed '%s' not loaded", feedname)
+        return items
+
+    @export
+     def test_filter(self, regex):
+        filters = { "to_test":Filter() }
+        conf = filters["to_test"].get_config()
+        conf["regex"] = regex
+        filters["to_test"].set_config(conf)
+        hits = {}
+        for feed in self.feeds:
+            hits.update(self.run_filters(feed, filters, test=True))
+        return hits
+
+    @export
+     def add_feed(self, config):
+        """adds/updates a feed and, for whatever reason, sets the default 
timeout"""
+
+        # save the feedname and remove it from the config
+        feedname = config['name']
+        del config['name']
+
+        # check if the feed already exists and save config
+        try:
+            conf = self.config['feeds'][feedname].get_config()
+            del self.config['feeds'][feedname]
+        except Exception, e:
+            conf = {}
+
+        # update configuration
+        for var in config:
+            conf[var] = config[var]
+
+        # save as default update time
+        try:
+           self.config['updatetime'] = config['updatetime']
+        except Exception, e:
+            log.warning("updatetime not set when adding feed %s", feedname)
+
+        # Create the new feed
+        newfeed = Feed()
+        newfeed.set_config(conf)
+
+        # Add a timer (with default timer for now, since we can't get ttl just 
yet)...
+        self.timers[feedname] = Timer( self.time,
+            newfeed.updatetime * 60,
+            self.update_feed, feedname )
+
+        # Save the new feed
+        self.config['feeds'].update({feedname: newfeed })
+        self.config.save()
+
+        # And update the new feed
+        self.update_feed(feedname)
+
+    @export
+    def remove_feed(self, feedname):
+        """Remove a feed"""
+        if self.feeds.has_key(feedname): # Check if we have the feed saved and 
remove it
+            del self.feeds[feedname]
+        if self.timers.has_key(feedname): # Check if we have a timer for this 
feed and remove it
+            del self.timers[feedname]
+        if self.config['feeds'].has_key(feedname): # Check if we have the feed 
in the configuration and remove it
+            del self.config['feeds'][feedname]
+        self.config.save()
+
+    @export
+     def add_filter(self, name):
+        """Adds a new filter to the configuration"""
+        if not self.config['filters'].has_key(name): # we don't want to add a 
filter that already exists
+            self.config['filters'][name] = Filter()
+            self.config.save()
+
+    @export
+     def set_filter_config(self, filtername, conf):
+        """Changes the options for a filter"""
+        oldconf = self.config['filters'][filtername].get_config()
+        for item in conf:
+            oldconf[item] = conf[item]
+
+        self.config['filters'][filtername].set_config(oldconf)
+        self.config.save()
+        for feed in self.config['feeds']: # we would like to check if the 
filter now matches something new
+            self.run_filters(feed)
+
+    @export
+     def remove_filter(self, name):
+        """Removes a filter"""
+        if self.config['filters'].has_key(name): # Can't remove a filter that 
doesn't exists
+            del self.config['filters'][name]
+            self.config.save()
+
+#=================Internal functions================
+
     def update_feeds(self):
-        "Start threads to update all feeds"
+        """Start threads to update all feeds"""
         for feedname in self.config['feeds']:
             self.update_feed(feedname)
-    
+
     def update_feed(self, feedname):
-        "Start a thread to update a single feed"
+        """Start a thread to update a single feed"""
         threading.Thread(
             target=self.update_feed_thread,
             args=(self.on_feed_updated, feedname)).start()
@@ -193,7 +362,7 @@
         return True
 
     def update_feed_thread(self, callback, feedname):
-        "updates a feed"
+        """updates a feed"""
         feed = self.config['feeds'][feedname]
         try:
             self.feeds[feedname] = feedparser.parse(feed.url)
@@ -203,7 +372,7 @@
             callback(feedname)
 
     def on_feed_updated(self, feedname):
-        "Run stuff when a feed has been updated"
+        """Run stuff when a feed has been updated"""
 
         # Not all feeds contain a ttl value, but if it does
         # we would like to obey it
@@ -212,8 +381,8 @@
                 log.debug("feed '%s' request a ttl of %s, updating timer", 
feedname, self.feeds[feedname].ttl)
                 self.config['feeds'][feedname].updatetime = 
self.feeds[feedname].ttl
                 del self.timers[feedname]
-                self.timers[feedname] = gobject.timeout_add(
-                    self.config['feeds'][feedname].updatetime * 60 * 1000, 
+                self.timers[feedname] = Timer( self.time,
+                    self.config['feeds'][feedname].updatetime * 60 * 1000,
                     self.update_feed, feedname )
         except Exception, e:
             log.debug("feed '%s' has no ttl set, will use default timer", 
feedname)
@@ -222,7 +391,7 @@
         self.run_filters(feedname)
 
     def run_filters(self, feedname, filters={}, test=False):
-        "Test all available filters on the given feed"
+        """Test all available filters on the given feed"""
         if not filters:
             filters = self.config['filters']
         log.debug("will test filters %s", filters)
@@ -241,7 +410,7 @@
                 if filters[filter].regex == "": # we don't want a empty 
regex...
                     log.warning("Filter '%s' has not been configured, 
ignoring!", filter)
                     continue
-                
+
                 # if the filter isn't supposed to be run on this feed we don't 
want to run it...
 #                if filter.all_feeds or 
self.config['filters'][filter].feeds.has_element(feedname) : # ...apparently 
has_element doesn't work on arrays... TODO
                 if self.test_filter(entry, filters[filter].regex):
@@ -271,8 +440,8 @@
 
 
     def test_filter(self, entry, filter):
-        "Tests a filter to a given rss entry"
-        f = re.compile(filter, re.IGNORECASE) 
+        """Tests a filter to a given rss entry"""
+        f = re.compile(filter, re.IGNORECASE)
         if f.search(entry.title) or f.search(entry.link):
             log.debug("RSS item '%s' matches filter '%s'", entry.title, filter)
             return True
@@ -281,139 +450,4 @@
 
     def add_torrent(self, url, torrent_options):
         log.debug("Attempting to add torrent %s", url)
-        client.add_torrent_url(url, torrent_options)
-
-    """=============Export functions============="""
-
-    """#############Configuration Setters#############"""
-
-    def export_add_feed(self, config):
-        "adds/updates a feed and, for whatever reason, sets the default 
timeout"
-
-        # save the feedname and remove it from the config
-        feedname = config['name']
-        del config['name']
-
-        # check if the feed already exists and save config
-        try:
-            conf = self.config['feeds'][feedname].get_config()
-            del self.config['feeds'][feedname]
-        except Exception, e:
-            conf = {}
-
-        # update configuration
-        for var in config:
-            conf[var] = config[var]
-
-        # save as default update time
-        try:
-           self.config['updatetime'] = config['updatetime']
-        except Exception, e:
-            log.warning("updatetime not set when adding feed %s", feedname)
-
-        # Create the new feed
-        newfeed = Feed()
-        newfeed.set_config(conf)
-
-        # Add a timer (with default timer for now, since we can't get ttl just 
yet)...
-        self.timers[feedname] = gobject.timeout_add(
-            newfeed.updatetime * 60 * 1000,
-            self.update_feed, feedname )
-
-        # Save the new feed
-        self.config['feeds'].update({feedname: newfeed })
-        self.config.save()
-
-        # And update the new feed
-        self.update_feed(feedname)
-
-    def export_remove_feed(self, feedname):
-        "Remove a feed"
-        if self.feeds.has_key(feedname): # Check if we have the feed saved and 
remove it
-            del self.feeds[feedname]
-        if self.timers.has_key(feedname): # Check if we have a timer for this 
feed and remove it
-            del self.timers[feedname]
-        if self.config['feeds'].has_key(feedname): # Check if we have the feed 
in the configuration and remove it
-            del self.config['feeds'][feedname]
-        self.config.save()
-
-    def export_add_filter(self, name):
-        "Adds a new filter to the configuration"
-        if not self.config['filters'].has_key(name): # we don't want to add a 
filter that already exists
-            self.config['filters'][name] = Filter()
-            self.config.save()
-    
-    def export_set_filter_config(self, filtername, conf):
-        "Changes the options for a filter"
-        oldconf = self.config['filters'][filtername].get_config()
-        for item in conf:
-            oldconf[item] = conf[item]
-
-        self.config['filters'][filtername].set_config(oldconf)
-        self.config.save()
-        for feed in self.config['feeds']: # we would like to check if the 
filter now matches something new
-            self.run_filters(feed)
-
-    def export_remove_filter(self, name):
-        "Removes a filter"
-        if self.config['filters'].has_key(name): # Can't remove a filter that 
doesn't exists
-            del self.config['filters'][name]
-            self.config.save()
-
-
-
-    """#############Configuration Getters#############"""
-
-    def export_get_config(self):
-        "returns the config dictionary"
-        return self.config.config
-
-
-    def export_get_feed_config(self, feedname):
-        "Returns configuration for a feed"
-        return self.config['feeds'][feedname].get_config()
-
-    def export_get_filter_config(self, filtername):
-        "Returns a configuration for a filter"
-        return self.config['filters'][filtername].get_config()
-
-    
-    """#############Information Getters#############"""
-
-    def export_get_feeds(self):
-        "Returns a list of the configured feeds"
-        feeds = []
-        for feedname in self.config['feeds']:
-            feeds.append(feedname)
-        feeds.sort(key=string.lower)
-        return feeds
-
-    def export_get_filters(self):
-        "Returns a list of all available filters"
-        filters = []
-        for filter in self.config['filters']:
-            filters.append(filter)
-        filters.sort(key=string.lower)
-        return filters
-
-    def export_get_items(self, feedname):
-        "Returns a dictionary with feedname:link"
-        try:
-            items = {}
-            feed = self.feeds[feedname]
-            for entry in feed['entries']:
-                items[entry.title] = entry.link
-        except Exception, e:
-            items = {}
-            log.warning("Feed '%s' not loaded", feedname)
-        return items
-
-    def export_test_filter(self, regex):
-        filters = { "to_test":Filter() }
-        conf = filters["to_test"].get_config()
-        conf["regex"] = regex
-        filters["to_test"].set_config(conf)
-        hits = {}
-        for feed in self.feeds:
-            hits.update(self.run_filters(feed, filters, test=True))
-        return hits
+        component.get("Core").add_torrent_url(url, torrent_options)



--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to