1 # Copyright (c) 2011 Neal H. Walfield
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation, either version 3 of the License, or
6 # (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 logger = logging.getLogger(__name__)
20 # Don't fail if the Woodchuck modules are not available. Just disable
21 # Woodchuck's functionality.
23 # Whether we imported the woodchuck modules successfully.
24 woodchuck_imported = True
27 from pywoodchuck import PyWoodchuck
28 from pywoodchuck import woodchuck
29 except ImportError, exception:
31 "Unable to load Woodchuck modules: disabling Woodchuck support: %s"
32 % traceback.format_exc ())
33 woodchuck_imported = False
34 class PyWoodchuck (object):
35 def available(self, *args, **kwargs):
39 # The default channel refresh interval: 6 hours.
40 refresh_interval = 6 * 60 * 60
42 class mywoodchuck (PyWoodchuck):
43 def __init__(self, config, listing, human_readable_name, identifier,
46 PyWoodchuck.__init__ (self, human_readable_name, identifier,
50 "Failed to establish a connection to the Woodchuck server: %s"
52 self.available = self.not_available
56 self.listing = listing
59 self.enabled = config.getWoodchuckEnabled()
61 logging.exception("Setting enabled")
63 def available(self, check_config=True):
64 if not PyWoodchuck.available(self):
67 return self.config.getWoodchuckEnabled()
70 def not_available(self, *args, **kwargs):
74 def stream_update_cb(self, stream, *args, **kwargs):
75 logger.debug("stream update called on %s (%s)"
76 % (stream.human_readable_name, stream.identifier,))
78 # Make sure no one else is concurrently updating this
81 self.listing.updateFeed(stream.identifier)
83 logger.debug("Updating %s: %s"
84 % (stream.identifier, traceback.format_exc ()))
86 def object_transfer_cb(self, stream, object,
87 version, filename, quality,
89 logger.debug ("object transfer called on %s (%s) in stream %s (%s)"
90 % (object.human_readable_name, object.identifier,
91 stream.human_readable_name, stream.identifier))
93 self[stream.identifier][object.identifier].dont_transfer = True
95 logger.warn("Setting '%s'(%s).'%s'(%s).DontTransfer: %s"
96 % (stream.human_readable_name, stream.identifier,
97 object.human_readable_name, object.identifier,
101 def wc_init(config, listing, request_feedback=False):
102 """Connect to the woodchuck server and initialize any state."""
106 _w = mywoodchuck (config, listing, "FeedingIt", "org.marcoz.feedingit",
109 if not woodchuck_imported or not _w.available ():
110 logger.info("Unable to contact Woodchuck server.")
112 logger.debug("Woodchuck appears to be available.")
114 def wc_disable_set(disable=True):
115 """Disable Woodchuck."""
117 logger.info("Disabling Woodchuck")
119 logger.info("Enabling Woodchuck")
123 logging.info("Woodchuck not loaded. Not doing anything.")
126 if not _w.available(check_config=False):
127 logging.info("Woodchuck not available. Not doing anything.")
131 _w.enabled = not disable
133 logger.exception("Disabling Woodchuck")
136 """Return the Woodchuck singleton."""
138 assert _w is not None