You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.5 KiB
97 lines
2.5 KiB
6 years ago
|
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)
|