Completely reworked event contractor
This commit is contained in:
parent
f801fcb81e
commit
a6f1d4b7ec
7 changed files with 100 additions and 34 deletions
|
@ -2,6 +2,45 @@ from media.monitor.log import Loggable
|
|||
from media.monitor.events import DeleteFile
|
||||
|
||||
class EventContractor(Loggable):
|
||||
def __init__(self):
|
||||
self.store = {}
|
||||
def event_registered(self, evt):
|
||||
"""
|
||||
returns true if the event is registered which means that there is
|
||||
another "unpacked" event somewhere out there with the same path
|
||||
"""
|
||||
return evt.path in self.store
|
||||
|
||||
def get_old_event(self, evt):
|
||||
"""
|
||||
get the previously registered event with the same path as 'evt'
|
||||
"""
|
||||
return self.store[ evt.path ]
|
||||
|
||||
def register(self, evt):
|
||||
if self.event_registered(evt):
|
||||
ev_proxy = self.get_old_event(evt)
|
||||
if ev_proxy.same_event(evt):
|
||||
ev_proxy.merge_proxy(evt)
|
||||
return False
|
||||
# delete overrides any other event
|
||||
elif evt.is_event(DeleteFile):
|
||||
ev_proxy.merge_proxy(evt)
|
||||
return False
|
||||
else:
|
||||
ev_proxy.run_hook()
|
||||
ev_proxy.reset_hook()
|
||||
|
||||
self.store[ evt.path ] = evt
|
||||
evt.set_pack_hook( lambda : self.__unregister(evt) )
|
||||
return True
|
||||
|
||||
def __unregister(self, evt):
|
||||
del self.store[evt.path]
|
||||
|
||||
|
||||
# Delete this class when done using
|
||||
class EventContractor2(Loggable):
|
||||
"""
|
||||
This class is responsible for "contracting" events together to ease the
|
||||
load on airtime. It does this by morphing old events into newer ones
|
||||
|
|
|
@ -42,6 +42,43 @@ class EventRegistry(object):
|
|||
raise Exception("You can instantiate this class. Must only use class \
|
||||
methods")
|
||||
|
||||
|
||||
class EventProxy(object):
|
||||
"""
|
||||
A container object for instances of BaseEvent (or it's subclasses) used for
|
||||
event contractor
|
||||
"""
|
||||
def __init__(self, orig_evt):
|
||||
self.orig_evt = orig_evt
|
||||
self.evt = orig_evt
|
||||
self.reset_hook()
|
||||
if hasattr(orig_evt, 'path'): self.path = orig_evt.path
|
||||
|
||||
def set_pack_hook(self, l):
|
||||
self._pack_hook = l
|
||||
|
||||
def reset_hook(self):
|
||||
self._pack_hook = lambda : None
|
||||
|
||||
def run_hook(self):
|
||||
self._pack_hook()
|
||||
|
||||
def safe_pack(self):
|
||||
self.run_hook()
|
||||
# make sure that cleanup hook is never called twice for the same event
|
||||
self.reset_hook()
|
||||
return self.evt.safe_pack()
|
||||
|
||||
def merge_proxy(self, proxy):
|
||||
self.evt = proxy.evt
|
||||
|
||||
def is_event(self, real_event):
|
||||
return isinstance(self.evt, real_event)
|
||||
|
||||
def same_event(self, proxy):
|
||||
return self.evt.__class__ == proxy.evt.__class__
|
||||
|
||||
|
||||
class HasMetaData(object):
|
||||
"""
|
||||
Any class that inherits from this class gains the metadata attribute that
|
||||
|
@ -91,6 +128,9 @@ class BaseEvent(Loggable):
|
|||
"""
|
||||
self._pack_hook = k
|
||||
|
||||
def proxify(self):
|
||||
return EventProxy(self)
|
||||
|
||||
# As opposed to unsafe_pack...
|
||||
def safe_pack(self):
|
||||
"""
|
||||
|
|
|
@ -490,7 +490,6 @@ def file_playable(pathname):
|
|||
command = ("airtime-liquidsoap -c 'output.dummy" + \
|
||||
"(audio_to_stereo(single(\"%s\")))' > /dev/null 2>&1") % \
|
||||
pathname.replace("'", "'\\''")
|
||||
print(command)
|
||||
return True
|
||||
return_code = subprocess.call(command, shell=True)
|
||||
return (return_code == 0)
|
||||
|
|
|
@ -8,6 +8,7 @@ from media.monitor.log import Loggable
|
|||
from media.monitor.exceptions import BadSongFile
|
||||
from media.monitor.pure import LazyProperty
|
||||
from media.monitor.eventcontractor import EventContractor
|
||||
from media.monitor.events import EventProxy
|
||||
|
||||
import api_clients.api_client as ac
|
||||
|
||||
|
@ -125,7 +126,7 @@ class WatchSyncer(ReportHandler,Loggable):
|
|||
try:
|
||||
# If there is a strange bug anywhere in the code the next line
|
||||
# should be a suspect
|
||||
if self.contractor.register(event): self.push_queue( event )
|
||||
if self.contractor.register(EventProxy(event)): self.push_queue( event )
|
||||
#self.push_queue( event )
|
||||
except BadSongFile as e:
|
||||
self.fatal_exception("Received bas song file '%s'" % e.path, e)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue