source: trunk/fl5/src/com/longtailvideo/jwplayer/player/PlayerV4Emulation.as @ 552

Revision 552, 14.7 KB checked in by zach, 4 years ago (diff)
  • Created interfaces for PlayerComponents and Playlists
  • Moved cookie-ing to Controller / right-click menu
RevLine 
[271]1package com.longtailvideo.jwplayer.player {
[386]2        import com.jeroenwijering.events.AbstractView;
3        import com.jeroenwijering.events.ControllerEvent;
[395]4        import com.jeroenwijering.events.ModelEvent;
[386]5        import com.longtailvideo.jwplayer.controller.Controller;
6        import com.longtailvideo.jwplayer.events.MediaEvent;
7        import com.longtailvideo.jwplayer.events.PlayerEvent;
8        import com.longtailvideo.jwplayer.events.PlayerStateEvent;
9        import com.longtailvideo.jwplayer.events.PlaylistEvent;
10        import com.longtailvideo.jwplayer.events.ViewEvent;
[552]11        import com.longtailvideo.jwplayer.model.IPlaylist;
[386]12        import com.longtailvideo.jwplayer.model.Model;
13        import com.longtailvideo.jwplayer.model.PlaylistItem;
14        import com.longtailvideo.jwplayer.plugins.PluginConfig;
15        import com.longtailvideo.jwplayer.plugins.V4Plugin;
16        import com.longtailvideo.jwplayer.utils.Logger;
[400]17        import com.longtailvideo.jwplayer.view.components.ControlbarComponent;
[386]18       
19        import flash.display.DisplayObject;
20        import flash.events.EventDispatcher;
21        import flash.utils.describeType;
22
23        /**
24         * This singleton class acts as a wrapper between the Player and plugins or javascripts that were
25         * written for version 4 of the player.  It extends version 4's AbstractView class, and translates
26         * Player 5 event dispatches into their version 4 counterparts.
27         *
28         * @see com.longtailvideo.jwplayer.plugins.V4Plugin 
29         */
30        public class PlayerV4Emulation extends AbstractView {
31                private static var instance:PlayerV4Emulation;
[271]32               
[548]33                private var _player:IPlayer;
[386]34               
35                private var viewEventDispatcher:EventDispatcher;
36                private var modelEventDispatcher:EventDispatcher;
37                private var controllerEventDispatcher:EventDispatcher;
38               
39                private var id:String;
40                private var client:String;
41                private var version:String;
42               
[548]43                public function PlayerV4Emulation(player:IPlayer) {
[517]44                        viewEventDispatcher = new EventDispatcher();
45                        modelEventDispatcher = new EventDispatcher();
46                        controllerEventDispatcher = new EventDispatcher();
[396]47                               
[517]48                        _player = player;
49                        _player.addEventListener(PlayerEvent.JWPLAYER_READY, playerReady);
[271]50                }
[386]51               
[548]52                public static function getInstance(player:IPlayer):PlayerV4Emulation {
[517]53                        if (!instance) {
54                                instance = new PlayerV4Emulation(player);
55                        }
[386]56                        return instance;
57                }
58               
59                private function playerReady(evt:PlayerEvent):void {
60                        var newEvt:PlayerEvent = new PlayerEvent("");
61                        id = newEvt.id;
62                        client = newEvt.client;
63                        version = newEvt.version;
64                         
65                        dispatchEvent(new com.jeroenwijering.events.PlayerEvent(com.jeroenwijering.events.PlayerEvent.READY));
66                        setupListeners();
67                }
68               
69                private function setupListeners():void {
70                       
71                        var m:Model;
[400]72                        var v:ControlbarComponent;
[386]73                        var c:Controller
74                       
[396]75                        _player.addEventListener(PlayerEvent.JWPLAYER_ERROR, errorHandler);
76                       
[386]77                        _player.addEventListener(MediaEvent.JWPLAYER_MEDIA_BUFFER, mediaBuffer);
78                        _player.addEventListener(MediaEvent.JWPLAYER_MEDIA_ERROR, mediaError);
79                        _player.addEventListener(MediaEvent.JWPLAYER_MEDIA_LOADED, mediaLoaded);
80                        _player.addEventListener(MediaEvent.JWPLAYER_MEDIA_TIME, mediaTime);
81                        _player.addEventListener(MediaEvent.JWPLAYER_MEDIA_VOLUME, mediaVolume);
[464]82                        _player.addEventListener(MediaEvent.JWPLAYER_MEDIA_META, mediaMeta);
[386]83                        _player.addEventListener(PlayerStateEvent.JWPLAYER_PLAYER_STATE, stateHandler);
84
85                        _player.addEventListener(ViewEvent.JWPLAYER_VIEW_FULLSCREEN, viewFullscreen);
86                        _player.addEventListener(ViewEvent.JWPLAYER_VIEW_ITEM, viewItem);
87                        _player.addEventListener(ViewEvent.JWPLAYER_VIEW_LOAD, viewLoad);
88                        _player.addEventListener(ViewEvent.JWPLAYER_VIEW_MUTE, viewMute);
89                        _player.addEventListener(ViewEvent.JWPLAYER_VIEW_NEXT, viewNext);
90                        _player.addEventListener(ViewEvent.JWPLAYER_VIEW_PAUSE, viewPause);
91                        _player.addEventListener(ViewEvent.JWPLAYER_VIEW_PLAY, viewPlay);
92                        _player.addEventListener(ViewEvent.JWPLAYER_VIEW_PREV, viewPrev);
93                        _player.addEventListener(ViewEvent.JWPLAYER_VIEW_SEEK, viewSeek);
94                        _player.addEventListener(ViewEvent.JWPLAYER_VIEW_STOP, viewStop);
95                        _player.addEventListener(ViewEvent.JWPLAYER_VIEW_VOLUME, viewVolume);
96                       
97                        _player.playlist.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_ITEM, playlistItem);
98                        _player.playlist.addEventListener(PlaylistEvent.JWPLAYER_PLAYLIST_LOADED, playlistLoad);
99                }
100               
[396]101                // Player Event Handlers
102               
103                private function errorHandler(evt:PlayerEvent):void {
104                        controllerEventDispatcher.dispatchEvent(new ControllerEvent(ControllerEvent.ERROR, {message:evt.message, id:id, client:client, version:version}));
105                }
106               
[386]107                // Media Event Handlers
108               
109                private function mediaBuffer(evt:MediaEvent):void {
110                        modelEventDispatcher.dispatchEvent(new ModelEvent(ModelEvent.BUFFER, {percentage:evt.bufferPercent, id:id, client:client, version:version}));
111                }
112               
113                private function mediaError(evt:MediaEvent):void {
114                        modelEventDispatcher.dispatchEvent(new ModelEvent(ModelEvent.ERROR, {message:evt.message, id:id, client:client, version:version}));
115                }
116               
117                private function mediaLoaded(evt:MediaEvent):void {
118                        modelEventDispatcher.dispatchEvent(new ModelEvent(ModelEvent.LOADED, {loaded:0, total:0, offset:0, id:id, client:client, version:version}));
119                }
120               
121                private function mediaTime(evt:MediaEvent):void {
122                        modelEventDispatcher.dispatchEvent(new ModelEvent(ModelEvent.TIME, {duration:evt.duration, position:evt.position, id:id, client:client, version:version}));
123                }
124               
125                private function mediaVolume(evt:MediaEvent):void {
126                        controllerEventDispatcher.dispatchEvent(new ControllerEvent(ControllerEvent.VOLUME, {percentage:evt.volume, id:id, client:client, version:version}));
127                }
[464]128
129                private function mediaMeta(evt:MediaEvent):void {
130                        evt.metadata['id'] = id;
131                        evt.metadata['client'] = client;
132                        evt.metadata['version'] = version;
133                        modelEventDispatcher.dispatchEvent(new ModelEvent(ModelEvent.META, evt.metadata));
134                }
[386]135               
136                private function stateHandler(evt:PlayerStateEvent):void {
137                        if (evt.newstate == PlayerState.IDLE && (evt.oldstate == PlayerState.BUFFERING || evt.oldstate == PlayerState.PLAYING)) {
138                                controllerEventDispatcher.dispatchEvent(new ControllerEvent(ControllerEvent.STOP, {id:id, client:client, version:version}));
139                        }
140                       
141                        modelEventDispatcher.dispatchEvent(new ModelEvent(ModelEvent.STATE, {oldstate:evt.oldstate, newstate:evt.newstate}));
142                }
143
144                // View Event Handlers
145
146                private function viewFullscreen(evt:ViewEvent):void {
147                        viewEventDispatcher.dispatchEvent(new com.jeroenwijering.events.ViewEvent(com.jeroenwijering.events.ViewEvent.FULLSCREEN, {state:evt.data, id:id, client:client, version:version}));
148                }
149               
150                private function viewItem(evt:ViewEvent):void {
151                        viewEventDispatcher.dispatchEvent(new com.jeroenwijering.events.ViewEvent(com.jeroenwijering.events.ViewEvent.ITEM, {index:evt.data, id:id, client:client, version:version}));
152                }
153
154                private function viewLoad(evt:ViewEvent):void {
155                        viewEventDispatcher.dispatchEvent(new com.jeroenwijering.events.ViewEvent(com.jeroenwijering.events.ViewEvent.LOAD, {object:evt.data, id:id, client:client, version:version}));
156                }
157               
158                private function viewMute(evt:ViewEvent):void {
159                        viewEventDispatcher.dispatchEvent(new com.jeroenwijering.events.ViewEvent(com.jeroenwijering.events.ViewEvent.MUTE, {state:evt.data, id:id, client:client, version:version}));
160                        controllerEventDispatcher.dispatchEvent(new ControllerEvent(ControllerEvent.MUTE, {state:evt.data, client:client, version:version}));
161                }
162               
163                private function viewNext(evt:ViewEvent):void {
164                        viewEventDispatcher.dispatchEvent(new com.jeroenwijering.events.ViewEvent(com.jeroenwijering.events.ViewEvent.NEXT, {id:id, client:client, version:version}));
165                }
166               
167                private function viewPause(evt:ViewEvent):void {
168                        viewEventDispatcher.dispatchEvent(new com.jeroenwijering.events.ViewEvent(com.jeroenwijering.events.ViewEvent.PLAY, {state:false, id:id, client:client, version:version}));
169                        controllerEventDispatcher.dispatchEvent(new ControllerEvent(ControllerEvent.PLAY, {state:false, id:id, client:client, version:version}));
170                }
171
172                private function viewPlay(evt:ViewEvent):void {
173                        viewEventDispatcher.dispatchEvent(new com.jeroenwijering.events.ViewEvent(com.jeroenwijering.events.ViewEvent.PLAY, {state:true, id:id, client:client, version:version}));
174                        controllerEventDispatcher.dispatchEvent(new ControllerEvent(ControllerEvent.PLAY, {state:true, id:id, client:client, version:version}));
175                }
176               
177                private function viewPrev(evt:ViewEvent):void {
178                        viewEventDispatcher.dispatchEvent(new com.jeroenwijering.events.ViewEvent(com.jeroenwijering.events.ViewEvent.PREV, {id:id, client:client, version:version}));
179                }
180               
181                private function viewRedraw(width:Number, height:Number):void {
182                        viewEventDispatcher.dispatchEvent(new com.jeroenwijering.events.ViewEvent(com.jeroenwijering.events.ViewEvent.REDRAW, {id:id, client:client, version:version}));
[419]183                        controllerEventDispatcher.dispatchEvent(new ControllerEvent(ControllerEvent.RESIZE, {width:width, height:height, fullscreen:_player.fullscreen, client:client, version:version}));
[386]184                }
185
186                private function viewSeek(evt:ViewEvent):void {
187                        viewEventDispatcher.dispatchEvent(new com.jeroenwijering.events.ViewEvent(com.jeroenwijering.events.ViewEvent.SEEK, {position:evt.data, id:id, client:client, version:version}));
188                        controllerEventDispatcher.dispatchEvent(new ControllerEvent(ControllerEvent.SEEK, {position:evt.data, id:id, client:client, version:version}));
189                }
190               
191                private function viewStop(evt:ViewEvent):void {
192                        viewEventDispatcher.dispatchEvent(new com.jeroenwijering.events.ViewEvent(com.jeroenwijering.events.ViewEvent.STOP, {id:id, client:client, version:version}));
193                }
194               
195                private function viewVolume(evt:ViewEvent):void {
196                        viewEventDispatcher.dispatchEvent(new com.jeroenwijering.events.ViewEvent(com.jeroenwijering.events.ViewEvent.VOLUME, {state:evt.data, id:id, client:client, version:version}));
197                        controllerEventDispatcher.dispatchEvent(new ControllerEvent(ControllerEvent.VOLUME, {percentage:evt.data, id:id, client:client, version:version}));
198                }
199               
200                // Playlist Event Handlers
201               
202                private function playlistItem(evt:PlaylistEvent):void {
203                        controllerEventDispatcher.dispatchEvent(new ControllerEvent(ControllerEvent.ITEM, {index:_player.playlist.currentIndex, id:id, client:client, version:version}));
204                }
205
206                private function playlistLoad(evt:PlaylistEvent):void {
207                        controllerEventDispatcher.dispatchEvent(new ControllerEvent(ControllerEvent.PLAYLIST, {playlist:playlistToArray(_player.playlist), id:id, client:client, version:version}));
208                }
209               
210               
211                // Listeners
212
213                public override function addModelListener(type:String, listener:Function):void {
214                        modelEventDispatcher.addEventListener(type, listener);
215                }
216                public override function removeModelListener(type:String, listener:Function):void {
217                        modelEventDispatcher.removeEventListener(type, listener);
218                }
219
220                public override function addViewListener(type:String, listener:Function):void {
221                        viewEventDispatcher.addEventListener(type, listener);
222                }
223                public override function removeViewListener(type:String, listener:Function):void {
224                        viewEventDispatcher.removeEventListener(type, listener);
225                }
226
227                public override function addControllerListener(type:String, listener:Function):void {
228                        controllerEventDispatcher.addEventListener(type, listener);
229                }
230                public override function removeControllerListener(type:String, listener:Function):void {
231                        controllerEventDispatcher.removeEventListener(type, listener);
232                }
233               
234                // Event "dispatcher"
235               
236                public override function sendEvent(typ:String, prm:Object=undefined) : void {
237                        switch (typ) {
238                                case com.jeroenwijering.events.ViewEvent.FULLSCREEN:
[417]239                                        _player.fullscreen = prm['state'];
[386]240                                        break;
241                                case com.jeroenwijering.events.ViewEvent.ITEM:
[462]242                                        _player.playlist.currentIndex = Number(prm);
[386]243                                        break;
244                                case com.jeroenwijering.events.ViewEvent.LINK:
245                                        _player.link(Number(prm['index']));
246                                        break;
247                                case com.jeroenwijering.events.ViewEvent.LOAD:
[474]248                                        _player.load(prm);
[386]249                                        break;
250                                case com.jeroenwijering.events.ViewEvent.MUTE:
[415]251                                        _player.mute = prm['state'];
[386]252                                        break;
253                                case com.jeroenwijering.events.ViewEvent.NEXT:
254                                        _player.playlist.currentIndex++;
255                                        break;
256                                case com.jeroenwijering.events.ViewEvent.PLAY:
257                                        _player.play();
258                                        break;
259                                case com.jeroenwijering.events.ViewEvent.PREV:
260                                        _player.playlist.currentIndex--;
261                                        break;
262                                case com.jeroenwijering.events.ViewEvent.REDRAW:
263                                        _player.redraw();
264                                        break;
265                                case com.jeroenwijering.events.ViewEvent.SEEK:
266                                        _player.seek(prm['position']);
267                                        break;
268                                case com.jeroenwijering.events.ViewEvent.STOP:
269                                        _player.stop();
270                                        break;
271                                case com.jeroenwijering.events.ViewEvent.TRACE:
272                                        Logger.log(prm);
273                                        break;
274                                case com.jeroenwijering.events.ViewEvent.VOLUME:
275                                        _player.volume(prm['percentage']);
276                                        break;
277                        }
278                }
279
280                public override function get config():Object {
281                        var cfg:Object = {};
[500]282                        var descType:XML = describeType(_player.config)
283                        for each (var i:String in descType.accessor.@name) {
284                                if (_player.config[i] is Number) {
285                                        cfg[i] = isNaN(_player.config[i]) ? "" : String(_player.config[i]);
286                                } else if (_player.config[i]) {
287                                        cfg[i] = _player.config[i].toString();
288                                } else {
289                                        cfg[i] = "";
290                                }
[462]291                        }
292                       
[546]293                        for each (var j:String in _player.config.pluginIds) {
[462]294                                var pluginConfig:PluginConfig = _player.config.pluginConfig(j);
295                                for (var k:String in pluginConfig){
296                                        cfg[j+"."+k] = pluginConfig[k];
297                                }
298                        }
[414]299
300                        cfg['state'] = _player.state;
[417]301                        cfg['mute'] = _player.mute;
[520]302                        cfg['fullscreen'] = _player.fullscreen;
[386]303                       
304                        return cfg;
305                }
306
307                public override function get playlist():Array {
308                        return playlistToArray(_player.playlist);
309                }
310               
[552]311                private function playlistToArray(list:IPlaylist):Array {
[386]312                        var arry:Array = [];
313                       
314                        for (var i:Number=0; i < list.length; i++) {
315                                arry.push(playlistItemToObject(list.getItemAt(i)));
316                        }
317                       
318                        return arry;
319                }
320               
321                private function playlistItemToObject(item:PlaylistItem):Object {
322                        var obj:Object = {
323                                'author':               item.author,
324                                'date':                 item.date,
325                                'description':  item.description,
326                                'duration':             item.duration,
327                                'file':                 item.file,
328                                'image':                item.image,
329                                'link':                 item.link,
330                                'start':                item.start,
331                                'streamer':             item.streamer,
332                                'tags':                 item.tags,
333                                'type':                 item.provider
334                        };
335                       
336                        for each (var i:String in item) {
337                                obj[i] = item[i];
338                        }
339                       
340                        return obj;
341                }
342               
343                public override function getPluginConfig(plugin:Object):Object {
344                        var pluginParent:V4Plugin = (plugin as DisplayObject).parent as V4Plugin;
345                        if (pluginParent) {
[546]346                                return _player.config.pluginConfig(pluginParent.pluginId);
[386]347                        } else {
348                                return new PluginConfig('');
349                        }
350                }
351               
352                public function resize(width:Number, height:Number):void {
353                        viewRedraw(width, height);
354                }
355               
[462]356                public override function getPlugin(plugin:String):Object {
357                        var result:Object;
358                        switch (plugin){
359                                case 'dock':
360                                        result = _player.controls.dock as Object;
361                                        break;
362                                case 'controlbar':
363                                        result = _player.controls.controlbar as Object;
364                                        break;
365                        }
366                        return result;
367                }
[271]368        }
369}
Note: See TracBrowser for help on using the repository browser.