diff --git a/mopidy_musicbox_webclient/static/index.html b/mopidy_musicbox_webclient/static/index.html index 85edb5c..346dcbf 100644 --- a/mopidy_musicbox_webclient/static/index.html +++ b/mopidy_musicbox_webclient/static/index.html @@ -411,33 +411,22 @@
-

Select a service and add the URL of the stream you want to listen to. - +

Play a specific stream/track and optionally save it to your favourites. + + + - - - -

Put in a name and hit the Save button to save the stream in your browser (not on the server yet). - - - + +
-

diff --git a/mopidy_musicbox_webclient/static/js/controls.js b/mopidy_musicbox_webclient/static/js/controls.js index e2c035d..3127422 100644 --- a/mopidy_musicbox_webclient/static/js/controls.js +++ b/mopidy_musicbox_webclient/static/js/controls.js @@ -286,7 +286,7 @@ function doPlay() { if(isStreamUri(songdata.track.uri)) { mopidy.playback.stop(); } else { - mopidy.playback.pause(); + mopidy.playback.pause(); } } setPlayState(!play); @@ -497,8 +497,8 @@ function playStreamUri(uri) { mopidy.playback.stop(); //hide ios/android keyboard document.activeElement.blur(); - $("input").blur(); clearQueue(); + $("input").blur(); mopidy.tracklist.add(null, null, nwuri); mopidy.playback.play(); } else { @@ -507,71 +507,108 @@ function playStreamUri(uri) { return false; } -function saveStreamUri(nwuri) { - var i = 0; - var name = $('#streamnameinput').val().trim(); - var uri = nwuri || $('#streamuriinput').val().trim(); - var service = $('#selectstreamservice').val(); - if (service) { - uri = serviceupdateStreamUris + ':' + uri; - } - toast('Adding stream ' + uri, 500); - //add stream to list and check for doubles and add no more than 100 - for (var key in streamUris) { - rs = streamUris[key]; - if (i > 100) { - delete streamUris[key]; - continue; +function getCurrentlyPlaying() { + $('#streamuriinput').val(songdata.track.uri); + var name = songdata.track.name; + if (songdata.track.artists) { + var artistStr = artistsToString(songdata.track.artists); + if (artistStr) { + name = artistStr + ' - ' + name; } - i++; } - streamUris.unshift([name, uri]); - $.cookie.json = true; - $.cookie('streamUris', streamUris); - updateStreamUris(); - return false; + $('#streamnameinput').val(name); + return true; } -function deleteStreamUri(uri) { - var i = 0; - for (var key in streamUris) { - rs = streamUris[key]; - if (rs && rs[1] == uri) { - if (confirm("About to remove " + rs[0] + ". Sure?")) { - delete streamUris[key]; +function getPlaylistByName(name, scheme, create) { + return mopidy.playlists.filter({"name": name}).then(function(plists) { + for (var i = 0; i < plists.length; i++) { + if (!scheme || getScheme(plists[i].uri) == scheme) { + return plists[i]; } } - } - $.cookie.json = true; - $.cookie('streamUris', streamUris); - updateStreamUris(); - - return false; -} - -function updateStreamUris() { - var tmp = ''; - $('#streamuristable').empty(); - var child = ''; - for (var key in streamUris) { - var rs = streamUris[key]; - if (rs) { - name = rs[0] || rs[1]; - child = '
  •  ' + - '' + - ' '; - child += '

    ' + name + '

  • '; - tmp += child; + if (create) { + return mopidy.playlists.create(name, scheme).done(function(plist) { + console.log("Created playlist '%s'", plist.name); + return plist; + }); } - } - $('#streamuristable').html(tmp); + console.log("Can't find playist '%s", name); + }); } -function initStreams() { - $.cookie.json = true; - tmpRS = $.cookie('streamUris'); - streamUris = tmpRS || streamUris; - updateStreamUris(); +function getFavourites() { + return getPlaylistByName(STREAMS_PLAYLIST_NAME, + STREAMS_PLAYLIST_SCHEME, + true).then(function(playlist) { + return playlist; + }); +} + +function addFavourite(uri, name) { + var uri = uri || $('#streamuriinput').val().trim(); + var name = name || $('#streamnameinput').val().trim(); + mopidy.library.lookup(null, [uri]).then(function(results) { + var newTracks = results[uri]; + if (newTracks.length == 1) { + // TODO: Supporting adding an entire playlist? + if (name) { + newTracks[0].name = name; // User overrides name. + } + getFavourites().then(function(favourites) { + if (favourites) { + if (favourites.tracks) { + //Array.prototype.push.apply(favourites.tracks, newTracks) + favourites.tracks.push(newTracks[0]); + } else { + favourites.tracks = [newTracks[0]]; + } + mopidy.playlists.save(favourites).then(function(s) { + showFavourites(); + }); + } + }); + } else { + if (newTracks.length == 0) { + console.log('No tracks to add'); + } else { + console.log('Too many tracks (%d) to add', tracks.length); + } + } + }); +} + +function deleteFavourite(index) { + getFavourites().then(function(favourites) { + if (favourites && favourites.tracks && index < favourites.tracks.length) { + var name = favourites.tracks[index].name; + if (confirm("Are you sure you want to remove '" + name + "'?")) { + favourites.tracks.splice(index, 1); + mopidy.playlists.save(favourites).then(function(s) { + showFavourites(); + }); + } + } + }); +} + +function showFavourites() { + $('#streamuristable').empty(); + getFavourites().then(function(favourites) { + if (favourites && favourites.tracks) { + tracks = favourites.tracks; + var tmp = ''; + var child = ''; + for (var i = 0; i < tracks.length; i++) { + child = '
  •  ' + + '' + + ' '; + child += '

    ' + tracks[i].name + '

  • '; + tmp += child; + } + $('#streamuristable').html(tmp); + } + }); } function haltSystem() { diff --git a/mopidy_musicbox_webclient/static/js/functionsvars.js b/mopidy_musicbox_webclient/static/js/functionsvars.js index 556f79a..565d043 100644 --- a/mopidy_musicbox_webclient/static/js/functionsvars.js +++ b/mopidy_musicbox_webclient/static/js/functionsvars.js @@ -34,6 +34,9 @@ var newposition = 0; var playlisttracksScroll; var playlistslistScroll; +var STREAMS_PLAYLIST_NAME = '[Radio Streams]'; +var STREAMS_PLAYLIST_SCHEME = 'm3u'; + //array of cached playlists (not only user-playlists, also search, artist, album-playlists) var playlists = {}; var currentplaylist; @@ -152,6 +155,20 @@ function getAlbum(pl) { }; } +function artistsToString(artists, max) { + var result = ''; + max = max || 3; + for (var i = 0; i < artists.length && i < max; i++) { + if (artists[i].name) { + if (i > 0) { + result += ', '; + } + result += artists[i].name; + } + } + return result; +} + /******************************************************** * break up results and put them in album tables *********************************************************/ @@ -488,17 +505,20 @@ function validServiceUri(str) { return validUri(str) || isServiceUri(str); } +function getScheme(uri) { + return uri.split(':')[0].toLowerCase(); +} + function isStreamUri(uri) { - var uriSplit = uri.split(":"); var a = validUri(uri); - var b = radioExtensionsList.indexOf(uriSplit[0].toLowerCase()) >= 0; + var b = radioExtensionsList.indexOf(getScheme(uri)) >= 0; return a || b; } function getMediaClass(uri) { - var uriSplit = uri.split(":")[0].toLowerCase(); + var scheme = getScheme(uri); for (var i = 0; i < uriClassList.length; i++) { - if (uriSplit == uriClassList[i][0]) { + if (scheme == uriClassList[i][0]) { return "fa " + uriClassList[i][1]; } } @@ -506,9 +526,9 @@ function getMediaClass(uri) { } function getMediaHuman(uri) { - var uriSplit = uri.split(":")[0].toLowerCase(); + var scheme = getScheme(uri); for (var i = 0; i < uriHumanList.length; i++) { - if (uriSplit == uriHumanList[i][0]) { + if (scheme == uriHumanList[i][0]) { return uriHumanList[i][1]; } } @@ -516,19 +536,26 @@ function getMediaHuman(uri) { } function isServiceUri(uri) { - var uriSplit = uri.split(":")[0].toLowerCase(); - var retVal = false; - + var scheme = getScheme(uri); for (var i = 0; i < uriClassList.length; i++) { - if (uriSplit == uriClassList[i][0]) { - retVal = true; + if (scheme == uriClassList[i][0]) { + return true; } } - for (var i = 0; i < radioExtensionsList.length; i++) { - if (uriSplit == radioExtensionsList[i]) { - retVal = true; + if (scheme == radioExtensionsList[i]) { + return true; } } - return retVal; + return false; } + +function isFavouritesPlaylist(playlist) { + return (playlist.name == STREAMS_PLAYLIST_NAME && + getScheme(playlist.uri) == STREAMS_PLAYLIST_SCHEME); +} + +function isSpotifyStarredPlaylist(playlist) { + var starredRegex = /spotify:user:.*:starred/g; + return (starredRegex.test(playlist.uri) && playlist.name == 'Starred'); +} diff --git a/mopidy_musicbox_webclient/static/js/gui.js b/mopidy_musicbox_webclient/static/js/gui.js index 401e7ac..89b2093 100644 --- a/mopidy_musicbox_webclient/static/js/gui.js +++ b/mopidy_musicbox_webclient/static/js/gui.js @@ -114,11 +114,11 @@ function setSongInfo(data) { if(data.track.artists) { for (var j = 0; j < data.track.artists.length; j++) { - artistshtml += '' + data.track.artists[j].name + ''; - artiststext += data.track.artists[j].name; - if (j != data.track.artists.length - 1) { - artistshtml += ', '; - artiststext += ', '; + artistshtml += '' + data.track.artists[j].name + ''; + artiststext += data.track.artists[j].name; + if (j != data.track.artists.length - 1) { + artistshtml += ', '; + artiststext += ', '; } } arttmp = artistshtml; @@ -224,6 +224,7 @@ function initSocketevents() { getCurrentPlaylist(); updateStatusOfAll(); getPlaylists(); + showFavourites(); getBrowseDir(); getSearchSchemes(); showLoading(false); @@ -552,7 +553,7 @@ $(document).ready(function(event) { return true; } }); - initStreams(); + if ($(window).width() < 980) { $("#panel").panel("close"); diff --git a/mopidy_musicbox_webclient/static/js/process_ws.js b/mopidy_musicbox_webclient/static/js/process_ws.js index ca4f680..d918d2a 100644 --- a/mopidy_musicbox_webclient/static/js/process_ws.js +++ b/mopidy_musicbox_webclient/static/js/process_ws.js @@ -159,19 +159,20 @@ function processGetPlaylists(resultArr) { if ((!resultArr) || (resultArr == '')) { return; } - var tmp = '', - starredRegex = /spotify:user:.*:starred/g; + var tmp = '', favourites = '', starred = ''; for (var i = 0; i < resultArr.length; i++) { var li_html = '
  • '; - if(starredRegex.test(resultArr[i].uri) && resultArr[i].name == "Starred") { - // Prepend the user's Spotify "Starred" playlist to the results (like Spotify official client). - tmp = li_html + '★ Spotify Starred Tracks
  • ' + tmp; + if(isSpotifyStarredPlaylist(resultArr[i])) { + starred = li_html + '★ Spotify Starred Tracks' + tmp; + } else if (isFavouritesPlaylist(resultArr[i])) { + favourites = li_html + '♥ Musicbox Favourites'; } else { - // Append everything else. tmp = tmp + li_html + ' ' + resultArr[i].name + ''; } }; + // Prepend the user's Spotify "Starred" playlist and favourites to the results. (like Spotify official client). + tmp = favourites + starred + tmp; $('#playlistslist').html(tmp); scrollToTracklist(); showLoading(false);