// ==UserScript== // @name Plex Freebox // @namespace Kalmac // @description Add a "play on freebox server" button on plex interface. // @include http://plex.tv/web/app* // @include https://plex.tv/web/app* // @version 1.01 // @grant GM_xmlhttpRequest // @require https://cdn.jsdelivr.net/jquery.cookie/1.4.1/jquery.cookie.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/hmac-sha1.js // @license GPL version 3 or any later version; http://www.gnu.org/copyleft/gpl.html // @downloadURL https://update.greasyfork.icu/scripts/7309/Plex%20Freebox.user.js // @updateURL https://update.greasyfork.icu/scripts/7309/Plex%20Freebox.meta.js // ==/UserScript== (function () { var HOST = 'http://mafreebox.freebox.fr'; var APP_ID = 'fr.freebox.kalmac'; var APP_NAME = 'Plex 4 Freebox'; var APP_VERSION = '0.1'; var DEVICE_NAME = 'Plex remote'; var COOKIE_TRACK_ID = 'freebox_plex_track_id'; var COOKIE_TOKEN = 'freebox_plex_token'; var COOKIE_AIRPLAY_PASS = 'freebox_plex_airplay_pass'; var STATE_UNINITIALIZED = 0; var STATE_INITIALIZED = 1; var STATE_UNAUTHORIZED = 2; var STATE_PENDING = 3; var STATE_AUTHORIZED = 4; var STATE_ERROR = 10; var track_id, token, state = STATE_UNINITIALIZED; function callFreeboxApi(path, callback, params, method, headers) { if (typeof(params) != 'object') { params = {}; } if (method !== 'POST') { method = 'GET'; } if (typeof(headers) != 'object') { headers = {}; } GM_xmlhttpRequest({ url: HOST + path, data: JSON.stringify(params), method: method, headers: headers, onload:function(response) { callback(JSON.parse(response.responseText)); }, onerror: function(response) { state = STATE_ERROR; core(); } }); } function init() { track_id = $.cookie(COOKIE_TRACK_ID); token = $.cookie(COOKIE_TOKEN); if (typeof(track_id) != 'undefined' && typeof(token) != 'undefined') { state = STATE_PENDING; } else { state = STATE_UNAUTHORIZED; } } function authorize() { callFreeboxApi('/api/v3/login/authorize/', function(response) { if (response.success) { $.cookie(COOKIE_TRACK_ID, response.result.track_id, { expires: 1000, path: '/' }); $.cookie(COOKIE_TOKEN, response.result.app_token, { expires: 1000, path: '/' }); state = STATE_INITIALIZED; core(); } }, { 'app_id': APP_ID, 'app_name': APP_NAME, 'app_version': APP_VERSION, 'device_name': DEVICE_NAME }, 'POST'); var airplay_password = prompt("Veuillez autoriser l\'appli sur votre Freebox (fleche de droite) et saisir le mot de passe AirPlay...", "1111"); $.cookie(COOKIE_AIRPLAY_PASS, airplay_password, { expires: 1000, path: '/' }); updateAdminButton('Veuillez autoriser l\'appli sur votre Freebox (fleche de droite).', 'refresh', false); } function pending() { callFreeboxApi('/api/v3/login/authorize/' + track_id, function(response) { if (response.success) { switch(response.result.status) { case 'pending': break; case 'granted': state = STATE_AUTHORIZED; break; default: console.log('Freebox returned ' + response.result.status); $.removeCookie(COOKIE_TRACK_ID, { path: '/' }); $.removeCookie(COOKIE_TOKEN, { path: '/' }); state = STATE_INITIALIZED; break; } } }); } function insertAdminButton() { var result = false; if (!$('li#plex-freebox-admin').length) { var elt = $('li#primary-player-dropdown'); if (elt.length == 1) { elt.after('