Skip to content

Instantly share code, notes, and snippets.

@VioletRed
Last active August 29, 2015 14:05
Show Gist options
  • Save VioletRed/9577d8c062f3ff056c59 to your computer and use it in GitHub Desktop.
Save VioletRed/9577d8c062f3ff056c59 to your computer and use it in GitHub Desktop.
Play on XBMC
// ==UserScript==
// @name Play on Kodi/XBMC
// @namespace user@violet.local
//
// @description Resolve and play media on Kodi/XBMC
// @description Use with AnyURL plugin from:
// @description https://github.com/VioletRed/script.anyurl.player
//
// @date 2015-01-04
// @version 17
// @include *
// @grant GM_addStyle
// @grant GM_registerMenuCommand
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// @grant GM_log
// @updateURL https://github.com/VioletRed/script.anyurl.player/raw/master/json/Play_on_XBMC.user.js
// ==/UserScript==
//
// Simple script to send media to Kodi.
// Adds a "Send to Kodi" button on supported websites
// Supported plugins:
// * Youtube
// * TED
// * AnyURL plugin for other domains (https://github.com/VioletRed/script.anyurl.player).
//
// !!!!!!!!!
// THIS IS THE LAST UPDATE IN GIST.
// CHECK https://github.com/VioletRed/script.anyurl.player FOR FUTURE UPDATES
//
// It uses the old GM_*** API, and needs cleaning.
/* ============================================================================
* Global config
* */
var xbmc_address = GM_getValue('XBMC_ADDRESS');
var xbmc_queued = null;
const xbmc_music_playlist = 0; // Queue for party mode
const xbmc_video_playlist = 1; // Queue for video mode
//Remove known top domain names (i.e 'www', 'm', 'embed')
var top_domain = /^www\.|^m\.|^embed\./
var current_host = window.location.host.toLowerCase().replace(top_domain, '');
/*
* ============================================================================
* Global UI elements
* ============================================================================
*/
var xbmc_ui = null;
var xbmc_title = null;
var xbmc_play_control = null;
var xbmc_msg_timer = null;
/*
* ============================================================================
* Site independent code here!!!!
* ============================================================================
*/
function xbmc_json_error(response) {
consoloe.log("XBMC JSON Error")
}
function xbmc_json_timeout(response) {
consoloe.log("XBMC JSON Timeout")
}
function json_command_answer(command, logmsgok, logmsgerr) {
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
"Content-type" : "application/json"
},
data : command,
onload : function(response) {
console.log(logmsgok);
return response;
}
});
console.log(logmsgerr);
return -1;
}
function play_movie_directly(video_url) {
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
"Content-type" : "application/json"
},
data : '{"jsonrpc": "2.0", "method": "Player.Open", '
+ '"params":{"item": { "file" : "'
+ encode_video_url(video_url) + '" }}, "id" : 1}',
onload : function(response) {
show_ui_msg("PLAYING", 2000);
console.log('Playing video');
}
});
/* Clear playlist */
setTimeout(
function() {
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
"Content-type" : "application/json"
},
timeout: 6000,
data : '{"jsonrpc": "2.0", "method": "Playlist.Clear", '
+ '"params":{"playlistid" : '+xbmc_video_playlist+'}, "id" : 1}',
onerror: xbmc_json_error,
ontimeout: xbmc_json_timeout,
});
}, 5000);
}
function open_video_playlist() {
console.log('New video queue');
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
"Content-type" : "application/json"
},
data : '{"jsonrpc": "2.0", "method": "Player.Open", '
+ '"params":{"item": { "playlistid" : ' + xbmc_video_playlist
+ ' }}, "id" : 1}',
onload : function(response) {
console.log('Playing video');
show_ui_msg("PLAYING", 2000);
}
});
}
function dont_open_video_playlist() {
console.log('Queued video at the end ');
show_ui_msg("QUEUED", 5000);
return 0;
}
function play_in_new_playlist(video_url) {
/* Clear playlist */
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
"Content-type" : "application/json"
},
timeout: 6000,
data : '{"jsonrpc": "2.0", "method": "Playlist.Clear", '
+ '"params":{"playlistid" : '+xbmc_video_playlist+'}, "id" : 1}',
onload : function(response) {
/* Add movies to Video playlist */
xbmc_queued = "";
queue_movie_last(video_url, open_video_playlist);
},
onerror: xbmc_json_error,
ontimeout: xbmc_json_timeout,
});
}
function queue_movie_at(video_url, xbmc_playlist, xbmc_queue_depth) {
if (xbmc_queued == video_url) {
// Show somehow that this action was already completed
console.log("Already queued "+xbmc_queued);
return;
}
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
"Content-type" : "application/json"
},
data : '{"jsonrpc": "2.0", "method": "Playlist.Insert", '
+ '"params":{"item": { "file" : "'
+ encode_video_url_for_queueing(video_url)
+ '" }, "playlistid" :'
+ xbmc_playlist
+ ', "position" : '
+ xbmc_queue_depth
+ ' }, "id" : 1}',
onerror: xbmc_json_error,
ontimeout: xbmc_json_timeout,
onload : function(response) {
xbmc_queued = video_url;
show_ui_msg("QUEUEED", 5000);
console.log('Queueing video');
}
})
}
function queue_movie_last(video_url, last_step) {
if (xbmc_queued == video_url) {
// Show somehow that this action was already completed
console.log("Already queued "+xbmc_queued);
return;
}
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
"Content-type" : "application/json"
},
data : '{"jsonrpc": "2.0", "method": "Playlist.Add", '
+ '"params":{"item": { "file" : "'
+ encode_video_url_for_queueing(video_url) + '" }, "playlistid" :'
+ xbmc_video_playlist + ' }, "id" : 1}',
onload : function(response) {
var result = JSON.parse(response.responseText);
if (result.result == "OK") {
xbmc_queued = video_url;
last_step();
return 0;
}
},
onerror: xbmc_json_error,
ontimeout: xbmc_json_timeout
});
return -1;
}
function queue_in_party_mode(video_url) {
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
"Content-type" : "application/json"
},
data : '{"jsonrpc": "2.0", "method": "Playlist.GetItems",'
+ '"params":{"playlistid" : '
+ xbmc_music_playlist
+ '}, "id" : 1}',
onload : function(response) {
var xbmc_response = JSON.parse(response.responseText);
if (xbmc_response.result.limits == undefined) {
console.log("Error: Playlist.GetItems bad response");
return;
}
// Queue exist, enqueue media at the end of user
// selection
xbmc_queue_depth = xbmc_response.result.limits.end - 9;
console.log("XBMC queue size is "
+ xbmc_queue_depth);
queue_movie_at(video_url, xbmc_music_playlist, xbmc_queue_depth);
}
})
}
function queue_in_playlist(video_url) {
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
"Content-type" : "application/json"
},
data : '{"jsonrpc": "2.0", "method": "Playlist.GetItems",'
+ '"params":{"playlistid" : '
+ xbmc_video_playlist
+ '}, "id" : 1}',
onload : function(response) {
var xbmc_response = JSON.parse(response.responseText);
if (xbmc_response.result.limits == undefined
|| xbmc_response.result.limits.end == 0) {
console.log("Playlist.GetItems bad response");
play_in_new_playlist(video_url)
return;
}
// Queue exist, enqueue media at the end of user
// selection
queue_movie_last(video_url,dont_open_video_playlist);
}
})
}
function play_movie() {
video_url = document.documentURI
console.log('Trying to play/queue movie');
var xbmc_queue_depth = undefined;
show_ui_msg("LOADING", 30000);
/*
* Logic goes like this: First, try to queue the video. If it fails, play
* video directly. Because AJAX is asynchronous, we use a timer for "direct
* play", and cancel it if we succeed to queue the video where we want
*/
if (video_url == undefined || xbmc_queued == video_url) {
return;
}
// Get the current playlist
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
"Content-type" : "application/json"
},
data : '{"jsonrpc": "2.0", "method": "Player.GetActivePlayers",'
+ '"params":{}, "id" : 1}',
onload : function(response) {
var xbmc_active = JSON.parse(response.responseText);
if (xbmc_active.result == undefined
|| xbmc_active.result.length == 0) {
console.log("No active players, play directly");
play_movie_directly(video_url)
return; // No active players
}
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
"Content-type" : "application/json"
},
data : '{"jsonrpc": "2.0", "method": "Player.GetProperties",'
+ '"params":{"playerid" : '
+ xbmc_active.result[0].playerid
+ ', "properties" : [ "playlistid" , "partymode" ] }, "id" : 1}',
onload : function(response) {
var xbmc_properties = JSON.parse(response.responseText);
if (xbmc_properties.result.partymode != true) {
console.log("Not in party mode, play now");
play_movie_directly(video_url);
return;
}
queue_in_party_mode(video_url)
}
});
}
});
}
function queue_movie() {
video_url = document.documentURI
console.log('Trying queue movie/create new playlist');
var xbmc_queue_depth = undefined;
show_ui_msg("LOADING", 30000);
// Get the current playlist
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
"Content-type" : "application/json"
},
data : '{"jsonrpc": "2.0", "method": "Player.GetActivePlayers",'
+ '"params":{}, "id" : 1}',
onerror : xbmc_json_error,
ontimeout : xbmc_json_timeout,
onload : function(response) {
var xbmc_active = JSON.parse(response.responseText);
if (xbmc_active.result == undefined
|| xbmc_active.result.length == 0) {
console.log("No active players, create a new queue");
play_in_new_playlist(video_url);
return;
}
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
"Content-type" : "application/json"
},
data : '{"jsonrpc": "2.0", "method": "Player.GetProperties",'
+ '"params":{"playerid" : '
+ xbmc_active.result[0].playerid
+ ', "properties" : [ "playlistid" , "partymode" ] }, "id" : 1}',
onload : function(response) {
var xbmc_properties = JSON.parse(response.responseText);
if (xbmc_properties.result.partymode == true) {
console.log("Party mode, default play");
queue_in_party_mode(video_url);
return;
}
if (xbmc_active.result[0].playerid != 1) {
console.log("Playing music, create a new queue");
play_in_new_playlist(video_url);
} else {
console.log("Queue in playlist");
queue_in_playlist(video_url);
}
},
onerror: function(response) {
/* No active playlist */
console.log("Not playing playlist, queue and play")
play_in_new_playlist(video_url);
}
});
}
});
}
/*
* ============================================================================
* Movie control functions
* ============================================================================
*/
function pause_movie() {
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
'Content-Type' : 'application/json'
},
data : '{"jsonrpc":"2.0", "method":"Player.PlayPause", "params":{"playerid":1}, "id" : 1}'
});
}
function stop_movie() {
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
'Content-Type' : 'application/json'
},
data : '{"jsonrpc":"2.0", "method": "Player.Stop", "params":{"playerid":1}, "id" : 1}'
});
xbmc_queued = "";
}
function next_movie() {
GM_xmlhttpRequest({
method : 'POST',
url : 'http://' + xbmc_address + '/jsonrpc',
headers : {
'Content-Type' : 'application/json'
},
data : '{"jsonrpc": "2.0", "method": "Player.GoTo", "params":{"playerid" : 1, "to" : "next" }, "id" : 1}'
});
xbmc_queued = "";
}
/*
* ============================================================================
* UI functions
* ============================================================================
*/
function modify_xbmc_address() {
xbmc_address = window
.prompt(
'Enter the address for the XBMC web interface\n(username:password@address:port)',
xbmc_address);
GM_setValue("XBMC_ADDRESS", xbmc_address);
}
//function modify_xbmc_playlist() {
// xbmc_music_playlist = window.prompt('Set the PARTYMODE playlist number (0 or 1)',
// xbmc_music_playlist);
// GM_setValue("XBMC_PLAYLIST", xbmc_music_playlist);
//}
function remove_playing_msg() {
try {
xbmc_ui.removeChild(xbmc_title);
} catch (e) {
// catch and just suppress error
}
try {
clearTimeout(xbmc_msg_timer);
} catch (e) {
// catch and just suppress error
}
}
function show_ui_msg(msg, timeout) {
remove_playing_msg();
xbmc_title.innerHTML = msg;
xbmc_ui.insertBefore(xbmc_title,xbmc_play_control);
xbmc_msg_timer = setTimeout(remove_playing_msg, timeout);
}
function add_play_on_xbmc_buttons() {
console.log('Found clip ' + document.documentURI);
xbmc_ui = document.createElement('div');
xbmc_ui.setAttribute('id', 'xbmc');
xbmc_play_control = document.createElement('div');
xbmc_play_control.setAttribute('id', 'playControl');
var xbmc_other_control = document.createElement('div');
xbmc_other_control.setAttribute('id', 'otherControl');
var xbmc_playback_control = document.createElement('div');
xbmc_playback_control.setAttribute('id', 'playbackControl');
xbmc_title = document.createElement('div');
xbmc_title.setAttribute('id', 'xbmcText');
xbmc_title.innerHTML = 'PLAYING';
var xbmc_play = document.createElement('span');
xbmc_play.addEventListener('click', function() {
play_movie()
}, false);
xbmc_play.setAttribute('id', 'btPlay');
xbmc_play.setAttribute('title', 'Start playback');
var xbmc_pause = document.createElement('span');
xbmc_pause.addEventListener('click', pause_movie, false);
xbmc_pause.setAttribute('id', 'btPause');
xbmc_pause.setAttribute('title', 'Pause playback');
var xbmc_stop = document.createElement('span');
xbmc_stop.addEventListener('click', stop_movie, false);
xbmc_stop.setAttribute('id', 'btStop');
xbmc_stop.setAttribute('title', 'Stop video');
xbmc_play_control.appendChild(xbmc_play); var xbmc_next = document.createElement('span');
xbmc_next.addEventListener('click', next_movie, false);
xbmc_next.setAttribute('id', 'btNext');
xbmc_next.setAttribute('title', 'Play next video');
var xbmc_queue = document.createElement('span');
xbmc_queue.addEventListener('click', queue_movie, false);
xbmc_queue.setAttribute('id', 'btQueue');
xbmc_queue.setAttribute('title', 'Queue video');
xbmc_play_control.appendChild(xbmc_play);
xbmc_playback_control.appendChild(xbmc_queue);
xbmc_playback_control.appendChild(xbmc_next);
xbmc_playback_control.appendChild(xbmc_pause);
xbmc_playback_control.appendChild(xbmc_stop);
xbmc_other_control.appendChild(xbmc_playback_control);
xbmc_ui.appendChild(xbmc_play_control);
xbmc_ui.appendChild(xbmc_other_control);
document.body.parentNode.insertBefore(xbmc_ui, document.body);
GM_addStyle('#xbmc { opacity:0.4; width:90px; position:fixed; z-index:100; bottom:0; right:0; display:block; background:#103040; -moz-border-radius-topleft: 20px; -moz-border-radius-bottomleft:20px; -webkit-border-top-left-radius:20px; -webkit-border-bottom-left-radius:20px; } ')
GM_addStyle('#xbmc:hover { opacity: 0.7; } ')
GM_addStyle('#xbmcText { opacity:0.8; font-family:Terminal; text-align:center; font-size:12px; font-weight:bold; background:#401010; color:#a0a0a0 } ')
// Play control
GM_addStyle('#playControl span, #playbackPlay span:hover { width:40px; height:40px; float:left; display:block; padding-bottom:0px; -moz-background-size:40px; background-size:40px; -webkit-background-size:40px; -o-background-size:40px; -khtml-background-size:40px; cursor:pointer; } ')
GM_addStyle('#btPlay { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gsQFQQ7DKP8ygAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAS6SURBVFjDzZh9TFZVHMc/5zxvYs58QRGNVeqW6bhNDXwBZfCIb2mz1IxejJUNNkwlFRV8jSlGCbMyNwN0utRiJb5Evo10Kuqcpnc20bSspQ41weTFh+c+9/QHz+OetWkgPMB3u3/c3XPu/dzfOed3zu8rNE1D13U0TXMAY4Bs4DlaR98CKcDfuq4rTdMQAJqmdfQ+HGO43XTpHorhdl03Dbcr0EQKhbTYHcJi61lVcRNpsQKkAl/run5LaJpmB3IQIsVVW8OoyYln+4R2LggO7npDmm53oAFNpfAIm+12taEd+alk6q9nj/az2YMANRfIFZqmBQO3XPdrSZq/oix1RsI0wAr10W1hGfOyN20vLsjqZ3O0AwiWwDLT4+H5yLirqTMSXjOVsrcSHKapbJ+mJU7r0/8FTNMDsFwCNQqFNjDiR1PhkEKoVlogSCmU4THt/cMHbldKAbgkMEgISfX1Ml0KHgrn7WAAZiAhrRapHNI4LYSshwZ0AKvVYnlURyGEmbYwY9i1O0ZYoCHraqtrH0QVaOiQekoO7hv7VFfbzozlWZPPl13uDAR8lcvGNLZYLG6AVSvSM2ampOQs/Wj1VO+CcrcJQH8dLtkfnrls0eLY+Anrzv9eMRCoMk1TtBlAnw4d/CEyvHeXTVmfbc6XUlajVNsC9Cl99jtRI53jTi9IXxJfWUP7+mFvOq1szr89UrI3KHv1yqyJ40evyvl8w3gQlqaueBmIiX308IHoubOSst54b87aqjqCgDrTVG0H0KdtBWuHxURHHVuW+cmHUorHiqQ10HnszKlSzpwqTTxaenywMy52S/r8Dw4BdUopqxCidSPor5K9O8Iz0mZlv/TK62u+23NosBCisiGbRIsB+lRc9M2IKRNj89+fuWADYGtzgD7lrcuOGx4zZue1G+X2Vp2DD5Nz9ISTyamL83qGhrjbFKBz7KSL0VFD1icnJZ3r0a3znf8b5hYFzMjMzU96980tYT273fMeMmytnmYAJkyacn33jsK3gJtAu8aUFAEFHOkcf2KUM/bLJYvmnQA6KGjX2ONOQAAjhsfdHhkVMXf+wqVXQrq0rwI68piVWLMDOkfF524s2FgYFtarrjm+0Wx5MG7cqxeK9pVOP3hg/1d+cE0vopr6gqiY+IuRQ4bsyfk4cz3QQSnVviF7bMABI4aOICp6RF7KzNlb+z7dvQLo5K3+mrcMfZxO06YnH9uS/8Vsm/VBpWoJWJ3ciLaiR2ivP3LXb86ak/x2YUvt4w8ADcPwPNImU8q6s+j7Td5be0AdJD8W6bM1nuzxbG/1iFTlnVsO7xUwc0mB6BDS+xmv1YIETCHg/IWLka46d6u4Wv6qqqqxXvj5eKIXxJTALiEEf135JSZ/644BwH2au7htmExAbizcnXju9MkQWW8V7bKEhISUCyFevF99r++lS5fiKzxB5cMHDbhcD4oJeFrgcgMybenKhL1F22cZhoEQYj+wxudRDwOKUaqTxWZ3DRg01GWTbHPX3K0MeNiUwm3KTpV3/0m4ee2qQynlAH4DYnVd/1P4ufzdgTLgCdM07c2dcBuUx4SoAyoBTdf1cn+X3wfZC4gHXm4Ja+0/sgHFuq7n+TP9C6ku1BHL4Se8AAAAAElFTkSuQmCC") no-repeat; } ')
GM_addStyle('#btPlay:hover { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gsQFQULM2H9JwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAATySURBVFjDzZhZbFRVGMd/59w7dwqFFpC2QQMGrLKk3AYomxKhuLRQy1YWRUAiKESWWDQE8YFFKQYjEkEKyCIEjBA1QNkhFeKG7L1CI4mAAlEatlboTDsz9xwfmDb1xVrodPpP5mlybn7nW863CNu2cRwH27a9QAawBOhIdLQNmAbcdBxH27aNALBtOy78Z0YwGKBl6yQMKW6i3GCkibQGLQ1PMKQeKi+9gWGaALnAFsdxrgvbti1gqRBimt9XTva4qb/1Sknem5iYcNMSOqQjCCcABQRcYV69XtqhoGDXgLNHD7WzvE0B/RbwsbBtuzVwvcLvY8bcvCvTJ45aAMjw+YaW+86yzfO25y9sa8U0AWgtgXnKDZHaL/Pa9Imj5mmtjSjBobU2Fr85bv5jXVJRygWYLwGfUpqn+j19TIMlhCBaEkKgtPb07de/UCkFUCmB7giBFbh1QUBtIeeGwyZikkLohBax56ucKAEHwDSkrOWs+nzTli4374QSIw0pVChQDUztVqsG3L93V+8XMvovWrN+c7+/Sm40B0KRdrusy8VM0wyVld5iVf6KV3JzZ01bv/GLAeELuo0B8N4BaeAGfJz75XT71fnLx4+dMDn30rU7yYBfay2iDlj1xEopqfD7OFd0vPPg9J5zVmz4ZrYQoqKRAP5bluVl5YfvpgzNeWnN2g0be5RXam99xaesr5t6PBYXzjvW8mVLX5806dXXvtq+p0+NahZ9QADDMAEoLjrRdemHH0ycMXvhdF9AeYGg1jr6gNURKiXld8s83+7ZmpKVlbUi/7NNo4UQqtEA1rTojWtXWb50ceaLE6bM/fLrnd1qVKT/JTPiD62USMvi7Mnv2188f2bqwYOFRZMmTT7wZM+UM0BsbY1JxAGrrWmaVFb4OfnzkdRzRcc6DcwcdjZv3uy1tSWRpEEl0Erh95V7d2zb2CN7xNi80rI7ZqOwYHU7FArRLL4VyU90Kp4y/e3dLeKbu40CUGtNRYWfbr36/zEkO7NgSFbWhebNmvxdG0ODAGqliGkaq6bMnLPv5dFDD7SIi/WFk8OMbhYLgSGlz07r41+1bvWiGLgNWHUZKSICqJSLkAZduqYVDx82dPuYnOxioGkYrk6qd8BgIEC7x1PKxowcvjInJ+fPuFivP/ze3ZfM+kwCaRiVA599fueiRe8diY+Lqxr6jQf5rvng7lR4Y2JUcufuV3NzZ23p3a3jecBbXxc3HwRMSIPkTvbl9PT0ozPfmLwDaKLBW59ttXl/cVZJm3bJZA0evHv8+PGHElo1vws0IwITf50BXTfEwEEjnWVLFnzqMY2Il8w6AbZt+2hJds64LaOHZRxuqDpeDRhylaolTY28vPf3VXX4kYSqySKrlnTaimvznyF0b2fjiTScBkLe+CTCI4IElJCCE2ecziHXJdoKBILm0cP7B4l7mxglgZ1SGhSf+il1T+EP7YFAlNg0ILcWHMg8/uN3LQ3DANhpJCUllQgh0gL+u8mnThelWS0fvm137HA1DKrDHW+kfyFALPlk9TOb1+WPUMpFCHEA+KhqR90X2IvW8aY3Jti1e59AQutWhZYO3NURNptSmjJ/sNnvly4OvHblkqWU6wFxEUh3HOeyqLHlTwR+BWKVUlZD+laEk1AIEQBKAdtxnJKaW/4qyEeA54AhQLCBY9AD7HEcZ21Npn8Aiiz5zaXkaTgAAAAASUVORK5CYII=") no-repeat; } ')
// Other control
GM_addStyle('#playbackControl span, #playbackControl span:hover { width:20px; height:20px; bottom:0; float:left; display:block; margin-left:3px; -moz-background-size:20px; background-size:20px; -webkit-background-size:20px; -o-background-size:20px; -khtml-background-size:20px; cursor:pointer; } ')
GM_addStyle('#btQueue { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gsQFRMBzyyh7gAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAJjSURBVDjLpVRNaBNREP7eT5rWCDWVEExF2rR6iNlUEGxBA4Iobf2h1V6kEkQiDQR78+JBQYTiVbwEL0kaLz2IggdBJIX4Uy2kehBpxFBiLUqVVMFmd7O7z4ObEmK2MfrBsDM7876dmTezJCBJHYSyGGNsGBAK/gmkTde1rBBihIOQWIfLve/ytZsXhg71LQAwmmV797HYfSk8fuPrl5U483g8ibGz41dCYydeA9gCoLWOMAA2C7/d1d72vaTR5ez8XJQC0Ht3dX42D/wBWVZoeCI6EJ6IDsiyQi2y5Du2b10FhMEBCCEMYVVPOp1un07GYwBweuTk0eGhwWK9OJND8EYNkuUSVHkdAKCYz81AG3ackCq9YTjqZWgA0CuG0+nUavRyVSyrTaqWUJwLnd//LDM7SClTAUDTtNaKMxQKTXLOZQAwDL3lYPDwo1QynrUiFAD43enEnXo9B4BCoTBa/XJpKXEmlYz3A1CtMjT8UuDWyqflfkqpBgC6rtuKxeIBs+RXjLHy7wwN7unc+RKABoDUIyQAMPfieSqfz88wxgAAmUxmWyQSeQgAU1NT14PB4Jr5IXi9XtU8JywvxeFwGJIkyRU7l8tt7Lfb7VZ8Pp/8X2PTLHjjOaSEMr6h/xVh9fDWYq/f/7Or2/ugojdaAA6ArMsqq25sNXp7vMqH94tXTdNmwSeUss4BUCoE1h4/mT1ubkfZHINaIabU85UBlJ/OvzkGkCIJBPpOtdjtM109u+953K4FSpr7wQqArH77sSe3+PaiKpdGSUCSqACOUMYmCeCwKn2zexMADF2/TYD7vwBiPd9+VARjVwAAAABJRU5ErkJggg==") no-repeat; } ')
GM_addStyle('#btQueue:hover { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gsQFRMZ3EA5uAAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAJaSURBVDjLrVRbSJNRHP+dy7dcrE1xZNh0uYZkMCPCQLxALAiih4JeJDISukkUoS8+7qkLJQo9lEFhIj4JQUTRzdCMWi8+RTiZ1oggnGVZ6b5z6aHvy9umW/WHP+ccDufH73LOIaFQqIAy1mUYxj4CmMi5CDR0nplKvVZK7eeU0i5faVld5EL7pR0Vm2IAdK6IH5LfN5w+0XR8fGy0m230+XrOnGu5Hq6tigHIA+BI0wwAB7AmzZ7hXuuYWVew/tPgwOMGTgAVKCmesg4sKyEk6entqwCAw4caYpyzdApYsdf9BdDaAsmscmJiwtXZ2dECAHU11a3B4OZvK+nnqxkkpcDsjxmL7eqZ8axcJ2TRmCugBiDthdPpFEvmYqF3AMhKgPrajZvlw4MDOxljAgBM03QwxgAAbW1tBw3DSP22QvKa+l3Rk8eaRjMCzmnQ9ssXW7kFYMvknGsAGBkZqdV6PsBX0Wj9kaNNp5x8nvUiQAeBDu/e0/9+fGwrZUzaTBKJxBYA8Pv9b23mSkpWWhZ84+Tz9iwDJAA6O648+jo9/cwOIB6PuxobG88DQCQS6Q4EAjMAoLWG2+MxrWM6YygOw9BerzdlrycnJ//cFbfbbRYWFqZWSpniPxfP5jehjC8w5R8Bi4qKZiu3bX9uz7MBJD9TZkbp+fkes6/39q3VCMyZkgEgVCmVvHvvQbX1OoQ1Lm1idbo9AUA8GXpZpTSSXErZ/PTh/f7mz1Ou8mAgxihRuYSgtSbvEh9LXgwP7ZXCPEAqQyGqgTBj/CylxPU3P7bSWkkhrgK48wuevOEqllHmIwAAAABJRU5ErkJggg==") no-repeat; } ')
GM_addStyle('#btNext { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gsQFRIgml6A8QAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAALLSURBVDjLpVRpSJRRFD33fd+US5HLOFMQEwlaTGq0iqkZqFgQ+DPaMxSEFkMkkiYqc0w0GqggIrUmog2iH0URtNOPos2mMi01y8zJsqQhx2a+791+OAaZewcuPB73nXfvuYdLCfHxKogyhRCbAIQAYIwGRMTMGku5n4S4o4JEXnDoBEfMTKszKmxiPRFGx6cY0Nbutr6tr7vl/9WzQhWCShYkJu097Ki8AkBgbLi6Pm+T99nDe5WCiManp6XUAlABEAAlcB5J6AGJghKsMQ/ACBcAoKoKA+iZM3fBNtsee5zb/VkdRku95oTTNC4o5EWUecqpjo4v4w2KYO7XovbhfVNseeke56KUlOLSckccAC8AyfwPt+Z0OtP8v7zw/OgyV1VXW4QQjH6EJISi67qGd02N2fYSm2OmNd7e4vaEEVFPf0ap+zUAALMES73vftAh9Hi7Ixpev8yOnWa8tGJ1TnZA38Gcg2EJ+3L9Pt+kC2dO2i3TY46UHzg062vnd0NgGANCHakvWlsaE23FRfOdNVVXVq9Ze44HKWZUvtM1v9LS0ryss+tHhCIU/m9Ca/y8G2+bWzMcFfvuSKmPjVBRVGmMMj/dXebIfeV6vHXq5PCfQ70bQkNCRKSxPjl1ybmq48eum4zh3YHlMSQGJAwKDpVL0rMqCjbn31ialfktYBnDX3rqutL3s6ZpYsCWiUi3RMfWnj1zOuPa5Yvnl2ZldgVy+ntQXblu4yMikiGhE9yr1m5ol1L+qZBkb37Q9h07jxYVFjwBMJGZFRpklzGzsiU/tykxMTXTGBnmi7aYPRAGAkCCmbWbt+9aAWhFhQUNzDwJgKAhFiMRgZnVhXNmfI+2mLsBeJ/XvUkmwKOYTCbfp7aPpR3fPK7FKUnvicgHwD9cEJEfgAbAv6vs4PL7N6/ZpJQ5lJAwWwG4nFkWMY9tu/b2Kuwul8v2G/TBGqKeojdGAAAAAElFTkSuQmCC") no-repeat; } ')
GM_addStyle('#btNext:hover { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gsQFRMojZ45ggAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAALOSURBVDjLpVRpSJRRFD33vW9cGqc0wmyDSY0wstH2sgwVszLDlDZLwlbaLFAqW0mUoh/9KKKCEPSPERROiIaVFoUTmWWiFW60QFCR0TaLzndfPxohLbWxAxfej8t595x73qPIyEgNQKLUtN2ChJEICl5AAYKZXazrJ4UQdzUi2mIaEXR+bszCSvO4kOdCELwiJImWtg6z7cG9apfDvkaTUhampqUX5e7bUwtAYGiwHTia76gou3paSCn94mMXtAHQABAA6UXxL9XwmTcz+oVSCBQAIKVQAFw7d2WnX7dWmH/Y7dLT2B+47vGTwOjpM4uWLE0+ZHc4DQZNKPSRyK9ftU84cfxw3tZt29eXV96eCKCrH2L9htUa7e524euXz0EPH9pG9yyzl2dSSmbdjabGZzEF+cd2b8zavOnDZ7vRQ9wLRMpNRCAiFkSsPNeKPxsJRASH/Yep4cnjhcuT4grOnL0Q4/G3V9/fMOhWXS6n8fLFc1tWrFy19+atGrPd4dQ8y/grtH/JhMFgQEfri4iD+3MmW6KibRnrMqqZWQxpwt/8hbu7Szxvbp79sfOLSQip/ouQmTFtxpz6qjs1ORvWpjUASnktWSkFqWk8OmRs+9Yd2WXpKYubAPgONIjWHxGzQsiYsW8SEpNq9uza8SjA6O8E4DeYEu1PaTr8h5nUspTU0syM1fXhYaHfPJHp1avrbuG5nJiZemIk+mSLQydNaSspKc45cfRgTXhY6Pe++evZUXxi8kshhAowDe+Mmj7rk1KKeiYk/nX2zd6XY02Ii20BMGwgn5RSIn7R/Hdl5VW5AUb/7pGBJjtDAgAJXde7796/bwbgToiLfQvA2M9UfV+JNI8P/jYqyOQE0FVb93QqAd9lcHCwq7WlJc8nILDVMjXiPQC3F6UD0C8VX5l3rbQ4k9mdRRaLRTLzKWbOVUoN6XclIkgpCxsbG4/8BG2OH3Fa2XjVAAAAAElFTkSuQmCC") no-repeat; } ')
GM_addStyle('#btStop { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gsQFQwH6xUKRQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAIQSURBVDjL7VRPSFRxEP5m3vMtS4QSVocKQ6Rt6+0e1lqqQx2ysKQCD0UXF0SEaKmVYA9BlomHAkESC6KORUZCp4qN1FYr9NCfXVCiJPAQRHSxfK277/2mQ4+wtXV3o2MD3+k38/HNN78ZCgQCXmY+xZoWh0gFyg0iTUQsx7ZPptPpuzozd1euWt2+7+CRnqBvY4oJUg6f5q00EonHDeOjiUHTNB0KhULzx1rauuKnTzwAUL5CQABk26JnOl8MP/SwiNhb62pSLhm7UACcIiA3VwNgrDRkkpg9OgAw0682k88mqs93XYy9mnzuy+WyKl+OUg7V1Pqdlkjkytl4bNwlBP1UCj0//1znhVhy+FHjcj2+nXqNnu6Z/lB9+Gjj3l3vFr9xvh9vXk6YpRhnffuKa/29frf9goTILmScUqdhzc8tsYTxj+M/ISCiqNRipVRxwuo160re5c2B+qJT5gNNh27rFUZRsrpN5ueBvstP8vc/f1Po+tW+If+W4MfBWzd9CxlriVrHthHevd++MdB7R0QcIvrNIp2I9KziFe7VAAB0RFuTHdHWkeWuIABjEZlAM7wQIRbBl5GnY00AcgBsF+SqLwTNXTnbrbPef5htBmSWgsFgs+HxDu3c03C/dv3ae4Q/jK6wTCHDWzWaHIvMTKd3KOVsoG3bw8hmvh9Xoi4BVPUXX48I+ETMh1Op1NQPxAjCXNn+aRUAAAAASUVORK5CYII=") no-repeat; } ')
GM_addStyle('#btStop:hover { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gsQFQwsR6nzBQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAIfSURBVDjL7ZRLSJRRFMf/59z7NQTlECIWkaOWmDkDQg8J2gjRLJqSQIIsYkYSIqOhVbso3LQII1rXLqK0LMMya+ixcjElfZbgxohqETE9CKxvvvto8xXT6DhNbTvw39zH755z7jmHYrHYUmY+JqVzggghVGwktNFfle/3TU1NXZPM3F+zcnW6+2DqUtuGplkm2EpwVoScu/fGNw4PXrkabW3VUkrnSLLn0MX9e/dMAJCVugfAtkXX38p9+hIeHbrczUSw0ea1swAcABzIAjBlRIEYgFNXu2LGAkskADDTrydfvX5TNXDuQtdL92md1mpe+NYaqq5dY1LJ5NDunTteBED8zFRxiPbswPmuh/fvtAshQEQLxpnLfUT/6ZPphsbGU7GWde8K97gYOO0+axRCgJlBRAtKSgnv+xzGRkciAPRiQCjlm1Ke/fYbRFC+Z4M8lgb+q/0HAtb+eedZa8oDl4erYYwpC9Nao2ZVxJYDUmJX5wMhHWitS8gg73mob2r53Js6kAUgCgHFnUJ9h3ueRBoaco8zY3XKz8/zwBiN+qaYPn60NwNYAxAFvW8DIAlPmVCwQACQiHc8T8Q7JstMGaegpq2yHAJArI3+MDae2QpABW2kgwtiEXHBWQXAm8hObmOmt1IrlR4ZHrzu5f2qTW2tj0RlA9Yqy8tu3Lwdn3GzzVLI7bR5Szu8b3P7tDFnAIT/pvSI6D0zd7quO/0DuWzdLIYmGtcAAAAASUVORK5CYII=") no-repeat; } ')
GM_addStyle('#btPause { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gsQFQs0G4T9lAAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAI3SURBVDjL7ZRfSNNRFMe/59y7zSVWCk2KIgihB2HLCAqKIihfymAjStlTJER/3upB2p6aw/4o0WOPIWTQQ71Yrj+iUKATKbFAE5Mowmr2Z9PN/fnd04ML7EejFvTWF87DvZf7OecevveQz+vVYN7PSp1hYreABGWIICxG8paV72CSAQ3i1orKqs56b0OPp6Z6yphCDiD6M5xAOVz6w8eEb/zZSH82s3BUK62ju/c2dl2OhG8DUChfAqD39NlQ9smj3ivMrJx7dm4fBeAAoH+EiOhiArV8HwDb1g4A2lu/eRjM1QyCECFnzzr9esbtDxze19l1rQ6AAWBudPdsaGo61Dg5Nb3C3sp8djHJTNAlnpENBoPH48NDpx7E+mabW44E1q9bmzh5ovVmJpN2J5PJS4ODA7dsLSKRpfJ/qc9ziZUAxLIK1uhIvBKAZDJpNwDMz6ecpe6VBBIt2YeIwMxiO0PZwL/Vf+C/A4qxLAYAEaFCIU/FLwYAMMZQuUDeuKluFgA5XRWW3x/4BkCtWl3zCQDWeGpTZQFFxPX4Yaw7Eu1oHht/GQRgiUjV1y9zB0KhcEus7/6dUoNEQ0Ag5bAbV0R0+HzbZDEpFc1stbdHJkRE2c2tnW4NgNgYyzwdim8FsLi8T8ULCgD9NE8BO0wALLyYeLVLjEkpT60n+/7d2wupPL/ZsW3LDIA0gHwZoaNXrx/sv3e3zRRyx8jnbVBC5iLA51gxQGwr6jfT1RhALEAkOjb2PPwdLsfi/2OSoc8AAAAASUVORK5CYII=") no-repeat; } ')
GM_addStyle('#btPause:hover { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gsQFQwaiBNmnAAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAIoSURBVDjL7ZRNSFRRFMf/59z7Zho/KJ2mRQousg+oFNGwhr5hIGhXUO2iaNEiaNFQgolt0nCTEUG0iAiDiFoYRJZiSl9YRLaSKCVyoWA5b2rUGee9e1rMDJj1YEZo1x8O3Hsu93f/58C5VFNTq4k5orV1SmldDGJBIRJhx0mnXGe+ndz0gGZWJ0rLgp3hnbufVlVWjCgmJ38YIET8eexL9YuBvv7Zn/HDWvt8bQcPHek6ffL4IACFpel1S1tJ8uG92x2sLd+yXdvDnwDoLHBhcJ45vbWhdoSUXsFELIp5cZkSs+O+K9du1PcPvlydKQ7y5t2HlZ1Xrzd8m7b9iy0yUZKIoYUA0B8lpNs7Lu9/8vjRgfJg6PuWhgfNpcWB+Jno2dYf8VjAtu2uCy1N/Vm3GREAogWJRbLtWAmTEdedl8nJiQAAmZtJBCAO5mYSPq97nkAikuzDklvnjGDBPm/gUvUf+O+AYozLmdkHua6hzFogAogYLhTIlZVVU0IW+QNF7vq1axIAuCwYmmbtR3kwlPACapjsYP0uq7U52hve1vixvr5uCoABUNTX032up/dZxb7Inq9eZrSIS0bkb4cqsnfHeG6ocq3wggkphjHErpN2nr8aWgcg7dESyqNNyaG37zca4yZUKBRKjo6NNgWWrxrftKF6AsA8AKeAoJt3uxvv37l1NJ2aPUa1dZsVjLokpKJsWSBSAFHePzbEwDgpkLgXh4eHz/8CWfTZHcuWkAsAAAAASUVORK5CYII=") no-repeat; } ')
}
/*
* ============================================================================
* Site dependent code here!!!!
* ============================================================================
*/
var supported_hosts = [ '180upload.com', '2gb-hosting.com', 'allmyvideos.net',
'auengine.com', 'bayfiles.com', 'bestreams.net', 'billionuploads.com',
'castamp.com', 'cheesestream.com', 'clicktoview.org', 'cloudy.ch',
'cloudy.com', 'cloudy.ec', 'cloudy.eu', 'cloudy.sx', 'crunchyroll.com',
'cyberlocker.ch', 'daclips.com', 'daclips.in', 'dailymotion.com',
'divxden.com', 'divxstage.eu', 'divxstage.net', 'divxstage.to',
'donevideo.com', 'ecostream.tv', 'entroupload.com', 'filebox.com',
'filedrive.com', 'filenuke.com', 'firedrive.com', 'flashx.tv',
'gorillavid.com', 'gorillavid.in', 'hostingbulk.com', 'hostingcup.com',
'hugefiles.net', 'jumbofiles.com', 'lemuploads.com', 'letwatch.us',
'limevideo.net', 'megarelease.org', 'mega-vids.com',
'mightyupload.com', 'mooshare.biz', 'movdivx.com', 'movieshd.co',
'movpod.in', 'movpod.net', 'movreel.com', 'movshare.net', 'movzap.com',
'mp4star.com', 'mp4stream.com', 'mp4upload.com', 'mrfile.me',
'muchshare.net', 'nolimitvideo.com', 'nosvideo.com', 'novamov.com',
'nowvideo.ch', 'nowvideo.eu', 'nowvideo.sx', 'ovile.com', 'play44.net',
'played.to', 'playwire.com', 'primeshare.tv', 'promptfile.com',
'purevid.com', 'putlocker.com', 'rapidvideo.com', 'realvid.net',
'seeon.tv', 'shared.sx', 'sharefiles4u.com', 'sharerepo.com',
'sharesix.com', 'sharevid.org', 'skyload.net', 'slickvid.com',
'sockshare.com', 'speedvideo.net', 'stagevu.com', 'stream2k.com',
'streamcloud.eu', 'streamin.to', 'ted.com', 'thefile.me',
'thevideo.me', 'trollvid.net', 'tubeplus.me', 'tune.pk', 'ufliq.com',
'uploadc.com', 'uploadcrazy.net', 'veehd.com', 'veoh.com',
'vidbull.com', 'vidbux.com', 'vidcrazy.net', 'video44.net',
'videobb.com', 'videoboxone.com', 'videofun.me', 'videohut.to',
'videomega.tv', 'videoraj.ch', 'videoraj.com', 'videoraj.ec',
'videoraj.eu', 'videoraj.sx', 'videotanker.co', 'videoweed.es',
'videozed.net', 'videozer.com', 'vidhog.com', 'vidpe.com',
'vidplay.net', 'vidspot.net', 'vidstream.in', 'vidto.me', 'vidup.org',
'vidxden.com', 'vidzi.tv', 'vidzur.com', 'vimeo.com', 'vk.com',
'vodlocker.com', 'vureel.com', 'watchfreeinhd.com', 'xvidstage.com',
'yourupload.com', 'youtu.be', 'youtube.com', 'youwatch.org',
'zalaa.com', 'zooupload.com', 'zshare.net', 'zuzvideo.com', ];
function binarySearch(items, value) {
var startIndex = 0, stopIndex = items.length - 1, middle = Math
.floor((stopIndex + startIndex) / 2);
while (items[middle] != value && startIndex < stopIndex) {
// adjust search area
if (value < items[middle]) {
stopIndex = middle - 1;
} else if (value > items[middle]) {
startIndex = middle + 1;
}
// recalculate middle
middle = Math.floor((stopIndex + startIndex) / 2);
}
// make sure it's the right value
return (items[middle] != value) ? -1 : middle;
}
/* Youtube has more features than most streaming sites,it needs special treatment
*/
function parse_yt_params(video_url) {
var regex = /[?&]([^=#]+)=([^&#]*)/g;
var params = {}, match;
while (match = regex.exec(video_url)) {
params[match[1]] = match[2];
}
return params;
}
function encode_video_url_for_queueing(video_url) {
switch (current_host) {
case "youtube.com":
case "youtu.be":
/* Youtube has it's own playlists, but Kodi doesn't support
* queueing a list within another list.
* Thus, we queue only current video. */
var yt_params = parse_yt_params(video_url);
return 'plugin://plugin.video.youtube/play/?video_id='
+ yt_params["v"];
break;
}
/* All other domains use the same URI for queueing and playing */
return encode_video_url(video_url);
}
function encode_video_url(video_url) {
switch (current_host) {
case "youtube.com":
case "youtu.be":
/* Better talk to YouTube plugin directly, it allows for more flexible use */
var yt_params = parse_yt_params(video_url);
if (yt_params["list"]) {
result = 'plugin://plugin.video.youtube/play/?play=1&order=default&playlist_id='
+ yt_params["list"];
if (yt_params["v"]) {
result = result + '&video_id=' + yt_params["v"];
}
return result;
}
return 'plugin://plugin.video.youtube/play/?video_id='
+ yt_params["v"];
break;
case "ted.com":
return 'plugin://plugin.video.ted.talks/?mode=playVideo&url='
+ encodeURIComponent(video_url)
+'&icon=a';
break;
}
return 'plugin://script.video.anyurl/?mode=play_video&url='
+ encodeURIComponent(video_url);
}
/* Add buttons only if necessary */
if (binarySearch(supported_hosts, current_host) >= 0 && top == self) {
GM_registerMenuCommand('Modify the XBMC address', modify_xbmc_address);
// GM_registerMenuCommand('XBMC partymode playlist', modify_xbmc_playlist);
// First run?
if (xbmc_address === undefined)
modify_xbmc_address();
//if (xbmc_music_playlist === undefined)
// modify_xbmc_playlist();
add_play_on_xbmc_buttons()
} else {
console.log("Unsupported host " + document.documentURI)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment