From cfadd851bfcba43a7c130c1c9120dcdf49952934 Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 11 Feb 2012 02:49:35 +0100 Subject: [PATCH] Event fixes --- couchpotato/__init__.py | 2 +- couchpotato/core/_base/_core/main.py | 9 +- couchpotato/core/auth.py | 2 +- couchpotato/core/event.py | 14 +- couchpotato/core/notifications/growl/main.py | 24 +++- couchpotato/core/plugins/base.py | 8 +- couchpotato/core/plugins/renamer/main.py | 4 +- couchpotato/core/plugins/scanner/main.py | 4 +- couchpotato/core/plugins/searcher/main.py | 8 +- couchpotato/core/settings/__init__.py | 2 +- couchpotato/runner.py | 5 +- couchpotato/static/images/couch.png | Bin 0 -> 68742 bytes couchpotato/static/scripts/page/wanted.js | 1 + libs/axl/axel.py | 130 +++++++++---------- 14 files changed, 115 insertions(+), 98 deletions(-) create mode 100644 couchpotato/static/images/couch.png diff --git a/couchpotato/__init__.py b/couchpotato/__init__.py index 0390afc0..7058b111 100644 --- a/couchpotato/__init__.py +++ b/couchpotato/__init__.py @@ -15,7 +15,7 @@ import os log = CPLog(__name__) -app = Flask(__name__) +app = Flask(__name__, static_folder = 'nope') web = Blueprint('web', __name__) diff --git a/couchpotato/core/_base/_core/main.py b/couchpotato/core/_base/_core/main.py index 007d1723..1e318fbb 100644 --- a/couchpotato/core/_base/_core/main.py +++ b/couchpotato/core/_base/_core/main.py @@ -70,7 +70,7 @@ class Core(Plugin): def crappyShutdown(self): try: - self.urlopen('%sapp.shutdown' % self.createApiUrl(), show_error = False) + self.urlopen('%s/app.shutdown' % self.createApiUrl(), show_error = False) return True except: self.initShutdown() @@ -78,7 +78,7 @@ class Core(Plugin): def crappyRestart(self): try: - self.urlopen('%sapp.restart' % self.createApiUrl(), show_error = False) + self.urlopen('%s/app.restart' % self.createApiUrl(), show_error = False) return True except: self.initShutdown(restart = True) @@ -163,8 +163,7 @@ class Core(Plugin): host = 'localhost' port = Env.setting('port') - return '%s:%d' % (cleanHost(host).rstrip('/'), int(port)) + return '%s:%d%s' % (cleanHost(host).rstrip('/'), int(port), '/' + Env.setting('url_base').lstrip('/') if Env.setting('url_base') else '') def createApiUrl(self): - - return '%s/%s/' % (self.createBaseUrl(), Env.setting('api_key')) + return '%s/%s' % (self.createBaseUrl(), Env.setting('api_key')) diff --git a/couchpotato/core/auth.py b/couchpotato/core/auth.py index 743a4c79..032bdf28 100644 --- a/couchpotato/core/auth.py +++ b/couchpotato/core/auth.py @@ -17,7 +17,7 @@ def requires_auth(f): @wraps(f) def decorated(*args, **kwargs): auth = getattr(request, 'authorization') - if Env.setting('username') and (not auth or not check_auth(auth.username, md5(auth.password))): + if Env.setting('username') and Env.setting('password') and (not auth or not check_auth(auth.username, md5(auth.password))): return authenticate() return f(*args, **kwargs) diff --git a/couchpotato/core/event.py b/couchpotato/core/event.py index 546883d8..232c7403 100644 --- a/couchpotato/core/event.py +++ b/couchpotato/core/event.py @@ -2,6 +2,7 @@ from axl.axel import Event from couchpotato.core.helpers.variable import mergeDicts from couchpotato.core.logger import CPLog import threading +import time import traceback log = CPLog(__name__) @@ -25,15 +26,17 @@ def addEvent(name, handler, priority = 100): try: parent = handler.im_self - parent.beforeCall(handler) + bc = hasattr(parent, 'beforeCall') + if bc: parent.beforeCall(handler) h = runHandler(name, handler, *args, **kwargs) - parent.afterCall(handler) + ac = hasattr(parent, 'afterCall') + if ac: parent.afterCall(handler) except: h = runHandler(name, handler, *args, **kwargs) return h - e.handle(createHandle, priority = priority) + e.handle(handler, priority = priority) def removeEvent(name, handler): e = events[name] @@ -64,8 +67,10 @@ def fireEvent(name, *args, **kwargs): except: pass e = events[name] + e.lock.acquire() e.asynchronous = False result = e(*args, **kwargs) + e.lock.release() if single and not merge: results = None @@ -123,10 +128,11 @@ def fireEventAsync(name, *args, **kwargs): #log.debug('Async "%s": %s, %s' % (name, args, kwargs)) try: e = events[name] + e.lock.acquire() e.asynchronous = True e.error_handler = errorHandler - e(*args, **kwargs) + e.lock.release() return True except Exception, e: log.error('%s: %s' % (name, e)) diff --git a/couchpotato/core/notifications/growl/main.py b/couchpotato/core/notifications/growl/main.py index fb80bbd7..a37e8ef3 100644 --- a/couchpotato/core/notifications/growl/main.py +++ b/couchpotato/core/notifications/growl/main.py @@ -1,7 +1,11 @@ +from couchpotato.core.event import fireEvent from couchpotato.core.logger import CPLog from couchpotato.core.notifications.base import Notification from gntp import notifier import logging +import thread +import time +import traceback log = CPLog(__name__) @@ -15,13 +19,19 @@ class Growl(Notification): logger.disabled = True try: - self.growl = notifier.GrowlNotifier( - applicationName = 'CouchPotato', - notifications = ["Updates"], - defaultNotifications = ["Updates"], - applicationIcon = 'http://couchpota.to/media/images/couch.png', - ) - self.growl.register() + def startGrowl(): + time.sleep(2) + try: + self.growl = notifier.GrowlNotifier( + applicationName = 'CouchPotato', + notifications = ["Updates"], + defaultNotifications = ["Updates"], + applicationIcon = '%s/static/images/couch.png' % fireEvent('app.api_url', single = True), + ) + self.growl.register() + except: + log.error('Failed register of growl: %s' % traceback.format_exc()) + thread.start_new_thread(startGrowl, ()) except: pass diff --git a/couchpotato/core/plugins/base.py b/couchpotato/core/plugins/base.py index 6648fdd0..6eb1d020 100644 --- a/couchpotato/core/plugins/base.py +++ b/couchpotato/core/plugins/base.py @@ -54,7 +54,7 @@ class Plugin(object): s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', self.__class__.__name__) class_name = re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower() - path = 'static/' + class_name + '/' + path = '%s/static/%s/' % (Env.setting('api_key'), class_name) addView(path + '', self.showStatic, static = True) if add_to_head: @@ -94,8 +94,6 @@ class Plugin(object): # http request def urlopen(self, url, timeout = 10, params = {}, headers = {}, multipart = False, show_error = True): - socket.setdefaulttimeout(timeout) - # Fill in some headers if not headers.get('Referer'): headers['Referer'] = urlparse(url).hostname @@ -114,13 +112,13 @@ class Plugin(object): cookies = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies), MultipartPostHandler) - data = opener.open(request).read() + data = opener.open(request, timeout = timeout).read() else: log.info('Opening url: %s, params: %s' % (url, [x for x in params.iterkeys()])) data = urllib.urlencode(params) if len(params) > 0 else None request = urllib2.Request(url, data, headers) - data = urllib2.urlopen(request).read() + data = urllib2.urlopen(request, timeout = timeout).read() except IOError: if show_error: log.error('Failed opening url in %s: %s %s' % (self.getName(), url, traceback.format_exc(1))) diff --git a/couchpotato/core/plugins/renamer/main.py b/couchpotato/core/plugins/renamer/main.py index 98c7b102..2700dc64 100644 --- a/couchpotato/core/plugins/renamer/main.py +++ b/couchpotato/core/plugins/renamer/main.py @@ -290,11 +290,11 @@ class Renamer(Plugin): # Remove files for src in remove_files: - log.info('Removing "%s"' % src) + log.info('(fake) Removing "%s"' % src) # Remove matching releases for release in remove_releases: - log.info('Removing release %s' % release) + log.info('(fake) Removing release %s' % release) # Search for trailers etc fireEventAsync('renamer.after', group) diff --git a/couchpotato/core/plugins/scanner/main.py b/couchpotato/core/plugins/scanner/main.py index 2ddb94cf..40d24b76 100644 --- a/couchpotato/core/plugins/scanner/main.py +++ b/couchpotato/core/plugins/scanner/main.py @@ -528,7 +528,9 @@ class Scanner(Plugin): return True def isSampleFile(self, filename): - return re.search('(^|[\W_])sample\d*[\W_]', filename.lower()) + is_sample = re.search('(^|[\W_])sample\d*[\W_]', filename.lower()) + if is_sample: log.debug('Is sample file: %s' % filename) + return is_sample def filesizeBetween(self, file, min = 0, max = 100000): try: diff --git a/couchpotato/core/plugins/searcher/main.py b/couchpotato/core/plugins/searcher/main.py index adf3c91d..fedd01dd 100644 --- a/couchpotato/core/plugins/searcher/main.py +++ b/couchpotato/core/plugins/searcher/main.py @@ -16,18 +16,18 @@ log = CPLog(__name__) class Searcher(Plugin): def __init__(self): - addEvent('searcher.all', self.all) + addEvent('searcher.all', self.all_movies) addEvent('searcher.single', self.single) addEvent('searcher.correct_movie', self.correctMovie) addEvent('searcher.download', self.download) # Schedule cronjob - fireEvent('schedule.cron', 'searcher.all', self.all, day = self.conf('cron_day'), hour = self.conf('cron_hour'), minute = self.conf('cron_minute')) + fireEvent('schedule.cron', 'searcher.all', self.all_movies, day = self.conf('cron_day'), hour = self.conf('cron_hour'), minute = self.conf('cron_minute')) if not Env.setting('development'): - addEvent('app.load', self.all) + addEvent('app.load', self.all_movies) - def all(self): + def all_movies(self): db = get_session() diff --git a/couchpotato/core/settings/__init__.py b/couchpotato/core/settings/__init__.py index 5b36e6ad..5ef04523 100644 --- a/couchpotato/core/settings/__init__.py +++ b/couchpotato/core/settings/__init__.py @@ -9,7 +9,7 @@ import os.path import time -class Settings(): +class Settings(object): options = {} types = {} diff --git a/couchpotato/runner.py b/couchpotato/runner.py index a331d93b..1888906c 100644 --- a/couchpotato/runner.py +++ b/couchpotato/runner.py @@ -10,8 +10,8 @@ import locale import logging import os.path import sys -import traceback import time +import traceback def getOptions(base_path, args): @@ -180,7 +180,8 @@ def runCouchPotato(options, base_path, args, desktop = None): } # Static path - web.add_url_rule('static/', + app.static_folder = os.path.join(base_path, 'couchpotato', 'static') + web.add_url_rule('%s/static/' % api_key, endpoint = 'static', view_func = app.send_static_file) diff --git a/couchpotato/static/images/couch.png b/couchpotato/static/images/couch.png new file mode 100644 index 0000000000000000000000000000000000000000..0910c5cb5e76a8072747cd2600e6524f1ca5a9df GIT binary patch literal 68742 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 A^#A|> literal 0 HcmV?d00001 diff --git a/couchpotato/static/scripts/page/wanted.js b/couchpotato/static/scripts/page/wanted.js index d656e422..c2ac6c08 100644 --- a/couchpotato/static/scripts/page/wanted.js +++ b/couchpotato/static/scripts/page/wanted.js @@ -13,6 +13,7 @@ Page.Wanted = new Class({ // Wanted movies self.wanted = new MovieList({ 'status': 'active', + 'navigation': true, 'actions': MovieActions }); $(self.wanted).inject(self.el); diff --git a/libs/axl/axel.py b/libs/axl/axel.py index de6da8a3..bbd145bd 100644 --- a/libs/axl/axel.py +++ b/libs/axl/axel.py @@ -6,59 +6,61 @@ # http://www.valuedlessons.com/2008/04/events-in-python.html # # This module is part of Axel and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php +# the MIT License: http://www.opensource.org/licenses/mit-license.php # # Source: http://pypi.python.org/pypi/axel # Docs: http://packages.python.org/axel from couchpotato.core.helpers.variable import natcmp import Queue +import hashlib import sys import threading +import time class Event(object): - """ + """ Event object inspired by C# events. Handlers can be registered and - unregistered using += and -= operators. Execution and result are + unregistered using += and -= operators. Execution and result are influenced by the arguments passed to the constructor and += method. - + from axel import Event - + event = Event() def on_event(*args, **kwargs): return (args, kwargs) - + event += on_event # handler registration - print(event(10, 20, y=30)) + print(event(10, 20, y=30)) >> ((True, ((10, 20), {'y': 30}), ),) - + event -= on_event # handler is unregistered - print(event(10, 20, y=30)) + print(event(10, 20, y=30)) >> None - + class Mouse(object): def __init__(self): self.click = Event(self) self.click += self.on_click # handler registration - + def on_click(self, sender, *args, **kwargs): assert isinstance(sender, Mouse), 'Wrong sender' return (args, kwargs) - + mouse = Mouse() - print(mouse.click(10, 20)) - >> ((True, ((10, 20), {}), + print(mouse.click(10, 20)) + >> ((True, ((10, 20), {}), >> >),) - + mouse.click -= mouse.on_click # handler is unregistered - print(mouse.click(10, 20)) + print(mouse.click(10, 20)) >> None """ def __init__(self, sender = None, asynch = False, exc_info = False, lock = None, threads = 3, traceback = False): - """ Creates an event - + """ Creates an event + asynch if True handler's are executes asynchronous exc_info @@ -66,31 +68,31 @@ class Event(object): lock threading.RLock used to synchronize execution sender - event's sender. The sender is passed as the first argument to the + event's sender. The sender is passed as the first argument to the handler, only if is not None. For this case the handler must have a placeholder in the arguments to receive the sender threads maximum number of threads that will be started traceback - if True, the execution result will contain sys.exc_info() - on error. exc_info must be also True to get the traceback - - hash = hash(handler) - - Handlers are stored in a dictionary that has as keys the handler's hash - handlers = { + if True, the execution result will contain sys.exc_info() + on error. exc_info must be also True to get the traceback + + hash = self.hash(handler) + + Handlers are stored in a dictionary that has as keys the handler's hash + handlers = { hash : (handler, memoize, timeout), - hash : (handler, memoize, timeout), ... + hash : (handler, memoize, timeout), ... + } + The execution result is cached using the following structure + memoize = { + hash : ((args, kwargs, result), (args, kwargs, result), ...), + hash : ((args, kwargs, result), ...), ... } - The execution result is cached using the following structure - memoize = { - hash : ((args, kwargs, result), (args, kwargs, result), ...), - hash : ((args, kwargs, result), ...), ... - } The execution result is returned as a tuple having this structure exec_result = ( (True, result, handler), # on success - (False, error_info, handler), # on error + (False, error_info, handler), # on error (None, None, handler), ... # asynchronous execution ) """ @@ -103,31 +105,34 @@ class Event(object): self.handlers = {} self.memoize = {} + def hash(self, handler): + return hashlib.md5(str(handler)).hexdigest() + def handle(self, handler, priority = 0): - """ Registers a handler. The handler can be transmitted together + """ Registers a handler. The handler can be transmitted together with two arguments as a list or dictionary. The arguments are: - - memoize + + memoize if True, the execution result will be cached in self.memoize - timeout + timeout will allocate a predefined time interval for the execution - - If arguments are provided as a list, they are considered to have - this sequence: (handler, memoize, timeout) - + + If arguments are provided as a list, they are considered to have + this sequence: (handler, memoize, timeout) + Examples: - event += handler + event += handler event += (handler, True, 1.5) - event += {'handler':handler, 'memoize':True, 'timeout':1.5} + event += {'handler':handler, 'memoize':True, 'timeout':1.5} """ handler_, memoize, timeout = self._extract(handler) - self.handlers['%s.%s' % (priority, hash(handler_))] = (handler_, memoize, timeout) + self.handlers['%s.%s' % (priority, self.hash(handler_))] = (handler_, memoize, timeout) return self def unhandle(self, handler): """ Unregisters a handler """ handler_, memoize, timeout = self._extract(handler) - key = hash(handler_) + key = self.hash(handler_) if not key in self.handlers: raise ValueError('Handler "%s" was not found' % str(handler_)) del self.handlers[key] @@ -139,6 +144,7 @@ class Event(object): self.result = [] if self.handlers: + max_threads = self._threads() for i in range(max_threads): @@ -172,10 +178,8 @@ class Event(object): """ Executes all handlers stored in the queue """ while True: try: - handler, memoize, timeout = self.handlers[self.queue.get()] - - if isinstance(self.lock, threading._RLock): - self.lock.acquire() #synchronization + h_ = self.queue.get() + handler, memoize, timeout = self.handlers[h_] try: r = self._memoize(memoize, timeout, handler, *args, **kwargs) @@ -189,14 +193,9 @@ class Event(object): else: self.error_handler(sys.exc_info()) finally: - if isinstance(self.lock, threading._RLock): - self.lock.release() if not self.asynchronous: - try: - self.queue.task_done() - except ValueError: - pass + self.queue.task_done() if self.queue.empty(): raise Queue.Empty @@ -205,9 +204,9 @@ class Event(object): break def _extract(self, queue_item): - """ Extracts a handler and handler's arguments that can be provided - as list or dictionary. If arguments are provided as list, they are - considered to have this sequence: (handler, memoize, timeout) + """ Extracts a handler and handler's arguments that can be provided + as list or dictionary. If arguments are provided as list, they are + considered to have this sequence: (handler, memoize, timeout) Examples: event += handler event += (handler, True, 1.5) @@ -234,11 +233,11 @@ class Event(object): return (handler, bool(memoize), float(timeout)) def _memoize(self, memoize, timeout, handler, *args, **kwargs): - """ Caches the execution result of successful executions - hash = hash(handler) - memoize = { - hash : ((args, kwargs, result), (args, kwargs, result), ...), - hash : ((args, kwargs, result), ...), ... + """ Caches the execution result of successful executions + hash = self.hash(handler) + memoize = { + hash : ((args, kwargs, result), (args, kwargs, result), ...), + hash : ((args, kwargs, result), ...), ... } """ if not isinstance(handler, Event) and self.sender is not None: @@ -247,7 +246,8 @@ class Event(object): if not memoize: if timeout <= 0: #no time restriction - return [True, handler(*args, **kwargs), handler] + result = [True, handler(*args, **kwargs), handler] + return result result = self._timeout(timeout, handler, *args, **kwargs) if isinstance(result, tuple) and len(result) == 3: @@ -255,7 +255,7 @@ class Event(object): return [False, self._error(result), handler] return [True, result, handler] else: - hash_ = hash(handler) + hash_ = self.hash(handler) if hash_ in self.memoize: for args_, kwargs_, result in self.memoize[hash_]: if args_ == args and kwargs_ == kwargs: