bazarr/libs/plex_activity/activity.py

97 lines
2.5 KiB
Python

from plex.lib import six as six
from plex.lib.six.moves import xrange
from plex_activity.sources import Logging, WebSocket
from pyemitter import Emitter
import logging
log = logging.getLogger(__name__)
class ActivityMeta(type):
def __getitem__(self, key):
for (weight, source) in self.registered:
if source.name == key:
return source
return None
@six.add_metaclass(ActivityMeta)
class Activity(Emitter):
registered = []
def __init__(self, sources=None):
self.available = self.get_available(sources)
self.enabled = []
def start(self, sources=None):
# TODO async start
if sources is not None:
self.available = self.get_available(sources)
# Test methods until an available method is found
for weight, source in self.available:
if weight is None:
# None = always start
self.start_source(source)
elif source.test():
# Test passed
self.start_source(source)
else:
log.info('activity source "%s" is not available', source.name)
log.info(
'Finished starting %s method(s): %s',
len(self.enabled),
', '.join([('"%s"' % source.name) for source in self.enabled])
)
def start_source(self, source):
instance = source(self)
instance.start()
self.enabled.append(instance)
def __getitem__(self, key):
for (weight, source) in self.registered:
if source.name == key:
return source
return None
@classmethod
def get_available(cls, sources):
if sources:
return [
(weight, source) for (weight, source) in cls.registered
if source.name in sources
]
return cls.registered
@classmethod
def register(cls, source, weight=None):
item = (weight, source)
# weight = None, highest priority
if weight is None:
cls.registered.insert(0, item)
return
# insert in DESC order
for x in xrange(len(cls.registered)):
w, _ = cls.registered[x]
if w is not None and w < weight:
cls.registered.insert(x, item)
return
# otherwise append
cls.registered.append(item)
# Register activity sources
Activity.register(WebSocket)
Activity.register(Logging, weight=1)