2021-03-08 18:45:06 +00:00
function time _days ( seconds _input ) {
var seconds = Number ( seconds _input ) ;
var days = seconds * 1.15741 E - 5 ;
var hours = String ( days ) . split ( "." ) ;
var hours _str = "0." + hours [ 1 ] ;
var hours _int = Number ( hours _str ) * 24.0 ;
var minutes = String ( hours _int ) . split ( "." ) ;
var minutes _str = "0." + minutes [ 1 ] ;
var minutes _int = Number ( minutes _str ) * 60.0 ;
var days _form = String ( days ) . split ( "." ) ;
var hours _form = String ( hours _int ) . split ( "." ) ;
var minutes _form = String ( minutes _int ) . split ( "." ) ;
var final = [ Number ( days _form [ 0 ] ) , Number ( hours _form [ 0 ] ) , Number ( minutes _form [ 0 ] ) ] ;
return final ;
}
function time _hours ( seconds _input ) {
var seconds = Number ( seconds _input ) ;
var hours _int = Number ( seconds ) * 0.0002777778 ;
var minutes = String ( hours _int ) . split ( "." ) ;
var minutes _str = "0." + minutes [ 1 ] ;
var minutes _int = Number ( minutes _str ) * 60.0 ;
var hours _form = String ( hours _int ) . split ( "." ) ;
var minutes _form = String ( minutes _int ) . split ( "." ) ;
var final = [ Number ( hours _form [ 0 ] ) , Number ( minutes _form [ 0 ] ) ] ;
return final ;
}
function makeRequest ( method , url , data ) {
return new Promise ( function ( resolve , reject ) {
var xhr = new XMLHttpRequest ( ) ;
xhr . open ( method , url ) ;
xhr . onload = function ( ) {
if ( this . status >= 200 && this . status < 300 ) {
resolve ( xhr . response ) ;
} else {
reject ( {
status : this . status ,
statusText : xhr . statusText
} ) ;
}
} ;
xhr . onerror = function ( ) {
reject ( {
status : this . status ,
statusText : xhr . statusText
} ) ;
} ;
if ( method == "POST" && data ) {
xhr . send ( data ) ;
} else {
xhr . send ( ) ;
}
} ) ;
}
function topFunction ( ) {
document . body . scrollTop = 0 ; // For Safari
document . documentElement . scrollTop = 0 ; // For Chrome, Firefox, IE and Opera
}
function login _menu ( ) {
topFunction ( ) ;
var html = '<form id="password_login_form" onsubmit="get_config();return false">'
html += '<div class="form-group">' ;
html += '<label for="password" title="The password chosen during first-time setup.">Password</label>' ;
html += '<input type="password" class="form-control" id="password" value="" autocomplete="off" required />' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<input type="submit" class="form-control btn" id="password_button" value="Log in" required />' ;
html += '</div>' ;
html += '</form>' ;
document . getElementById ( "setup" ) . innerHTML = html ;
}
function set _password ( back ) {
topFunction ( ) ;
var html = '<form id="password_form" onsubmit="set_tautulli(false);return false">'
html += '<div class="form-group">' ;
html += '<label for="password" title="The password needed to change the config-file remotely.">Set an admin password</label>' ;
html += '<input type="password" class="form-control" id="password" value="' + password + '" autocomplete="off" required />' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="password_2" title="The password needed to change the config-file remotely.">Repeat the password</label>' ;
html += '<input type="password" class="form-control" id="password_2" value="' + password + '" autocomplete="off" required />' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<input type="submit" class="form-control btn" id="password_button" value="Save" required />' ;
html += '</div>' ;
html += '</form>' ;
document . getElementById ( "setup" ) . innerHTML = html ;
}
function set _tautulli ( back ) {
2021-03-13 22:55:08 +00:00
2021-03-08 18:45:06 +00:00
topFunction ( ) ;
if ( ! back ) {
if ( document . getElementById ( 'password' ) . value == document . getElementById ( 'password_2' ) . value ) {
password = document . getElementById ( 'password' ) . value ;
} else {
alert ( "The passwords must match." ) ;
return false ;
}
}
var html = '<div class="form-group">' ;
html += '<button class="form-control btn" onclick="set_password(true)">Set admin password</button>' ;
html += '</div>' ;
html += '<form id="tautulli_form" onsubmit="set_tautulli_details(false);return false">'
html += '<div class="form-group">' ;
html += '<label for="tautulli_apikey" title="The API key needed to interact with Tautulli. Commonly found at Tautulli->Settings->Web Interface->API Key.">Tautulli API key</label>' ;
html += '<input type="text" class="form-control" id="tautulli_apikey" value="' + tautulli _apikey + '" autocomplete="off" required /><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="tautulli_ip" title="The IP address or domain that connects to Tautulli. No subfolders as this is another setting, but subdomains can be defined.">IP or domain for Tautulli connection</label>' ;
html += '<input type="text" class="form-control" id="tautulli_ip" value="' + tautulli _ip + '" required /><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="tautulli_port" title="The port Tautulli uses for connections. Typically empty if a domain is used.">Port for Tautulli (optional)</label>' ;
html += '<input type="text" class="form-control" id="tautulli_port" value="' + tautulli _port + '" /><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="tautulli_length" title="The max amount of items Tautulli responds with. Typically doesn\'t need to be changed, but with server-wide stats it could limit results if the amount of items needed are extreme.">Tautlli item length</label>' ;
html += '<input type="number" class="form-control" id="tautulli_length" value="' + tautulli _length + '" autocomplete="off" required /><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="tautulli_root" title="Subfolder for Tautulli, no slashes needed at the beginning or end. It is the folder accessed after the main IP/domain. For example: tautulli.com/subfolder.">Root for Tautulli (optional)</label>' ;
html += '<input type="text" class="form-control" id="tautulli_root" value="' + tautulli _root + '" autocomplete="off" /><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="ssl" title="Enable if your connection uses HTTPS.">Use SSL (optional)</label>' ;
html += '<input type="checkbox" class="form-control" id="ssl" ' ;
if ( ssl ) {
html += 'checked="' + ssl + '" ' ;
}
html += '/><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="library_id_movies" title="The ID for your chosen movie library in Tautulli. Can be found by going to Tautulli->Libraries->Your library. The ID is the url as section_id.">ID for movie-library in Tautulli</label>' ;
html += '<input type="number" class="form-control" id="library_id_movies" value="' + library _id _movies + '" autocomplete="off" required /><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="library_id_shows" title="The ID for your chosen show library in Tautulli. Can be found by going to Tautulli->Libraries->Your library. The ID is the url as section_id.">ID for show-library in Tautulli</label>' ;
html += '<input type="number" class="form-control" id="library_id_shows" value="' + library _id _shows + '" autocomplete="off" required /><br>' ;
html += '</div>' ;
2021-03-12 22:45:44 +00:00
html += '<div class="form-group">' ;
html += '<input style="background-color: lightgrey;" type="button" class="form-control btn" id="test_connection" onclick="test_tautulli_connection()" value="Test Tautulli connection" />' ;
html += '</div>' ;
2021-03-08 18:45:06 +00:00
html += '<div class="form-group">' ;
html += '<input type="submit" class="form-control btn" id="form_button" value="Save" required />' ;
html += '</div>' ;
html += '</form>' ;
document . getElementById ( "setup" ) . innerHTML = html ;
}
function set _tautulli _details ( back ) {
topFunction ( ) ;
if ( ! back ) {
tautulli _apikey = document . getElementById ( 'tautulli_apikey' ) . value ;
tautulli _ip = document . getElementById ( 'tautulli_ip' ) . value ;
tautulli _port = document . getElementById ( 'tautulli_port' ) . value ;
tautulli _length = document . getElementById ( 'tautulli_length' ) . value ;
tautulli _root = document . getElementById ( 'tautulli_root' ) . value ;
ssl = document . getElementById ( 'ssl' ) . checked ;
library _id _movies = document . getElementById ( 'library_id_movies' ) . value ;
library _id _shows = document . getElementById ( 'library_id_shows' ) . value ;
}
var html = '<div class="form-group">' ;
html += '<button class="form-control btn" onclick="set_tautulli(true, false)">Tautulli settings</button>' ;
html += '</div>' ;
html += '<form id="tautulli_details_form" onsubmit="set_tautulli_last(false);return false">'
var temp _date = wrapped _start . toLocaleDateString ( "en-GB" , { // you can skip the first argument
year : "numeric" ,
month : "2-digit" ,
day : "2-digit" ,
hour : "2-digit" ,
minute : "2-digit" ,
second : "2-digit" ,
timezone : "Europe/London" ,
} ) ;
var temp _date = temp _date . split ( ',' ) ;
var temp _date _first = temp _date [ 0 ] . split ( '/' ) ;
var temp _date _second = temp _date [ 1 ] . split ( ':' ) ;
html += '<div class="form-group">' ;
html += '<label for="wrapped_start" title="The start of the period you want wrapped.">Start of wrapped period</label>' ;
html += '<input type="datetime-local" class="form-control" id="wrapped_start" value="' + temp _date _first [ 2 ] . trim ( ) + '-' + temp _date _first [ 1 ] . trim ( ) + '-' + temp _date _first [ 0 ] . trim ( ) + 'T' + temp _date _second [ 0 ] . trim ( ) + ':' + temp _date _second [ 1 ] . trim ( ) + '" required /><br>' ;
html += '</div>' ;
var temp _date = wrapped _end . toLocaleDateString ( "en-GB" , { // you can skip the first argument
year : "numeric" ,
month : "2-digit" ,
day : "2-digit" ,
hour : "2-digit" ,
minute : "2-digit" ,
second : "2-digit" ,
timezone : "Europe/London" ,
} ) ;
var temp _date = temp _date . split ( ',' ) ;
var temp _date _first = temp _date [ 0 ] . split ( '/' ) ;
var temp _date _second = temp _date [ 1 ] . split ( ':' ) ;
html += '<div class="form-group">' ;
html += '<label for="wrapped_end" title="The end of your wrapped period. All data until this point is viable.">End of wrapped period<br>' ;
html += '<input type="datetime-local" class="form-control" id="wrapped_end" value="' + temp _date _first [ 2 ] . trim ( ) + '-' + temp _date _first [ 1 ] . trim ( ) + '-' + temp _date _first [ 0 ] . trim ( ) + 'T' + temp _date _second [ 0 ] . trim ( ) + ':' + temp _date _second [ 1 ] . trim ( ) + '" required /></label>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="get_user_movie_stats" title="Includes movie statistics in your wrapped period.">Get users movie statistics (optional)<br>' ;
html += '<input type="checkbox" class="form-control" id="get_user_movie_stats" ' ;
if ( get _user _movie _stats ) {
html += 'checked="' + get _user _movie _stats + '" ' ;
}
html += '/><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="get_user_show_stats" title="Includes show statistics in your wrapped period.">Get users show statistics (optional)<br>' ;
html += '<input type="checkbox" class="form-control" id="get_user_show_stats" ' ;
if ( get _user _show _stats ) {
html += 'checked="' + get _user _show _stats + '" ' ;
}
html += '/><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="get_user_show_buddy" title="Includes the users top show-buddy in your wrapped period. Requires show stats.">Get users show-buddy (optional)<br>' ;
html += '<input type="checkbox" class="form-control" id="get_user_show_buddy" ' ;
if ( get _user _show _buddy ) {
html += 'checked="' + get _user _show _buddy + '" ' ;
}
html += '/><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="get_year_stats" title="Includes server-wide statistics in your wrapped period.">Get server-wide statistics (optional)<br>' ;
html += '<input type="checkbox" class="form-control" id="get_year_stats" ' ;
if ( get _year _stats ) {
html += 'checked="' + get _year _stats + '" ' ;
}
html += '/><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="use_cache" title="Caches your results in cache.json for later use.">Cache results for later use (optional)<br>' ;
html += '<input type="checkbox" class="form-control" id="use_cache" ' ;
if ( use _cache ) {
html += 'checked="' + use _cache + '" ' ;
}
html += '/><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="cache_age_limit" title="How old the cache can be in days before it expires.">Amount of days cache is valid (optional)<br>' ;
html += '<input type="number" class="form-control" id="cache_age_limit" value="' + cache _age _limit + '" /></label>' ;
html += '</div>' ;
html += '<div class="form-group" title="Clear the cache to include the newest settings.">' ;
html += '<label for="clear_cache">Clear cache (optional)<br>' ;
html += '<input type="checkbox" class="form-control" id="clear_cache" checked /></label>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<input type="submit" class="form-control btn" id="form_button" value="Finish" required />' ;
html += '</div>' ;
html += '</form>' ;
document . getElementById ( "setup" ) . innerHTML = html ;
}
2021-03-12 22:45:44 +00:00
function test _tautulli _connection ( ) {
var button = document . getElementById ( 'test_connection' ) ;
button . style . backgroundColor = 'lightgrey' ;
ssl _temp = document . getElementById ( 'ssl' ) . checked ;
ip _temp = document . getElementById ( 'tautulli_ip' ) . value ;
root _temp = document . getElementById ( 'tautulli_root' ) . value ;
port _temp = document . getElementById ( 'tautulli_port' ) . value ;
api _temp = document . getElementById ( 'tautulli_apikey' ) . value ;
if ( ssl _temp ) {
var prefix = 'https://' ;
} else {
var prefix = 'http://' ;
}
if ( root _temp == "" ) {
var suffix = '' ;
} else {
var suffix = '/' + root _temp + '/' ;
}
if ( port _temp == "" ) {
url = prefix + ip _temp + suffix + '/api/v2' ;
} else {
url = prefix + ip _temp + ':' + port _temp + suffix + '/api/v2' ;
}
config _form = { "url" : url , "ssl" : ssl _temp , "apikey" : api _temp } ;
var config _data = JSON . stringify ( config _form ) ;
var xhttp = new XMLHttpRequest ( ) ;
xhttp . onreadystatechange = function ( ) {
if ( this . readyState == 4 && this . status == 200 ) {
var result = JSON . parse ( this . responseText ) ;
if ( ! result . error ) {
button . style . backgroundColor = '#79A04F' ;
} else {
button . style . backgroundColor = '#F1909C' ;
}
}
} ;
xhttp . withCredentials = true ;
xhttp . open ( "post" , 'api/get_connection.php' ) ;
xhttp . send ( config _data ) ;
}
2021-03-08 18:45:06 +00:00
function set _tautulli _last ( back ) {
if ( ! back ) {
wrapped _start = new Date ( document . getElementById ( 'wrapped_start' ) . value ) ;
wrapped _end = new Date ( document . getElementById ( 'wrapped_end' ) . value ) ;
if ( wrapped _end < wrapped _start ) {
alert ( "The wrapped end period must be later than the wrapped start period." ) ;
return ;
}
get _user _movie _stats = document . getElementById ( 'get_user_movie_stats' ) . checked ;
get _user _show _stats = document . getElementById ( 'get_user_show_stats' ) . checked ;
get _user _show _buddy = document . getElementById ( 'get_user_show_buddy' ) . checked ;
get _year _stats = document . getElementById ( 'get_year_stats' ) . checked ;
use _cache = document . getElementById ( 'use_cache' ) . checked ;
cache _age _limit = document . getElementById ( 'cache_age_limit' ) . value ;
set _config ( ) ;
}
}