      1 /** The minplayer namespace. */
      2 var minplayer = minplayer || {};
      3
      4 /**
      5  * @constructor
      6  * @class A wrapper class used to provide all the data necessary to control an
      7  * individual file within this media player.
      8  *
      9  * @param {object} file A media file object with minimal required information.
     10  */
     11 minplayer.file = function(file) {
     12
     13   // If there isn't a file provided, then just return null.
     14   if (!file) {
     15     return null;
     16   }
     17
     18   file = (typeof file === 'string') ? {path: file} : file;
     19
     20   // If we already are a minplayer file, then just return this file.
     21   if (file.hasOwnProperty('isMinPlayerFile')) {
     22     return file;
     23   }
     24
     25   this.isMinPlayerFile = true;
     26   this.duration = file.duration || 0;
     27   this.bytesTotal = file.bytesTotal || 0;
     28   this.quality = file.quality || 0;
     29   this.stream = file.stream || '';
     30   this.path = file.path || '';
     31   this.codecs = file.codecs || '';
     32
     33   // These should be provided, but just in case...
     34   this.extension = file.extension || this.getFileExtension();
     35   this.mimetype = file.mimetype || file.filemime || this.getMimeType();
     36   this.type = file.type || this.getType();
     37
     38   // Fail safe to try and guess the mimetype and media type.
     39   if (!this.type) {
     40     this.mimetype = this.getMimeType();
     41     this.type = this.getType();
     42   }
     43
     44   // Get the player.
     45   this.player = minplayer.player || file.player || this.getBestPlayer();
     46   this.priority = file.priority || this.getPriority();
     47   this.id = file.id || this.getId();
     48   if (!this.path) {
     49     this.path = this.id;
     50   }
     51 };
     52
     53 /** Used to force the player for all media. */
     54 minplayer.player = '';
     55
     56 /**
     57  * Returns the best player for the job.
     58  *
     59  * @return {string} The best player to play the media file.
     60  */
     61 minplayer.file.prototype.getBestPlayer = function() {
     62   var bestplayer = null, bestpriority = 0;
     63   jQuery.each(minplayer.players, (function(file) {
     64     return function(name, player) {
     65       var priority = player.getPriority(file);
     66       if (player.canPlay(file) && (priority > bestpriority)) {
     67         bestplayer = name;
     68         bestpriority = priority;
     69       }
     70     };
     71   })(this));
     72   return bestplayer;
     73 };
     74
     75 /**
     76  * The priority of this file is determined by the priority of the best
     77  * player multiplied by the priority of the mimetype.
     78  *
     79  * @return {integer} The priority of the media file.
     80  */
     81 minplayer.file.prototype.getPriority = function() {
     82   var priority = 1;
     83   if (this.player) {
     84     priority = minplayer.players[this.player].getPriority(this);
     85   }
     86   switch (this.mimetype) {
     87     case 'video/x-webm':
     88     case 'video/webm':
     89     case 'application/octet-stream':
     90       return priority * 10;
     91     case 'video/mp4':
     92     case 'audio/mp4':
     93     case 'audio/mpeg':
     94       return priority * 9;
     95     case 'video/ogg':
     96     case 'audio/ogg':
     97     case 'video/quicktime':
     98       return priority * 8;
     99     default:
    100       return priority * 5;
    101   }
    102 };
    103
    104 /**
    105  * Returns the file extension of the file path.
    106  *
    107  * @return {string} The file extension.
    108  */
    109 minplayer.file.prototype.getFileExtension = function() {
    110   return this.path.substring(this.path.lastIndexOf('.') + 1).toLowerCase();
    111 };
    112
    113 /**
    114  * Returns the proper mimetype based off of the extension.
    115  *
    116  * @return {string} The mimetype of the file based off of extension.
    117  */
    118 minplayer.file.prototype.getMimeType = function() {
    119   switch (this.extension) {
    120     case 'mp4': case 'm4v': case 'flv': case 'f4v':
    121       return 'video/mp4';
    122     case'webm':
    123       return 'video/webm';
    124     case 'ogg': case 'ogv':
    125       return 'video/ogg';
    126     case '3g2':
    127       return 'video/3gpp2';
    128     case '3gpp':
    129     case '3gp':
    130       return 'video/3gpp';
    131     case 'mov':
    132       return 'video/quicktime';
    133     case'swf':
    134       return 'application/x-shockwave-flash';
    135     case 'oga':
    136       return 'audio/ogg';
    137     case 'mp3':
    138       return 'audio/mpeg';
    139     case 'm4a': case 'f4a':
    140       return 'audio/mp4';
    141     case 'aac':
    142       return 'audio/aac';
    143     case 'wav':
    144       return 'audio/vnd.wave';
    145     case 'wma':
    146       return 'audio/x-ms-wma';
    147     default:
    148       return 'unknown';
    149   }
    150 };
    151
    152 /**
    153  * The type of media this is: video or audio.
    154  *
    155  * @return {string} "video" or "audio" based on what the type of media this
    156  * is.
    157  */
    158 minplayer.file.prototype.getType = function() {
    159   var type = this.mimetype.match(/([^\/]+)(\/)/);
    160   type = (type && (type.length > 1)) ? type[1] : '';
    161   if (type == 'video' || this.mimetype == 'application/octet-stream') {
    162     return 'video';
    163   }
    164   if (type == 'audio') {
    165     return 'audio';
    166   }
    167   return '';
    168 };
    169
    170 /**
    171  * Returns the ID for this media file.
    172  *
    173  * @return {string} The id for this media file which is provided by the player.
    174  */
    175 minplayer.file.prototype.getId = function() {
    176   var player = minplayer.players[this.player];
    177   return (player && player.getMediaId) ? player.getMediaId(this) : '';
    178 };
    179