218 lines
4.5 KiB
JavaScript
218 lines
4.5 KiB
JavaScript
/*globals wp, _ */
|
|
|
|
var media = wp.media,
|
|
baseSettings = window._wpmejsSettings || {},
|
|
l10n = window._wpMediaViewsL10n || {};
|
|
|
|
/**
|
|
* @mixin
|
|
*/
|
|
wp.media.mixin = {
|
|
mejsSettings: baseSettings,
|
|
|
|
removeAllPlayers: function() {
|
|
var p;
|
|
|
|
if ( window.mejs && window.mejs.players ) {
|
|
for ( p in window.mejs.players ) {
|
|
window.mejs.players[p].pause();
|
|
this.removePlayer( window.mejs.players[p] );
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Override the MediaElement method for removing a player.
|
|
* MediaElement tries to pull the audio/video tag out of
|
|
* its container and re-add it to the DOM.
|
|
*/
|
|
removePlayer: function(t) {
|
|
var featureIndex, feature;
|
|
|
|
if ( ! t.options ) {
|
|
return;
|
|
}
|
|
|
|
// invoke features cleanup
|
|
for ( featureIndex in t.options.features ) {
|
|
feature = t.options.features[featureIndex];
|
|
if ( t['clean' + feature] ) {
|
|
try {
|
|
t['clean' + feature](t);
|
|
} catch (e) {}
|
|
}
|
|
}
|
|
|
|
if ( ! t.isDynamic ) {
|
|
t.$node.remove();
|
|
}
|
|
|
|
if ( 'native' !== t.media.pluginType ) {
|
|
t.$media.remove();
|
|
}
|
|
|
|
delete window.mejs.players[t.id];
|
|
|
|
t.container.remove();
|
|
t.globalUnbind();
|
|
delete t.node.player;
|
|
},
|
|
|
|
/**
|
|
* Allows any class that has set 'player' to a MediaElementPlayer
|
|
* instance to remove the player when listening to events.
|
|
*
|
|
* Examples: modal closes, shortcode properties are removed, etc.
|
|
*/
|
|
unsetPlayers : function() {
|
|
if ( this.players && this.players.length ) {
|
|
_.each( this.players, function (player) {
|
|
player.pause();
|
|
wp.media.mixin.removePlayer( player );
|
|
} );
|
|
this.players = [];
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Autowire "collection"-type shortcodes
|
|
*/
|
|
wp.media.playlist = new wp.media.collection({
|
|
tag: 'playlist',
|
|
editTitle : l10n.editPlaylistTitle,
|
|
defaults : {
|
|
id: wp.media.view.settings.post.id,
|
|
style: 'light',
|
|
tracklist: true,
|
|
tracknumbers: true,
|
|
images: true,
|
|
artists: true,
|
|
type: 'audio'
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Shortcode modeling for audio
|
|
* `edit()` prepares the shortcode for the media modal
|
|
* `shortcode()` builds the new shortcode after update
|
|
*
|
|
* @namespace
|
|
*/
|
|
wp.media.audio = {
|
|
coerce : wp.media.coerce,
|
|
|
|
defaults : {
|
|
id : wp.media.view.settings.post.id,
|
|
src : '',
|
|
loop : false,
|
|
autoplay : false,
|
|
preload : 'none',
|
|
width : 400
|
|
},
|
|
|
|
edit : function( data ) {
|
|
var frame, shortcode = wp.shortcode.next( 'audio', data ).shortcode;
|
|
|
|
frame = wp.media({
|
|
frame: 'audio',
|
|
state: 'audio-details',
|
|
metadata: _.defaults( shortcode.attrs.named, this.defaults )
|
|
});
|
|
|
|
return frame;
|
|
},
|
|
|
|
shortcode : function( model ) {
|
|
var content;
|
|
|
|
_.each( this.defaults, function( value, key ) {
|
|
model[ key ] = this.coerce( model, key );
|
|
|
|
if ( value === model[ key ] ) {
|
|
delete model[ key ];
|
|
}
|
|
}, this );
|
|
|
|
content = model.content;
|
|
delete model.content;
|
|
|
|
return new wp.shortcode({
|
|
tag: 'audio',
|
|
attrs: model,
|
|
content: content
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Shortcode modeling for video
|
|
* `edit()` prepares the shortcode for the media modal
|
|
* `shortcode()` builds the new shortcode after update
|
|
*
|
|
* @namespace
|
|
*/
|
|
wp.media.video = {
|
|
coerce : wp.media.coerce,
|
|
|
|
defaults : {
|
|
id : wp.media.view.settings.post.id,
|
|
src : '',
|
|
poster : '',
|
|
loop : false,
|
|
autoplay : false,
|
|
preload : 'metadata',
|
|
content : '',
|
|
width : 640,
|
|
height : 360
|
|
},
|
|
|
|
edit : function( data ) {
|
|
var frame,
|
|
shortcode = wp.shortcode.next( 'video', data ).shortcode,
|
|
attrs;
|
|
|
|
attrs = shortcode.attrs.named;
|
|
attrs.content = shortcode.content;
|
|
|
|
frame = wp.media({
|
|
frame: 'video',
|
|
state: 'video-details',
|
|
metadata: _.defaults( attrs, this.defaults )
|
|
});
|
|
|
|
return frame;
|
|
},
|
|
|
|
shortcode : function( model ) {
|
|
var content;
|
|
|
|
_.each( this.defaults, function( value, key ) {
|
|
model[ key ] = this.coerce( model, key );
|
|
|
|
if ( value === model[ key ] ) {
|
|
delete model[ key ];
|
|
}
|
|
}, this );
|
|
|
|
content = model.content;
|
|
delete model.content;
|
|
|
|
return new wp.shortcode({
|
|
tag: 'video',
|
|
attrs: model,
|
|
content: content
|
|
});
|
|
}
|
|
};
|
|
|
|
media.model.PostMedia = require( './models/post-media.js' );
|
|
media.controller.AudioDetails = require( './controllers/audio-details.js' );
|
|
media.controller.VideoDetails = require( './controllers/video-details.js' );
|
|
media.view.MediaFrame.MediaDetails = require( './views/frame/media-details.js' );
|
|
media.view.MediaFrame.AudioDetails = require( './views/frame/audio-details.js' );
|
|
media.view.MediaFrame.VideoDetails = require( './views/frame/video-details.js' );
|
|
media.view.MediaDetails = require( './views/media-details.js' );
|
|
media.view.AudioDetails = require( './views/audio-details.js' );
|
|
media.view.VideoDetails = require( './views/video-details.js' );
|