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">'
2021-10-04 12:26:50 +00:00
html += '<div class="form-group">' ;
html += '<label for="username" title="The username chosen during first-time setup.">Username</label>' ;
html += '<input type="text" class="form-control" id="username" value="" minlength=4 autocomplete="on" required />' ;
html += '</div>' ;
2021-03-08 18:45:06 +00:00
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">'
2021-10-04 12:26:50 +00:00
html += '<div class="form-group">' ;
html += '<label for="username" title="The username needed to change the config-file remotely.">Set an admin username</label>' ;
html += '<input type="text" class="form-control" id="username" value="' + username + '" minlength=4 autocomplete="on" required />' ;
html += '</div>' ;
2021-03-08 18:45:06 +00:00
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 ) {
2021-10-04 12:26:50 +00:00
if ( document . getElementById ( 'password' ) . value != document . getElementById ( 'password_2' ) . value ) {
alert ( "The passwords must match." ) ;
document . getElementById ( 'password' ) . value = "" ;
document . getElementById ( 'password_2' ) . value = "" ;
document . getElementById ( 'password' ) . focus ( ) ;
return false ;
2021-03-08 18:45:06 +00:00
} else {
2021-10-04 12:26:50 +00:00
password = document . getElementById ( 'password' ) . value ;
username = document . getElementById ( 'username' ) . value ;
2021-03-08 18:45:06 +00:00
}
}
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>' ;
2021-09-21 10:40:54 +00:00
html += '<input type="text" class="form-control" id="tautulli_apikey" value="' + tautulli _apikey + '" autocomplete="off" required placeholder="l0NgWe1rDAp1K3y..." /><br>' ;
2021-03-08 18:45:06 +00:00
html += '</div>' ;
html += '<div class="form-group">' ;
2021-10-07 16:44:27 +00:00
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>' ;
2021-09-21 10:40:54 +00:00
html += '<input type="text" class="form-control" id="tautulli_ip" value="' + tautulli _ip + '" required placeholder="mycooldomain.plex" /><br>' ;
2021-03-08 18:45:06 +00:00
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>' ;
2021-09-21 10:40:54 +00:00
html += '<input type="text" class="form-control" id="tautulli_port" value="' + tautulli _port + '" placeholder="8181" /><br>' ;
2021-03-08 18:45:06 +00:00
html += '</div>' ;
html += '<div class="form-group">' ;
2021-10-07 16:44:27 +00:00
html += '<label for="tautulli_length" title="The max amount of entries Tautulli responds with during API calls. Typically doesn\'t need to be changed, but if you have more than 5000 entries in a day, they won\'t be loaded.">Tautlli item length</label>' ;
2021-09-21 10:40:54 +00:00
html += '<input type="number" min="0" class="form-control" id="tautulli_length" value="' + tautulli _length + '" autocomplete="off" placeholder="5000" required /><br>' ;
2021-03-08 18:45:06 +00:00
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>' ;
2021-09-21 10:40:54 +00:00
html += '<input type="text" class="form-control" id="tautulli_root" value="' + tautulli _root + '" autocomplete="off" placeholder="tautulli"/><br>' ;
2021-03-08 18:45:06 +00:00
html += '</div>' ;
2021-10-04 20:21:43 +00:00
html += '<div class="form-group">' ;
2021-10-05 13:34:30 +00:00
html += '<label for="timezone" title="The timezone the data is located in.">Timezone <a href="https://www.php.net/manual/en/timezones.php" target="_blank">(List)</a></label>' ;
2021-10-04 20:21:43 +00:00
html += '<input type="text" class="form-control" id="timezone" value="Europe/Oslo" autocomplete="off" placeholder="Europe/Oslo" required /><br>' ;
html += '</div>' ;
2021-03-08 18:45:06 +00:00
html += '<div class="form-group">' ;
2021-10-07 16:44:27 +00:00
html += '<label for="ssl" title="Enable if your connection uses HTTPS or HTTP.">Use HTTPS</label>' ;
2021-03-08 18:45:06 +00:00
html += '<input type="checkbox" class="form-control" id="ssl" ' ;
if ( ssl ) {
html += 'checked="' + ssl + '" ' ;
}
html += '/><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 ;
2021-10-04 20:21:43 +00:00
timezone = document . getElementById ( 'timezone' ) . value ;
2021-03-08 18:45:06 +00:00
ssl = document . getElementById ( 'ssl' ) . checked ;
}
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">' ;
2021-10-07 16:44:27 +00:00
html += '<div class="warning">!<br>Load time for long wrapped periods are extensive. Consider enabling caching and performing pre-caching once.</div>' ;
2021-03-08 18:45:06 +00:00
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>' ;
2021-10-04 12:57:28 +00:00
html += '<hr>' ;
2021-03-08 18:45:06 +00:00
html += '<div class="form-group">' ;
2021-10-01 23:21:18 +00:00
html += '<label for="get_user_movie_stats" title="Includes movie statistics in your wrapped period.">Get users movie statistics<br>' ;
2021-03-08 18:45:06 +00:00
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">' ;
2021-10-01 23:21:18 +00:00
html += '<label for="get_user_show_stats" title="Includes show statistics in your wrapped period.">Get users show statistics<br>' ;
2021-03-08 18:45:06 +00:00
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">' ;
2021-10-01 23:21:18 +00:00
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<br>' ;
2021-03-08 18:45:06 +00:00
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">' ;
2021-10-01 23:21:18 +00:00
html += '<label for="get_user_music_stats" title="Includes music statistics in your wrapped period.">Get users music statistics<br>' ;
html += '<input type="checkbox" class="form-control" id="get_user_music_stats" ' ;
if ( get _user _music _stats ) {
html += 'checked="' + get _user _music _stats + '" ' ;
}
html += '/><br>' ;
html += '</div>' ;
2021-10-04 12:57:28 +00:00
html += '<hr>' ;
2021-10-01 23:21:18 +00:00
html += '<div class="form-group">' ;
html += '<label for="get_year_stats_movies" title="Includes server-wide movie statistics in your wrapped period.">Get server-wide movie statistics<br>' ;
html += '<input type="checkbox" class="form-control" id="get_year_stats_movies" ' ;
if ( get _year _stats _movies ) {
html += 'checked="' + get _year _stats _movies + '" ' ;
}
html += '/><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="get_year_stats_shows" title="Includes server-wide show statistics in your wrapped period.">Get server-wide show statistics<br>' ;
html += '<input type="checkbox" class="form-control" id="get_year_stats_shows" ' ;
if ( get _year _stats _shows ) {
html += 'checked="' + get _year _stats _shows + '" ' ;
}
html += '/><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="get_year_stats_music" title="Includes server-wide music statistics in your wrapped period.">Get server-wide music statistics<br>' ;
html += '<input type="checkbox" class="form-control" id="get_year_stats_music" ' ;
if ( get _year _stats _music ) {
html += 'checked="' + get _year _stats _music + '" ' ;
}
html += '/><br>' ;
html += '</div>' ;
html += '<div class="form-group">' ;
html += '<label for="get_year_stats_leaderboard" title="Creates a user leaderboard based on the server-wide statistics in your wrapped period.">Get server-wide leaderboard rankings<br>' ;
html += '<input type="checkbox" class="form-control" id="get_year_stats_leaderboard" ' ;
if ( get _year _stats _leaderboard ) {
html += 'checked="' + get _year _stats _leaderboard + '" ' ;
2021-03-08 18:45:06 +00:00
}
html += '/><br>' ;
2021-09-21 13:01:14 +00:00
html += '</div>' ;
2021-10-04 12:57:28 +00:00
html += '<hr>' ;
2021-09-21 13:01:14 +00:00
html += '<div class="form-group">' ;
2021-10-01 23:21:18 +00:00
html += '<label for="use_logs" title="Logs every API request into a log-file in the config folder. ID for Wrapped request included.">Log API calls<br>' ;
2021-09-21 13:01:14 +00:00
html += '<input type="checkbox" class="form-control" id="use_logs" ' ;
if ( use _logs ) {
html += 'checked="' + use _logs + '" ' ;
}
html += '/><br>' ;
2021-03-08 18:45:06 +00:00
html += '</div>' ;
2021-10-07 16:44:27 +00:00
2021-03-08 18:45:06 +00:00
html += '<div class="form-group">' ;
2021-10-07 16:44:27 +00:00
html += '<div class="warning">!<br>If your wrapped period is long and no results are cached, the wait time can be extensive. Using the cache feature and pre-caching once is recommended.</div>' ;
2021-10-01 23:21:18 +00:00
html += '<label for="use_cache" title="Caches your results in cache.json for later use.">Cache results for later use<br>' ;
2021-03-08 18:45:06 +00:00
html += '<input type="checkbox" class="form-control" id="use_cache" ' ;
if ( use _cache ) {
html += 'checked="' + use _cache + '" ' ;
}
html += '/><br>' ;
html += '</div>' ;
2021-09-21 10:40:54 +00:00
html += '<div class="form-group" title="Clear the cache now to include the newest settings.">' ;
2021-10-01 23:21:18 +00:00
html += '<label for="clear_cache">Clear cache now<br>' ;
2021-03-08 18:45:06 +00:00
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 ;
2021-10-01 23:21:18 +00:00
get _user _music _stats = document . getElementById ( 'get_user_music_stats' ) . checked ;
get _year _stats _movies = document . getElementById ( 'get_year_stats_movies' ) . checked ;
get _year _stats _shows = document . getElementById ( 'get_year_stats_shows' ) . checked ;
get _year _stats _music = document . getElementById ( 'get_year_stats_music' ) . checked ;
get _year _stats _leaderboard = document . getElementById ( 'get_year_stats_leaderboard' ) . checked ;
2021-03-08 18:45:06 +00:00
use _cache = document . getElementById ( 'use_cache' ) . checked ;
2021-09-21 13:01:14 +00:00
use _logs = document . getElementById ( 'use_logs' ) . checked ;
2021-03-08 18:45:06 +00:00
set _config ( ) ;
}
}