// ==UserScript==
// @name JVC HTML5 player
// @namespace http://www.hardcoding.fr
// @description Replace Flash players with native HTML5 player (without ads and with resolution chooser)
// @include http://www.jeuxvideo.com/*
// @version 1
// @grant none
// ==/UserScript==
// Load native player from a jv player element
function loadNativePlayer(element) {
console.log('Replacing '+element.id);
//var id = element.id.match('player-jv-([0-9]+)-[0-9]+_wrapper');
/*
* Get the video id.
*/
// Get video id from element id
var id = element.id.match('player-jv-([0-9]+)-');
// Check id
if (!id) {
console.warn('Unable to get video ip.');
// Stop player loading
return;
}
id = id[1];
/*
* Get the video parent element.
*/
// Declare parent found status
var parentFound = false;
// Declare parent element
var parent = $('#'+element.id);
// Look for player content parent element
while (!parentFound && parent) {
// Check parent class
if (parent.hasClass('player-contenu')) {
// Mark parent as found
parentFound = true;
// Stop looking for parent
break;
}
// Get parent
parent = parent.parent();
}
// Check parent
if (!parent) {
console.warn('Unable to found player parent.');
// Stop player loading
return;
}
/*
* Insert native player.
*/
// Get video configuration
$.ajax('http://www.jeuxvideo.com/contenu/medias/video.php?q=config&id='+id)
.done(function (data) {
// Clear parent
parent.empty();
// Insert resolution div
var resolutionDiv = $('
').appendTo(parent);
// Insert video icon
resolutionDiv.append('');
// Insert each resolution button
for (var index in data.sources) {
// Get source file and label
var file = data.sources[index].file;
var label = data.sources[index].label;
// Check source file
if (!file)
continue;
// Append source file button
resolutionDiv.append(' '+label+' ');
// Attach source file button handler
$('#native-player-'+id+'-'+label).on('click', function (event) {
// Fire load video action
actionLoadVideo(event);
// Prevent link loading
return false;
});
}
// Insert native player element
var nativeVideo = parent.append('');
// Bind hover callbacks
nativeVideo.hover(function () {
// Fade in resolution div
$('#native-player-'+id+'-resolutions').fadeIn();
}, function () {
// Fade out resolution div
$('#native-player-'+id+'-resolutions').fadeOut();
});
// Load default video
var defaultSource = (data.sources.lenght > 1 && data.sources[0].label == '1080p') ? 1 : 0;
loadVideo(id, data.sources[defaultSource].file);
})
.fail(function () {
console.warn('Unable to get video configuration');
});
}
// Handler to load a video
function actionLoadVideo(event) {
// Check event target
if (!event.target) {
console.warn('No event target.');
return;
}
var target = $(event.target);
// Get native player id
var id = target.attr('data-id');
// Get video source
var source = target.attr('data-source');
// Check id and source
if (!id || !source) {
console.warn('Missing native player id or video source.');
return;
}
// Load video
loadVideo(id, source);
}
// Load a video to a native player
function loadVideo(id, source) {
console.log('Load video '+source+' on player '+id);
// Get native player element
var nativePlayer = $('#native-player-'+id);
var _nativePlayer = nativePlayer[0];
// Get playing status
var playing = !_nativePlayer.paused;
// Get video current time
var currentTime = 0;
if (playing) {
// Pause video
_nativePlayer.pause();
// Get video current time
currentTime = _nativePlayer.currentTime;
}
// Change native player source
nativePlayer.attr('src', source);
if (playing) {
// Load new source
_nativePlayer.load();
// Start playing video
_nativePlayer.play();
// Request to restore current time when video can play
nativePlayer.one('canplay', function() {
_nativePlayer.currentTime = currentTime
});
}
}
// Initialize the script
$(document).ready(function () {
console.log('Looking for jv player.');
// Look for player jv div
$('div[id^=player-jv]').
//Sfilter('[id$=_wrapper]').
each(function (index, element) {
// Load native player for each element found
loadNativePlayer(element);
});
});