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...