`;
});
return accordionOptions;
}
function buildFormItem(item){
var placeholder = (item.placeholder) ? ' placeholder="'+item.placeholder+'"' : '';
var id = (item.id) ? ' id="'+item.id+'"' : '';
var type = (item.type) ? ' data-type="'+item.type+'"' : '';
var value = (item.value) ? ' value="'+item.value+'"' : '';
var textarea = (item.value) ? item.value : '';
var name = (item.name) ? ' name="'+item.name+'"' : '';
var extraClass = (item.class) ? ' '+item.class : '';
var icon = (item.icon) ? ' '+item.icon : '';
var text = (item.text) ? ' '+item.text : '';
var attr = (item.attr) ? ' '+item.attr : '';
var disabled = (item.disabled) ? ' disabled' : '';
var href = (item.href) ? ' href="'+item.href+'"' : '';
var smallLabel = (item.smallLabel) ? '' : '';
var pwd1 = createRandomString(3);
var pwd2 = createRandomString(3);
var pwd3 = createRandomString(3);
var pwgMgr = `
`;
//+tof(item.value,'c')+`
switch (item.type) {
case 'input':
case 'text':
return smallLabel+'';
break;
case 'textbox':
return smallLabel+'';
break;
case 'password':
return smallLabel+pwgMgr+'';
break;
case 'password-alt':
return smallLabel+'
'+pwgMgr+'
';
break;
case 'hidden':
return '';
break;
case 'select':
return smallLabel+'';
break;
case 'select2':
return smallLabel+'';
break;
case 'switch':
case 'checkbox':
return smallLabel+'';
break;
case 'button':
return smallLabel+'';
break;
case 'blank':
return '';
break;
case 'accordion':
return '
'+accordionOptions(item.options, item.id)+'
';
break;
case 'html':
return item.html;
break;
default:
return false;
}
}
function buildPluginsItem(array){
var activePlugins = '';
var inactivePlugins = '';
$.each(array, function(i,v) {
var settingsPage = (v.settings == true) ? `
` : '';
var href = (v.settings == true) ? '#'+v.idPrefix+'-settings-page' : 'javascript:void(0);';
if(v.enabled == true){
var activeToggle = `
`;
if(count%2 == 0 || count == total ){ group += '
'; };
});
group += '
';
}
});
return group;
}
function buildImageManagerViewItem(array){
var imageListing = '';
if (Array.isArray(array)) {
$.each(array, function(i,v) {
var filepath = v.split("/");
var name = filepath[3].split(".");
imageListing += `
`+name[0]+`
`;
});
}
return imageListing;
}
function buildImageManagerView(){
organizrAPI('GET','api/?v1/image/list').success(function(data) {
var response = JSON.parse(data);
$('#settings-image-manager-list').html(buildImageManagerViewItem(response.data));
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
}
function buildCustomizeAppearance(){
organizrAPI('GET','api/?v1/customize/appearance').success(function(data) {
var response = JSON.parse(data);
$('#customize-appearance-form').html(buildFormGroup(response.data));
cssEditor = ace.edit("customCSSEditor");
var CssMode = ace.require("ace/mode/css").Mode;
cssEditor.session.setMode(new CssMode());
cssEditor.setTheme("ace/theme/idle_fingers");
cssEditor.setShowPrintMargin(false);
cssEditor.session.on('change', function(delta) {
if($('.cssTextarea').val() == cssEditor.getValue()){
$('.saveCss').addClass('hidden');
}else{
$('.saveCss').removeClass('hidden');
}
});
/*var colors = jsColorPicker('input.pick-a-color', {
customBG: '#222',
readOnly: false,
init: function(elm, colors) { // colors is a different instance (not connected to colorPicker)
elm.style.backgroundColor = elm.value;
elm.style.color = colors.rgbaMixCustom.luminance > 0.22 ? '#222' : '#ddd';
}
});*/
$("input.pick-a-color").ColorPickerSliders({
placement: 'bottom',
color: '#987654',
hsvpanel: true,
previewformat: 'hex',
});
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
}
function buildSSO(){
organizrAPI('GET','api/?v1/sso').success(function(data) {
var response = JSON.parse(data);
$('#sso-form').html(buildFormGroup(response.data));
;
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
}
function buildSettingsMain(){
organizrAPI('GET','api/?v1/settings/main').success(function(data) {
var response = JSON.parse(data);
$('#settings-main-form').html(buildFormGroup(response.data));
changeAuth();
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
}
function buildUserManagement(){
organizrAPI('GET','api/?v1/user/list').success(function(data) {
var response = JSON.parse(data);
$('#manageUserTable').html(buildUserManagementItem(response.data));
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
}
function buildGroupManagement(){
organizrAPI('GET','api/?v1/user/list').success(function(data) {
var response = JSON.parse(data);
$('#manageGroupTable').html(buildGroupManagementItem(response.data));
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
}
function buildTabEditor(){
organizrAPI('GET','api/?v1/tab/list').success(function(data) {
var response = JSON.parse(data);
$('#tabEditorTable').html(buildTabEditorItem(response.data));
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
}
function buildCategoryEditor(){
organizrAPI('GET','api/?v1/tab/list').success(function(data) {
var response = JSON.parse(data);
$('#categoryEditorTable').html(buildCategoryEditorItem(response.data));
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
}
function settingsAPI(post, callbacks=null){
organizrAPI('POST',post.api,post).success(function(data) {
var response = JSON.parse(data);
console.log(response);
message(post.messageTitle,post.messageBody,"bottom-right","#FFF","success","5000");
if(callbacks){ callbacks.fire(); }
}).fail(function(xhr) {
console.error(post.error);
});
}
/* END ORGANIZR API FUNCTIONS */
function buildLanguage(replace=false,newLang=null){
var languages = languageList();
var languageItems = '';
var currentLanguage = (getCookie('organizrLanguage')) ? getCookie('organizrLanguage') : window.lang.currentLang;
$.each(languages, function(i,v) {
var active = (i == currentLanguage) ? '' : '';
languageItems += `
`;
}else{
items += `
`;
}
}
});
return items;
}
function buildRequestAdminMenuItem(value,category,id,type){
var action = '';
var text = '';
var extra = '';
switch (category) {
case 'approved':
if(value){
//nada
}else{
action = 'approve';
text = 'Approve';
extra = `
` : '';
}
function buildRequestResult(array,media_type=null,list=null,page=null,search=false){
var comments = (typeof array.comments !== 'undefined') ? true : false;
var comment = '';
var results = ``;
var buttons = ``;
var next = ``;
var tv = 0;
var movie = 0;
var total = 0;
if(array.results.length == 0){
return '
No Results
';
}
$.each(array.results, function(i,v) {
media_type = (v.media_type) ? v.media_type : media_type;
if(media_type == 'tv' || media_type == 'movie'){
total = total + 1;
tv = (media_type == 'tv') ? tv + 1 : tv;
movie = (media_type == 'movie') ? movie + 1 : movie;
var bg = (v.poster_path !== null) ? `https://image.tmdb.org/t/p/w300/`+v.poster_path : 'plugins/images/cache/no-list.png';
var top = (v.title) ? v.title : (v.original_title) ? v.original_title : (v.original_name) ? v.original_name : '';
var bottom = (v.release_date) ? v.release_date : (v.first_air_date) ? v.first_air_date : '';
if(comments){
if(array.comments[media_type+':'+v.id] !== null){
comment = array.comments[media_type+':'+v.id];
}
}
results += `
`;
});
break;
default:
}
break;
case 'transmission':
switch (type) {
case 'queue':
if(array.arguments.torrents == 0){
return '
Nothing in queue
';
}
$.each(array.arguments.torrents, function(i,v) {
switch (v.status) {
case 7:
case '7':
var status = 'No Peers';
break;
case 6:
case '6':
var status = 'Seeding';
break;
case 5:
case '5':
var status = 'Seeding Queued';
break;
case 4:
case '4':
var status = 'Downloading';
break;
case 3:
case '3':
var status = 'Queued';
break;
case 2:
case '2':
var status = 'Checking Files';
break;
case 1:
case '1':
var status = 'File Check Queued';
break;
case 0:
case '0':
var status = 'Complete';
break;
default:
var status = 'Complete';
}
var percent = Math.floor(v.percentDone * 100);
v.Category = (v.Category !== '') ? v.Category : 'Not Set';
items += `
`+v.name+`
`+status+`
`+v.downloadDir+`
`+humanFileSize(v.totalSize,true)+`
`+percent+`%
`;
});
break;
default:
}
break;
case 'qBittorrent':
switch (type) {
case 'queue':
if(array.arguments.torrents == 0){
return '
Nothing in queue
';
}
$.each(array.arguments.torrents, function(i,v) {
switch (v.state) {
case 'stalledDL':
var status = 'No Peers';
break;
case 'metaDL':
var status = 'Getting Metadata';
break;
case 'uploading':
var status = 'Seeding';
break;
case 'queuedUP':
var status = 'Seeding Queued';
break;
case 'downloading':
var status = 'Downloading';
break;
case 'queuedDL':
var status = 'Queued';
break;
case 'checkingDL':
case 'checkingUP':
var status = 'Checking Files';
break;
case 'pausedDL':
var status = 'Paused';
break;
case 'pausedUP':
var status = 'Complete';
break;
default:
var status = 'Complete';
}
var percent = Math.floor(v.progress * 100);
var size = v.total_size != -1 ? humanFileSize(v.total_size,true) : "?";
items += `
`+v.name+`
`+status+`
`+v.save_path+`
`+size+`
`+percent+`%
`;
});
break;
default:
}
break;
case 'deluge':
switch (type) {
case 'queue':
if(array.length == 0){
return '
`;
}
var seconds = v.metadata.duration / 1000 ; // or "2000"
seconds = parseInt(seconds) //because moment js dont know to handle number in string format
var format = Math.floor(moment.duration(seconds,'seconds').asHours()) + ':' + moment.duration(seconds,'seconds').minutes() + ':' + moment.duration(seconds,'seconds').seconds();
metadata = `
`;
});
return metadata;
}
function buildYoutubeLink(title){
if(title){
var str = createRandomString(10);
return `
`;
}
}
function buildCalendarMetadata(array){
var metadata = '';
var genres = '';
var actors = '';
var rating = '';
var hasGenre = (typeof array.genres !== 'string') ? true : false;
if(hasGenre){
$.each(array.genres, function(i,v) {
genres += ''+v+'';
});
}
if(array.ratings){
var ratingRound = Math.ceil(array.ratings)*10;
rating = `
`;
}
var seconds = array.runtime / 1000 ; // or "2000"
seconds = parseInt(seconds) //because moment js dont know to handle number in string format
var format = Math.floor(moment.duration(seconds,'seconds').asHours()) + ':' + moment.duration(seconds,'seconds').minutes() + ':' + moment.duration(seconds,'seconds').seconds();
metadata = `
`;
return metadata;
}
function homepageDownloader(type, timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageDownloadRefresh;
//if(isHidden()){ return; }
switch (type) {
case 'sabnzbd':
var action = 'getSabnzbd';
break;
case 'nzbget':
var action = 'getNzbget';
break;
case 'transmission':
var action = 'getTransmission';
break;
case 'qBittorrent':
var action = 'getqBittorrent';
break;
case 'deluge':
var action = 'getDeluge';
break;
default:
}
organizrAPI('POST','api/?v1/homepage/connect',{action:action}).success(function(data) {
var response = JSON.parse(data);
document.getElementById('homepageOrder'+type).innerHTML = '';
if(response.data !== null){
$('#homepageOrder'+type).html(buildDownloader(response.data, type));
}
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
var timeoutTitle = type+'-Downloader';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageDownloader(type,timeout); }, timeout);
}
function homepageStream(type, timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageStreamRefresh;
switch (type) {
case 'plex':
var action = 'getPlexStreams';
break;
case 'emby':
var action = 'getEmbyStreams';
break;
default:
}
organizrAPI('POST','api/?v1/homepage/connect',{action:action}).success(function(data) {
var response = JSON.parse(data);
document.getElementById('homepageOrder'+type+'nowplaying').innerHTML = '';
$('#homepageOrder'+type+'nowplaying').html(buildStream(response.data, type));
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
var timeoutTitle = type+'-Stream';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageStream(type,timeout); }, timeout);
}
function homepageRecent(type, timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageRecentRefresh;
//if(isHidden()){ return; }
switch (type) {
case 'plex':
var action = 'getPlexRecent';
break;
case 'emby':
var action = 'getEmbyRecent';
break;
default:
}
organizrAPI('POST','api/?v1/homepage/connect',{action:action}).success(function(data) {
var response = JSON.parse(data);
document.getElementById('homepageOrder'+type+'recent').innerHTML = '';
$('#homepageOrder'+type+'recent').html(buildRecent(response.data, type));
$('.recent-items').owlCarousel({
nav:false,
autoplay:false,
dots:false,
margin:10,
autoWidth:true,
items:4
})
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
var timeoutTitle = type+'-Recent';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageRecent(type,timeout); }, timeout);
}
function homepagePlaylist(type, timeout=30000){
//if(isHidden()){ return; }
switch (type) {
case 'plex':
var action = 'getPlexPlaylists';
break;
default:
}
organizrAPI('POST','api/?v1/homepage/connect',{action:action}).success(function(data) {
var response = JSON.parse(data);
document.getElementById('homepageOrder'+type+'playlist').innerHTML = '';
$('#homepageOrder'+type+'playlist').html(buildPlaylist(response.data, type));
$('.playlist-items').owlCarousel({
nav:false,
autoplay:false,
dots:false,
margin:10,
autoWidth:true,
items:4
})
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
}
function homepageRequests(timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.ombiRefresh;
organizrAPI('POST','api/?v1/homepage/connect',{action:'getRequests'}).success(function(data) {
var response = JSON.parse(data);
document.getElementById('homepageOrderombi').innerHTML = '';
if(response.data.content !== false){
$('#homepageOrderombi').html(buildRequest(response.data));
}
$('.request-items').owlCarousel({
nav:false,
autoplay:false,
dots:false,
margin:10,
autoWidth:true,
items:4
})
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
if(typeof timeouts['ombi'] !== 'undefined'){ clearTimeout(timeouts['ombi']); }
timeouts['ombi'] = setTimeout(function(){ homepageRequests(timeout); }, timeout);
}
function homepageCalendar(timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.calendarRefresh;
//if(isHidden()){ return; }
organizrAPI('POST','api/?v1/homepage/connect',{action:'getCalendar'}).success(function(data) {
var response = JSON.parse(data);
$('#calendar').fullCalendar('removeEvents');
$('#calendar').fullCalendar('addEventSource', response.data);
response = '';
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
if(typeof timeouts['calendar'] !== 'undefined'){ clearTimeout(timeouts['calendar']); }
timeouts['calendar'] = setTimeout(function(){ homepageCalendar(timeout); }, timeout);
}
function clearAJAX(id='all'){
if(id == 'all'){
$.each(timeouts, function(i,v) {
clearTimeout(timeouts[i]);
});
}else{
clearTimeout(timeouts[id]);
}
}
//Generate API
function generateCode() {
var code = "";
var possible = "abcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < 20; i++)
code += possible.charAt(Math.floor(Math.random() * possible.length));
return code;
}
// uppercase word
function toUpper(str) {
return str
.toLowerCase()
.split(' ')
.map(function(word) {
return word[0].toUpperCase() + word.substr(1);
})
.join(' ');
}
// human filesize
function humanFileSize(bytes, si) {
var thresh = si ? 1000 : 1024;
if(Math.abs(bytes) < thresh) {
return bytes + ' B';
}
var units = si
? ['kB','MB','GB','TB','PB','EB','ZB','YB']
: ['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'];
var u = -1;
do {
bytes /= thresh;
++u;
} while(Math.abs(bytes) >= thresh && u < units.length - 1);
return bytes.toFixed(1)+' '+units[u];
}
//youtube search
function youtubeSearch(searchQuery) {
return $.ajax({
url: "https://www.googleapis.com/youtube/v3/search?part=snippet&q="+searchQuery+"+offcial+trailer&part=snippet&maxResults=1&type=video&videoDuration=short&key=AIzaSyD-8SHutB60GCcSM8q_Fle38rJUV7ujd8k",
});
}
function youtubeCheck(title,link){
youtubeSearch(title).success(function(data) {
inlineLoad();
var id = data.items["0"].id.videoId;
var div = `
`;
$('.youtube-div').html(div);
$('.'+link).trigger('click');
player = new Plyr('#player-'+link);
}).fail(function(xhr) {
console.error("Organizr Function: YouTube Connection Failed");
});
}
//request search
function requestSearch(title,page=1) {
return $.ajax({
url: "https://api.themoviedb.org/3/search/multi?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language="+activeInfo.language+"&query="+title+"&page="+page+"&include_adult=false",
});
}
function requestSearchList(list,page=1) {
var url = '';
switch (list) {
case 'top-movie':
url = 'https://api.themoviedb.org/3/movie/top_rated?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'&page='+page;
break;
case 'pop-movie':
url = 'https://api.themoviedb.org/3/movie/popular?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'&page='+page;
break;
case 'up-movie':
url = 'https://api.themoviedb.org/3/movie/upcoming?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'&page='+page;
break;
case 'theatre-movie':
url = 'https://api.themoviedb.org/3/movie/now_playing?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'&page='+page;
break;
case 'top-tv':
url = 'https://api.themoviedb.org/3/tv/top_rated?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'&page='+page;
break;
case 'pop-tv':
url = 'https://api.themoviedb.org/3/tv/popular?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'&page='+page;
break;
case 'today-tv':
url = 'https://api.themoviedb.org/3/tv/airing_today?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'&page='+page;
break;
case 'org-mod':
url = 'https://api.themoviedb.org/4/list/64438?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'&page='+page;
break;
default:
}
return $.ajax({
url: url,
});
}
function requestNewID(id) {
return $.ajax({
url: "https://api.themoviedb.org/3/tv/"+id+"/external_ids?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=en-US",
});
}
function inlineLoad(){
$('.inline-popups').magnificPopup({
removalDelay: 500, //delay removal by X to allow out-animation
closeOnBgClick: true,
//closeOnContentClick: true,
callbacks: {
beforeOpen: function() {
this.st.mainClass = this.st.el.attr('data-effect');
this.st.focus = '#request-input';
},
close: function() {
if(typeof player !== 'undefined'){
console.log('STOP STOP STOP')
player.destroy();
}
}
},
midClick: true // allow opening popup on middle mouse click. Always set it to true if you don't provide alternative source.
});
}
//Settings change auth
function changeAuth(){
var type = $('#authSelect').val();
var service = $('#authBackendSelect').val();
switch (service) {
case 'plex':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.plexAuth').parent().parent().parent().show();
break;
case 'emby_local':
case 'emby_connect':
case 'emby_all':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.embyAuth').parent().parent().parent().show();
break;
case 'ftp':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.ftpAuth').parent().parent().parent().show();
break;
case 'ldap':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.ldapAuth').parent().parent().parent().show();
break;
default:
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
}
if(type == 'internal') { $('.switchAuth').parent().parent().parent().hide(); }
}
function organizrSpecialSettings(array){
//media search
if(array.settings.homepage.search.enabled == true && typeof array.settings.homepage.search.type !== 'undefined'){
var htmlDOM = `
`;
var searchBoxResults = `
`;
$(htmlDOM).prependTo('.navbar-right');
$(searchBoxResults).appendTo($('.organizr-area'));
}
}
function forceSearch(term){
$.magnificPopup.close();
var tabName = $("li[data-url^='api/?v1/homepage/page']").find('span').html();
if($("li[data-url^='api/?v1/homepage/page']").find('i').hasClass('tabLoaded')){
console.log('yup');
if($("li[data-url^='api/?v1/homepage/page']").find('a').hasClass('active')){
setTimeout(
function(){
$('#newRequestButton').trigger('click');
$('#request-input').val(term);
doneTyping();
},
1000);
}else{
tabActions('click',tabName,0);
setTimeout(
function(){
$('#newRequestButton').trigger('click');
$('#request-input').val(term);
doneTyping();
},
1000);
}
}else{
tabActions('click',tabName,0);
setTimeout(
function(){
$('#newRequestButton').trigger('click');
$('#request-input').val(term);
doneTyping();
},
3000);
}
}
function splitPoster(str){
var words = str.split(' ');
var newWord = '';
$.each(words, function(i,v) {
newWord += v+' ';
});
return newWord;
}
function buildMediaResults(array,source,term){
if(array.content.length == 0){
var none = '
No Results for:
'+term+'
';
none += (activeInfo.settings.homepage.ombi.enabled == true) ? `` : '';
return none;
}
var results = '';
var tv = 0;
var movie = 0;
var music = 0;
var total = 0;
$.each(array.content, function(i,v) {
total = total + 1;
tv = (v.type == 'tv') ? tv + 1 : tv;
movie = (v.type == 'movie') ? movie + 1 : movie;
music = (v.type == 'music') ? music + 1 : music;
var bg = v.imageURL;
var top = v.title;
var bottom = v.metadata.originallyAvailableAt;
results += `