3.1.0 AngularJS, lots of other changes released from beta branch
This commit is contained in:
parent
451213d15d
commit
89684032ce
83 changed files with 20199 additions and 5019 deletions
406
js/controllers/library.js
Normal file
406
js/controllers/library.js
Normal file
|
@ -0,0 +1,406 @@
|
|||
JamStash.controller('SubsonicCtrl',
|
||||
function SubsonicCtrl($scope, $rootScope, $location, $window, $routeParams, utils, globals, model, notifications, player) {
|
||||
$("#SubsonicAlbums").layout($scope.layoutThreeCol);
|
||||
|
||||
$rootScope.song = [];
|
||||
$scope.settings = globals.settings;
|
||||
$scope.index = [];
|
||||
$scope.shortcut = [];
|
||||
$scope.album = [];
|
||||
$scope.Server = globals.settings.Server;
|
||||
$scope.AutoAlbums = [
|
||||
{ id: "random", name: "Random" },
|
||||
{ id: "newest", name: "Recently Added" },
|
||||
{ id: "starred", name: "Starred" },
|
||||
{ id: "highest", name: "Top Rated" },
|
||||
{ id: "frequent", name: "Most Played" },
|
||||
{ id: "recent", name: "Recently Played" }
|
||||
];
|
||||
$scope.selectedAutoAlbum;
|
||||
$scope.selectedArtist;
|
||||
$scope.selectedAlbum;
|
||||
$scope.selectedMusicFolder;
|
||||
$scope.$watch("selectedMusicFolder", function (newValue, oldValue) {
|
||||
if (newValue !== oldValue) {
|
||||
if (utils.getValue('MusicFolders') != newValue) {
|
||||
if (typeof newValue != 'undefined') {
|
||||
utils.setValue('MusicFolders', newValue, true);
|
||||
} else {
|
||||
utils.setValue('MusicFolders', null, true);
|
||||
}
|
||||
//alert(newValue);
|
||||
$scope.getArtists(newValue);
|
||||
}
|
||||
}
|
||||
});
|
||||
$scope.rescanLibrary = function (data, event) {
|
||||
$.ajax({
|
||||
url: globals.BaseURL() + '/getUser.view?' + globals.BaseParams() + '&username=' + globals.settings.Username,
|
||||
method: 'GET',
|
||||
dataType: globals.settings.Protocol,
|
||||
timeout: globals.settings.Timeout,
|
||||
success: function (data) {
|
||||
if (data["subsonic-response"].user.adminRole == true) {
|
||||
$.get(globals.settings.Server + '/musicFolderSettings.view?scanNow');
|
||||
} else {
|
||||
alert('You are not logged in as an admin user!');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
$scope.mapArtist = function (data) {
|
||||
var artist = data.artist;
|
||||
var artists = [];
|
||||
if (artist.length > 0) {
|
||||
artists = artist;
|
||||
} else {
|
||||
artists[0] = artist;
|
||||
}
|
||||
return new model.Index(data.name, artists);
|
||||
}
|
||||
$scope.getArtists = function (id) {
|
||||
var url, id;
|
||||
if (utils.getValue('MusicFolders')) {
|
||||
id = utils.getValue('MusicFolders');
|
||||
}
|
||||
if (id) {
|
||||
url = globals.BaseURL() + '/getIndexes.view?' + globals.BaseParams() + '&musicFolderId=' + id;
|
||||
} else {
|
||||
url = globals.BaseURL() + '/getIndexes.view?' + globals.BaseParams();
|
||||
}
|
||||
$.ajax({
|
||||
url: url,
|
||||
method: 'GET',
|
||||
dataType: globals.settings.Protocol,
|
||||
timeout: globals.settings.Timeout,
|
||||
done: function () { if (globals.settings.Debug) { console.log("DONE!"); } },
|
||||
error: function () { if (globals.settings.Debug) { console.log("ERROR!"); } },
|
||||
success: function (data) {
|
||||
var indexes = [];
|
||||
if (typeof data["subsonic-response"].indexes.index != 'undefined') {
|
||||
if (data["subsonic-response"].indexes.index.length > 0) {
|
||||
//angular.forEach(items, function(item, key) {
|
||||
//});
|
||||
//$.makeArray(obj)
|
||||
indexes = data["subsonic-response"].indexes.index;
|
||||
} else {
|
||||
indexes[0] = data["subsonic-response"].indexes.index;
|
||||
}
|
||||
}
|
||||
// TODO: AZContainer, build letters here. Make it a click button somewhere then a larger popup with letters finger friendly size
|
||||
var shortcuts = [];
|
||||
if (typeof data["subsonic-response"].indexes.shortcut != 'undefined') {
|
||||
if (data["subsonic-response"].indexes.shortcut.length > 0) {
|
||||
shortcuts = data["subsonic-response"].indexes.shortcut;
|
||||
} else {
|
||||
shortcuts[0] = data["subsonic-response"].indexes.shortcut;
|
||||
}
|
||||
}
|
||||
$scope.shortcut = shortcuts;
|
||||
$scope.index = [];
|
||||
angular.forEach(indexes, function (item, key) {
|
||||
$scope.index.push($scope.mapArtist(item));
|
||||
});
|
||||
$scope.$apply();
|
||||
}
|
||||
});
|
||||
};
|
||||
$scope.mapAlbum = function (data) {
|
||||
var album = data;
|
||||
var coverart, starred;
|
||||
if (typeof album.coverArt != 'undefined') {
|
||||
coverart = globals.BaseURL() + '/getCoverArt.view?' + globals.BaseParams() + '&size=50&id=' + album.coverArt;
|
||||
}
|
||||
if (typeof album.starred !== 'undefined') { starred = true; } else { starred = false; }
|
||||
return new model.Album(album.id, album.parent, album.album, album.artist, coverart, $.format.date(new Date(album.created), "yyyy-MM-dd h:mm a"), starred, '', '');
|
||||
}
|
||||
$scope.getAlbums = function (id) {
|
||||
$scope.selectedAutoAlbum = null;
|
||||
$scope.selectedArtist = id;
|
||||
var url = globals.BaseURL() + '/getMusicDirectory.view?' + globals.BaseParams() + '&id=' + id;
|
||||
$.ajax({
|
||||
url: url,
|
||||
method: 'GET',
|
||||
dataType: globals.settings.Protocol,
|
||||
timeout: globals.settings.Timeout,
|
||||
success: function (data) {
|
||||
var items = [];
|
||||
if (typeof data["subsonic-response"].directory.child != 'undefined') {
|
||||
if (data["subsonic-response"].directory.child.length > 0) {
|
||||
items = data["subsonic-response"].directory.child;
|
||||
} else {
|
||||
items[0] = data["subsonic-response"].directory.child;
|
||||
}
|
||||
$scope.album = [];
|
||||
$rootScope.song = [];
|
||||
|
||||
angular.forEach(items, function (item, key) {
|
||||
if (item.isDir) {
|
||||
$scope.album.push($scope.mapAlbum(item));
|
||||
} else {
|
||||
$rootScope.song.push($scope.mapAlbum(item));
|
||||
}
|
||||
});
|
||||
if ($scope.selectedSubsonicAlbumSort != "default") {
|
||||
$scope.sortSubsonicAlbums($scope.selectedSubsonicAlbumSort);
|
||||
}
|
||||
$scope.$apply();
|
||||
} else {
|
||||
notifications.updateMessage('No Albums Returned :(', true);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
$scope.offset = 0;
|
||||
$scope.getAlbumListBy = function (id, offset) {
|
||||
var size, url;
|
||||
$scope.selectedArtist = null;
|
||||
$scope.selectedAutoAlbum = id;
|
||||
if (offset == 'next') {
|
||||
$scope.offset = $scope.offset + globals.settings.AutoAlbumSize;
|
||||
} else if (offset == 'prev') {
|
||||
$scope.offset = $scope.offset - globals.settings.AutoAlbumSize;
|
||||
}
|
||||
if ($scope.offset > 0) {
|
||||
url = globals.BaseURL() + '/getAlbumList.view?' + globals.BaseParams() + '&size=' + globals.settings.AutoAlbumSize.toString() + '&type=' + id + '&offset=' + $scope.offset;
|
||||
} else {
|
||||
url = globals.BaseURL() + '/getAlbumList.view?' + globals.BaseParams() + '&size=' + globals.settings.AutoAlbumSize.toString() + '&type=' + id;
|
||||
}
|
||||
$.ajax({
|
||||
url: url,
|
||||
method: 'GET',
|
||||
dataType: globals.settings.Protocol,
|
||||
timeout: globals.settings.Timeout,
|
||||
success: function (data) {
|
||||
var items = [];
|
||||
if (typeof data["subsonic-response"].albumList.album != 'undefined') {
|
||||
if (data["subsonic-response"].albumList.album.length > 0) {
|
||||
items = data["subsonic-response"].albumList.album;
|
||||
} else {
|
||||
items[0] = data["subsonic-response"].albumList.album;
|
||||
}
|
||||
$scope.album = [];
|
||||
angular.forEach(items, function (item, key) {
|
||||
if (item.isDir) {
|
||||
$scope.album.push($scope.mapAlbum(item));
|
||||
} else {
|
||||
$rootScope.song.push($scope.mapAlbum(item));
|
||||
}
|
||||
});
|
||||
$scope.$apply();
|
||||
} else {
|
||||
notifications.updateMessage('No Albums Returned :(', true);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
$scope.getSongs = function (id, action) {
|
||||
$scope.selectedAlbum = id;
|
||||
var url = globals.BaseURL() + '/getMusicDirectory.view?' + globals.BaseParams() + '&id=' + id;
|
||||
$.ajax({
|
||||
url: url,
|
||||
method: 'GET',
|
||||
dataType: globals.settings.Protocol,
|
||||
timeout: globals.settings.Timeout,
|
||||
success: function (data) {
|
||||
var items = [];
|
||||
if (typeof data["subsonic-response"].directory.child != 'undefined') {
|
||||
if (data["subsonic-response"].directory.child.length > 0) {
|
||||
items = data["subsonic-response"].directory.child;
|
||||
} else {
|
||||
items[0] = data["subsonic-response"].directory.child;
|
||||
}
|
||||
//alert(JSON.stringify(getMusicDirectory["subsonic-response"].directory.child));
|
||||
if (action == 'add') {
|
||||
angular.forEach(items, function (item, key) {
|
||||
$rootScope.queue.push($scope.mapSong(item));
|
||||
});
|
||||
$scope.$apply();
|
||||
$('body').layout().open('south');
|
||||
notifications.updateMessage(items.length + ' Song(s) Added to Queue', true);
|
||||
} else if (action == 'play') {
|
||||
$rootScope.queue = [];
|
||||
angular.forEach(items, function (item, key) {
|
||||
$rootScope.queue.push($scope.mapSong(item));
|
||||
});
|
||||
var next = $rootScope.queue[0];
|
||||
$scope.$apply(function () {
|
||||
$rootScope.playSong(false, next);
|
||||
});
|
||||
$('body').layout().open('south');
|
||||
notifications.updateMessage(items.length + ' Song(s) Added to Queue', true);
|
||||
} else {
|
||||
$rootScope.song = [];
|
||||
angular.forEach(items, function (item, key) {
|
||||
$rootScope.song.push($scope.mapSong(item));
|
||||
});
|
||||
$scope.$apply();
|
||||
}
|
||||
} else {
|
||||
notifications.updateMessage('No Songs Returned :(', true);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
$scope.search = function () {
|
||||
var query = $('#Search').val();
|
||||
if (query != '') {
|
||||
var type = $('#SearchType').val();
|
||||
$.ajax({
|
||||
url: globals.BaseURL() + '/search2.view?' + globals.BaseParams() + '&query=' + query,
|
||||
method: 'GET',
|
||||
dataType: globals.settings.Protocol,
|
||||
timeout: globals.settings.Timeout,
|
||||
success: function (data) {
|
||||
if (data["subsonic-response"].searchResult2 !== "") {
|
||||
var header;
|
||||
var items = [];
|
||||
if (type === 'song') {
|
||||
if (data["subsonic-response"].searchResult2.song !== undefined) {
|
||||
if (data["subsonic-response"].searchResult2.song.length > 0) {
|
||||
items = data["subsonic-response"].searchResult2.song;
|
||||
} else {
|
||||
items[0] = data["subsonic-response"].searchResult2.song;
|
||||
}
|
||||
$rootScope.song = [];
|
||||
angular.forEach(items, function (item, key) {
|
||||
$rootScope.song.push($scope.mapSong(item));
|
||||
});
|
||||
$scope.$apply();
|
||||
}
|
||||
}
|
||||
if (type === 'album') {
|
||||
if (data["subsonic-response"].searchResult2.album !== undefined) {
|
||||
if (data["subsonic-response"].searchResult2.album.length > 0) {
|
||||
items = data["subsonic-response"].searchResult2.album;
|
||||
} else {
|
||||
items[0] = data["subsonic-response"].searchResult2.album;
|
||||
}
|
||||
$scope.album = [];
|
||||
angular.forEach(items, function (item, key) {
|
||||
if (item.isDir) {
|
||||
$scope.album.push($scope.mapAlbum(item));
|
||||
} else {
|
||||
$rootScope.song.push($scope.mapAlbum(item));
|
||||
}
|
||||
});
|
||||
$scope.$apply();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
$('#Search').val("");
|
||||
}
|
||||
}
|
||||
$scope.toggleAZ = function (event) {
|
||||
var submenu = $('div#submenu_AZIndex');
|
||||
if (submenu.css('display') !== 'none') {
|
||||
submenu.fadeOut();
|
||||
} else {
|
||||
//submenu.fadeIn();
|
||||
var el = $('#AZContainer');
|
||||
pos = el.offset();
|
||||
width = el.width();
|
||||
height = el.height();
|
||||
//show the menu directly over the placeholder
|
||||
submenu.css({ "left": (pos.left + 44) + "px", "top": (pos.top) + "px" }).fadeIn(400);
|
||||
}
|
||||
}
|
||||
$scope.addSongsToQueue = function () {
|
||||
angular.forEach($scope.selectedSongs, function (item, key) {
|
||||
$scope.queue.push(item);
|
||||
item.selected = false;
|
||||
});
|
||||
$('body').layout().open('south');
|
||||
notifications.updateMessage($scope.selectedSongs.length + ' Song(s) Added to Queue', true);
|
||||
}
|
||||
$scope.scrollToTop = function () {
|
||||
$('#Artists').stop().scrollTo('#auto', 400);
|
||||
}
|
||||
$scope.selectAll = function () {
|
||||
angular.forEach($rootScope.song, function (item, key) {
|
||||
$scope.selectedSongs.push(item);
|
||||
item.selected = true;
|
||||
});
|
||||
}
|
||||
$scope.selectNone = function () {
|
||||
angular.forEach($rootScope.song, function (item, key) {
|
||||
$scope.selectedSongs = [];
|
||||
item.selected = false;
|
||||
});
|
||||
}
|
||||
$scope.updateFavorite = function (item) {
|
||||
var id = item.id;
|
||||
var starred = item.starred;
|
||||
var url;
|
||||
if (typeof starred !== 'undefined') {
|
||||
url = globals.BaseURL() + '/unstar.view?' + globals.BaseParams() + '&id=' + id;
|
||||
item.starred = undefined;
|
||||
} else {
|
||||
url = globals.BaseURL() + '/star.view?' + globals.BaseParams() + '&id=' + id;
|
||||
item.starred = true;
|
||||
}
|
||||
$.ajax({
|
||||
url: url,
|
||||
method: 'GET',
|
||||
dataType: globals.settings.Protocol,
|
||||
timeout: globals.settings.Timeout,
|
||||
success: function () {
|
||||
notifications.updateMessage('Favorite Updated!', true);
|
||||
}
|
||||
});
|
||||
}
|
||||
$scope.sortDateFunction = function (a, b) {
|
||||
return a.date < b.date ? 1 : -1;
|
||||
};
|
||||
$scope.sortArtistFunction = function (a, b) {
|
||||
return a.artist.toLowerCase() > b.artist.toLowerCase() ? -1 : 1;
|
||||
};
|
||||
$scope.sortAlbumFunction = function (a, b) {
|
||||
/*
|
||||
if (a.name < b.name) //sort string ascending
|
||||
return -1
|
||||
if (a.name > b.name)
|
||||
return 1
|
||||
return 0
|
||||
*/
|
||||
return a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;
|
||||
};
|
||||
$scope.selectedSubsonicAlbumSort = 'default';
|
||||
$scope.SubsonicAlbumSort = [
|
||||
"default",
|
||||
"artist",
|
||||
"album",
|
||||
"createdate desc"
|
||||
];
|
||||
$scope.$watch("selectedSubsonicAlbumSort", function (newValue, oldValue) {
|
||||
if (newValue !== oldValue) {
|
||||
$scope.sortSubsonicAlbums(newValue);
|
||||
}
|
||||
});
|
||||
$scope.sortSubsonicAlbums = function (newValue) {
|
||||
if (typeof newValue != 'undefined') {
|
||||
//alert(newValue);
|
||||
switch (newValue) {
|
||||
case 'createdate desc':
|
||||
$scope.album.sort($scope.sortDateFunction);
|
||||
break;
|
||||
case 'artist':
|
||||
$scope.album.sort($scope.sortArtistFunction);
|
||||
break;
|
||||
case 'album':
|
||||
$scope.album.sort($scope.sortAlbumFunction);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/* Launch on Startup */
|
||||
$scope.getArtists();
|
||||
$scope.getMusicFolders();
|
||||
if ($routeParams.albumId) {
|
||||
$scope.getSongs($routeParams.albumId, '');
|
||||
}
|
||||
/* End Startup */
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue