Youtube Video Background
by Vladimir Sobolev
HTML
<textarea id="videoinfo" cols="80" rows="10"></textarea>
<button id="decode">Decode</button>
<pre id="log"></pre>
SCSS
html, body {
height: 100%;
min-height: 100%;
background: #444;
overflow: hidden;
}
video {
object-fit: cover;
width: 100%;
height: 100%;
transform: rotateZ(0);
}
JavaScript
var textarea_element = document.getElementById('videoinfo'),
pre_element = document.getElementById('log'),
button = document.getElementById('decode');
button.onclick = function() {
var json = parse_youtube_meta(textarea_element.value);
//pre_element.innerHTML = JSON.stringify(json);
console.log(json);
return false;
};
function parse_youtube_meta(rawdata) {
var data = parse_str(rawdata),
player_response = JSON.parse(data.player_response),
streams = [],
result = {};
data.player_response = player_response;
if (data.hasOwnProperty('adaptive_fmts')) {
streams = streams.concat(data.adaptive_fmts.split(',').map(function(s) {
return parse_str(s)
}));
} else {
if (player_response.streamingData && player_response.streamingData.adaptiveFormats) {
streams = streams.concat(player_response.streamingData.adaptiveFormats);
}
}
if (data.hasOwnProperty('url_encoded_fmt_stream_map')) {
streams = streams.concat(data.url_encoded_fmt_stream_map.split(',').map(function(s) {
return parse_str(s)
}));
} else {
if (player_response.streamingData && player_response.streamingData.formats) {
streams = streams.concat(player_response.streamingData.formats);
}
}
streams.forEach(function(stream, n) {
var itag = stream.itag * 1,
quality = false,
itag_map = {
18: '360p',
22: '720p',
37: '1080p',
38: '3072p',
82: '360p3d',
83: '480p3d',
84: '720p3d',
85: '1080p3d',
133: '240pna',
134: '360pna',
135: '480pna',
136: '720pna',
137: '1080pna',
264: '1440pna',
298: '720p60',
299: '1080p60na',
160: '144pna',
139: "48kbps",
140: "128kbps",
141: "256kbps"
};
//if (stream.type.indexOf('o/mp4') > 0) console.log(stream);
if (itag_map[itag]) result[itag_map[itag]] = stream.url;
});
return result;
};
function...