// ==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 // @downloadURL none // ==/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; } /* initial setup for finding the video we're ending up playing */ var hq = 2, 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.href = this.responseJSON.media[vid].connection[0].href; dwnbutton.className = 'icon'; 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 version w/ the best quality */ 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); } });