Jamstash/app/subsonic/subsonic.js
Hyzual a1d48bbd30 Reorganizes the entire app to follow Google's best practice recommendations for Angular App Structure.
see: https://docs.google.com/document/d/1XXMvReO8-Awi1EZXAXS4PzDzdNvV6pGcuaF4Q9821Es/pub

The files are now grouped by view / component.
Tests are located beside tested js files. The Grunt build will be responsible for only distributing actual files without the tests.
Each partial is at the same level as the js files related to it.
Ideally css files should be at the same level, maybe I'll refactor this later.

Moves all non-bower plugins to app/vendor.
Moves all images to app/images and styles to app/styles.
Merges the test and non-test jshintrc files.

Adds all the Jamstash contributors to the package.json file while I was refactoring.

Conflicts:
	app/app.js
	app/images/vgrabber.gif
	app/images/vgrabber2-active.gif
	app/images/vgrabber2-normal.gif
	app/index.html
2014-11-09 16:10:34 +01:00

384 lines
15 KiB
JavaScript

/**
* jamstash.subsonic Module
*
* Access the Subsonic server through the dedicated service
*/
angular.module('jamstash.subsonic.ctrl', ['jamstash.subsonic.service'])
.controller('SubsonicCtrl',
function SubsonicCtrl($scope, $rootScope, $routeParams, utils, globals, map, subsonic, notifications) {
'use strict';
$scope.settings = globals.settings;
$scope.itemType = 'ss';
$scope.Server = globals.settings.Server;
$scope.playlistMenu = [];
$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.SelectedAlbumSort = globals.settings.DefaultAlbumSort;
$scope.AlbumSort = globals.AlbumSorts;
$scope.showIndex = subsonic.showIndex;
$scope.$watch("showIndex", function (newValue, oldValue) {
if (newValue !== oldValue) {
subsonic.showIndex = $scope.showIndex;
}
});
$scope.toggleIndex = function () {
if ($scope.showIndex) {
$scope.showIndex = false;
} else {
$scope.showIndex = true;
$scope.showPlaylist = false;
$scope.showPodcast = false;
}
$scope.saveDefaultSection('index');
};
$scope.showPlaylist = subsonic.showPlaylist;
$scope.$watch("showPlaylist", function (newValue, oldValue) {
if (newValue !== oldValue) {
subsonic.showPlaylist = $scope.showPlaylist;
}
});
$scope.togglePlaylist = function () {
if ($scope.showPlaylist) {
$scope.showPlaylist = false;
} else {
$scope.showPlaylist = true;
$scope.showIndex = false;
$scope.showPodcast = false;
}
$scope.saveDefaultSection('playlist');
};
$scope.showPodcast = subsonic.showPodcast;
$scope.$watch("showPodcast", function (newValue, oldValue) {
if (newValue !== oldValue) {
subsonic.showPodcast = $scope.showPodcast;
}
});
$scope.togglePodcast = function () {
if ($scope.showPodcast) {
$scope.showPodcast = false;
} else {
$scope.showPodcast = true;
$scope.showPlaylist = false;
$scope.showIndex = false;
}
$scope.saveDefaultSection('podcast');
};
$scope.saveDefaultSection = function (val) {
utils.setValue('DefaultSection', val, false);
};
$scope.openDefaultSection = function () {
var section = utils.getValue('DefaultSection');
switch (section) {
case 'index':
$scope.showIndex = true;
break;
case 'playlist':
$scope.showPlaylist = true;
break;
case 'podcast':
$scope.showPodcast = true;
break;
default:
break;
}
};
$scope.$watch("SelectedAlbumSort.id", function (newValue, oldValue) {
if (newValue !== oldValue) {
if (subsonic.song.length > 0) {
subsonic.sortSubsonicSongs(newValue);
} else if (subsonic.content.album.length > 0) {
subsonic.sortSubsonicAlbums(newValue);
var indexes = $.map(globals.AlbumSorts, function (obj, index) {
if (obj.id === newValue) {
return index;
}
});
globals.settings.DefaultAlbumSort = globals.AlbumSorts[indexes];
}
}
});
$rootScope.$watch("SelectedMusicFolder", function (newValue, oldValue) {
if (newValue !== oldValue) {
utils.setValue('MusicFolders', angular.toJson(newValue), true);
$scope.getArtists(newValue.id, true);
}
});
$scope.SearchType = globals.settings.DefaultSearchType;
$scope.SearchTypes = globals.SearchTypes;
$scope.playlistsGenre = globals.SavedGenres;
$scope.$watch("selectedGenre", function (newValue, oldValue) {
if (newValue !== oldValue) {
globals.SavedGenres.push(newValue);
utils.setValue('SavedGenres', globals.SavedGenres.join(), false);
}
});
$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) {
$.post(globals.settings.Server + '/musicFolderSettings.view?scanNow');
} else {
alert('You are not logged in as an admin user!');
}
}
});
};
$scope.selectAll = function () {
$rootScope.selectAll($scope.song);
};
$scope.selectNone = function () {
$rootScope.selectNone($scope.song);
};
$scope.playAll = function () {
$rootScope.playAll($scope.song);
};
$scope.playFrom = function (index) {
$rootScope.playFrom(index, $scope.song);
};
$scope.removeSong = function (item) {
$rootScope.removeSong(item, $scope.song);
};
$scope.songsRemoveSelected = function () {
subsonic.songsRemoveSelected($scope.selectedSongs).then(function (data) {
$scope.album = data.album;
$scope.song = data.song;
});
};
$scope.getArtists = function (id, refresh) {
subsonic.getArtists(id, refresh).then(function (data) {
$scope.index = data.artists;
$scope.shortcut = data.shortcuts;
});
};
$scope.refreshArtists = function () {
utils.setValue('MusicFolders', null, true);
$scope.getArtists(0, true);
$scope.getPlaylists(true);
};
$scope.getAlbums = function (id, name) {
subsonic.getAlbums(id, name).then(function (data) {
$scope.album = data.album;
$scope.song = data.song;
$scope.BreadCrumbs = data.breadcrumb;
$scope.selectedAutoAlbum = data.selectedAutoAlbum;
$scope.selectedArtist = data.selectedArtist;
$scope.selectedAlbum = data.selectedAlbum;
$scope.selectedPlaylist = data.selectedPlaylist;
});
};
$scope.getAlbumListBy = function (id, off) {
subsonic.getAlbumListBy(id, off).then(function (data) {
$scope.album = data.album;
$scope.song = data.song;
$scope.BreadCrumbs = data.breadcrumb;
$scope.selectedAutoAlbum = data.selectedAutoAlbum;
$scope.selectedArtist = data.selectedArtist;
$scope.selectedPlaylist = data.selectedPlaylist;
});
};
$scope.getSongs = function (id, action) {
subsonic.getSongs(id, action).then(function (data) {
$scope.album = data.album;
$scope.song = data.song;
});
};
$scope.getArtistByTag = function (id) { // Gets Artist by ID3 tag
$scope.selectedAutoAlbum = null;
$scope.selectedArtist = id;
var url = globals.BaseURL() + '/getArtist.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"].artist !== 'undefined') {
if (data["subsonic-response"].artist.album.length > 0) {
items = data["subsonic-response"].artist.album;
} else {
items[0] = data["subsonic-response"].artist.album;
}
subsonic.content.album = [];
subsonic.song = [];
angular.forEach(items, function (item) {
subsonic.content.album.push(map.mapAlbum(item));
});
$scope.$apply();
} else {
notifications.updateMessage('No Albums Returned :(', true);
}
}
});
};
$scope.getAlbumByTag = function (id) { // Gets Album by ID3 tag
subsonic.getAlbumByTag(id).then(function (data) {
$scope.album = data.album;
$scope.song = data.song;
$scope.BreadCrumbs = data.breadcrumb;
$scope.selectedAutoAlbum = data.selectedAutoAlbum;
$scope.selectedArtist = data.selectedArtist;
$scope.selectedPlaylist = data.selectedPlaylist;
});
};
$scope.search = function () {
var query = $('#Search').val();
var type = $('#SearchType').val();
subsonic.search(query, type).then(function (data) {
//$scope.shortcut = data.shortcuts;
$scope.album = data.album;
$scope.song = data.song;
});
};
$scope.toggleAZ = function () {
$scope.toggleSubmenu('#submenu_AZIndex', '#AZIndex', 'right', 44);
};
$scope.getPlaylists = function (refresh) {
subsonic.getPlaylists(refresh).then(function (data) {
$scope.playlists = data.playlists;
$scope.playlistsPublic = data.playlistsPublic;
$scope.selectedAutoPlaylist = data.selectedAutoPlaylist;
$scope.selectedPlaylist = data.selectedPlaylist;
});
};
$scope.getPlaylist = function (id, action) {
subsonic.getPlaylist(id, action).then(function (data) {
$scope.album = data.album;
$scope.song = data.song;
$scope.selectedAutoPlaylist = data.selectedAutoPlaylist;
$scope.selectedPlaylist = data.selectedPlaylist;
});
};
$scope.getStarred = function (action, type) {
subsonic.getStarred(action, type).then(function (data) {
$scope.album = data.album;
$scope.song = data.song;
$scope.selectedAutoPlaylist = data.selectedAutoPlaylist;
$scope.selectedPlaylist = data.selectedPlaylist;
});
};
$scope.getRandomSongs = function (action, genre, folder) {
subsonic.getRandomSongs(action, genre, folder).then(function (data) {
$scope.album = data.album;
$scope.song = data.song;
$scope.selectedAutoPlaylist = data.selectedAutoPlaylist;
$scope.selectedPlaylist = data.selectedPlaylist;
});
};
$scope.newPlaylist = function (data, event) {
subsonic.newPlaylist(data, event).then(function (data) {
$scope.getPlaylists(true);
});
};
$scope.deletePlaylist = function () {
subsonic.deletePlaylist().then(function (data) {
$scope.getPlaylists(true);
});
};
$scope.savePlaylist = function () {
var id = $scope.selectedPlaylist;
subsonic.savePlaylist().then(function (data) {
$scope.getPlaylist(id, '');
notifications.updateMessage('Playlist Updated!', true);
});
};
$scope.loadPlaylistsForMenu = function (data, event) {
$.ajax({
url: globals.BaseURL() + '/getPlaylists.view?' + globals.BaseParams(),
method: 'GET',
dataType: globals.settings.Protocol,
timeout: globals.settings.Timeout,
success: function (data) {
var playlists = [];
$scope.playlistMenu = [];
if (typeof data["subsonic-response"].playlists.playlist != 'undefined') {
if (data["subsonic-response"].playlists.playlist.length > 0) {
playlists = data["subsonic-response"].playlists.playlist;
} else {
playlists[0] = data["subsonic-response"].playlists.playlist;
}
angular.forEach(playlists, function (item, key) {
if (item.owner == globals.settings.Username) {
$scope.playlistMenu.push(map.mapPlaylist(item));
}
});
if ($scope.playlistMenu.length > 0) {
$scope.$apply();
$scope.toggleSubmenu('#submenu_AddToPlaylist', '#action_AddToPlaylist', 'left', 124);
} else {
notifications.updateMessage('No Playlists :(', true);
}
}
}
});
};
$scope.addToPlaylist = function (id) {
var songs = [];
if ($scope.selectedSongs.length !== 0) {
angular.forEach($scope.selectedSongs, function (item) {
songs.push(item.id);
});
var runningVersion = utils.parseVersionString(globals.settings.ApiVersion);
var minimumVersion = utils.parseVersionString('1.8.0');
if (utils.checkVersion(runningVersion, minimumVersion)) { // is 1.8.0 or newer
$.ajax({
type: 'GET',
url: globals.BaseURL() + '/updatePlaylist.view?' + globals.BaseParams(),
dataType: globals.settings.Protocol,
timeout: globals.settings.Timeout,
data: { playlistId: id, songIdToAdd: songs },
success: function (data) {
$scope.selectedSongs.length = 0;
notifications.updateMessage('Playlist Updated!', true);
},
traditional: true // Fixes POST with an array in JQuery 1.4
});
}
}
};
$scope.getGenres = function () {
subsonic.getGenres().then(function (data) {
$scope.Genres = data;
});
};
$scope.getPodcasts = function (refresh) {
subsonic.getPodcasts(refresh).then(function (data) {
$scope.podcasts = data;
});
};
$scope.getPodcast = function (id, action) {
subsonic.getPodcast(id, action).then(function (data) {
$scope.album = data.album;
$scope.song = data.song;
$scope.selectedPodcast = data.selectedPodcast;
});
};
/* Launch on Startup */
$scope.getArtists();
$scope.getAlbums();
$scope.getPlaylists();
$scope.getGenres();
$scope.getPodcasts();
$scope.openDefaultSection();
$scope.getMusicFolders();
if ($routeParams.artistId && $routeParams.albumId) {
$scope.getAlbumByTag($routeParams.albumId);
} else if ($routeParams.artistId) {
$scope.getAlbums($routeParams.artistId);
}
/* End Startup */
});