function updateBaseParams() { baseURL = server + '/rest'; baseParams = 'u=' + username + '&p=' + password + '&f=' + protocol + '&v=' + apiVersion + '&c=' + applicationName; } function ping() { $.ajax({ url: baseURL + '/ping.view?' + baseParams, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { if (data["subsonic-response"].status == 'ok') { apiVersion = data["subsonic-response"].version; $('#SubsonicVersion').html(apiVersion); updateBaseParams(); } else { if (typeof data["subsonic-response"].error != 'undefined') { alert(data["subsonic-response"].error.message); } } }, error: function () { alert('Bad Server'); } }); } function loadArtists(id, refresh) { if (debug) { console.log("LOAD ARTISTS"); } if (refresh) { $('#ArtistContainer').empty(); } var url; if (id == "all") { url = baseURL + '/getIndexes.view?' + baseParams; } else if (id) { url = baseURL + '/getIndexes.view?' + baseParams + '&musicFolderId=' + id; } else { url = baseURL + '/getIndexes.view?' + baseParams; } if (debug) { console.log(url); } var content = $('#ArtistContainer').html(); if (content === "") { // Load Artist List $.ajax({ url: url, method: 'GET', dataType: protocol, timeout: 10000, done: function () { if (debug) { console.log("DONE!"); } }, error: function () { if (debug) { console.log("ERROR!"); } }, success: function (data) { if (debug) { console.log("SUCCESS"); } if (data["subsonic-response"].status == 'ok') { var indexlist, name; if (typeof data["subsonic-response"].indexes != 'undefined') { if (typeof data["subsonic-response"].indexes.shortcut != 'undefined') { var shortcuts = []; if (data["subsonic-response"].indexes.shortcut.length > 0) { shortcuts = data["subsonic-response"].indexes.shortcut; } else { shortcuts[0] = data["subsonic-response"].indexes.shortcut; } var html = '
  • Shortcuts
  • '; $(html).appendTo("#ArtistContainer"); $.each(shortcuts, function (i, item) { if (item.name !== undefined) { var html = '
  • '; html += '' + item.name + ''; html += '
  • '; $(html).appendTo("#ArtistContainer"); } }); } var indexes = []; if (typeof data["subsonic-response"].indexes != 'undefined') { if (typeof data["subsonic-response"].indexes.index != 'undefined') { 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) { name = index.name; $('
  • ' + name + '
  • ').appendTo("#ArtistContainer"); indexlist += '
  • ' + name + '
  • '; 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 += '
  • '; html += '' + artist.name + ''; html += '
  • '; $(html).appendTo("#ArtistContainer"); } }); }); //$(indexlist).appendTo("#IndexList"); $("#BottomIndex").empty(); $(indexlist).appendTo("#BottomIndex"); } var indexes = []; if (data["subsonic-response"].indexes.child !== undefined) { var rowcolor; if (data["subsonic-response"].indexes.child.length > 0) { indexes = data["subsonic-response"].indexes.child; } else { indexes[0] = data["subsonic-response"].indexes.child; } var appendto = '#AlbumContainer tbody'; $(appendto).empty(); $.each(indexes, function (i, child) { if (child.isVideo != true) { var html = generateRowHTML(child, appendto); $(html).appendTo(appendto); } }); header = generateSongHeaderHTML(); } if (smwidth) { resizeSMSection(0); } } } else { var status = data["subsonic-response"].status; if (status == 'ok') { alert('Status: ' + status + ', but Subsonic is busy, wait and refresh...'); } else { alert(msg); } } } } }); } } function getMusicFolders() { $.ajax({ url: baseURL + '/getMusicFolders.view?' + baseParams, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { if (data["subsonic-response"].musicFolders.musicFolder !== undefined) { 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 = getCookie('MusicFolders') ? getCookie('MusicFolders') : null; var options = []; options.push(''); $.each(folders, function (i, folder) { if (savedMusicFolder == folder.id && savedMusicFolder != null) { options.push(''); } else { options.push(''); } }); $('#MusicFolders').html(options.join('')); } else { } } }); } function getGenres() { var genres = 'Acid Rock,Acoustic,Alt Country,Alt/Indie,Alternative & Punk,Alternative Metal,Alternative,AlternRock,Awesome,Bluegrass,Blues,Blues-Rock,Classic Hard Rock,Classic Rock,Comedy,Country,Country-Rock,Dance,Dance-Rock,Deep Funk,Easy Listening,Electronic,Electronica,Electronica/Dance,Folk,Folk/Rock,Funk,Grunge,Hard Rock,Heavy Metal,Holiday,House,Improg,Indie Rock,Indie,International,Irish,Jam Band,Jam,Jazz Fusion,Jazz,Latin,Live Albums,Metal,Music,Oldies,Other,Pop,Pop/Rock,Post Rock,Progressive Rock,Psychedelic Rock,Psychedelic,Punk,R&B,Rap & Hip-Hop,Reggae,Rock & Roll,Rock,Rock/Pop,Roots,Ska,Soft Rock,Soul,Southern Rock,Thrash Metal,Unknown,Vocal,World'; var genresArr = genres.split(','); var options = []; options.push(''); $.each(genresArr, function (i, genre) { options.push(''); }); $('#Genres').html(options.join('')); } function loadAutoPlaylists(refresh) { if (debug) { console.log("LOAD AUTO PLAYLISTS"); } if (refresh) { $('#AutoPlaylistContainer').empty(); } var content = $('#AutoPlaylistContainer').html(); if (content == "") { var genres = getCookie('AutoPlaylists'); var genresArr = []; if (genres) { genresArr = genres.split(','); genresArr.unshift('Random'); genresArr.unshift('Starred'); } else { genresArr.push('Starred'); genresArr.push('Random'); } $.each(genresArr, function (i, genre) { genre = genre.trim(); if (genre != '') { var html = ""; html += '
  • '; html += '' + genre + ''; html += '
    '; html += '
    '; html += '
  • '; $(html).appendTo("#AutoPlaylistContainer"); } }); } } function getMusicDirectory(id, action, appendto, artistid) { $.ajax({ url: baseURL + '/getMusicDirectory.view?' + baseParams + '&id=' + id, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { if (action == '') { $('#AlbumContainer tbody').empty(); } if (action === 'autoplay') { $('#CurrentPlaylistContainer tbody').empty(); } if (action == 'link') { $('#AlbumContainer tbody').empty(); $('#action_tabLibrary').trigger('click'); } if (data["subsonic-response"].directory.child !== undefined) { 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 isDir = false; var header, parentid, artist, album; $.each(children, function (i, child) { var isVideo = false; if (child.isDir == true) { isDir = true; } if (child.isVideo == true) { isVideo = true; } if (typeof child.parent != 'undefined') { parentid = child.parent; } if (typeof child.artist != 'undefined') { artist = child.artist; } if (typeof child.album != 'undefined') { album = child.album; } //if (typeof child.artistId != 'undefined') { artistid = child.artistId; } if (!isVideo) { var html = generateRowHTML(child, appendto, artistid); $(html).appendTo(appendto).hide().fadeIn('fast'); } }); toggleAlbumListNextPrev('#status_Library', false, '', ''); if (appendto == '#CurrentPlaylistContainer') { updateMessage(children.length + ' Song(s) Added', true); } if (appendto == '#AlbumContainer tbody' && isDir == true) { header = generateAlbumHeaderHTML(); $('#tabLibrary .subactions a.button').addClass('disabled'); $('#BreadCrumbs').html('' + artist + ''); } if (appendto == '#AlbumContainer tbody' && isDir == false) { header = generateSongHeaderHTML(); $('#tabLibrary .subactions a.button').removeClass('disabled'); var html; if (typeof artistid == 'undefined' || artistid == '') { html = '' + artist + ' >' + album + '' } else { html = '' + artist + ' >' + album + '' } $('#BreadCrumbs').html(html); } $("#AlbumContainer thead").html(header); if (action == 'autoplay') { autoPlay(); } } } }); } /* Currently not being used */ function getArtist(id, action, appendto) { $.ajax({ url: baseURL + '/getArtist.view?' + baseParams + '&id=' + id, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { if (action == '') { $('#AlbumContainer tbody').empty(); } if (action === 'autoplay') { $('#CurrentPlaylistContainer tbody').empty(); } if (action == 'link') { $('#AlbumContainer tbody').empty(); $('#action_tabLibrary').trigger('click'); } if (data["subsonic-response"].artist !== undefined) { var children = []; if (data["subsonic-response"].artist.album.length > 0) { children = data["subsonic-response"].artist.album; } else { children[0] = data["subsonic-response"].artist.album; } var header, starred, duration; $.each(children, function (i, child) { if (typeof child.starred != 'undefined') { starred = true; } else { starred = false; } if (typeof child.duration != 'undefined') { duration = child.duration; } else { duration = ''; } var html = generateAlbumHTML(child.id, child.artistId, child.coverArt, child.name, child.artist, child.userRating, starred, child.created); $(html).appendTo(appendto).hide().fadeIn('fast'); }); toggleAlbumListNextPrev('#status_Library', false, '', ''); if (appendto == '#CurrentPlaylistContainer') { updateMessage(children.length + ' Song(s) Added', true); } if (appendto == '#AlbumContainer tbody') { header = generateAlbumHeaderHTML(); $('#tabLibrary .subactions a.button').addClass('disabled'); } $("#AlbumContainer thead").html(header); if (action == 'autoplay') { autoPlay(); } } } }); } function getAlbumListBy(id, offset) { var size, url; if (getCookie('AutoAlbumSize')) { size = getCookie('AutoAlbumSize'); } else { size = 15; } if (offset > 0) { url = baseURL + '/getAlbumList.view?' + baseParams + '&size=' + size + '&type=' + id + '&offset=' + offset } else { url = baseURL + '/getAlbumList.view?' + baseParams + '&size=' + size + '&type=' + id } $.ajax({ url: url, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { if (data["subsonic-response"].status != 'failed') { if (typeof data["subsonic-response"].albumList.album != "undefined") { $("#AlbumContainer tbody").empty(); var header = generateAlbumHeaderHTML(); $("#AlbumContainer thead").html(header); 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) { // 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, starred; if (album.starred !== undefined) { starred = true; } else { starred = false; } if (album.isDir === true) { albumhtml = generateAlbumHTML(album.id, album.parent, album.coverArt, album.title, album.artist, album.userRating, starred, album.created); } $(albumhtml).appendTo("#AlbumContainer tbody").hide().fadeIn('fast'); }); $('#BreadCrumbs').empty(); $('#tabLibrary .subactions a.button').addClass('disabled'); toggleAlbumListNextPrev('#status_Library', true, id, offset); } else { updateMessage('Albums failed to load, no music :(', true); $('#AlbumContainer tbody').empty(); } } } }); } function toggleAlbumListNextPrev(el, on, type, offset) { if (el != '') { if (on) { $(el).addClass('on'); $('#status_Library').data('type', type); if (offset === undefined) { $('#status_Library').data('offset', '0'); } else { $('#status_Library').data('offset', offset); } } else { $(el).removeClass('on'); $(el).stop().fadeOut(); $('#status_Library').data('type', ''); $('#status_Library').data('offset', '0'); } } } function getRandomSongList(action, appendto, genre, folder) { if (debug) { console.log('action:' + action + ', appendto:' + appendto + ', genre:' + genre + ', folder:' + folder); } var size; if (getCookie('AutoPlaylistSize')) { size = getCookie('AutoPlaylistSize'); } else { size = 25; } var genreParams = ''; if (genre != '' && genre != 'Random') { genreParams = '&genre=' + genre; } folderParams = ''; if (typeof folder == 'number' && folder == 0 && folder != 'all') { folderParams = '&musicFolderId=' + folder; } else if (folder != '' && folder != 'all') { folderParams = '&musicFolderId=' + folder; } if (genre == 'Starred') { getStarred(action, appendto, 'song'); } else { $.ajax({ url: baseURL + '/getRandomSongs.view?' + baseParams + '&size=' + size + genreParams + folderParams, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { if (data["subsonic-response"].randomSongs.song !== undefined) { if (appendto == '#TrackContainer tbody') { $("#TrackContainer tbody").empty(); var header = generateSongHeaderHTML(); $("#TrackContainer thead").html(header); } if (action == 'autoplay') { $("#TrackContainer tbody").empty(); $(appendto).empty(); } 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) { var track, starred, duration; if (item.starred !== undefined) { starred = true; } else { starred = false; } if (item.track === undefined) { track = " "; } else { track = item.track; } if (item.duration !== undefined) { duration = item.duration; } else { duration = ''; } html = generateSongHTML(item.id, item.parent, '', track, item.title, '', item.artist, item.album, item.coverArt, item.userRating, starred, duration); $(html).appendTo(appendto); }); if (appendto === '#TrackContainer tbody') { updateStatus('#status_Playlists', countCurrentPlaylist('#TrackContainer')); } if (appendto === '#CurrentPlaylistContainer tbody') { updateMessage(items.length + ' Song(s) Added', true); updateStatus('#status_Current', countCurrentPlaylist('#CurrentPlaylistContainer')); } if (action == 'autoplay' || action == 'autoplayappend') { autoPlay(); } } else { updateStatus('#status_Playlists', ''); $(appendto).empty(); } } }); } } function getStarred(action, appendto, type) { var size; if (getCookie('AutoPlaylistSize')) { size = getCookie('AutoPlaylistSize'); } else { size = 25; } $.ajax({ url: baseURL + '/getStarred.view?' + baseParams + '&size=' + size, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { if (data["subsonic-response"].starred !== undefined) { if (appendto === '#TrackContainer tbody') { $("#TrackContainer tbody").empty(); var header = generateSongHeaderHTML(); $("#TrackContainer thead").html(header); } if (action === 'autoplay') { $("#TrackContainer tbody").empty(); $(appendto).empty(); } var items = []; switch (type) { case 'artist': if (data["subsonic-response"].starred.artist !== undefined) { if (data["subsonic-response"].starred.artist.length > 0) { items = data["subsonic-response"].starred.artist; } else { items[0] = data["subsonic-response"].starred.artist; } } break; case 'album': if (data["subsonic-response"].starred.album !== undefined) { if (data["subsonic-response"].starred.album.length > 0) { items = data["subsonic-response"].starred.album; } else { items[0] = data["subsonic-response"].starred.album; } } break; case 'song': if (data["subsonic-response"].starred.song !== undefined) { if (data["subsonic-response"].starred.song.length > 0) { items = data["subsonic-response"].starred.song; } else { items[0] = data["subsonic-response"].starred.song; } } break; default: break; } var rowcolor; var html; $.each(items, function (i, item) { var track, starred; if (item.starred !== undefined) { starred = true; } else { starred = false; } if (item.track === undefined) { track = " "; } else { track = item.track; } var time = secondsToTime(item.duration); switch (type) { case 'artist': break; case 'album': html = generateRowHTML(item, appendto); break; case 'song': html = generateRowHTML(item, appendto); break; default: break; } $(html).appendTo(appendto); }); if (appendto == '#TrackContainer tbody') { updateStatus('#status_Playlists', countCurrentPlaylist('#TrackContainer')); } if (appendto == '#CurrentPlaylistContainer tbody') { updateMessage(items.length + ' Song(s) Added', true); } if (action == 'autoplay') { autoPlay(); } } else { $(appendto).empty(); } } }); } function previewStarredCoverArt() { $.ajax({ url: baseURL + '/getStarred.view?' + baseParams + '&size=25', method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { var coverarts = []; if (data["subsonic-response"].starred !== undefined) { var items = []; if (data["subsonic-response"].starred.album !== undefined) { if (data["subsonic-response"].starred.album.length > 0) { items = data["subsonic-response"].starred.album; } else { items[0] = data["subsonic-response"].starred.album; } } var html = ""; $.each(items, function (i, item) { if (typeof item.coverArt !== "undefined") { var coverSrc = baseURL + '/getCoverArt.view?' + baseParams + '&id=' + item.coverArt; var title = item.artist + ' - ' + item.album; html += ''; } }); $('#preview').html(html); $('#preview a').shuffle(); //var pick = Math.floor(Math.random() * coverarts.length) + 1; //var href = baseURL + '/getCoverArt.view?' + baseParams + '&id=' + coverarts[pick]; $('a.fancyboxcoverart').fancybox({ autoPlay: true, playSpeed: 10000, preload: 5, hideOnContentClick: true, type: 'image', openEffect: 'none', closeEffect: 'none', openSpeed: 'normal', closeSpeed: 'slow', afterLoad: function () { $('div.fancybox-inner').click(function () { //alert("test"); }); } }).trigger('click'); //setInterval($('#preview a').fancybox.next(), 2000); } } }); } function previewCurrentCoverArt() { var href = $('#coverartimage').attr('href'); var title = $('#songdetails_artist').html(); $("a#preview").fancybox({ hideOnContentClick: true, type: 'image', openEffect: 'none', closeEffect: 'none', href: href, title: title }).trigger('click'); } var updaterNowPlaying; var updaterNowPlayingIdList = []; function updateNowPlaying(showPopup) { updaterNowPlaying = $.periodic({ period: 4000, decay: 1.5, max_period: 30000 }, function () { $.ajax({ periodic: this, url: baseURL + '/getNowPlaying.view?' + baseParams, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { if (data["subsonic-response"].nowPlaying.entry === undefined) { this.periodic.increment(); $("#NowPlayingList").empty(); var chathtml = '
    '; chathtml += 'Nothing :(
    '; chathtml += '
    '; $(chathtml).appendTo("#NowPlayingList"); } else { this.periodic.increment(); if (debug) { console.log('NowPlaying Delay: ' + this.periodic.cur_period); } $("#NowPlayingList").empty(); var msgs = []; if (data["subsonic-response"].nowPlaying.entry.length > 0) { msgs = data["subsonic-response"].nowPlaying.entry; } else { msgs[0] = data["subsonic-response"].nowPlaying.entry; } var sorted = msgs.sort(function (a, b) { return a.minutesAgo - b.minutesAgo; }); $.each(sorted, function (i, msg) { if (!showPopup) { var chathtml = '
    '; chathtml += '' + msg.username + '
    '; chathtml += '' + msg.artist + ' - ' + msg.title + ''; chathtml += '
    '; $(chathtml).appendTo("#NowPlayingList"); } var coverartSrc; if (msg.coverArt === undefined) { coverartSrc = 'images/albumdefault_50.jpg'; } else { coverartSrc = baseURL + '/getCoverArt.view?' + baseParams + '&size=50&id=' + msg.coverArt; } if (getCookie('Notification_NowPlaying')) { var sid = msg.username + '-' + msg.id; if (jQuery.inArray(sid, updaterNowPlayingIdList) === -1 && username != msg.username) { showNotification(coverartSrc, toHTML.un(msg.username + ':' + msg.playerName), toHTML.un(msg.artist + ' - ' + msg.title), 'text', ''); updaterNowPlayingIdList.push(sid); } } }); } } }); }); } function stopUpdateNowPlaying() { updaterNowPlaying.cancel(); } function search(type, query) { $.ajax({ url: baseURL + '/search2.view?' + baseParams + '&query=' + query, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { $("#AlbumContainer tbody").empty(); if (data["subsonic-response"].searchResult2 !== "") { var header; var children = []; if (type === 'song') { if (data["subsonic-response"].searchResult2.song !== undefined) { header = generateSongHeaderHTML(); if (data["subsonic-response"].searchResult2.song.length > 0) { children = data["subsonic-response"].searchResult2.song; } else { children[0] = data["subsonic-response"].searchResult2.song; } $("#AlbumContainer thead").html(header); } } if (type === 'album') { if (data["subsonic-response"].searchResult2.album !== undefined) { header = generateAlbumHeaderHTML(); if (data["subsonic-response"].searchResult2.album.length > 0) { children = data["subsonic-response"].searchResult2.album; } else { children[0] = data["subsonic-response"].searchResult2.album; } $("#AlbumContainer thead").html(header); } } $.each(children, function (i, child) { var starred; if (typeof child.starred != 'undefined') { starred = true; } else { starred = false; } isDir = child.isDir; if (isDir == true) { albumhtml = generateAlbumHTML(child.id, child.parent, child.coverArt, child.title, child.artist, child.userRating, starred, child.created); } else { var track, starred, duration; if (child.starred !== undefined) { starred = true; } else { starred = false; } if (child.track === undefined) { track = " "; } else { track = child.track; } if (child.duration !== undefined) { duration = child.duration; } else { duration = ''; } albumhtml = generateSongHTML(child.id, child.parent, '', track, child.title, '', child.artist, child.album, child.coverArt, child.userRating, starred, duration); } $('#tabLibrary .subactions a.button').removeClass('disabled'); $(albumhtml).appendTo("#AlbumContainer tbody"); $('#action_tabLibrary').click(); }); } } }); } function rescanLibrary() { $.ajax({ url: baseURL + '/getUser.view?' + baseParams + '&username=' + getCookie('username'), method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { if (data["subsonic-response"].user.adminRole == true) { $.get(getCookie('Server') + '/musicFolderSettings.view?scanNow'); } else { alert('You are not logged in as an admin user!'); } } }); } function loadFolders(refresh) { if (debug) { console.log("LOAD FOLDERS"); } if (refresh) { $('#FolderContainer').empty(); } var content = $('#FolderContainer').html(); if (content === "") { // Load Folders $.ajax({ url: baseURL + '/getMusicFolders.view?' + baseParams, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { var musicFolders = []; if (data["subsonic-response"].musicFolders.musicFolder.length > 0) { musicFolders = data["subsonic-response"].musicFolders.musicFolder; } else { musicFolders[0] = data["subsonic-response"].musicFolders.musicFolder; } $.each(musicFolders, function (i, musicFolder) { var html = ""; html += '
  • '; html += '' + musicFolder.name + ''; html += '
    '; html += '
    '; html += '
  • '; $(html).appendTo("#FolderContainer"); }); } }); } } function loadPlaylists(refresh) { if (debug) { console.log("LOAD PLAYLISTS"); } if (refresh) { $('#PlaylistContainer').empty(); } var content = $('#PlaylistContainer').html(); if (content === "") { // Load Playlists $.ajax({ url: baseURL + '/getPlaylists.view?' + baseParams, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { var playlists = []; if (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; } $.each(playlists, function (i, playlist) { var html = ""; html += '
  • '; html += '
    '; html += '
    '; html += '
    '; html += '
    ' + playlist.name + '
    '; html += '
  • '; $(html).appendTo("#PlaylistContainer"); }); if (smwidth) { resizeSMSection(0); } } } }); } } function savePlaylist(playlistid) { var songs = []; $('#TrackContainer tr.song').each(function (index) { songs.push($(this).attr('childid')); }); if (songs.length > 0) { $.ajax({ type: 'GET', url: baseURL + '/createPlaylist.view?' + baseParams, dataType: protocol, timeout: 10000, data: { playlistId: playlistid, songId: songs }, success: function () { getPlaylist(playlistid); updateMessage('Playlist Updated!', true); }, traditional: true // Fixes POST with an array in JQuery 1.4 }); } } function getPlaylist(id, action, appendto) { $.ajax({ url: baseURL + '/getPlaylist.view?' + baseParams + '&id=' + id, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { if (data["subsonic-response"].playlist.entry !== undefined) { if (appendto === '#TrackContainer tbody') { $(appendto).empty(); var header = generateSongHeaderHTML(); $("#TrackContainer thead").html(header); } if (action === 'autoplay') { $(appendto).empty(); } var children = []; var playlist = data["subsonic-response"].playlist; if (playlist.entry.length > 0) { children = playlist.entry; } else { children[0] = playlist.entry; } var rowcolor; var html; var count = children.length; $.each(children, function (i, child) { var track, starred, duration; if (child.starred !== undefined) { starred = true; } else { starred = false; } if (child.track === undefined) { track = " "; } else { track = child.track; } if (child.duration !== undefined) { duration = child.duration; } else { duration = ''; } html = generateSongHTML(child.id, child.parent, child.artistId, track, child.title, '', child.artist, child.album, child.coverArt, child.userRating, starred, duration); $(html).appendTo(appendto); }); if (appendto === '#TrackContainer tbody') { updateStatus('#status_Playlists', countCurrentPlaylist('#TrackContainer')); } if (appendto === '#CurrentPlaylistContainer tbody') { updateMessage(children.length + ' Song(s) Added', true); } if (action === 'autoplay') { autoPlay(); } } else { if (appendto === '#TrackContainer tbody') { $(appendto).empty(); updateStatus('#status_Playlists', ''); } } } }); } function loadPlaylistsForMenu(menu) { $('#' + menu).empty(); $.ajax({ url: baseURL + '/getPlaylists.view?' + baseParams, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { var playlists = []; if (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; } } $("+ New
    ").appendTo("#" + menu); $.each(playlists, function (i, playlist) { $('' + playlist.name + '
    ').appendTo("#" + menu); }); } }); } function newPlaylist() { var reply = prompt("Choose a name for your new playlist.", ""); if (reply != 'null' && reply != null && reply != '') { $.ajax({ url: baseURL + '/createPlaylist.view?' + baseParams + '&name=' + reply, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { loadPlaylists(true); } }); } } function deletePlaylist(id) { $.ajax({ url: baseURL + '/deletePlaylist.view?' + baseParams + '&id=' + id, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { loadPlaylists(true); $('#TrackContainer tbody').empty(); } }); } function addToPlaylist(playlistid, from) { var selected = []; var el; if (from === 'current') { el = $('#CurrentPlaylist table.songlist tr.selected'); } else { el = $('#Albums table.songlist tr.selected'); } el.each(function (index) { selected.push($(this).attr('childid')); }); if (selected.length > 0) { if (playlistid !== 'new') { // Create new playlist from here, will implement in UI later // Get songs from playlist var currentsongs = []; $.ajax({ url: baseURL + '/getPlaylist.view?' + baseParams + '&id=' + playlistid, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { var children = []; if (data["subsonic-response"].playlist.entry !== undefined) { if (data["subsonic-response"].playlist.entry.length > 1) { children = data["subsonic-response"].playlist.entry; } else { children[0] = data["subsonic-response"].playlist.entry; } $.each(children, function (i, child) { currentsongs.push(child.id); }); } var newsongs = []; var count = 0; $.each(selected, function (i, songid) { if (jQuery.inArray(songid, currentsongs) === -1) { currentsongs.push(songid); count++; } }); if (count > 0) { var runningVersion = parseVersionString(apiVersion); var minimumVersion = parseVersionString('1.8.0'); if (checkVersion(runningVersion, minimumVersion)) { // is 1.8.0 or newer $.ajax({ type: 'GET', url: baseURL + '/updatePlaylist.view?' + baseParams, dataType: protocol, timeout: 10000, data: { playlistId: playlistid, songIdToAdd: selected }, success: function (data) { // Add logic to show an error if the playlist update fails // if (data["subsonic-response"].playlist.entry !== undefined) { $('table.songlist tr.song').each(function () { $(this).removeClass('selected'); }); updateMessage(count + ' Song(s) Added to Playlist', true); }, traditional: true // Fixes POST with an array in JQuery 1.4 }); } else { $.ajax({ // Depreciated: 11/5/2012 type: 'GET', url: baseURL + '/createPlaylist.view?' + baseParams, dataType: protocol, timeout: 10000, data: { playlistId: playlistid, songId: currentsongs }, success: function () { $('table.songlist tr.song').each(function () { $(this).removeClass('selected'); }); updateMessage(count + ' Song(s) Added to Playlist', true); }, traditional: true // Fixes POST with an array in JQuery 1.4 }); } } } }); } else { var reply = prompt("Choose a name for your new playlist.", ""); if (reply) { $.ajax({ type: 'GET', url: baseURL + '/createPlaylist.view?' + baseParams, dataType: protocol, timeout: 10000, data: { name: "" + reply + "", songId: selected }, success: function () { $('table.songlist tr.song').each(function () { $(this).removeClass('selected'); }); updateMessage('Playlist Created!', true); }, traditional: true // Fixes POST with an array in JQuery 1.4 }); } } setTimeout(function () { $('div.submenu').fadeOut(); }, 100); } } function addToCurrent(addAll) { var count; if (addAll) { count = $('#AlbumContainer tr.song').length; } else { count = $('#AlbumContainer tr.selected').length; } if (count > 0) { if (addAll) { $('#AlbumContainer tr.song').each(function (index) { $(this).clone().appendTo('#CurrentPlaylistContainer tbody'); }); } else { $('#AlbumContainer tr.selected').each(function (index) { $(this).clone().appendTo('#CurrentPlaylistContainer tbody'); }); } $('#CurrentPlaylistContainer tbody tr.song').removeClass('selected'); updateMessage(count + ' Song(s) Added', true); } } function countCurrentPlaylist(container) { var total = $(container + ' tbody tr.song').size(); if (total > 0) { var time = 0; $(container + ' tr.song').each(function (index) { var duration = $(this).attr('duration'); if (duration != '') { time += parseInt(duration); } }); return total + ' song(s), ' + secondsToTime(time) + ' total time'; } else { return ''; } } function saveCurrentPlaylist() { if (browserStorageCheck) { var html = localStorage.getItem('CurrentPlaylist'); var current = $('#CurrentPlaylistContainer tbody').html(); if (current != '' && current != html) { try { localStorage.setItem('CurrentPlaylist', current); if (debug) { console.log('Saving Play Queue: ' + current.length + ' characters'); } } catch (e) { if (e == QUOTA_EXCEEDED_ERR) { alert('Quota exceeded!'); } } } } else { if (debug) { console.log('HTML5::loadStorage not supported on your browser' + html.length + ' characters'); } } } function deleteCurrentPlaylist() { if (browserStorageCheck) { localStorage.removeItem('CurrentPlaylist'); setCookie('CurrentSong', null); if (debug) { console.log('Removing Play Queue'); } } else { if (debug) { console.log('HTML5::loadStorage not supported on your browser' + html.length + ' characters'); } } } function loadCurrentPlaylist() { if (browserStorageCheck) { var html = localStorage.getItem('CurrentPlaylist'); if (html != '' && html !== undefined && html !== null) { $('#CurrentPlaylistContainer tbody').html(html); var songid = $('#CurrentPlaylistContainer tbody tr.playing').attr('childid'); if (typeof songid != 'undefined') { $('#CurrentPlaylist').scrollTo($('#' + songid), 400); } if (debug) { console.log('Load Play Queue From localStorage: ' + html.length + ' characters'); } } } else { if (debug) { console.log('HTML5::loadStorage not supported on your browser' + html.length + ' characters'); } } } function saveAutoFilter() { if (browserStorageCheck) { var item = localStorage.getItem('AutoFilter'); try { localStorage.setItem('AutoFilter', item); if (debug) { console.log('Saving Auto Filter: ' + item); } } catch (e) { if (e == QUOTA_EXCEEDED_ERR) { alert('Quota exceeded!'); } } } else { if (debug) { console.log('HTML5::loadStorage not supported on your browser' + html.length + ' characters'); } } } function deleteAutoFilter() { if (browserStorageCheck) { localStorage.removeItem('AutoFilter'); if (debug) { console.log('Removing Auto Filter'); } } else { if (debug) { console.log('HTML5::loadStorage not supported on your browser' + html.length + ' characters'); } } } function loadAutoFilter() { if (browserStorageCheck) { var item = localStorage.getItem('AutoFilter'); if (item != '' && item !== undefined && item !== null) { var el = '#AutoFilter'; $(el).val(item); if (debug) { console.log('Load Play Queue From localStorage: ' + item); } } } else { if (debug) { console.log('HTML5::loadStorage not supported on your browser' + html.length + ' characters'); } } } function saveTrackPosition() { var el = $('#songdetails_song'); var songid = el.attr('childid'); if (songid !== undefined) { var albumid = el.attr('parentid'); var position = $("#playdeck").data("jPlayer").status.currentTime; if (position != null && position >= 5) { var currentSong = { songid: songid, albumid: albumid, position: position }; $('#action_SaveProgress').show(); setCookie('CurrentSong', JSON.stringify(currentSong)); saveCurrentPlaylist(); } } if (debug) { console.log('Saving Track Position: songid:' + songid + ', albumid:' + albumid + ', position:' + position); } } function downloadItem(id, type) { var url; if (type == 'item' && id) { reqDownload = 'id=' + id; } if (type == 'playlist' && id) { reqDownload = 'playlistUtf8Hex=' + id; } if (reqDownload) { url = baseURL + '/download.view?' + baseParams + '&' + reqDownload; window.location = url; } } function loadPodcasts(refresh) { if (debug) { console.log("LOAD PODCASTS"); } if (refresh) { $('#ChannelsContainer').empty(); } var content = $('#ChannelsContainer').html(); if (content === "") { // Load Podcasts $.ajax({ url: baseURL + '/getPodcasts.view?' + baseParams, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { var podcasts = []; if (data["subsonic-response"].podcasts.channel !== undefined) { if (data["subsonic-response"].podcasts.channel.length > 0) { podcasts = data["subsonic-response"].podcasts.channel; } else { podcasts[0] = data["subsonic-response"].podcasts.channel; } $.each(podcasts, function (i, podcast) { var albumId = (podcast.episode === undefined || podcast.episode.length <= 0) ? "0" : podcast.episode[0].parent; var html = ""; html += '
  • '; html += '
    '; html += '
    '; html += '
    '; html += '
    ' + podcast.title + '
    '; html += '
  • '; $(html).appendTo("#ChannelsContainer"); }); if (smwidth) { resizeSMSection(0); } } } }); } } function getPodcast(id, action, appendto) { $.ajax({ url: baseURL + '/getPodcasts.view?' + baseParams, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { var podcasts = []; if (data["subsonic-response"].podcasts.channel.length > 0) { podcasts = data["subsonic-response"].podcasts.channel; } else { podcasts[0] = data["subsonic-response"].podcasts.channel; } var channel = []; $.each(podcasts, function (i, podcast) { if (podcast.id == id) { channel = podcast; } }); if (channel.episode !== undefined) { if (appendto === '#PodcastContainer tbody') { $(appendto).empty(); var header = generateSongHeaderHTML; $("#PodcastContainer thead").html(header); } if (action === 'autoplay') { $(appendto).empty(); } var children = channel.episode; var rowcolor; var html; var count = 0; $.each(children, function (i, child) { if (child.status == "skipped") return; // Skip podcasts that are not yet downloaded var date = parseDate(child.publishDate); var description = 'Published: ' + date + '\n\n'; description += child.description; var starred, duration, publishdate; if (child.starred !== undefined) { starred = true; } else { starred = false; } if (child.duration !== undefined) { duration = child.duration; } else { duration = ''; } if (child.publishDate !== undefined) { publishdate = child.publishDate.substring(0, child.publishDate.indexOf(" ")); } else { publishdate = ''; } html = generateSongHTML(child.streamId, child.parent, '', publishdate, child.title, description, child.artist, child.album, child.coverArt, child.userRating, starred, duration); $(html).appendTo(appendto); count++; }); if (appendto === '#PodcastContainer tbody') { updateStatus('#status_Podcasts', countCurrentPlaylist('#PodcastContainer')); } if (appendto === '#CurrentPlaylistContainer tbody') { updateMessage(count + ' Song(s) Added', true); } if (action === 'autoplay') { autoPlay(); } } else { if (appendto === '#PodcastContainer tbody') { $(appendto).empty(); } } } }); } function loadVideos(refresh) { if (debug) { console.log("LOAD VIDEOS"); } if (refresh) { $('#VideosContainer').empty(); } var content = $('#VideosContainer').html(); if (content == "") { // Load Videos $.ajax({ url: baseURL + '/getVideos.view?' + baseParams, method: 'GET', dataType: protocol, timeout: 10000, success: function (data) { if (data["subsonic-response"].videos != '') { var videos = []; if (data["subsonic-response"].videos.video.length > 0) { videos = data["subsonic-response"].videos.video; } else { videos[0] = data["subsonic-response"].videos.video; } var rowcolor; $.each(videos, function (i, video) { var html; if (i % 2 === 0) { rowcolor = 'even'; } else { rowcolor = 'odd'; } var videoURL = baseURL + '/stream.view?' + baseParams + '&id=' + video.id; html = ''; html += ''; //html += ''; //html += ''; html += ''; //html += ''; html += ''; html += ''; html += '' + video.title + ''; html += ''; var coverartSrc; if (video.coverArt === undefined) { coverartSrc = 'images/albumdefault_25.jpg'; } else { coverartSrc = baseURL + '/getCoverArt.view?' + baseParams + '&size=25&id=' + video.coverArt; } var time = secondsToTime(video.duration); html += '' + video.album + ''; html += '' + time + ''; html += ''; $(html).appendTo("#VideosContainer"); }); } } }); } }