wp/wp-includes/js/mediaelement/wp-playlist.js
changeset 5 5e2f62d02dcd
child 7 cf61fcea0001
equal deleted inserted replaced
4:346c88efed21 5:5e2f62d02dcd
       
     1 /*globals window, document, jQuery, _, Backbone, _wpmejsSettings */
       
     2 
       
     3 (function ($, _, Backbone) {
       
     4 	"use strict";
       
     5 
       
     6 	var WPPlaylistView = Backbone.View.extend({
       
     7 		initialize : function (options) {
       
     8 			this.index = 0;
       
     9 			this.settings = {};
       
    10 			this.data = options.metadata || $.parseJSON( this.$('script.wp-playlist-script').html() );
       
    11 			this.playerNode = this.$( this.data.type );
       
    12 
       
    13 			this.tracks = new Backbone.Collection( this.data.tracks );
       
    14 			this.current = this.tracks.first();
       
    15 
       
    16 			if ( 'audio' === this.data.type ) {
       
    17 				this.currentTemplate = wp.template( 'wp-playlist-current-item' );
       
    18 				this.currentNode = this.$( '.wp-playlist-current-item' );
       
    19 			}
       
    20 
       
    21 			this.renderCurrent();
       
    22 
       
    23 			if ( this.data.tracklist ) {
       
    24 				this.itemTemplate = wp.template( 'wp-playlist-item' );
       
    25 				this.playingClass = 'wp-playlist-playing';
       
    26 				this.renderTracks();
       
    27 			}
       
    28 
       
    29 			this.playerNode.attr( 'src', this.current.get( 'src' ) );
       
    30 
       
    31 			_.bindAll( this, 'bindPlayer', 'bindResetPlayer', 'setPlayer', 'ended', 'clickTrack' );
       
    32 
       
    33 			if ( ! _.isUndefined( window._wpmejsSettings ) ) {
       
    34 				this.settings = _wpmejsSettings;
       
    35 			}
       
    36 			this.settings.success = this.bindPlayer;
       
    37 			this.setPlayer();
       
    38 		},
       
    39 
       
    40 		bindPlayer : function (mejs) {
       
    41 			this.mejs = mejs;
       
    42 			this.mejs.addEventListener( 'ended', this.ended );
       
    43 		},
       
    44 
       
    45 		bindResetPlayer : function (mejs) {
       
    46 			this.bindPlayer( mejs );
       
    47 			this.playCurrentSrc();
       
    48 		},
       
    49 
       
    50 		setPlayer: function (force) {
       
    51 			if ( this.player ) {
       
    52 				this.player.pause();
       
    53 				this.player.remove();
       
    54 				this.playerNode = this.$( this.data.type );
       
    55 			}
       
    56 
       
    57 			if (force) {
       
    58 				this.playerNode.attr( 'src', this.current.get( 'src' ) );
       
    59 				this.settings.success = this.bindResetPlayer;
       
    60 			}
       
    61 
       
    62 			/**
       
    63 			 * This is also our bridge to the outside world
       
    64 			 */
       
    65 			this.player = new MediaElementPlayer( this.playerNode.get(0), this.settings );
       
    66 		},
       
    67 
       
    68 		playCurrentSrc : function () {
       
    69 			this.renderCurrent();
       
    70 			this.mejs.setSrc( this.playerNode.attr( 'src' ) );
       
    71 			this.mejs.load();
       
    72 			this.mejs.play();
       
    73 		},
       
    74 
       
    75 		renderCurrent : function () {
       
    76 			var dimensions, defaultImage = 'wp-includes/images/media/video.png';
       
    77 			if ( 'video' === this.data.type ) {
       
    78 				if ( this.data.images && this.current.get( 'image' ) && -1 === this.current.get( 'image' ).src.indexOf( defaultImage ) ) {
       
    79 					this.playerNode.attr( 'poster', this.current.get( 'image' ).src );
       
    80 				}
       
    81 				dimensions = this.current.get( 'dimensions' ).resized;
       
    82 				this.playerNode.attr( dimensions );
       
    83 			} else {
       
    84 				if ( ! this.data.images ) {
       
    85 					this.current.set( 'image', false );
       
    86 				}
       
    87 				this.currentNode.html( this.currentTemplate( this.current.toJSON() ) );
       
    88 			}
       
    89 		},
       
    90 
       
    91 		renderTracks : function () {
       
    92 			var self = this, i = 1, tracklist = $( '<div class="wp-playlist-tracks"></div>' );
       
    93 			this.tracks.each(function (model) {
       
    94 				if ( ! self.data.images ) {
       
    95 					model.set( 'image', false );
       
    96 				}
       
    97 				model.set( 'artists', self.data.artists );
       
    98 				model.set( 'index', self.data.tracknumbers ? i : false );
       
    99 				tracklist.append( self.itemTemplate( model.toJSON() ) );
       
   100 				i += 1;
       
   101 			});
       
   102 			this.$el.append( tracklist );
       
   103 
       
   104 			this.$( '.wp-playlist-item' ).eq(0).addClass( this.playingClass );
       
   105 		},
       
   106 
       
   107 		events : {
       
   108 			'click .wp-playlist-item' : 'clickTrack',
       
   109 			'click .wp-playlist-next' : 'next',
       
   110 			'click .wp-playlist-prev' : 'prev'
       
   111 		},
       
   112 
       
   113 		clickTrack : function (e) {
       
   114 			e.preventDefault();
       
   115 
       
   116 			this.index = this.$( '.wp-playlist-item' ).index( e.currentTarget );
       
   117 			this.setCurrent();
       
   118 		},
       
   119 
       
   120 		ended : function () {
       
   121 			if ( this.index + 1 < this.tracks.length ) {
       
   122 				this.next();
       
   123 			} else {
       
   124 				this.index = 0;
       
   125 				this.setCurrent();
       
   126 			}
       
   127 		},
       
   128 
       
   129 		next : function () {
       
   130 			this.index = this.index + 1 >= this.tracks.length ? 0 : this.index + 1;
       
   131 			this.setCurrent();
       
   132 		},
       
   133 
       
   134 		prev : function () {
       
   135 			this.index = this.index - 1 < 0 ? this.tracks.length - 1 : this.index - 1;
       
   136 			this.setCurrent();
       
   137 		},
       
   138 
       
   139 		loadCurrent : function () {
       
   140 			var last = this.playerNode.attr( 'src' ) && this.playerNode.attr( 'src' ).split('.').pop(),
       
   141 				current = this.current.get( 'src' ).split('.').pop();
       
   142 
       
   143 			this.mejs && this.mejs.pause();
       
   144 
       
   145 			if ( last !== current ) {
       
   146 				this.setPlayer( true );
       
   147 			} else {
       
   148 				this.playerNode.attr( 'src', this.current.get( 'src' ) );
       
   149 				this.playCurrentSrc();
       
   150 			}
       
   151 		},
       
   152 
       
   153 		setCurrent : function () {
       
   154 			this.current = this.tracks.at( this.index );
       
   155 
       
   156 			if ( this.data.tracklist ) {
       
   157 				this.$( '.wp-playlist-item' )
       
   158 					.removeClass( this.playingClass )
       
   159 					.eq( this.index )
       
   160 						.addClass( this.playingClass );
       
   161 			}
       
   162 
       
   163 			this.loadCurrent();
       
   164 		}
       
   165 	});
       
   166 
       
   167     $(document).ready(function () {
       
   168 		$('.wp-playlist').each( function() {
       
   169 			return new WPPlaylistView({ el: this });
       
   170 		} );
       
   171     });
       
   172 
       
   173 	window.WPPlaylistView = WPPlaylistView;
       
   174 
       
   175 }(jQuery, _, Backbone));