billboardsystem.py (5020B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\billboards\billboardsystem.py 2 import uthread2 3 import logging 4 logger = logging.getLogger(__name__) 5 try: 6 from videoplayer import resource 7 except ImportError: 8 resource = None 9 10 DYNAMIC_PATH = 'dynamic:/{resourceName}/?video_local={videoResPath}&resource_name={resourceName}' 11 NO_RESOURCE_PATH = '' 12 13 class BillboardResource(object): 14 15 def __init__(self, name, resPathPlaylist): 16 self.name = name 17 self.resource_path_playlist = [ DYNAMIC_PATH.format(resourceName=name, videoResPath=resPath) for resPath in resPathPlaylist ] 18 self.texture_parameters_by_item_id = {} 19 self.current_play_index = 0 20 resource.register_resource_constructor(name) 21 logger.info('Billboard resource %s created', self.name) 22 23 def add_texture_parameters_for_item_id(self, itemID, textureParameters): 24 self.texture_parameters_by_item_id[itemID] = textureParameters 25 self._set_texture_parameter_resource_paths(self._get_current_resource_path(), textureParameters) 26 27 def remove_texture_parameters_for_item_id(self, itemID): 28 self._set_texture_parameter_resource_paths(NO_RESOURCE_PATH, self.texture_parameters_by_item_id[itemID]) 29 del self.texture_parameters_by_item_id[itemID] 30 31 def reset_video_playback(self): 32 self._set_all_texture_parameter_resource_paths(NO_RESOURCE_PATH) 33 34 def play_current_video(self): 35 resourcePath = self._get_current_resource_path() 36 self._set_all_texture_parameter_resource_paths(resourcePath) 37 38 def _set_all_texture_parameter_resource_paths(self, resourcePath): 39 for textureParameters in self.texture_parameters_by_item_id.values(): 40 self._set_texture_parameter_resource_paths(resourcePath, textureParameters) 41 42 def _set_texture_parameter_resource_paths(self, resourcePath, textureParameters): 43 for textureParameter in textureParameters: 44 textureParameter.resourcePath = resourcePath 45 46 def _get_current_resource_path(self): 47 return self.resource_path_playlist[self.current_play_index] 48 49 def _set_next_resource_path(self): 50 self.current_play_index = (self.current_play_index + 1) % len(self.resource_path_playlist) 51 52 def is_unassigned(self): 53 return len(self.texture_parameters_by_item_id) == 0 54 55 def play_next_in_playlist(self): 56 self._set_next_resource_path() 57 self.reset_video_playback() 58 self.play_current_video() 59 logger.info("resource %s play next video in playlist. new video is number %s '%s'", self.name, self.current_play_index, self._get_current_resource_path()) 60 61 62 class BillboardSystem(object): 63 64 def __init__(self): 65 self.resources_by_name = {} 66 resource.register_state_change_handler(self._on_video_state_change) 67 68 def register_billboard_resource(self, name, playlist, itemId, textureParameters): 69 billboard_resource = self.get_billboard_resource(name) 70 if billboard_resource is None: 71 billboard_resource = BillboardResource(name, playlist) 72 self.resources_by_name[name] = billboard_resource 73 logging.info("Created a new billboard resourced named '%s'", name) 74 billboard_resource.add_texture_parameters_for_item_id(itemId, textureParameters) 75 billboard_resource.play_current_video() 76 return billboard_resource 77 78 def get_billboard_resource(self, name): 79 return self.resources_by_name.get(name) 80 81 def _on_video_state_change(self, videoPlayer, construction_parameters, texture): 82 logging.info('video state change. construction params=%s', construction_parameters) 83 try: 84 if videoPlayer.state != resource.videoplayer.State.DONE: 85 logging.warn('not done. construction params=%s', construction_parameters) 86 return 87 name = construction_parameters.get('resource_name') 88 if name is None: 89 logging.warning('could not find resource in construction parameters %s', construction_parameters) 90 return 91 logging.info('found dynamic resource name %s', name) 92 billboard_resource = self.get_billboard_resource(name) 93 if not billboard_resource: 94 logging.warning("unable to locate billboard resource named '%s'" % name) 95 return 96 uthread2.start_tasklet(billboard_resource.play_next_in_playlist) 97 except Exception: 98 logger.exception('something is wrong. construction parameters %s', construction_parameters) 99 100 def unregister_billboard_resource(self, name, itemId): 101 billboard_resource = self.get_billboard_resource(name) 102 billboard_resource.remove_texture_parameters_for_item_id(itemId) 103 if billboard_resource.is_unassigned(): 104 self._remove_billboard_resource(name) 105 106 def _remove_billboard_resource(self, name): 107 if name in self.resources_by_name: 108 del self.resources_by_name[name]