Greasy Fork

HTML5 player for BBC News

Use a natively uncluttered hardware-accelerated player, no ads or annoyances. Also, easily downloadable videos.

目前为 2015-07-16 提交的版本。查看 最新版本

// ==UserScript==
// @name        HTML5 player for BBC News
// @match       http://www.bbc.com/*
// @version     2015.07.16
// @description Use a natively uncluttered hardware-accelerated player, no ads or annoyances. Also, easily downloadable videos.
// @grant       GM_xmlhttpRequest
// @namespace   https://greasyfork.org/users/4813
// ==/UserScript==


for (var i in (src = document.querySelectorAll('script:not([src])')))
{
    if (typeof src[i] !== 'object' || src[i].textContent.indexOf('externalId') === -1)
    {
        continue;
    }

    var vpid = src[i].textContent.match(/externalId":"([^"]+)"/)[1];

    console.log(i, vpid);
}

if (!vpid)
  throw 'BBC HTML5: nothing to do :)';

  GM_xmlhttpRequest(
  {
    method: 'GET',
    url: 'http://open.live.bbc.co.uk/mediaselector/5/select/version/2.0/vpid/' + vpid + '/format/json/mediaset/journalism-http-tablet/',

    onreadystatechange: function(e)
    {
      if (e.readyState !== XMLHttpRequest.DONE)
      {
        return;
      }

      this.responseJSON = JSON.parse(e.responseText);

      /* just for taking a look, please don't mind me! :-) */
      console.log(e, this.responseJSON);

      if (!this.responseJSON.media)
      {
        console.warn('BBC HTML5: the listing did not come with any video at all!', this.responseJSON); return;
      }
      
      var hq         = 2 // 0;
      var hq_bitrate = 0;

      /* add a download button per result video */
      for(var vid in this.responseJSON.media)
      {
        console.log("=>", vid, this.responseJSON.media[vid].width,
                               this.responseJSON.media[vid].height,
                               this.responseJSON.media[vid],
                               this.responseJSON.media[vid].connection[0].href);

        dwnbutton = document.createElement("a");
        dwnbutton.setAttribute('style', 'padding-right: 10px;');

        dwnbutton.textContent = this.responseJSON.media[vid].width + 'p';
        dwnbutton.className   = 'icon';
        dwnbutton.href        = this.responseJSON.media[vid].connection[0].href;
        dwnbutton.title       = 'Download the ' + this.responseJSON.media[vid].width  + 'x'
                                                + this.responseJSON.media[vid].height + ' px version of this video.';
        dwnbutton.download    = document.querySelector('#media-asset-page-text > h1').textContent + '.' + dwnbutton.textContent + '.mp4';

        /* replace it on the page */
        dwnbuttonHolderElement = document.querySelector('.player-wrapper');
        dwnbuttonHolderElement.appendChild(dwnbutton);
        
        /* reuse the loop to find the best version */
        if (this.responseJSON.media[vid].bitrate > hq_bitrate) hq = vid;
      }

      /* build our own html5 player with our own stuff */
      vplayer = document.createElement('video');

      vplayer.src      = this.responseJSON.media[hq].connection[0].href;
      vplayer.poster   = document.querySelector('#media-asset-placeholder').src;

      vplayer.controls = 'true';
      vplayer.autoplay = 'false';
      vplayer.preload  = 'none';

      vplayer.volume   = '0.4';

      vplayer.style.width = '100%';

      /* replace it on the page */
      videoHolderElement = document.querySelector('#media-asset-page-video');
      videoHolderElement.parentElement.replaceChild(vplayer, videoHolderElement);
    },

    onerror: function(e)
    {
      console.warn('BBC HTML5: Houston, we have an unidentified problem!', e);
    }
  });