Splitting app.js
This commit is contained in:
parent
194a492a2a
commit
5aeb7ab02a
6 changed files with 532 additions and 523 deletions
280
js/api.js
Normal file
280
js/api.js
Normal file
|
@ -0,0 +1,280 @@
|
|||
function loadArtists(id, refresh) {
|
||||
console.log("LOAD ARTISTS");
|
||||
if (refresh) {
|
||||
$('#ArtistContainer').empty();
|
||||
}
|
||||
var url;
|
||||
if (id == "all") {
|
||||
url = baseURL + '/getIndexes.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp';
|
||||
} else if (id) {
|
||||
url = baseURL + '/getIndexes.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp&musicFolderId=' + id;
|
||||
} else {
|
||||
url = baseURL + '/getIndexes.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp';
|
||||
}
|
||||
console.log(url);
|
||||
var content = $('#ArtistContainer').html();
|
||||
if (content === "") {
|
||||
// Load Artist List
|
||||
$.ajax({
|
||||
url: url,
|
||||
method: 'GET',
|
||||
dataType: 'jsonp',
|
||||
timeout: 10000,
|
||||
done: function() { console.log("DONE!"); },
|
||||
error: function() { console.log("ERROR!"); },
|
||||
success: function (data) {
|
||||
console.log("SUCCESS");
|
||||
if (data["subsonic-response"].status === 'ok') {
|
||||
var indexlist, indexname;
|
||||
|
||||
// There is a bug in the API that doesn't return a JSON array for one artist
|
||||
var indexes = [];
|
||||
if (data["subsonic-response"].indexes.index.length > 0) {
|
||||
indexes = data["subsonic-response"].indexes.index;
|
||||
} else {
|
||||
indexes[0] = data["subsonic-response"].indexes.index;
|
||||
}
|
||||
|
||||
$.each(indexes, function (i, index) {
|
||||
if (index.name === '#') {
|
||||
indexname = '0-9';
|
||||
} else {
|
||||
indexname = index.name;
|
||||
}
|
||||
$('<li class=\"index\" id=\"index_' + indexname + '\" title=\"Scroll to Top\">' + indexname + '<span class=\"floatright\">↑</span></li>').appendTo("#ArtistContainer");
|
||||
indexlist += '<li><a href=\"#\">' + indexname + '</a></li>';
|
||||
var artists = [];
|
||||
if (index.artist.length > 0) {
|
||||
artists = index.artist;
|
||||
} else {
|
||||
artists[0] = index.artist;
|
||||
}
|
||||
$.each(artists, function (i, artist) {
|
||||
if (artist.name !== undefined) {
|
||||
var html = "";
|
||||
html += '<li id=\"' + artist.id + '\" class=\"item\">';
|
||||
html += '<span>' + artist.name + '</span>';
|
||||
html += '</li>';
|
||||
$(html).appendTo("#ArtistContainer");
|
||||
}
|
||||
});
|
||||
});
|
||||
//$(indexlist).appendTo("#IndexList");
|
||||
$("#BottomIndex").empty();
|
||||
$(indexlist).appendTo("#BottomIndex");
|
||||
} else {
|
||||
var error = data["subsonic-response"].status;
|
||||
var errorcode = data["subsonic-response"].error.code;
|
||||
var errormsg = data["subsonic-response"].error.message;
|
||||
alert('Status: ' + error + ', Code: ' + errorcode + ', Message: ' + errormsg);
|
||||
//var errorhtml = '<li class=\"item\"><span>' + error + '</span></li>';
|
||||
//$(errorhtml).appendTo("#IndexList");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
function getMusicFolders() {
|
||||
$.ajax({
|
||||
url: baseURL + '/getMusicFolders.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp',
|
||||
method: 'GET',
|
||||
dataType: 'jsonp',
|
||||
timeout: 10000,
|
||||
beforeSend: function (req) {
|
||||
req.setRequestHeader('Authorization', auth);
|
||||
},
|
||||
success: function (data) {
|
||||
if (data["subsonic-response"].musicFolders.musicFolder !== undefined) {
|
||||
// There is a bug in the API that doesn't return a JSON array for one artist
|
||||
var folders = [];
|
||||
if (data["subsonic-response"].musicFolders.musicFolder.length > 0) {
|
||||
folders = data["subsonic-response"].musicFolders.musicFolder;
|
||||
} else {
|
||||
folders[0] = data["subsonic-response"].musicFolders.musicFolder;
|
||||
}
|
||||
|
||||
var savedMusicFolder = $.cookie('MusicFolders');
|
||||
var options = [];
|
||||
options.push('<option value="all">All Folders</option>');
|
||||
$.each(folders, function (i, folder) {
|
||||
if (savedMusicFolder == folder.id) {
|
||||
options.push('<option value="' + folder.id + '" selected>' + folder.name + '</option>');
|
||||
} else {
|
||||
options.push('<option value="' + folder.id + '">' + folder.name + '</option>');
|
||||
}
|
||||
});
|
||||
$('#MusicFolders').html(options.join(''));
|
||||
} else {
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
function getAlbums(id, action, appendto) {
|
||||
$.ajax({
|
||||
url: baseURL + '/getMusicDirectory.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp&id=' + id,
|
||||
method: 'GET',
|
||||
dataType: 'jsonp',
|
||||
timeout: 10000,
|
||||
beforeSend: function (req) {
|
||||
req.setRequestHeader('Authorization', auth);
|
||||
},
|
||||
success: function (data) {
|
||||
if (action === '') {
|
||||
$('#AlbumRows').empty();
|
||||
}
|
||||
if (action === 'autoplay') {
|
||||
$('#CurrentPlaylistContainer tbody').empty();
|
||||
}
|
||||
if (data["subsonic-response"].directory.child !== undefined) {
|
||||
// There is a bug in the API that doesn't return a JSON array for one artist
|
||||
var children = [];
|
||||
if (data["subsonic-response"].directory.child.length > 0) {
|
||||
children = data["subsonic-response"].directory.child;
|
||||
} else {
|
||||
children[0] = data["subsonic-response"].directory.child;
|
||||
}
|
||||
|
||||
var rowcolor;
|
||||
var albumhtml;
|
||||
var isDir;
|
||||
var header;
|
||||
$.each(children, function (i, child) {
|
||||
if (i % 2 === 0) {
|
||||
rowcolor = 'even';
|
||||
} else {
|
||||
rowcolor = 'odd';
|
||||
}
|
||||
isDir = child.isDir;
|
||||
if (isDir === true) {
|
||||
albumhtml = generateAlbumHTML(rowcolor, child.id, child.parent, child.coverArt, child.title, child.artist, child.userRating);
|
||||
} else {
|
||||
var track;
|
||||
if (child.track === undefined) { track = " "; } else { track = child.track; }
|
||||
var time = secondsToTime(child.duration);
|
||||
albumhtml = generateSongHTML(rowcolor, child.id, child.parent, track, child.title, child.artist, child.album, child.coverArt, child.userRating, time['m'], time['s']);
|
||||
}
|
||||
$(albumhtml).appendTo(appendto);
|
||||
});
|
||||
if (appendto === '#CurrentPlaylistContainer') {
|
||||
updateMessage(children.length + ' Song(s) Added');
|
||||
}
|
||||
if (appendto === '#AlbumRows' && isDir === true) {
|
||||
header = generateAlbumHeaderHTML();
|
||||
}
|
||||
if (appendto === '#AlbumRows' && isDir === false) {
|
||||
header = generateSongHeaderHTML();
|
||||
}
|
||||
$("#AlbumHeader").html(header);
|
||||
if (action === 'autoplay') {
|
||||
autoPlay();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
function getAlbumListBy(id) {
|
||||
var size;
|
||||
if ($.cookie('AutoAlbumSize') === null) {
|
||||
size = 15;
|
||||
} else {
|
||||
size = $.cookie('AutoAlbumSize');
|
||||
}
|
||||
$.ajax({
|
||||
url: baseURL + '/getAlbumList.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp&size=' + size + '&type=' + id,
|
||||
method: 'GET',
|
||||
dataType: 'jsonp',
|
||||
timeout: 10000,
|
||||
beforeSend: function (req) {
|
||||
req.setRequestHeader('Authorization', auth);
|
||||
},
|
||||
success: function (data) {
|
||||
if (data["subsonic-response"].albumList.album !== undefined) {
|
||||
$("#AlbumRows").empty();
|
||||
var header = generateAlbumHeaderHTML();
|
||||
$("#AlbumHeader").html(header);
|
||||
// There is a bug in the API that doesn't return a JSON array for one artist
|
||||
var albums = [];
|
||||
if (data["subsonic-response"].albumList.album.length > 0) {
|
||||
albums = data["subsonic-response"].albumList.album;
|
||||
} else {
|
||||
albums[0] = data["subsonic-response"].albumList.album;
|
||||
}
|
||||
|
||||
var rowcolor;
|
||||
var html;
|
||||
$.each(albums, function (i, album) {
|
||||
if (i % 2 === 0) {
|
||||
rowcolor = 'even';
|
||||
} else {
|
||||
rowcolor = 'odd';
|
||||
}
|
||||
// Only show albums, not songs (Rated songs will also be returned in API call, trying to display them will break Back button, disabled for now)
|
||||
var albumhtml;
|
||||
if (album.isDir === true) {
|
||||
albumhtml = generateAlbumHTML(rowcolor, album.id, album.parent, album.coverArt, album.title, album.artist, album.userRating);
|
||||
}
|
||||
$(albumhtml).appendTo("#AlbumRows");
|
||||
});
|
||||
} else {
|
||||
$('#AlbumRows').empty();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
function getRandomSongList(action, appendto) {
|
||||
var size;
|
||||
if ($.cookie('AutoPlaylistSize') === null) {
|
||||
size = 25;
|
||||
} else {
|
||||
size = $.cookie('AutoPlaylistSize');
|
||||
}
|
||||
$.ajax({
|
||||
url: baseURL + '/getRandomSongs.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp&size=' + size,
|
||||
method: 'GET',
|
||||
dataType: 'jsonp',
|
||||
timeout: 10000,
|
||||
beforeSend: function (req) {
|
||||
req.setRequestHeader('Authorization', auth);
|
||||
},
|
||||
success: function (data) {
|
||||
if (data["subsonic-response"].randomSongs.song !== undefined) {
|
||||
if (appendto === '#TrackContainer') {
|
||||
$("#TrackContainer").empty();
|
||||
}
|
||||
if (action === 'autoplay') {
|
||||
$(appendto).empty();
|
||||
}
|
||||
// There is a bug in the API that doesn't return a JSON array for one artist
|
||||
var items = [];
|
||||
if (data["subsonic-response"].randomSongs.song.length > 0) {
|
||||
items = data["subsonic-response"].randomSongs.song;
|
||||
} else {
|
||||
items[0] = data["subsonic-response"].randomSongs.song;
|
||||
}
|
||||
|
||||
var rowcolor;
|
||||
var html;
|
||||
$.each(items, function (i, item) {
|
||||
if (i % 2 === 0) {
|
||||
rowcolor = 'even';
|
||||
} else {
|
||||
rowcolor = 'odd';
|
||||
}
|
||||
var track;
|
||||
if (item.track === undefined) { track = " "; } else { track = item.track; }
|
||||
var time = secondsToTime(item.duration);
|
||||
html = generateSongHTML(rowcolor, item.id, item.parent, track, item.title, item.artist, item.album, item.coverArt, item.userRating, time['m'], time['s']);
|
||||
$(html).appendTo(appendto);
|
||||
});
|
||||
if (appendto === '#CurrentPlaylistContainer') {
|
||||
updateMessage(items.length + ' Song(s) Added');
|
||||
}
|
||||
if (action === 'autoplay') {
|
||||
autoPlay();
|
||||
}
|
||||
} else {
|
||||
$(appendto).empty();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
522
js/app.js
522
js/app.js
|
@ -62,347 +62,6 @@ function loadTabContent(tab) {
|
|||
}
|
||||
}
|
||||
|
||||
function loadArtists(id, refresh) {
|
||||
console.log("LOAD ARTISTS");
|
||||
if (refresh) {
|
||||
$('#ArtistContainer').empty();
|
||||
}
|
||||
var url;
|
||||
if (id == "all") {
|
||||
url = baseURL + '/getIndexes.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp';
|
||||
} else if (id) {
|
||||
url = baseURL + '/getIndexes.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp&musicFolderId=' + id;
|
||||
} else {
|
||||
url = baseURL + '/getIndexes.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp';
|
||||
}
|
||||
console.log(url);
|
||||
var content = $('#ArtistContainer').html();
|
||||
if (content === "") {
|
||||
// Load Artist List
|
||||
$.ajax({
|
||||
url: url,
|
||||
method: 'GET',
|
||||
dataType: 'jsonp',
|
||||
timeout: 10000,
|
||||
done: function() { console.log("DONE!"); },
|
||||
error: function() { console.log("ERROR!"); },
|
||||
success: function (data) {
|
||||
console.log("SUCCESS");
|
||||
if (data["subsonic-response"].status === 'ok') {
|
||||
var indexlist, indexname;
|
||||
|
||||
// There is a bug in the API that doesn't return a JSON array for one artist
|
||||
var indexes = [];
|
||||
if (data["subsonic-response"].indexes.index.length > 0) {
|
||||
indexes = data["subsonic-response"].indexes.index;
|
||||
} else {
|
||||
indexes[0] = data["subsonic-response"].indexes.index;
|
||||
}
|
||||
|
||||
$.each(indexes, function (i, index) {
|
||||
if (index.name === '#') {
|
||||
indexname = '0-9';
|
||||
} else {
|
||||
indexname = index.name;
|
||||
}
|
||||
$('<li class=\"index\" id=\"index_' + indexname + '\" title=\"Scroll to Top\">' + indexname + '<span class=\"floatright\">↑</span></li>').appendTo("#ArtistContainer");
|
||||
indexlist += '<li><a href=\"#\">' + indexname + '</a></li>';
|
||||
var artists = [];
|
||||
if (index.artist.length > 0) {
|
||||
artists = index.artist;
|
||||
} else {
|
||||
artists[0] = index.artist;
|
||||
}
|
||||
$.each(artists, function (i, artist) {
|
||||
if (artist.name !== undefined) {
|
||||
var html = "";
|
||||
html += '<li id=\"' + artist.id + '\" class=\"item\">';
|
||||
html += '<span>' + artist.name + '</span>';
|
||||
html += '</li>';
|
||||
$(html).appendTo("#ArtistContainer");
|
||||
}
|
||||
});
|
||||
});
|
||||
//$(indexlist).appendTo("#IndexList");
|
||||
$("#BottomIndex").empty();
|
||||
$(indexlist).appendTo("#BottomIndex");
|
||||
} else {
|
||||
var error = data["subsonic-response"].status;
|
||||
var errorcode = data["subsonic-response"].error.code;
|
||||
var errormsg = data["subsonic-response"].error.message;
|
||||
alert('Status: ' + error + ', Code: ' + errorcode + ', Message: ' + errormsg);
|
||||
//var errorhtml = '<li class=\"item\"><span>' + error + '</span></li>';
|
||||
//$(errorhtml).appendTo("#IndexList");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
function getMusicFolders() {
|
||||
$.ajax({
|
||||
url: baseURL + '/getMusicFolders.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp',
|
||||
method: 'GET',
|
||||
dataType: 'jsonp',
|
||||
timeout: 10000,
|
||||
beforeSend: function (req) {
|
||||
req.setRequestHeader('Authorization', auth);
|
||||
},
|
||||
success: function (data) {
|
||||
if (data["subsonic-response"].musicFolders.musicFolder !== undefined) {
|
||||
// There is a bug in the API that doesn't return a JSON array for one artist
|
||||
var folders = [];
|
||||
if (data["subsonic-response"].musicFolders.musicFolder.length > 0) {
|
||||
folders = data["subsonic-response"].musicFolders.musicFolder;
|
||||
} else {
|
||||
folders[0] = data["subsonic-response"].musicFolders.musicFolder;
|
||||
}
|
||||
|
||||
var savedMusicFolder = $.cookie('MusicFolders');
|
||||
var options = [];
|
||||
options.push('<option value="all">All Folders</option>');
|
||||
$.each(folders, function (i, folder) {
|
||||
if (savedMusicFolder == folder.id) {
|
||||
options.push('<option value="' + folder.id + '" selected>' + folder.name + '</option>');
|
||||
} else {
|
||||
options.push('<option value="' + folder.id + '">' + folder.name + '</option>');
|
||||
}
|
||||
});
|
||||
$('#MusicFolders').html(options.join(''));
|
||||
} else {
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
function getAlbums(id, action, appendto) {
|
||||
$.ajax({
|
||||
url: baseURL + '/getMusicDirectory.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp&id=' + id,
|
||||
method: 'GET',
|
||||
dataType: 'jsonp',
|
||||
timeout: 10000,
|
||||
beforeSend: function (req) {
|
||||
req.setRequestHeader('Authorization', auth);
|
||||
},
|
||||
success: function (data) {
|
||||
if (action === '') {
|
||||
$('#AlbumRows').empty();
|
||||
}
|
||||
if (action === 'autoplay') {
|
||||
$('#CurrentPlaylistContainer tbody').empty();
|
||||
}
|
||||
if (data["subsonic-response"].directory.child !== undefined) {
|
||||
// There is a bug in the API that doesn't return a JSON array for one artist
|
||||
var children = [];
|
||||
if (data["subsonic-response"].directory.child.length > 0) {
|
||||
children = data["subsonic-response"].directory.child;
|
||||
} else {
|
||||
children[0] = data["subsonic-response"].directory.child;
|
||||
}
|
||||
|
||||
var rowcolor;
|
||||
var albumhtml;
|
||||
var isDir;
|
||||
var header;
|
||||
$.each(children, function (i, child) {
|
||||
if (i % 2 === 0) {
|
||||
rowcolor = 'even';
|
||||
} else {
|
||||
rowcolor = 'odd';
|
||||
}
|
||||
isDir = child.isDir;
|
||||
if (isDir === true) {
|
||||
albumhtml = generateAlbumHTML(rowcolor, child.id, child.parent, child.coverArt, child.title, child.artist, child.userRating);
|
||||
} else {
|
||||
var track;
|
||||
if (child.track === undefined) { track = " "; } else { track = child.track; }
|
||||
var time = secondsToTime(child.duration);
|
||||
albumhtml = generateSongHTML(rowcolor, child.id, child.parent, track, child.title, child.artist, child.album, child.coverArt, child.userRating, time['m'], time['s']);
|
||||
}
|
||||
$(albumhtml).appendTo(appendto);
|
||||
});
|
||||
if (appendto === '#CurrentPlaylistContainer') {
|
||||
updateMessage(children.length + ' Song(s) Added');
|
||||
}
|
||||
if (appendto === '#AlbumRows' && isDir === true) {
|
||||
header = generateAlbumHeaderHTML();
|
||||
}
|
||||
if (appendto === '#AlbumRows' && isDir === false) {
|
||||
header = generateSongHeaderHTML();
|
||||
}
|
||||
$("#AlbumHeader").html(header);
|
||||
if (action === 'autoplay') {
|
||||
autoPlay();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
function getAlbumListBy(id) {
|
||||
var size;
|
||||
if ($.cookie('AutoAlbumSize') === null) {
|
||||
size = 15;
|
||||
} else {
|
||||
size = $.cookie('AutoAlbumSize');
|
||||
}
|
||||
$.ajax({
|
||||
url: baseURL + '/getAlbumList.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp&size=' + size + '&type=' + id,
|
||||
method: 'GET',
|
||||
dataType: 'jsonp',
|
||||
timeout: 10000,
|
||||
beforeSend: function (req) {
|
||||
req.setRequestHeader('Authorization', auth);
|
||||
},
|
||||
success: function (data) {
|
||||
if (data["subsonic-response"].albumList.album !== undefined) {
|
||||
$("#AlbumRows").empty();
|
||||
var header = generateAlbumHeaderHTML();
|
||||
$("#AlbumHeader").html(header);
|
||||
// There is a bug in the API that doesn't return a JSON array for one artist
|
||||
var albums = [];
|
||||
if (data["subsonic-response"].albumList.album.length > 0) {
|
||||
albums = data["subsonic-response"].albumList.album;
|
||||
} else {
|
||||
albums[0] = data["subsonic-response"].albumList.album;
|
||||
}
|
||||
|
||||
var rowcolor;
|
||||
var html;
|
||||
$.each(albums, function (i, album) {
|
||||
if (i % 2 === 0) {
|
||||
rowcolor = 'even';
|
||||
} else {
|
||||
rowcolor = 'odd';
|
||||
}
|
||||
// Only show albums, not songs (Rated songs will also be returned in API call, trying to display them will break Back button, disabled for now)
|
||||
var albumhtml;
|
||||
if (album.isDir === true) {
|
||||
albumhtml = generateAlbumHTML(rowcolor, album.id, album.parent, album.coverArt, album.title, album.artist, album.userRating);
|
||||
}
|
||||
$(albumhtml).appendTo("#AlbumRows");
|
||||
});
|
||||
} else {
|
||||
$('#AlbumRows').empty();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
function getRandomSongList(action, appendto) {
|
||||
var size;
|
||||
if ($.cookie('AutoPlaylistSize') === null) {
|
||||
size = 25;
|
||||
} else {
|
||||
size = $.cookie('AutoPlaylistSize');
|
||||
}
|
||||
$.ajax({
|
||||
url: baseURL + '/getRandomSongs.view?u=' + username + '&p=' + passwordenc + '&v=' + version + '&c=' + applicationName + '&f=jsonp&size=' + size,
|
||||
method: 'GET',
|
||||
dataType: 'jsonp',
|
||||
timeout: 10000,
|
||||
beforeSend: function (req) {
|
||||
req.setRequestHeader('Authorization', auth);
|
||||
},
|
||||
success: function (data) {
|
||||
if (data["subsonic-response"].randomSongs.song !== undefined) {
|
||||
if (appendto === '#TrackContainer') {
|
||||
$("#TrackContainer").empty();
|
||||
}
|
||||
if (action === 'autoplay') {
|
||||
$(appendto).empty();
|
||||
}
|
||||
// There is a bug in the API that doesn't return a JSON array for one artist
|
||||
var items = [];
|
||||
if (data["subsonic-response"].randomSongs.song.length > 0) {
|
||||
items = data["subsonic-response"].randomSongs.song;
|
||||
} else {
|
||||
items[0] = data["subsonic-response"].randomSongs.song;
|
||||
}
|
||||
|
||||
var rowcolor;
|
||||
var html;
|
||||
$.each(items, function (i, item) {
|
||||
if (i % 2 === 0) {
|
||||
rowcolor = 'even';
|
||||
} else {
|
||||
rowcolor = 'odd';
|
||||
}
|
||||
var track;
|
||||
if (item.track === undefined) { track = " "; } else { track = item.track; }
|
||||
var time = secondsToTime(item.duration);
|
||||
html = generateSongHTML(rowcolor, item.id, item.parent, track, item.title, item.artist, item.album, item.coverArt, item.userRating, time['m'], time['s']);
|
||||
$(html).appendTo(appendto);
|
||||
});
|
||||
if (appendto === '#CurrentPlaylistContainer') {
|
||||
updateMessage(items.length + ' Song(s) Added');
|
||||
}
|
||||
if (action === 'autoplay') {
|
||||
autoPlay();
|
||||
}
|
||||
} else {
|
||||
$(appendto).empty();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
function generateAlbumHeaderHTML() {
|
||||
var html;
|
||||
html = '<tr><th></th><th></th><th>Album</th><th>Artist</th></tr>';
|
||||
return html;
|
||||
}
|
||||
function generateAlbumHTML(rowcolor, childid, parentid, coverart, title, artist, rating) {
|
||||
var html;
|
||||
html = '<tr class=\"album ' + rowcolor + '\" childid=\"' + childid + '\" parentid=\"' + parentid + '\" userrating=\"' + rating + '\">';
|
||||
html += '<td class=\"itemactions\"><a class=\"add\" href=\"\" title=\"Add To Current Playlist\"></a>';
|
||||
html += '<a class=\"play\" href=\"\" title=\"Play\"></a>';
|
||||
html += '<a class=\"download\" href=\"\" title=\"Download\"></a>';
|
||||
if (rating === 5) {
|
||||
html += '<a class=\"favorite\" href=\"\" title=\"Favorite\"></a>';
|
||||
} else {
|
||||
html += '<a class=\"rate\" href=\"\" title=\"Add To Favorites\"></a>';
|
||||
}
|
||||
html += '</td>';
|
||||
html += '<td class=\"albumart\"><img src=\"' + baseURL + '/getCoverArt.view?v=' + version + '&c=' + applicationName + '&f=jsonp&size=50&id=' + coverart + '\" /></td>';
|
||||
html += '<td class=\"album\">' + title + '</td>';
|
||||
html += '<td class=\"artist\">' + artist + '</td>';
|
||||
html += '</tr>';
|
||||
return html;
|
||||
}
|
||||
function generateSongHeaderHTML() {
|
||||
var html;
|
||||
html = '<tr><th></th><th>Track</th><th>Title</th><th>Artist</th><th>Album</th><th class=\"alignright\">Time</th></tr>';
|
||||
return html;
|
||||
}
|
||||
function generateSongHTML(rowcolor, childid, parentid, track, title, artist, album, coverart, rating, m, s) {
|
||||
var html;
|
||||
html = '<tr class=\"song ' + rowcolor + '\" childid=\"' + childid + '\" parentid=\"' + parentid + '\" userrating=\"' + rating + '\">';
|
||||
html += '<td class=\"itemactions\"><a class=\"add\" href=\"\" title=\"Add To Current Playlist\"></a>';
|
||||
html += '<a class=\"remove\" href=\"\" title=\"Remove\"></a>';
|
||||
html += '<a class=\"play\" href=\"\" title=\"Play\"></a>';
|
||||
if (rating === 5) {
|
||||
html += '<a class=\"favorite\" href=\"\" title=\"Favorite\"></a>';
|
||||
} else {
|
||||
html += '<a class=\"rate\" href=\"\" title=\"Add To Favorites\"></a>';
|
||||
}
|
||||
html += '</td>';
|
||||
html += '<td class=\"track\">' + track + '</td>';
|
||||
html += '<td class=\"title\">' + title + '</td>';
|
||||
html += '<td class=\"artist\">' + artist + '</td>';
|
||||
html += '<td class=\"album\">' + album + '<img src=\"' + baseURL + '/getCoverArt.view?v=' + version + '&c=' + applicationName + '&f=jsonp&size=25&id=' + coverart + '\" /></td>';
|
||||
html += '<td class=\"time\">' + m + ':' + s + '</td>';
|
||||
html += '</tr>';
|
||||
return html;
|
||||
}
|
||||
|
||||
function refreshRowColor() {
|
||||
$.each($('table.songlist tr.song'), function (i) {
|
||||
$(this).removeClass('even odd');
|
||||
var rowcolor;
|
||||
if (i % 2 === 0) {
|
||||
rowcolor = 'even';
|
||||
} else {
|
||||
rowcolor = 'odd';
|
||||
}
|
||||
$(this).addClass(rowcolor);
|
||||
});
|
||||
}
|
||||
var scrobbled = false;
|
||||
function playSong(el, songid, albumid) {
|
||||
$.ajax({
|
||||
|
@ -1037,184 +696,3 @@ function getPlaylist(id, action, appendto) {
|
|||
});
|
||||
}
|
||||
|
||||
/* Reusable Functions */
|
||||
function confirmDelete() {
|
||||
var question = confirm('Are you sure you want to delete the selected item(s)?');
|
||||
if (question) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
function makeBaseAuth(user, password) {
|
||||
var tok = user + ':' + password;
|
||||
var hash = $.base64Encode(tok);
|
||||
return "Basic " + hash;
|
||||
}
|
||||
function HexEncode(n) {
|
||||
for (var u = "0123456789abcdef", i = [], r = [], t = 0; t < 256; t++)
|
||||
i[t] = u.charAt(t >> 4) + u.charAt(t & 15);
|
||||
for (t = 0; t < n.length; t++)
|
||||
r[t] = i[n.charCodeAt(t)];
|
||||
return r.join("")
|
||||
}
|
||||
function findKeyForCode(code) {
|
||||
var map = { 'keymap': [
|
||||
{ 'key': 'a', 'code': 65 },
|
||||
{ 'key': 'b', 'code': 66 },
|
||||
{ 'key': 'c', 'code': 67 },
|
||||
{ 'key': 'd', 'code': 68 },
|
||||
{ 'key': 'e', 'code': 69 },
|
||||
{ 'key': 'f', 'code': 70 },
|
||||
{ 'key': 'g', 'code': 71 },
|
||||
{ 'key': 'h', 'code': 72 },
|
||||
{ 'key': 'i', 'code': 73 },
|
||||
{ 'key': 'j', 'code': 74 },
|
||||
{ 'key': 'k', 'code': 75 },
|
||||
{ 'key': 'l', 'code': 76 },
|
||||
{ 'key': 'm', 'code': 77 },
|
||||
{ 'key': 'n', 'code': 78 },
|
||||
{ 'key': 'o', 'code': 79 },
|
||||
{ 'key': 'p', 'code': 80 },
|
||||
{ 'key': 'q', 'code': 81 },
|
||||
{ 'key': 'r', 'code': 82 },
|
||||
{ 'key': 's', 'code': 83 },
|
||||
{ 'key': 't', 'code': 84 },
|
||||
{ 'key': 'u', 'code': 85 },
|
||||
{ 'key': 'v', 'code': 86 },
|
||||
{ 'key': 'w', 'code': 87 },
|
||||
{ 'key': 'x', 'code': 88 },
|
||||
{ 'key': 'y', 'code': 89 },
|
||||
{ 'key': 'z', 'code': 90 }
|
||||
]
|
||||
};
|
||||
var keyFound = 0;
|
||||
$.each(map.keymap, function (i, mapping) {
|
||||
if (mapping.code === code) {
|
||||
keyFound = mapping.key;
|
||||
}
|
||||
});
|
||||
return keyFound;
|
||||
}
|
||||
function popOut()
|
||||
{
|
||||
window.open(hostURL, "External Player", "status = 1, height = 735, width = 840, resizable = 0");
|
||||
}
|
||||
function secondsToTime(secs) {
|
||||
var hours = Math.floor(secs / (60 * 60));
|
||||
|
||||
var divisor_for_minutes = secs % (60 * 60);
|
||||
var minutes = Math.floor(divisor_for_minutes / 60);
|
||||
|
||||
var divisor_for_seconds = divisor_for_minutes % 60;
|
||||
var seconds = Math.ceil(divisor_for_seconds);
|
||||
if (seconds < 10) {
|
||||
seconds = '0' + seconds;
|
||||
}
|
||||
|
||||
var obj = {
|
||||
"h": hours,
|
||||
"m": minutes,
|
||||
"s": seconds
|
||||
};
|
||||
return obj;
|
||||
}
|
||||
function updateMessage(msg) {
|
||||
$('#messages').text(msg);
|
||||
$('#messages').fadeIn();
|
||||
setTimeout(function () { $('#messages').fadeOut(); }, 5000);
|
||||
}
|
||||
// Convert to unicode support
|
||||
var toHTML = {
|
||||
on: function (str) {
|
||||
var a = [],
|
||||
i = 0;
|
||||
for (; i < str.length; ) a[i] = str.charCodeAt(i++);
|
||||
return "&#" + a.join(";&#") + ";"
|
||||
},
|
||||
un: function (str) {
|
||||
return str.replace(/&#(x)?([^&]{1,5});?/g,
|
||||
function (a, b, c) {
|
||||
return String.fromCharCode(parseInt(c, b ? 16 : 10))
|
||||
})
|
||||
}
|
||||
};
|
||||
function getParameterByName(name) {
|
||||
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
|
||||
var regexS = "[\\?&]" + name + "=([^&#]*)";
|
||||
var regex = new RegExp(regexS);
|
||||
var results = regex.exec(window.location.search);
|
||||
if (results == null)
|
||||
return "";
|
||||
else
|
||||
return decodeURIComponent(results[1].replace(/\+/g, " "));
|
||||
}
|
||||
function getPathFromUrl(url) {
|
||||
var strurl = url.toString();
|
||||
var u = strurl.substring(0, strurl.indexOf('?'));
|
||||
return u
|
||||
}
|
||||
function setTitle(text) {
|
||||
if (text != "") {
|
||||
document.title = text;
|
||||
}
|
||||
}
|
||||
var timer = null;
|
||||
var scrollMsg = "";
|
||||
var pos = 0;
|
||||
function scrollTitle(text) {
|
||||
if (scrollMsg === "") {
|
||||
if (text === "") {
|
||||
scrollMsg = document.title;
|
||||
} else {
|
||||
scrollMsg = text;
|
||||
}
|
||||
} else {
|
||||
if (text != undefined && text != scrollMsg) {
|
||||
scrollMsg = text;
|
||||
}
|
||||
}
|
||||
var msg = scrollMsg;
|
||||
var speed = 1200;
|
||||
var endChar = " ";
|
||||
var ml = msg.length;
|
||||
|
||||
title = msg.substr(pos, ml) + endChar + msg.substr(0, pos);
|
||||
document.title = title;
|
||||
|
||||
pos++;
|
||||
if (pos > ml) {
|
||||
pos = 0;
|
||||
} else {
|
||||
timer = window.setTimeout("scrollTitle()", speed);
|
||||
}
|
||||
// To stop timer, clearTimeout(timer);
|
||||
}
|
||||
function requestPermissionIfRequired() {
|
||||
if (!hasNotificationPermission() && (window.webkitNotifications)) {
|
||||
window.webkitNotifications.requestPermission();
|
||||
}
|
||||
}
|
||||
function hasNotificationPermission() {
|
||||
return !!(window.webkitNotifications) && (window.webkitNotifications.checkPermission() == 0);
|
||||
}
|
||||
var notifications = new Array();
|
||||
function showNotification(pic, title, text) {
|
||||
if (hasNotificationPermission()) {
|
||||
closeAllNotifications()
|
||||
var popup = window.webkitNotifications.createNotification(pic, title, text);
|
||||
notifications.push(popup);
|
||||
setTimeout(function (notWin) {
|
||||
notWin.cancel();
|
||||
}, 10000, popup);
|
||||
popup.show();
|
||||
} else {
|
||||
console.log("showNotification: No Permission");
|
||||
}
|
||||
}
|
||||
function closeAllNotifications() {
|
||||
for (notification in notifications) {
|
||||
notifications[notification].cancel();
|
||||
}
|
||||
}
|
||||
|
|
9
js/auth.js
Normal file
9
js/auth.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
function auth()
|
||||
{
|
||||
$('#Username').val($.cookie('username'));
|
||||
$('#Password').val($.cookie('password'));
|
||||
$('#AutoAlbumSize').val($.cookie('AutoAlbumSize'));
|
||||
$('#AutoPlaylistSize').val($.cookie('AutoPlaylistSize'));
|
||||
$('#Server').val($.cookie('Server'));
|
||||
$('#ApplicationName').val($.cookie('ApplicationName'));
|
||||
}
|
61
js/generators.js
Normal file
61
js/generators.js
Normal file
|
@ -0,0 +1,61 @@
|
|||
function generateAlbumHeaderHTML() {
|
||||
var html;
|
||||
html = '<tr><th></th><th></th><th>Album</th><th>Artist</th></tr>';
|
||||
return html;
|
||||
}
|
||||
function generateAlbumHTML(rowcolor, childid, parentid, coverart, title, artist, rating) {
|
||||
var html;
|
||||
html = '<tr class=\"album ' + rowcolor + '\" childid=\"' + childid + '\" parentid=\"' + parentid + '\" userrating=\"' + rating + '\">';
|
||||
html += '<td class=\"itemactions\"><a class=\"add\" href=\"\" title=\"Add To Current Playlist\"></a>';
|
||||
html += '<a class=\"play\" href=\"\" title=\"Play\"></a>';
|
||||
html += '<a class=\"download\" href=\"\" title=\"Download\"></a>';
|
||||
if (rating === 5) {
|
||||
html += '<a class=\"favorite\" href=\"\" title=\"Favorite\"></a>';
|
||||
} else {
|
||||
html += '<a class=\"rate\" href=\"\" title=\"Add To Favorites\"></a>';
|
||||
}
|
||||
html += '</td>';
|
||||
html += '<td class=\"albumart\"><img src=\"' + baseURL + '/getCoverArt.view?v=' + version + '&c=' + applicationName + '&f=jsonp&size=50&id=' + coverart + '\" /></td>';
|
||||
html += '<td class=\"album\">' + title + '</td>';
|
||||
html += '<td class=\"artist\">' + artist + '</td>';
|
||||
html += '</tr>';
|
||||
return html;
|
||||
}
|
||||
function generateSongHeaderHTML() {
|
||||
var html;
|
||||
html = '<tr><th></th><th>Track</th><th>Title</th><th>Artist</th><th>Album</th><th class=\"alignright\">Time</th></tr>';
|
||||
return html;
|
||||
}
|
||||
function generateSongHTML(rowcolor, childid, parentid, track, title, artist, album, coverart, rating, m, s) {
|
||||
var html;
|
||||
html = '<tr class=\"song ' + rowcolor + '\" childid=\"' + childid + '\" parentid=\"' + parentid + '\" userrating=\"' + rating + '\">';
|
||||
html += '<td class=\"itemactions\"><a class=\"add\" href=\"\" title=\"Add To Current Playlist\"></a>';
|
||||
html += '<a class=\"remove\" href=\"\" title=\"Remove\"></a>';
|
||||
html += '<a class=\"play\" href=\"\" title=\"Play\"></a>';
|
||||
if (rating === 5) {
|
||||
html += '<a class=\"favorite\" href=\"\" title=\"Favorite\"></a>';
|
||||
} else {
|
||||
html += '<a class=\"rate\" href=\"\" title=\"Add To Favorites\"></a>';
|
||||
}
|
||||
html += '</td>';
|
||||
html += '<td class=\"track\">' + track + '</td>';
|
||||
html += '<td class=\"title\">' + title + '</td>';
|
||||
html += '<td class=\"artist\">' + artist + '</td>';
|
||||
html += '<td class=\"album\">' + album + '<img src=\"' + baseURL + '/getCoverArt.view?v=' + version + '&c=' + applicationName + '&f=jsonp&size=25&id=' + coverart + '\" /></td>';
|
||||
html += '<td class=\"time\">' + m + ':' + s + '</td>';
|
||||
html += '</tr>';
|
||||
return html;
|
||||
}
|
||||
|
||||
function refreshRowColor() {
|
||||
$.each($('table.songlist tr.song'), function (i) {
|
||||
$(this).removeClass('even odd');
|
||||
var rowcolor;
|
||||
if (i % 2 === 0) {
|
||||
rowcolor = 'even';
|
||||
} else {
|
||||
rowcolor = 'odd';
|
||||
}
|
||||
$(this).addClass(rowcolor);
|
||||
});
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
require(["jquery", "sm/soundmanager2-jsmin", "jquery.scrollTo-1.4.2-min", "jquery.disable.text.select.pack",
|
||||
"jquery.cookie", "jquery.base64", "jquery.dateFormat-1.0", "jquery.periodic", "jquery.shuffle",
|
||||
"fancybox/jquery.fancybox-1.3.4.pack",
|
||||
"jquery.linkify-1.0-min", "app", "ui-load", "ui-ready"
|
||||
"jquery.linkify-1.0-min", "utils", "api", "generators", "app", "ui-load", "ui-ready"
|
||||
], function($) {
|
||||
|
||||
$(function() {
|
||||
|
|
181
js/utils.js
Normal file
181
js/utils.js
Normal file
|
@ -0,0 +1,181 @@
|
|||
/* Reusable Functions */
|
||||
function confirmDelete() {
|
||||
var question = confirm('Are you sure you want to delete the selected item(s)?');
|
||||
if (question) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
function makeBaseAuth(user, password) {
|
||||
var tok = user + ':' + password;
|
||||
var hash = $.base64Encode(tok);
|
||||
return "Basic " + hash;
|
||||
}
|
||||
function HexEncode(n) {
|
||||
for (var u = "0123456789abcdef", i = [], r = [], t = 0; t < 256; t++)
|
||||
i[t] = u.charAt(t >> 4) + u.charAt(t & 15);
|
||||
for (t = 0; t < n.length; t++)
|
||||
r[t] = i[n.charCodeAt(t)];
|
||||
return r.join("")
|
||||
}
|
||||
function findKeyForCode(code) {
|
||||
var map = { 'keymap': [
|
||||
{ 'key': 'a', 'code': 65 },
|
||||
{ 'key': 'b', 'code': 66 },
|
||||
{ 'key': 'c', 'code': 67 },
|
||||
{ 'key': 'd', 'code': 68 },
|
||||
{ 'key': 'e', 'code': 69 },
|
||||
{ 'key': 'f', 'code': 70 },
|
||||
{ 'key': 'g', 'code': 71 },
|
||||
{ 'key': 'h', 'code': 72 },
|
||||
{ 'key': 'i', 'code': 73 },
|
||||
{ 'key': 'j', 'code': 74 },
|
||||
{ 'key': 'k', 'code': 75 },
|
||||
{ 'key': 'l', 'code': 76 },
|
||||
{ 'key': 'm', 'code': 77 },
|
||||
{ 'key': 'n', 'code': 78 },
|
||||
{ 'key': 'o', 'code': 79 },
|
||||
{ 'key': 'p', 'code': 80 },
|
||||
{ 'key': 'q', 'code': 81 },
|
||||
{ 'key': 'r', 'code': 82 },
|
||||
{ 'key': 's', 'code': 83 },
|
||||
{ 'key': 't', 'code': 84 },
|
||||
{ 'key': 'u', 'code': 85 },
|
||||
{ 'key': 'v', 'code': 86 },
|
||||
{ 'key': 'w', 'code': 87 },
|
||||
{ 'key': 'x', 'code': 88 },
|
||||
{ 'key': 'y', 'code': 89 },
|
||||
{ 'key': 'z', 'code': 90 }
|
||||
]
|
||||
};
|
||||
var keyFound = 0;
|
||||
$.each(map.keymap, function (i, mapping) {
|
||||
if (mapping.code === code) {
|
||||
keyFound = mapping.key;
|
||||
}
|
||||
});
|
||||
return keyFound;
|
||||
}
|
||||
function popOut()
|
||||
{
|
||||
window.open(hostURL, "External Player", "status = 1, height = 735, width = 840, resizable = 0");
|
||||
}
|
||||
function secondsToTime(secs) {
|
||||
var hours = Math.floor(secs / (60 * 60));
|
||||
|
||||
var divisor_for_minutes = secs % (60 * 60);
|
||||
var minutes = Math.floor(divisor_for_minutes / 60);
|
||||
|
||||
var divisor_for_seconds = divisor_for_minutes % 60;
|
||||
var seconds = Math.ceil(divisor_for_seconds);
|
||||
if (seconds < 10) {
|
||||
seconds = '0' + seconds;
|
||||
}
|
||||
|
||||
var obj = {
|
||||
"h": hours,
|
||||
"m": minutes,
|
||||
"s": seconds
|
||||
};
|
||||
return obj;
|
||||
}
|
||||
function updateMessage(msg) {
|
||||
$('#messages').text(msg);
|
||||
$('#messages').fadeIn();
|
||||
setTimeout(function () { $('#messages').fadeOut(); }, 5000);
|
||||
}
|
||||
// Convert to unicode support
|
||||
var toHTML = {
|
||||
on: function (str) {
|
||||
var a = [],
|
||||
i = 0;
|
||||
for (; i < str.length; ) a[i] = str.charCodeAt(i++);
|
||||
return "&#" + a.join(";&#") + ";"
|
||||
},
|
||||
un: function (str) {
|
||||
return str.replace(/&#(x)?([^&]{1,5});?/g,
|
||||
function (a, b, c) {
|
||||
return String.fromCharCode(parseInt(c, b ? 16 : 10))
|
||||
})
|
||||
}
|
||||
};
|
||||
function getParameterByName(name) {
|
||||
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
|
||||
var regexS = "[\\?&]" + name + "=([^&#]*)";
|
||||
var regex = new RegExp(regexS);
|
||||
var results = regex.exec(window.location.search);
|
||||
if (results == null)
|
||||
return "";
|
||||
else
|
||||
return decodeURIComponent(results[1].replace(/\+/g, " "));
|
||||
}
|
||||
function getPathFromUrl(url) {
|
||||
var strurl = url.toString();
|
||||
var u = strurl.substring(0, strurl.indexOf('?'));
|
||||
return u
|
||||
}
|
||||
function setTitle(text) {
|
||||
if (text != "") {
|
||||
document.title = text;
|
||||
}
|
||||
}
|
||||
var timer = null;
|
||||
var scrollMsg = "";
|
||||
var pos = 0;
|
||||
function scrollTitle(text) {
|
||||
if (scrollMsg === "") {
|
||||
if (text === "") {
|
||||
scrollMsg = document.title;
|
||||
} else {
|
||||
scrollMsg = text;
|
||||
}
|
||||
} else {
|
||||
if (text != undefined && text != scrollMsg) {
|
||||
scrollMsg = text;
|
||||
}
|
||||
}
|
||||
var msg = scrollMsg;
|
||||
var speed = 1200;
|
||||
var endChar = " ";
|
||||
var ml = msg.length;
|
||||
|
||||
title = msg.substr(pos, ml) + endChar + msg.substr(0, pos);
|
||||
document.title = title;
|
||||
|
||||
pos++;
|
||||
if (pos > ml) {
|
||||
pos = 0;
|
||||
} else {
|
||||
timer = window.setTimeout("scrollTitle()", speed);
|
||||
}
|
||||
// To stop timer, clearTimeout(timer);
|
||||
}
|
||||
function requestPermissionIfRequired() {
|
||||
if (!hasNotificationPermission() && (window.webkitNotifications)) {
|
||||
window.webkitNotifications.requestPermission();
|
||||
}
|
||||
}
|
||||
function hasNotificationPermission() {
|
||||
return !!(window.webkitNotifications) && (window.webkitNotifications.checkPermission() == 0);
|
||||
}
|
||||
var notifications = new Array();
|
||||
function showNotification(pic, title, text) {
|
||||
if (hasNotificationPermission()) {
|
||||
closeAllNotifications()
|
||||
var popup = window.webkitNotifications.createNotification(pic, title, text);
|
||||
notifications.push(popup);
|
||||
setTimeout(function (notWin) {
|
||||
notWin.cancel();
|
||||
}, 10000, popup);
|
||||
popup.show();
|
||||
} else {
|
||||
console.log("showNotification: No Permission");
|
||||
}
|
||||
}
|
||||
function closeAllNotifications() {
|
||||
for (notification in notifications) {
|
||||
notifications[notification].cancel();
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue