log("loading media.codec.js");
/**
* Input might look funky, we need to normalize it so e.g. whitespace isn't an issue for our spoofing.
*
* @example
* video/webm; codecs="vp8, vorbis"
* video/mp4; codecs="avc1.42E01E"
* audio/x-m4a;
* audio/ogg; codecs="vorbis"
* @param {String} arg
*/
const parseInput = (arg) => {
const [mime, codecStr] = arg.trim().split(";");
let codecs = [];
if (codecStr && codecStr.includes("codecs=\"")) {
codecs = codecStr.trim().
replace(`codecs="`, "").
replace(`"`, "").
trim().
split(",").
filter((x) => !!x).
map((x) => x.trim());
}
return {
mime,
codecStr,
codecs
};
};
const canPlayType = {
// Intercept certain requests
apply: function(target, ctx, args) {
if (!args || !args.length) {
return target.apply(ctx, args);
}
const { mime, codecs } = parseInput(args[0]);
// This specific mp4 codec is missing in Chromium
if (mime === "video/mp4") {
if (codecs.includes("avc1.42E01E")) {
return "probably";
}
}
// This mimetype is only supported if no codecs are specified
if (mime === "audio/x-m4a" && !codecs.length) {
return "maybe";
}
// This mimetype is only supported if no codecs are specified
if (mime === "audio/aac" && !codecs.length) {
return "probably";
}
// Everything else as usual
return target.apply(ctx, args);
}
};
/* global HTMLMediaElement */
utils.replaceWithProxy(HTMLMediaElement.prototype, "canPlayType", canPlayType);