1
0
mirror of https://github.com/videojs/video.js.git synced 2025-04-15 11:56:32 +02:00

feat: add mimetype type to source object when possible (#4469) (#4947)

File mimetype is filled when the file extension is known and type is not provided.

Fixes #4469, improves #4851.
This commit is contained in:
David GG 2018-03-07 20:34:16 +01:00 committed by Gary Katsevman
parent 8706941573
commit 62ff3f66a5
3 changed files with 108 additions and 2 deletions

View File

@ -2,6 +2,8 @@
* @module filter-source
*/
import {isObject} from './obj';
import {MimetypesKind} from './mimetypes';
import * as Url from '../utils/url.js';
/**
* Filter out single bad source objects or multiple source objects in an
@ -34,10 +36,10 @@ const filterSource = function(src) {
src = newsrc;
} else if (typeof src === 'string' && src.trim()) {
// convert string into object
src = [{src}];
src = [checkMimetype({src})];
} else if (isObject(src) && typeof src.src === 'string' && src.src && src.src.trim()) {
// src is already valid
src = [src];
src = [checkMimetype(src)];
} else {
// invalid source, turn it into an empty array
src = [];
@ -46,4 +48,23 @@ const filterSource = function(src) {
return src;
};
/**
* Checks src mimetype, adding it when possible
*
* @param {Tech~SourceObject} src
* The src object to check
* @return {Tech~SourceObject}
* src Object with known type
*/
function checkMimetype(src) {
const ext = Url.getFileExtension(src.src);
const mimetype = MimetypesKind[ext.toLowerCase()];
if (!src.type && mimetype) {
src.type = mimetype;
}
return src;
}
export default filterSource;

19
src/js/utils/mimetypes.js Normal file
View File

@ -0,0 +1,19 @@
/**
* Mimetypes
*
* @see http://hul.harvard.edu/ois/////systems/wax/wax-public-help/mimetypes.htm
* @typedef Mimetypes~Kind
* @enum
*/
export const MimetypesKind = {
opus: 'video/ogg',
ogv: 'video/ogg',
mp4: 'video/mp4',
mov: 'video/mp4',
m4v: 'video/mp4',
mkv: 'video/x-matroska',
mp3: 'audio/mpeg',
aac: 'audio/aac',
oga: 'audio/ogg',
m3u8: 'application/x-mpegURL'
};

View File

@ -122,3 +122,69 @@ QUnit.test('Dont filter extra object properties', function(assert) {
);
});
QUnit.test('SourceObject type is filled with default values when extension is known', function(assert) {
assert.deepEqual(
filterSource('some-url.mp4'),
[{src: 'some-url.mp4', type: 'video/mp4'}],
'string source filters to object'
);
assert.deepEqual(
filterSource('some-url.ogv'),
[{src: 'some-url.ogv', type: 'video/ogg'}],
'string source filters to object'
);
assert.deepEqual(
filterSource('some-url.aac'),
[{src: 'some-url.aac', type: 'audio/aac'}],
'string source filters to object'
);
assert.deepEqual(
filterSource({src: 'some-url.mp4'}),
[{src: 'some-url.mp4', type: 'video/mp4'}],
'string source filters to object'
);
assert.deepEqual(
filterSource({src: 'some-url.ogv'}),
[{src: 'some-url.ogv', type: 'video/ogg'}],
'string source filters to object'
);
assert.deepEqual(
filterSource([{src: 'some-url.MP4'}, {src: 'some-url.OgV'}, {src: 'some-url.AaC'}]),
[{src: 'some-url.MP4', type: 'video/mp4'}, {src: 'some-url.OgV', type: 'video/ogg'}, {src: 'some-url.AaC', type: 'audio/aac'}],
'string source filters to object'
);
});
QUnit.test('SourceObject type is not filled when extension is unknown', function(assert) {
assert.deepEqual(
filterSource('some-url.ppp'),
[{src: 'some-url.ppp'}],
'string source filters to object'
);
assert.deepEqual(
filterSource('some-url.a'),
[{src: 'some-url.a'}],
'string source filters to object'
);
assert.deepEqual(
filterSource('some-url.mp8'),
[{src: 'some-url.mp8'}],
'string source filters to object'
);
});
QUnit.test('SourceObject type is not changed when type exists', function(assert) {
assert.deepEqual(
filterSource({src: 'some-url.aac', type: 'video/zzz'}),
[{src: 'some-url.aac', type: 'video/zzz'}],
'string source filters to object'
);
});