diff --git a/mopidy_musicbox_webclient/static/js/controls.js b/mopidy_musicbox_webclient/static/js/controls.js index a7821bb..daec3cc 100644 --- a/mopidy_musicbox_webclient/static/js/controls.js +++ b/mopidy_musicbox_webclient/static/js/controls.js @@ -1,665 +1,665 @@ -/*********************************** +/** ********************************* * play tracks from a browse list * ***********************************/ -function playBrowsedTracks(action, trackIndex) { - $('#popupBrowse').popup('close'); - toast('Loading...'); +function playBrowsedTracks (action, trackIndex) { + $('#popupBrowse').popup('close') + toast('Loading...') if (typeof trackIndex === 'undefined') { - trackIndex = $('#popupBrowse').data("tlid"); + trackIndex = $('#popupBrowse').data('tlid') } if (action == PLAY_ALL) { - mopidy.tracklist.clear(); + mopidy.tracklist.clear() // Default for radio streams is to just add the selected URI. if (isStreamUri(browseTracks[trackIndex].uri)) { - action = PLAY_NOW; + action = PLAY_NOW } } - var trackUris = []; + var trackUris = [] switch (action) { case PLAY_NOW: case PLAY_NEXT: case ADD_THIS_BOTTOM: - trackUris.push(browseTracks[trackIndex].uri); - break; + trackUris.push(browseTracks[trackIndex].uri) + break case PLAY_ALL: case ADD_ALL_BOTTOM: - trackUris = getUris(browseTracks); - break; + trackUris = getUris(browseTracks) + break default: - break; + break } - var maybePlay = function(tlTracks) { + var maybePlay = function (tlTracks) { if (action === PLAY_NOW || action === PLAY_ALL) { - var playIndex = (action === PLAY_ALL) ? trackIndex : 0; - mopidy.playback.play({'tl_track': tlTracks[playIndex]}); + var playIndex = (action === PLAY_ALL) ? trackIndex : 0 + mopidy.playback.play({'tl_track': tlTracks[playIndex]}) } - }; + } switch (action) { case PLAY_NOW: case PLAY_NEXT: mopidy.tracklist.index().then(function (currentIndex) { - mopidy.tracklist.add({'at_position': currentIndex + 1, 'uris': trackUris}).then(maybePlay); - }); - break; + mopidy.tracklist.add({'at_position': currentIndex + 1, 'uris': trackUris}).then(maybePlay) + }) + break case ADD_THIS_BOTTOM: case ADD_ALL_BOTTOM: case PLAY_ALL: - mopidy.tracklist.add({'uris': trackUris}).then(maybePlay); - break; + mopidy.tracklist.add({'uris': trackUris}).then(maybePlay) + break default: - break; + break } - return false; + return false } -/********************************* +/** ******************************* * play an uri from a tracklist * *********************************/ -function playTrack(action) { - var hash = document.location.hash.split('?'); - var divid = hash[0].substr(1); +function playTrack (action) { + var hash = document.location.hash.split('?') + var divid = hash[0].substr(1) // Search page default click behaviour adds and plays selected track only. if (action == PLAY_NOW && divid == 'search') { - action = PLAY_NOW_SEARCH; + action = PLAY_NOW_SEARCH } - $('#popupTracks').popup('close'); - $('#controlspopup').popup('close'); - toast('Loading...'); + $('#popupTracks').popup('close') + $('#controlspopup').popup('close') + toast('Loading...') - playlisturi = $('#popupTracks').data("list"); - uri = $('#popupTracks').data("track"); + playlisturi = $('#popupTracks').data('list') + uri = $('#popupTracks').data('track') - var trackUris = getTracksFromUri(playlisturi); - //find track that was selected + var trackUris = getTracksFromUri(playlisturi) + // find track that was selected for (var selected = 0; selected < trackUris.length; selected++) { if (trackUris[selected] == uri) { - break; + break } } switch (action) { case ADD_THIS_BOTTOM: case PLAY_NEXT: case PLAY_NOW_SEARCH: - trackUris = [trackUris[selected]]; - selected = 0; + trackUris = [trackUris[selected]] + selected = 0 } switch (action) { case PLAY_NOW: case PLAY_NOW_SEARCH: mopidy.tracklist.clear().then( mopidy.tracklist.add({'uris': trackUris}).then( - function(tlTracks) { - mopidy.playback.play({'tl_track': tlTracks[selected]}); + function (tlTracks) { + mopidy.playback.play({'tl_track': tlTracks[selected]}) } ) - ); - break; + ) + break case PLAY_NEXT: - mopidy.tracklist.index().then(function(currentIndex) { - mopidy.tracklist.add({'at_position': currentIndex + 1, 'uris': trackUris}); - }); - break; + mopidy.tracklist.index().then(function (currentIndex) { + mopidy.tracklist.add({'at_position': currentIndex + 1, 'uris': trackUris}) + }) + break case ADD_THIS_BOTTOM: case ADD_ALL_BOTTOM: - mopidy.tracklist.add({'uris': trackUris}); - break; + mopidy.tracklist.add({'uris': trackUris}) + break } - return false; + return false } -/*** +/** * * Plays a Track given by an URI from the given playlist URI. * @param track_uri, playlist_uri * @returns {boolean} */ -function playTrackByUri(track_uri, playlist_uri) { - function findAndPlayTrack(tlTracks) { +function playTrackByUri (track_uri, playlist_uri) { + function findAndPlayTrack (tlTracks) { if (tlTracks.length > 0) { // Find track that was selected for (var selected = 0; selected < tlTracks.length; selected++) { if (tlTracks[selected].track.uri == track_uri) { - mopidy.playback.play({'tl_track': tlTracks[selected]}); - return; + mopidy.playback.play({'tl_track': tlTracks[selected]}) + return } } } - console.error('Failed to find and play selected track ', track_uri); - return; + console.error('Failed to find and play selected track ', track_uri) + return } // Stop directly, for user feedback - mopidy.tracklist.clear(); + mopidy.tracklist.clear() - //this is deprecated, remove when popuptracks is removed completly - $('#popupTracks').popup('close'); - $('#controlspopup').popup('close'); - //end of deprecated + // this is deprecated, remove when popuptracks is removed completly + $('#popupTracks').popup('close') + $('#controlspopup').popup('close') + // end of deprecated - toast('Loading...'); + toast('Loading...') - mopidy.tracklist.add({'uris': [playlist_uri]}).then(function(tlTracks) { + mopidy.tracklist.add({'uris': [playlist_uri]}).then(function (tlTracks) { // Can fail for all sorts of reasons. If so, just add individually. if (tlTracks.length === 0) { - var trackUris = getTracksFromUri(playlist_uri, false); - mopidy.tracklist.add({'uris': trackUris}).then(findAndPlayTrack); + var trackUris = getTracksFromUri(playlist_uri, false) + mopidy.tracklist.add({'uris': trackUris}).then(findAndPlayTrack) } else { - findAndPlayTrack(tlTracks); + findAndPlayTrack(tlTracks) } - }); - return false; + }) + return false } -/******************************************************** +/** ****************************************************** * play an uri from the queue *********************************************************/ -/*** +/** * * Plays a Track from a Playlist. * @param uri * @param tlid * @returns {boolean} */ -function playTrackQueueByTlid(uri, tlid) { - //stop directly, for user feedback - mopidy.playback.stop(); - $('#popupQueue').popup('close'); - toast('Loading...'); +function playTrackQueueByTlid (uri, tlid) { + // stop directly, for user feedback + mopidy.playback.stop() + $('#popupQueue').popup('close') + toast('Loading...') - tlid = parseInt(tlid); + tlid = parseInt(tlid) mopidy.tracklist.filter({ 'tlid': [tlid] }).then( - function(tlTracks) { + function (tlTracks) { if (tlTracks.length > 0) { - mopidy.playback.play({'tl_track': tlTracks[0]}); - return; + mopidy.playback.play({'tl_track': tlTracks[0]}) + return } - console.log('Failed to play selected track ', tlid); + console.log('Failed to play selected track ', tlid) } - ); - return false; + ) + return false } -/*** +/** * * @deprecated * @returns {boolean} */ -function playTrackQueue() { - uri = $('#popupQueue').data("track"); - tlid = $('#popupQueue').data("tlid"); - return playTrackQueueByTlid(uri, tlid); +function playTrackQueue () { + uri = $('#popupQueue').data('track') + tlid = $('#popupQueue').data('tlid') + return playTrackQueueByTlid(uri, tlid) } -/*********************************** +/** ********************************* * remove a track from the queue * ***********************************/ -function removeTrack() { - $('#popupQueue').popup('close'); - toast('Deleting...'); +function removeTrack () { + $('#popupQueue').popup('close') + toast('Deleting...') - tlid = parseInt($('#popupQueue').data("tlid")); - console.log(tlid); - mopidy.tracklist.remove({'tlid': [tlid]}); + tlid = parseInt($('#popupQueue').data('tlid')) + console.log(tlid) + mopidy.tracklist.remove({'tlid': [tlid]}) } -function clearQueue() { +function clearQueue () { mopidy.tracklist.clear().then( resetSong() - ); - return false; + ) + return false } -function savePressed(key) { +function savePressed (key) { if (key == 13) { - saveQueue(); - return false; + saveQueue() + return false } - return true; + return true } -function showSavePopup(){ - mopidy.tracklist.getTracks().then(function(tracks) { +function showSavePopup () { + mopidy.tracklist.getTracks().then(function (tracks) { if (tracks.length > 0) { - $('#saveinput').val(''); - $('#popupSave').popup('open'); + $('#saveinput').val('') + $('#popupSave').popup('open') } - }); + }) } -function saveQueue() { - mopidy.tracklist.getTracks().then(function(tracks) { - var playlistName = $('#saveinput').val().trim(); - if (playlistName !== null && playlistName !== "") { - getPlaylistByName(playlistName, 'm3u', false).then(function(exists) { +function saveQueue () { + mopidy.tracklist.getTracks().then(function (tracks) { + var playlistName = $('#saveinput').val().trim() + if (playlistName !== null && playlistName !== '') { + getPlaylistByName(playlistName, 'm3u', false).then(function (exists) { if (exists) { - $('#popupSave').popup('close'); - $('#popupOverwrite').popup('open'); - $('#overwriteConfirmBtn').click(function() { - initSave(playlistName, tracks); - }); + $('#popupSave').popup('close') + $('#popupOverwrite').popup('open') + $('#overwriteConfirmBtn').click(function () { + initSave(playlistName, tracks) + }) } else { - initSave(playlistName, tracks); + initSave(playlistName, tracks) } - }); + }) } - }); - return false; + }) + return false } -function initSave(playlistName, tracks) { - $('#popupOverwrite').popup('close'); - $('#popupSave').popup('close'); - $('#saveinput').val(''); - toast('Saving...'); - mopidy.playlists.create({'name': playlistName, 'uri_scheme': "m3u"}).then(function(playlist) { - playlist.tracks = tracks; - mopidy.playlists.save({'playlist': playlist}).then(); - }); +function initSave (playlistName, tracks) { + $('#popupOverwrite').popup('close') + $('#popupSave').popup('close') + $('#saveinput').val('') + toast('Saving...') + mopidy.playlists.create({'name': playlistName, 'uri_scheme': 'm3u'}).then(function (playlist) { + playlist.tracks = tracks + mopidy.playlists.save({'playlist': playlist}).then() + }) } -function refreshPlaylists() { - mopidy.playlists.refresh().then(function() { - playlists = {}; - $('#playlisttracksdiv').hide(); - $('#playlistslistdiv').show(); - }); - return false; +function refreshPlaylists () { + mopidy.playlists.refresh().then(function () { + playlists = {} + $('#playlisttracksdiv').hide() + $('#playlistslistdiv').show() + }) + return false } -/************* +/** *********** * Buttons * *************/ -function doShuffle() { - mopidy.playback.stop(); - mopidy.tracklist.shuffle(); - mopidy.playback.play(); +function doShuffle () { + mopidy.playback.stop() + mopidy.tracklist.shuffle() + mopidy.playback.play() } /* Toggle state of play button */ -function setPlayState(nwplay) { +function setPlayState (nwplay) { if (nwplay) { - $("#btplayNowPlaying >i").removeClass('fa-play').addClass('fa-pause'); - $("#btplayNowPlaying").attr('title', 'Pause'); - $("#btplay >i").removeClass('fa-play').addClass('fa-pause'); - $("#btplay").attr('title', 'Pause'); - mopidy.playback.getTimePosition().then(processCurrentposition, console.error); - startProgressTimer(); + $('#btplayNowPlaying >i').removeClass('fa-play').addClass('fa-pause') + $('#btplayNowPlaying').attr('title', 'Pause') + $('#btplay >i').removeClass('fa-play').addClass('fa-pause') + $('#btplay').attr('title', 'Pause') + mopidy.playback.getTimePosition().then(processCurrentposition, console.error) + startProgressTimer() } else { - $("#btplayNowPlaying >i").removeClass('fa-pause').addClass('fa-play'); - $("#btplayNowPlaying").attr('title', 'Play'); - $("#btplay >i").removeClass('fa-pause').addClass('fa-play'); - $("#btplay").attr('title', 'Play'); - progressTimer.stop(); + $('#btplayNowPlaying >i').removeClass('fa-pause').addClass('fa-play') + $('#btplayNowPlaying').attr('title', 'Play') + $('#btplay >i').removeClass('fa-pause').addClass('fa-play') + $('#btplay').attr('title', 'Play') + progressTimer.stop() } - play = nwplay; + play = nwplay } -//play or pause -function doPlay() { - toast('Please wait...', 250); +// play or pause +function doPlay () { + toast('Please wait...', 250) if (!play) { - mopidy.playback.play(); + mopidy.playback.play() } else { - if(isStreamUri(songdata.track.uri)) { - mopidy.playback.stop(); + if (isStreamUri(songdata.track.uri)) { + mopidy.playback.stop() } else { - mopidy.playback.pause(); + mopidy.playback.pause() } } - setPlayState(!play); + setPlayState(!play) } -function doPrevious() { - toast('Playing previous track...'); - mopidy.playback.previous(); +function doPrevious () { + toast('Playing previous track...') + mopidy.playback.previous() } -function doNext() { - toast('Playing next track...'); - mopidy.playback.next(); +function doNext () { + toast('Playing next track...') + mopidy.playback.next() } -function backbt() { - history.back(); - return false; +function backbt () { + history.back() + return false } -/************* +/** *********** * Options * *************/ -function setTracklistOption(name, new_value) { +function setTracklistOption (name, new_value) { if (!new_value) { - $("#"+name+"bt").attr('style', 'color:#2489ce'); + $("#" + name+'bt').attr('style', 'color:#2489ce') } else { - $("#"+name+"bt").attr('style', 'color:#66DD33'); + $("#" + name+'bt').attr('style', 'color:#66DD33') } - return new_value; + return new_value } -function setRepeat(nwrepeat) { +function setRepeat (nwrepeat) { if (repeat != nwrepeat) { - repeat = setTracklistOption("repeat", nwrepeat); + repeat = setTracklistOption('repeat', nwrepeat) } } -function setRandom(nwrandom) { +function setRandom (nwrandom) { if (random != nwrandom) { - random = setTracklistOption("random", nwrandom); + random = setTracklistOption('random', nwrandom) } } -function setConsume(nwconsume) { +function setConsume (nwconsume) { if (consume != nwconsume) { - consume = setTracklistOption("consume", nwconsume); + consume = setTracklistOption('consume', nwconsume) } } -function setSingle(nwsingle) { +function setSingle (nwsingle) { if (single != nwsingle) { - single = setTracklistOption("single", nwsingle); + single = setTracklistOption('single', nwsingle) } } -function doRandom() { - mopidy.tracklist.setRandom({'value': !random}).then(); +function doRandom () { + mopidy.tracklist.setRandom({'value': !random}).then() } -function doRepeat() { - mopidy.tracklist.setRepeat({'value': !repeat}).then(); +function doRepeat () { + mopidy.tracklist.setRepeat({'value': !repeat}).then() } -function doConsume() { - mopidy.tracklist.setConsume({'value': !consume}).then(); +function doConsume () { + mopidy.tracklist.setConsume({'value': !consume}).then() } -function doSingle() { - mopidy.tracklist.setSingle({'value': !single}).then(); +function doSingle () { + mopidy.tracklist.setSingle({'value': !single}).then() } -/*********************************************** +/** ********************************************* * Track Slider * * Use a timer to prevent looping of commands * ***********************************************/ -function doSeekPos(value) { +function doSeekPos (value) { if (!positionChanging) { - positionChanging = value; - mopidy.playback.seek({'time_position': Math.round(value)}).then( function() { - positionChanging = null; - }); + positionChanging = value + mopidy.playback.seek({'time_position': Math.round(value)}).then(function () { + positionChanging = null + }) } } -function setPosition(pos) { - if (!positionChanging && $("#trackslider").val() != pos) { - setProgressTimer(pos); +function setPosition (pos) { + if (!positionChanging && $('#trackslider').val() != pos) { + setProgressTimer(pos) } } -/*********************************************** +/** ********************************************* * Volume slider * * Use a timer to prevent looping of commands * ***********************************************/ -function setVolume(value) { - if (!volumeChanging && !volumeSliding && $("#volumeslider").val() != value) { - $( "#volumeslider" ).off( "change"); - $( "#volumeslider" ).val(value).slider('refresh'); - $( "#volumeslider" ).on( "change", function() { doVolume( $(this).val() ); } ); +function setVolume (value) { + if (!volumeChanging && !volumeSliding && $('#volumeslider').val() != value) { + $("#volumeslider").off( 'change') + $("#volumeslider").val(value).slider('refresh') + $("#volumeslider").on( 'change', function () { doVolume($(this).val()) }) } } -function doVolume(value) { +function doVolume (value) { if (!volumeChanging) { - volumeChanging = value; - mopidy.playback.setVolume({'volume': parseInt(volumeChanging)}).then( function() { - volumeChanging = null; - }); + volumeChanging = value + mopidy.playback.setVolume({'volume': parseInt(volumeChanging)}).then(function () { + volumeChanging = null + }) } } -function setMute(nwmute) { +function setMute (nwmute) { if (mute != nwmute) { - mute = nwmute; + mute = nwmute if (mute) { - $("#mutebt").attr('class', 'fa fa-volume-off'); + $('#mutebt').attr('class', 'fa fa-volume-off') } else { - $("#mutebt").attr('class', 'fa fa-volume-up'); + $('#mutebt').attr('class', 'fa fa-volume-up') } } } -function doMute() { - mopidy.mixer.setMute({'mute': !mute}); +function doMute () { + mopidy.mixer.setMute({'mute': !mute}) } -/************ +/** ********** * Stream * ************/ -function streamPressed(key) { +function streamPressed (key) { if (key == 13) { - playStreamUri(); - return false; + playStreamUri() + return false } - return true; + return true } -function playStreamUri(uri) { - //value of name is based on the passing of an uri as a parameter or not - var nwuri = uri || $('#streamuriinput').val().trim(); - var service = $('#selectstreamservice').val(); +function playStreamUri (uri) { + // value of name is based on the passing of an uri as a parameter or not + var nwuri = uri || $('#streamuriinput').val().trim() + var service = $('#selectstreamservice').val() if (!uri && service) { - nwuri = service + ':' + nwuri; + nwuri = service + ':' + nwuri } if (isServiceUri(nwuri) || isStreamUri(nwuri) || validUri(nwuri)) { - toast('Playing...'); - //stop directly, for user feedback - mopidy.playback.stop(); - //hide ios/android keyboard - document.activeElement.blur(); - clearQueue(); - $("input").blur(); - mopidy.tracklist.add({'uris': [nwuri]}); - mopidy.playback.play(); + toast('Playing...') + // stop directly, for user feedback + mopidy.playback.stop() + // hide ios/android keyboard + document.activeElement.blur() + clearQueue() + $('input').blur() + mopidy.tracklist.add({'uris': [nwuri]}) + mopidy.playback.play() } else { - toast('No valid url!'); + toast('No valid url!') } - return false; + return false } -function getCurrentlyPlaying() { - $('#streamuriinput').val(songdata.track.uri); - var name = songdata.track.name; +function getCurrentlyPlaying () { + $('#streamuriinput').val(songdata.track.uri) + var name = songdata.track.name if (songdata.track.artists) { - var artistStr = artistsToString(songdata.track.artists); + var artistStr = artistsToString(songdata.track.artists) if (artistStr) { - name = artistStr + ' - ' + name; + name = artistStr + ' - ' + name } } - $('#streamnameinput').val(name); - return true; + $('#streamnameinput').val(name) + return true } -function getUriSchemes() { - uriSchemes = {}; - return mopidy.getUriSchemes().then(function(schemes) { +function getUriSchemes () { + uriSchemes = {} + return mopidy.getUriSchemes().then(function (schemes) { for (var i = 0; i < schemes.length; i++) { - uriSchemes[schemes[i].toLowerCase()] = true; + uriSchemes[schemes[i].toLowerCase()] = true } - }); + }) } -function getPlaylistByName(name, scheme, create) { - var uri_scheme = scheme || ''; - var uri = ''; +function getPlaylistByName (name, scheme, create) { + var uri_scheme = scheme || '' + var uri = '' if (uri_scheme && !uriSchemes[uri_scheme]) { - return Mopidy.when(false); + return Mopidy.when(false) } - return mopidy.playlists.asList().catch(console.error.bind(console)).then(function(plists) { + return mopidy.playlists.asList().catch(console.error.bind(console)).then(function (plists) { for (var i = 0; i < plists.length; i++) { if ((plists[i].name === name) && (uri_scheme === '' || getScheme(plists[i].uri) === uri_scheme)) { - return plists[i]; + return plists[i] } } if (create) { - return mopidy.playlists.create({'name': name, 'uri_scheme': uri_scheme}).done(function(plist) { - console.log("Created playlist '%s'", plist.name); - return plist; - }); + return mopidy.playlists.create({'name': name, 'uri_scheme': uri_scheme}).done(function (plist) { + console.log("Created playlist '%s'", plist.name) + return plist + }) } - console.log("Can't find playist '%s", name); - return Mopidy.when(false); - }); + console.log("Can't find playist '%s", name) + return Mopidy.when(false) + }) } -function getPlaylistFull(uri) { - return mopidy.playlists.lookup({'uri': uri}).then(function(pl) { - playlists[uri] = pl; - return pl; - }); +function getPlaylistFull (uri) { + return mopidy.playlists.lookup({'uri': uri}).then(function (pl) { + playlists[uri] = pl + return pl + }) } -function getFavourites() { +function getFavourites () { return getPlaylistByName(STREAMS_PLAYLIST_NAME, STREAMS_PLAYLIST_SCHEME, - true).then(function(playlist) { - if (playlist) { - return getPlaylistFull(playlist.uri); + true).then(function (playlist) { + if (playlist) { + return getPlaylistFull(playlist.uri) } - return Mopidy.when(false); - }); + return Mopidy.when(false) + }) } -function addToFavourites(newTracks) { - getFavourites().catch(console.error.bind(console)).then(function(favourites) { +function addToFavourites (newTracks) { + getFavourites().catch(console.error.bind(console)).then(function (favourites) { if (favourites) { if (favourites.tracks) { - Array.prototype.push.apply(favourites.tracks, newTracks); + Array.prototype.push.apply(favourites.tracks, newTracks) } else { - favourites.tracks = newTracks; + favourites.tracks = newTracks } - mopidy.playlists.save({'playlist': favourites}).then(function(s) { - showFavourites(); - }); + mopidy.playlists.save({'playlist': favourites}).then(function (s) { + showFavourites() + }) } - }); + }) } -function addFavourite(uri, name) { - var uri = uri || $('#streamuriinput').val().trim(); - var name = name || $('#streamnameinput').val().trim(); - mopidy.library.lookup({'uris': [uri]}).then(function(results) { - var newTracks = results[uri]; +function addFavourite (uri, name) { + var uri = uri || $('#streamuriinput').val().trim() + var name = name || $('#streamnameinput').val().trim() + mopidy.library.lookup({'uris': [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. + newTracks[0].name = name // User overrides name. } - addToFavourites(newTracks); + addToFavourites(newTracks) } else { if (newTracks.length === 0) { - console.log('No tracks to add'); + console.log('No tracks to add') } else { - console.log('Too many tracks (%d) to add', tracks.length); + console.log('Too many tracks (%d) to add', tracks.length) } } - }); + }) } -function deleteFavourite(index) { - getFavourites().then(function(favourites) { +function deleteFavourite (index) { + getFavourites().then(function (favourites) { if (favourites && favourites.tracks && index < favourites.tracks.length) { - var name = favourites.tracks[index].name; + var name = favourites.tracks[index].name if (confirm("Are you sure you want to remove '" + name + "'?")) { - favourites.tracks.splice(index, 1); - mopidy.playlists.save({'playlist': favourites}).then(function(s) { - showFavourites(); - }); + favourites.tracks.splice(index, 1) + mopidy.playlists.save({'playlist': favourites}).then(function (s) { + showFavourites() + }) } } - }); + }) } -function showFavourites() { - $('#streamuristable').empty(); - getFavourites().then(function(favourites) { +function showFavourites () { + $('#streamuristable').empty() + getFavourites().then(function (favourites) { if (!favourites) { - return; + return } - var tmp = ''; + var tmp = '' - $.cookie.json = true; + $.cookie.json = true if ($.cookie('streamUris')) { - tmp = ''; + tmp = '' } if (favourites.tracks) { - var child = ''; + var child = '' for (var i = 0; i < favourites.tracks.length; i++) { child = '
  •  ' + '' + - ' '; - child += '

    ' + favourites.tracks[i].name + '

  • '; - tmp += child; + ' ' + child += '

    ' + favourites.tracks[i].name + '

    ' + tmp += child } } - $('#streamuristable').html(tmp); - }); + $('#streamuristable').html(tmp) + }) } // TODO: Remove this upgrade path in next major release. -function upgradeStreamUrisToFavourites() { - toast('Converting streamUris...'); - $.cookie.json = true; - var streamUris = $.cookie('streamUris'); // Read the cookie. +function upgradeStreamUrisToFavourites () { + toast('Converting streamUris...') + $.cookie.json = true + var streamUris = $.cookie('streamUris') // Read the cookie. if (streamUris) { - var uris = []; // Prepare a list of uris to lookup. + var uris = [] // Prepare a list of uris to lookup. for (var key in streamUris) { - var rs = streamUris[key]; + var rs = streamUris[key] if (rs) { - uris.push(rs[1]); + uris.push(rs[1]) } } - mopidy.library.lookup({'uris': uris}).then(function(results) { - var tracks = []; // Prepare a list of tracks to add. + mopidy.library.lookup({'uris': uris}).then(function (results) { + var tracks = [] // Prepare a list of tracks to add. for (var key in streamUris) { - var rs = streamUris[key]; + var rs = streamUris[key] if (rs) { - var track = results[rs[1]][0]; + var track = results[rs[1]][0] if (track) { - track.name = rs[0] || track.name; // Use custom name if provided. - tracks.push(track); + track.name = rs[0] || track.name // Use custom name if provided. + tracks.push(track) } else { - console.log("Skipping unplayable streamUri " + rs[1]); + console.log('Skipping unplayable streamUri ' + rs[1]) } } } - addToFavourites(tracks); - $.cookie('streamUris', null); // Delete the cookie now we're done. - console.log(tracks.length + " streamUris added to favourites"); - }); + addToFavourites(tracks) + $.cookie('streamUris', null) // Delete the cookie now we're done. + console.log(tracks.length + ' streamUris added to favourites') + }) } else { - console.log("No streamUris cookie found"); + console.log('No streamUris cookie found') } } -function haltSystem() { - $.post("/settings/shutdown"); - toast('Stopping system...', 10000); - setTimeout(function() { - window.history.back(); - }, 10000); +function haltSystem () { + $.post('/settings/shutdown') + toast('Stopping system...', 10000) + setTimeout(function () { + window.history.back() + }, 10000) } -function rebootSystem() { - $.post("/settings/reboot"); - toast('Rebooting...', 10000); - setTimeout(function() { - window.history.back(); - }, 10000); +function rebootSystem () { + $.post('/settings/reboot') + toast('Rebooting...', 10000) + setTimeout(function () { + window.history.back() + }, 10000) } diff --git a/mopidy_musicbox_webclient/static/js/functionsvars.js b/mopidy_musicbox_webclient/static/js/functionsvars.js index d0b99fc..1b8f060 100644 --- a/mopidy_musicbox_webclient/static/js/functionsvars.js +++ b/mopidy_musicbox_webclient/static/js/functionsvars.js @@ -4,74 +4,74 @@ * all kinds functions and vars */ -var mopidy; +var mopidy -//values for controls -var play = false; -var random; -var repeat; -var consume; -var single; -var mute; -var volumeChanging; -var volumeSliding = false; +// values for controls +var play = false +var random +var repeat +var consume +var single +var mute +var volumeChanging +var volumeSliding = false -var positionChanging; +var positionChanging -var initgui = true; -var popupData = {}; -var songlength = 0; +var initgui = true +var popupData = {} +var songlength = 0 -var artistshtml = ''; -var artiststext = ''; -var songname = ''; -var songdata = {'track': {}, 'tlid': -1}; +var artistshtml = '' +var artiststext = '' +var songname = '' +var songdata = {'track': {}, 'tlid': -1} -var playlisttracksScroll; -var playlistslistScroll; +var playlisttracksScroll +var playlistslistScroll -var STREAMS_PLAYLIST_NAME = '[Radio Streams]'; -var STREAMS_PLAYLIST_SCHEME = 'm3u'; -var uriSchemes = {}; +var STREAMS_PLAYLIST_NAME = '[Radio Streams]' +var STREAMS_PLAYLIST_SCHEME = 'm3u' +var uriSchemes = {} -//array of cached playlists (not only user-playlists, also search, artist, album-playlists) -var playlists = {}; -var currentplaylist; -var customTracklists = []; +// array of cached playlists (not only user-playlists, also search, artist, album-playlists) +var playlists = {} +var currentplaylist +var customTracklists = [] -var browseStack = []; -var browseTracks = []; +var browseStack = [] +var browseTracks = [] var ua = navigator.userAgent, isMobileSafari = /Mac/.test(ua) && /Mobile/.test(ua), isMobileWebkit = /WebKit/.test(ua) && /Mobile/.test(ua), isMobile = /Mobile/.test(ua), - isWebkit = /WebKit/.test(ua); + isWebkit = /WebKit/.test(ua) -//constants -PROGRAM_NAME = 'MusicBox'; -ARTIST_TABLE = '#artiststable'; -ALBUM_TABLE = '#albumstable'; -PLAYLIST_TABLE = '#playlisttracks'; -CURRENT_PLAYLIST_TABLE = '#currenttable'; -SEARCH_ALL_TABLE = '#allresulttable'; -SEARCH_ALBUM_TABLE = '#albumresulttable'; -SEARCH_ARTIST_TABLE = '#artistresulttable'; -SEARCH_TRACK_TABLE = '#trackresulttable'; +// constants +PROGRAM_NAME = 'MusicBox' +ARTIST_TABLE = '#artiststable' +ALBUM_TABLE = '#albumstable' +PLAYLIST_TABLE = '#playlisttracks' +CURRENT_PLAYLIST_TABLE = '#currenttable' +SEARCH_ALL_TABLE = '#allresulttable' +SEARCH_ALBUM_TABLE = '#albumresulttable' +SEARCH_ARTIST_TABLE = '#artistresulttable' +SEARCH_TRACK_TABLE = '#trackresulttable' -URI_SCHEME = 'mbw'; +URI_SCHEME = 'mbw' -PLAY_NOW = 0; -PLAY_NEXT = 1; -ADD_THIS_BOTTOM = 2; -ADD_ALL_BOTTOM = 3; -PLAY_ALL = 4; -PLAY_NOW_SEARCH = 5; +PLAY_NOW = 0 +PLAY_NEXT = 1 +ADD_THIS_BOTTOM = 2 +ADD_ALL_BOTTOM = 3 +PLAY_ALL = 4 +PLAY_NOW_SEARCH = 5 -MAX_TABLEROWS = 50; +MAX_TABLEROWS = 50 // the first part of Mopidy extensions which serve radio streams -var radioExtensionsList = ['somafm', 'tunein', 'dirble', 'audioaddict']; +var radioExtensionsList = ['somafm', 'tunein', 'dirble', 'audioaddict'] var uriClassList = [ ['spotify', 'fa-spotify'], @@ -90,7 +90,7 @@ var uriClassList = [ ['yt', 'fa-youtube'], ['audioaddict', 'fa-bullhorn'], ['subsonic', 'fa-folder-open'] -]; +] var uriHumanList = [ ['spotify', 'Spotify'], @@ -107,441 +107,441 @@ var uriHumanList = [ ['youtube', 'YouTube'], ['audioaddict', 'AudioAddict'], ['subsonic', 'Subsonic'] -]; +] -function scrollToTop() { - var divtop = 0; +function scrollToTop () { + var divtop = 0 $('body,html').animate({ scrollTop: divtop - }, 250); + }, 250) } -function scrollToTracklist() { - var divtop = $("#playlisttracksdiv").offset().top - 120; +function scrollToTracklist () { + var divtop = $('#playlisttracksdiv').offset().top - 120 $('body,html').animate({ scrollTop: divtop - }, 250); + }, 250) } -//A hack to find the name of the first artist of a playlist. this is not yet returned by mopidy -//does not work wel with multiple artists of course -function getArtist(pl) { +// A hack to find the name of the first artist of a playlist. this is not yet returned by mopidy +// does not work wel with multiple artists of course +function getArtist (pl) { for (var i = 0; i < pl.length; i++) { for (var j = 0; j < pl[i].artists.length; j++) { if (pl[i].artists[j].name !== '') { - return pl[i].artists[j].name; + return pl[i].artists[j].name } } } } -//A hack to find the first album of a playlist. this is not yet returned by mopidy -function getAlbum(pl) { +// A hack to find the first album of a playlist. this is not yet returned by mopidy +function getAlbum (pl) { for (var i = 0; i < pl.length; i++) { if (pl[i].album.name !== '') { - return pl[i].album.name; + return pl[i].album.name } } } -function artistsToString(artists, max) { - var result = ''; - max = max || 3; +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 += ', ' } - result += artists[i].name; + result += artists[i].name } } - return result; + return result } -/******************************************************** +/** ****************************************************** * break up results and put them in album tables *********************************************************/ -function albumTracksToTable(pl, target, uri) { - var tmp = '' + $(target).html(tmp) + $(target).attr('data', uri) } -function renderSongLi(song, liID, uri) { - var name; +function renderSongLi (song, liID, uri) { + var name if (!song.name || song.name === '') { - name = uri.split('/'); - name = decodeURI(name[name.length - 1]); + name = uri.split('/') + name = decodeURI(name[name.length - 1]) } else { - name = song.name; + name = song.name } songLi = '
  • ' + '' + '' + '' + '

    ' + name + '

    ' + - '
  • '; - return songLi; + '' + return songLi } -function renderQueueSongLi(song, liID, uri, tlid) { - var name; +function renderQueueSongLi (song, liID, uri, tlid) { + var name if (!song.name || song.name === '') { - name = uri.split('/'); - name = decodeURI(name[name.length - 1]); + name = uri.split('/') + name = decodeURI(name[name.length - 1]) } else { - name = song.name; + name = song.name } songLi = '
  • ' + '' + '' + '' + '

    ' + name + '

    ' + - '
  • '; - return songLi; + '' + return songLi } -function resultsToTables(results, target, uri) { +function resultsToTables (results, target, uri) { if (!results) { - return; + return } - var tlids = []; + var tlids = [] if (target == CURRENT_PLAYLIST_TABLE) { for (i = 0; i < results.length; i++) { - tlids[i] = results[i].tlid; - results[i] = results[i].track; + tlids[i] = results[i].tlid + results[i] = results[i].track } } - var newalbum = []; - var newtlids = []; - //keep a list of track URIs for retrieving of covers - var coversList = []; - var nextname = ''; - var count = 0; - $(target).html(''); + var newalbum = [] + var newtlids = [] + // keep a list of track URIs for retrieving of covers + var coversList = [] + var nextname = '' + var count = 0 + $(target).html('') - //break into albums and put in tables - var html = ''; - var tableid, j, artistname, alburi, name, iconClass; - var targetmin = target.substr(1); - $(target).attr('data', uri); - var length = 0 || results.length; + // break into albums and put in tables + var html = '' + var tableid, j, artistname, alburi, name, iconClass + var targetmin = target.substr(1) + $(target).attr('data', uri) + var length = 0 || results.length for (i = 0; i < length; i++) { - //create album if none extists + // create album if none extists if (!results[i].album) { - results[i].album = {"__model__": "Album"}; + results[i].album = {'__model__': 'Album'} } - //create album uri if there is none + // create album uri if there is none if (!results[i].album.uri) { - results[i].album.uri = 'x'; + results[i].album.uri = 'x' } if (!results[i].album.name) { - results[i].album.name = ''; + results[i].album.name = '' } - //create name if there is no one + // create name if there is no one if (!results[i].name || results[i].name === '') { - name = results[i].uri.split('/'); - results[i].name = decodeURI(name[name.length - 1]) || 'Track ' + String(i); + name = results[i].uri.split('/') + results[i].name = decodeURI(name[name.length - 1]) || 'Track ' + String(i) } - //leave out unplayable items - if (results[i].name.substring(0, 12) == '[unplayable]') continue; + // leave out unplayable items + if (results[i].name.substring(0, 12) == '[unplayable]') continue - newalbum.push(results[i]); - newtlids.push(tlids[i]); - nextname = ''; + newalbum.push(results[i]) + newtlids.push(tlids[i]) + nextname = '' if ((i < length - 1) && results[i + 1].album && results[i + 1].album.name) { - nextname = results[i + 1].album.name; + nextname = results[i + 1].album.name } if (results[i].length == -1) { - html += '
  • ' + results[i].name + ' [Stream]

  • '; - newalbum = []; - newtlids = []; - nextname = ''; + html += '
  • ' + results[i].name + ' [Stream]

  • ' + newalbum = [] + newtlids = [] + nextname = '' } else { if ((results[i].album.name != nextname) || (nextname === '')) { - tableid = 'art' + i; - //render differently if only one track in the album + tableid = 'art' + i + // render differently if only one track in the album if (newalbum.length == 1) { if (i !== 0) { - html += '
  •  
  • '; + html += '
  •  
  • ' } - iconClass = getMediaClass(newalbum[0].uri); - var liID = targetmin + '-' + newalbum[0].uri; + iconClass = getMediaClass(newalbum[0].uri) + var liID = targetmin + '-' + newalbum[0].uri if (target == CURRENT_PLAYLIST_TABLE) { html += '
  • ' + '' + '' + '' + - '

    ' + newalbum[0].name + "

    "; + '

    ' + newalbum[0].name + "

    " } else { html += '

  • ' + '' + '' + '' + - '

    ' + newalbum[0].name + "

    "; + '

    ' + newalbum[0].name + "

    " } if (newalbum[0].artists) { for (j = 0; j < newalbum[0].artists.length; j++) { - html += newalbum[0].artists[j].name; - html += (j == newalbum[0].artists.length - 1) ? '' : ' / '; - //stop after 3 + html += newalbum[0].artists[j].name + html += (j == newalbum[0].artists.length - 1) ? '' : ' / ' + // stop after 3 if (j > 2) { - html += '...'; - break; + html += '...' + break } } } if (newalbum[0].album.name !== '') { - html += ' / '; + html += ' / ' } - html += '' + newalbum[0].album.name + '

    '; - html += '
  • '; + html += '' + newalbum[0].album.name + '

    ' + html += '' - popupData[newalbum[0].uri] = newalbum[0]; - newalbum = []; - newtlids = []; - } else { //newalbum length + popupData[newalbum[0].uri] = newalbum[0] + newalbum = [] + newtlids = [] + } else { // newalbum length if (results[i].album.uri && results[i].album.name) { - iconClass = getMediaClass(newalbum[0].uri); - html += '
  • '; + iconClass = getMediaClass(newalbum[0].uri) + html += '
  • ' html += '

    ' + results[i].album.name + '

    '; + targetmin + '-cover-' + i + '" class="artistcover" width="30" height="30" />

    ' + results[i].album.name + '

    ' } if (results[i].album.artists) { for (j = 0; j < results[i].album.artists.length; j++) { - html += results[i].album.artists[j].name; - html += (j == results[i].album.artists.length - 1) ? '' : ' / '; - //stop after 3 + html += results[i].album.artists[j].name + html += (j == results[i].album.artists.length - 1) ? '' : ' / ' + // stop after 3 if (j > 2) { - child += '...'; - break; + child += '...' + break } } } - html += '

  • '; + html += '

    ' for (j = 0; j < newalbum.length; j++) { - popupData[newalbum[j].uri] = newalbum[j]; - //hERE! - var liID = targetmin + '-' + newalbum[j].uri; + popupData[newalbum[j].uri] = newalbum[j] + // hERE! + var liID = targetmin + '-' + newalbum[j].uri if (target == CURRENT_PLAYLIST_TABLE) { - html += renderQueueSongLi(newalbum[j], liID, uri, newtlids[j]); + html += renderQueueSongLi(newalbum[j], liID, uri, newtlids[j]) } else { - html += renderSongLi(newalbum[j], liID, uri); + html += renderSongLi(newalbum[j], liID, uri) } } - newalbum = []; - newtlids = []; + newalbum = [] + newtlids = [] if (results[i].album) { - coversList.push([results[i].uri, i]); + coversList.push([results[i].uri, i]) } - } //newalbum length - } //albums name + } // newalbum length + } // albums name } } - tableid = "#" + tableid; - $(target).html(html); - $(target).attr('data', uri); - //retrieve albumcovers + tableid = '#' + tableid + $(target).html(html) + $(target).attr('data', uri) + // retrieve albumcovers for (i = 0; i < coversList.length; i++) { - getCover(coversList[i][0], target + '-cover-' + coversList[i][1], 'small'); + getCover(coversList[i][0], target + '-cover-' + coversList[i][1], 'small') } } -//process updated playlist to gui -function playlisttotable(pl, target, uri) { - var tmp = ''; - $(target).html(''); - var targetmin = target.substr(1); - var child = ''; +// process updated playlist to gui +function playlisttotable (pl, target, uri) { + var tmp = '' + $(target).html('') + var targetmin = target.substr(1) + var child = '' for (var i = 0; i < pl.length; i++) { if (pl[i]) { - popupData[pl[i].uri] = pl[i]; - child = '
  • '; - child += '

    ' + pl[i].name + "

    "; - child += '

    '; - child += '' + timeFromSeconds(pl[i].length / 1000) + ''; + popupData[pl[i].uri] = pl[i] + child = '

  • ' + child += '

    ' + pl[i].name + "

    " + child += '

    ' + child += '' + timeFromSeconds(pl[i].length / 1000) + '' for (var j = 0; j < pl[i].artists.length; j++) { if (pl[i].artists[j]) { - child += pl[i].artists[j].name; - child += (j == pl[i].artists.length - 1) ? '' : ' / '; - //stop after 3 + child += pl[i].artists[j].name + child += (j == pl[i].artists.length - 1) ? '' : ' / ' + // stop after 3 if (j > 2) { - child += '...'; - break; + child += '...' + break } } } - child += ' / ' + pl[i].album.name + '

    '; - child += '
  • '; - tmp += child; + child += ' / ' + pl[i].album.name + '

    ' + child += '' + tmp += child } } - $(target).html(tmp); - $(target).attr('data', uri); + $(target).html(tmp) + $(target).attr('data', uri) } -function getPlaylistTracks(uri) { +function getPlaylistTracks (uri) { if (playlists[uri] && playlists[uri].tracks) { - return Mopidy.when(playlists[uri].tracks); + return Mopidy.when(playlists[uri].tracks) } else { - showLoading(true); - return mopidy.playlists.getItems({'uri': uri}).then(function(refs) { - return processPlaylistItems({'uri': uri, 'items': refs}); - }, console.error); + showLoading(true) + return mopidy.playlists.getItems({'uri': uri}).then(function (refs) { + return processPlaylistItems({'uri': uri, 'items': refs}) + }, console.error) } } -function getUris(tracks) { - var results = []; +function getUris (tracks) { + var results = [] for (var i = 0; i < tracks.length; i++) { - results.push(tracks[i].uri); + results.push(tracks[i].uri) } - return results; + return results } -function getTracksFromUri(uri, full_track_data) { - var returnTracksOrUris = function(tracks) { - return (full_track_data || false) ? tracks : getUris(tracks); - }; +function getTracksFromUri (uri, full_track_data) { + var returnTracksOrUris = function (tracks) { + return (full_track_data || false) ? tracks : getUris(tracks) + } if (customTracklists[uri]) { - return returnTracksOrUris(customTracklists[uri]); + return returnTracksOrUris(customTracklists[uri]) } else if (playlists[uri] && playlists[uri].tracks) { - return returnTracksOrUris(playlists[uri].tracks); + return returnTracksOrUris(playlists[uri].tracks) } - return []; + return [] } -//convert time to human readable format -function timeFromSeconds(length) { - var d = Number(length); - var h = Math.floor(d / 3600); - var m = Math.floor(d % 3600 / 60); - var s = Math.floor(d % 3600 % 60); - return ((h > 0 ? h + ":" : "") + (m > 0 ? (h > 0 && m < 10 ? "0" : "") + m + ":" : "0:") + (s < 10 ? "0" : "") + s); +// convert time to human readable format +function timeFromSeconds (length) { + var d = Number(length) + var h = Math.floor(d / 3600) + var m = Math.floor(d % 3600 / 60) + var s = Math.floor(d % 3600 % 60) + return ((h > 0 ? h + ':' : '') + (m > 0 ? (h > 0 && m < 10 ? '0' : '') + m + ':' : '0:') + (s < 10 ? '0' : '') + s) } -/******* Toast ***/ -function toast(message, delay, textOnly) { - textOnl = textOnly || false; - message = message || "Loading..."; - delay = delay || 1000; +/** ***** Toast ***/ +function toast (message, delay, textOnly) { + textOnl = textOnly || false + message = message || "Loading..." + delay = delay || 1000 $.mobile.loading('show', { text: message, textVisible: true, theme: 'a', textonly: textOnl - }); + }) if (delay > 0) { - setTimeout(function() { - $.mobile.loading('hide'); - }, delay); + setTimeout(function () { + $.mobile.loading('hide') + }, delay) } } -/****************** +/** **************** * Modal dialogs * ******************/ -function showLoading(on) { +function showLoading (on) { if (on) { - $("body").css("cursor", "progress"); + $('body').css('cursor', 'progress') $.mobile.loading('show', { text: 'Loading data from ' + PROGRAM_NAME + '. Please wait...', textVisible: true, theme: 'a' - }); + }) } else { - $("body").css("cursor", "default"); - $.mobile.loading('hide'); + $('body').css('cursor', 'default') + $.mobile.loading('hide') } } -function showOffline(on) { +function showOffline (on) { if (on) { $.mobile.loading('show', { text: 'Trying to reach ' + PROGRAM_NAME + '. Please wait...', textVisible: true, theme: 'a' - }); + }) } else { - $.mobile.loading('hide'); + $.mobile.loading('hide') } } // from http://dzone.com/snippets/validate-url-regexp -function validUri(str) { - var regexp = /^(mms|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/; - return regexp.test(str); +function validUri (str) { + var regexp = /^(mms|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ + return regexp.test(str) } -function validServiceUri(str) { - return validUri(str) || isServiceUri(str); +function validServiceUri (str) { + return validUri(str) || isServiceUri(str) } -function getScheme(uri) { - return uri.split(':')[0].toLowerCase(); +function getScheme (uri) { + return uri.split(':')[0].toLowerCase() } -function isStreamUri(uri) { - var a = validUri(uri); - var b = radioExtensionsList.indexOf(getScheme(uri)) >= 0; - return a || b; +function isStreamUri (uri) { + var a = validUri(uri) + var b = radioExtensionsList.indexOf(getScheme(uri)) >= 0 + return a || b } -function getMediaClass(uri) { - var scheme = getScheme(uri); +function getMediaClass (uri) { + var scheme = getScheme(uri) for (var i = 0; i < uriClassList.length; i++) { if (scheme == uriClassList[i][0]) { - return "fa " + uriClassList[i][1]; + return 'fa ' + uriClassList[i][1] } } - return ''; + return '' } -function getMediaHuman(uri) { - var scheme = getScheme(uri); +function getMediaHuman (uri) { + var scheme = getScheme(uri) for (var i = 0; i < uriHumanList.length; i++) { if (scheme == uriHumanList[i][0]) { - return uriHumanList[i][1]; + return uriHumanList[i][1] } } - return ''; + return '' } -function isServiceUri(uri) { - var scheme = getScheme(uri); +function isServiceUri (uri) { + var scheme = getScheme(uri) for (var i = 0; i < uriClassList.length; i++) { if (scheme == uriClassList[i][0]) { - return true; + return true } } for (var i = 0; i < radioExtensionsList.length; i++) { if (scheme == radioExtensionsList[i]) { - return true; + return true } } - return false; + return false } -function isFavouritesPlaylist(playlist) { +function isFavouritesPlaylist (playlist) { return (playlist.name == STREAMS_PLAYLIST_NAME && - getScheme(playlist.uri) == STREAMS_PLAYLIST_SCHEME); + getScheme(playlist.uri) == STREAMS_PLAYLIST_SCHEME) } -function isSpotifyStarredPlaylist(playlist) { - var starredRegex = /spotify:user:.*:starred/g; - return (starredRegex.test(playlist.uri) && playlist.name == 'Starred'); +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 d1be849..4827d1c 100644 --- a/mopidy_musicbox_webclient/static/js/gui.js +++ b/mopidy_musicbox_webclient/static/js/gui.js @@ -3,32 +3,32 @@ * do- functions interact with the server * show- functions do both */ -/******************** +/** ****************** * Song Info Sreen * ********************/ -function resetSong() { - setPlayState(false); - setPosition(0); - var data = new Object({}); - data.tlid = -1; - data.track = new Object({}); - data.track.name = ''; - data.track.artists = ''; - data.track.length = 0; - data.track.uri = ' '; - setSongInfo(data); +function resetSong () { + setPlayState(false) + setPosition(0) + var data = new Object({}) + data.tlid = -1 + data.track = new Object({}) + data.track.name = '' + data.track.artists = '' + data.track.length = 0 + data.track.uri = ' ' + setSongInfo(data) } -function resizeMb() { - $("#infoname").html(songdata.track.name); - $("#infoartist").html(artiststext); +function resizeMb () { + $('#infoname').html(songdata.track.name) + $('#infoartist').html(artiststext) if ($(window).width() <= 960) { // $('#playlisttracksdiv').hide(); // $('#playlistslistdiv').show(); } else { - $('#playlisttracksdiv').show(); - $('#playlistslistdiv').show(); + $('#playlisttracksdiv').show() + $('#playlistslistdiv').show() } // //set height of playlist scrollers /* if ($(window).width() > 960) { @@ -68,412 +68,412 @@ function resizeMb() { */ } -function setSongTitle(title, refresh_ui) { - songdata.track.name = title; - $("#modalname").html(title); +function setSongTitle (title, refresh_ui) { + songdata.track.name = title + $('#modalname').html(title) if (refresh_ui) { - resizeMb(); + resizeMb() } } -function setSongInfo(data) { +function setSongInfo (data) { // console.log(data, songdata); - if (!data ) { return; } - if (data.tlid == songdata.tlid) { return; } + if (!data) { return } + if (data.tlid == songdata.tlid) { return } if (!data.track.name || data.track.name === '') { - var name = data.track.uri.split('/'); - data.track.name = decodeURI(name[name.length - 1]); + var name = data.track.uri.split('/') + data.track.name = decodeURI(name[name.length - 1]) } - updatePlayIcons(data.track.uri, data.tlid); - artistshtml = ''; - artiststext = ''; + updatePlayIcons(data.track.uri, data.tlid) + artistshtml = '' + artiststext = '' if (validUri(data.track.name)) { for (var key in streamUris) { - rs = streamUris[key]; + rs = streamUris[key] if (rs && rs[1] == data.track.name) { - data.track.name = (rs[0] || rs[1]); + data.track.name = (rs[0] || rs[1]) } } } - songdata = data; + songdata = data - setSongTitle(data.track.name, false); - songlength = Infinity; + setSongTitle(data.track.name, false) + songlength = Infinity if (!data.track.length || data.track.length === 0) { - $('#trackslider').next().find('.ui-slider-handle').hide(); - $('#trackslider').slider('disable'); + $('#trackslider').next().find('.ui-slider-handle').hide() + $('#trackslider').slider('disable') // $('#streamnameinput').val(data.track.name); // $('#streamuriinput').val(data.track.uri); } else { - songlength = data.track.length; - $('#trackslider').slider('enable'); - $('#trackslider').next().find('.ui-slider-handle').show(); + songlength = data.track.length + $('#trackslider').slider('enable') + $('#trackslider').next().find('.ui-slider-handle').show() } - var arttmp = ''; + var arttmp = '' - 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 += ', '; - } + 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 += ', ' + } } - arttmp = artistshtml; + arttmp = artistshtml } if (data.track.album && data.track.album.name) { - $("#modalalbum").html('' + data.track.album.name + ''); - getCover(data.track.uri, '#infocover, #controlspopupimage', 'extralarge'); + $('#modalalbum').html('' + data.track.album.name + '') + getCover(data.track.uri, '#infocover, #controlspopupimage', 'extralarge') } else { - $("#modalalbum").html(''); - $("#infocover").attr('src', 'images/default_cover.png'); - $("#controlspopupimage").attr('src', 'images/default_cover.png'); + $('#modalalbum').html('') + $('#infocover').attr('src', 'images/default_cover.png') + $('#controlspopupimage').attr('src', 'images/default_cover.png') } - $("#modalartist").html(arttmp); + $('#modalartist').html(arttmp) - $("#trackslider").attr("min", 0); - $("#trackslider").attr("max", songlength); - resetProgressTimer(); - progressTimer.set(0, songlength); + $('#trackslider').attr('min', 0) + $('#trackslider').attr('max', songlength) + resetProgressTimer() + progressTimer.set(0, songlength) if (play) { - startProgressTimer(); + startProgressTimer() } - resizeMb(); + resizeMb() } -/****************** +/** **************** * display popups * ******************/ -function closePopups() { - $('#popupTracks').popup('close'); - $('#artistpopup').popup('close'); - $('#coverpopup').popup('close'); - $('#popupQueue').popup('close'); - $('#controlspopup').popup('close'); +function closePopups () { + $('#popupTracks').popup('close') + $('#artistpopup').popup('close') + $('#coverpopup').popup('close') + $('#popupQueue').popup('close') + $('#controlspopup').popup('close') } -function popupTracks(e, listuri, trackuri, tlid) { +function popupTracks (e, listuri, trackuri, tlid) { if (!e) - e = window.event; - $('.popupTrackName').html(popupData[trackuri].name); - $('.popupAlbumName').html(popupData[trackuri].album.name); - var child = ""; + e = window.event + $('.popupTrackName').html(popupData[trackuri].name) + $('.popupAlbumName').html(popupData[trackuri].album.name) + var child = "" if (popupData[trackuri].artists) { if (popupData[trackuri].artists.length == 1) { - child = 'Show Artist'; - $('.popupArtistName').html(popupData[trackuri].artists[0].name); - $('.popupArtistHref').attr('onclick', 'showArtist("' + popupData[trackuri].artists[0].uri + '");' ); - $('.popupArtistsDiv').hide(); - $('.popupArtistsLi').show(); + child = 'Show Artist' + $('.popupArtistName').html(popupData[trackuri].artists[0].name) + $('.popupArtistHref').attr('onclick', 'showArtist("' + popupData[trackuri].artists[0].uri + '");') + $('.popupArtistsDiv').hide() + $('.popupArtistsLi').show() } else { for (var j = 0; j < popupData[trackuri].artists.length; j++) { - child += '
  • ' + popupData[trackuri].artists[j].name + '
  • '; + child += '
  • ' + popupData[trackuri].artists[j].name + '
  • ' } - $('.popupArtistsLi').hide(); - $('.popupArtistsLv').html(child).show(); - $('.popupArtistsDiv').show(); + $('.popupArtistsLi').hide() + $('.popupArtistsLv').html(child).show() + $('.popupArtistsDiv').show() // this makes the viewport of the window resize somehow - $('.popupArtistsLv').listview("refresh"); + $('.popupArtistsLv').listview('refresh') } } else { - $('.popupArtistsDiv').hide(); - $('.popupArtistsLi').hide(); + $('.popupArtistsDiv').hide() + $('.popupArtistsLi').hide() } - var hash = document.location.hash.split('?'); - var divid = hash[0].substr(1); - var popupName = ''; + var hash = document.location.hash.split('?') + var divid = hash[0].substr(1) + var popupName = '' if (divid == 'current') { - $(".addqueue").hide(); - popupName = '#popupQueue'; + $('.addqueue').hide() + popupName = '#popupQueue' } else if (divid == 'browse') { - $(".addqueue").show(); - popupName = '#popupBrowse'; + $('.addqueue').show() + popupName = '#popupBrowse' } else { - $(".addqueue").show(); - popupName = '#popupTracks'; + $('.addqueue').show() + popupName = '#popupTracks' } if (typeof tlid != 'undefined' && tlid !== '') { - $(popupName).data("list", listuri).data("track", trackuri).data("tlid", tlid).popup("open", { + $(popupName).data('list', listuri).data('track', trackuri).data('tlid', tlid).popup('open', { x : e.pageX, y : e.pageY - }); + }) } else { - $(popupName).data("list", listuri).data("track", trackuri).popup("open", { + $(popupName).data('list', listuri).data('track', trackuri).popup('open', { x : e.pageX, y : e.pageY - }); + }) } - return false; + return false } -function showAlbumPopup(popupId) { - uri = $(popupId).data("track"); - showAlbum(popupData[uri].album.uri); +function showAlbumPopup (popupId) { + uri = $(popupId).data('track') + showAlbum(popupData[uri].album.uri) } -/********************** +/** ******************** * initialize sockets * **********************/ -function initSocketevents() { - mopidy.on("state:online", function() { - showOffline(false); - getCurrentPlaylist(); - updateStatusOfAll(); - getPlaylists(); - getUriSchemes().then(function() { - showFavourites(); - }); - getBrowseDir(); - getSearchSchemes(); - showLoading(false); - $(window).hashchange(); - }); +function initSocketevents () { + mopidy.on('state:online', function () { + showOffline(false) + getCurrentPlaylist() + updateStatusOfAll() + getPlaylists() + getUriSchemes().then(function () { + showFavourites() + }) + getBrowseDir() + getSearchSchemes() + showLoading(false) + $(window).hashchange() + }) - mopidy.on("state:offline", function() { - resetSong(); - showOffline(true); - }); + mopidy.on('state:offline', function () { + resetSong() + showOffline(true) + }) - mopidy.on("event:optionsChanged", updateOptions); + mopidy.on('event:optionsChanged', updateOptions) - mopidy.on("event:trackPlaybackStarted", function(data) { - setSongInfo(data.tl_track); - setPlayState(true); - }); + mopidy.on('event:trackPlaybackStarted', function (data) { + setSongInfo(data.tl_track) + setPlayState(true) + }) - mopidy.on("event:playlistsLoaded", function(data) { - showLoading(true); - getPlaylists(); - }); + mopidy.on('event:playlistsLoaded', function (data) { + showLoading(true) + getPlaylists() + }) - mopidy.on("event:playlistChanged", function(data) { - $('#playlisttracksdiv').hide(); - $('#playlistslistdiv').show(); - delete playlists[data.playlist.uri]; - getPlaylists(); - }); + mopidy.on('event:playlistChanged', function (data) { + $('#playlisttracksdiv').hide() + $('#playlistslistdiv').show() + delete playlists[data.playlist.uri] + getPlaylists() + }) - mopidy.on("event:playlistDeleted", function(data) { - $('#playlisttracksdiv').hide(); - $('#playlistslistdiv').show(); - delete playlists[data.uri]; - getPlaylists(); - }); + mopidy.on('event:playlistDeleted', function (data) { + $('#playlisttracksdiv').hide() + $('#playlistslistdiv').show() + delete playlists[data.uri] + getPlaylists() + }) - mopidy.on("event:volumeChanged", function(data) { - setVolume(data.volume); - }); + mopidy.on('event:volumeChanged', function (data) { + setVolume(data.volume) + }) - mopidy.on("event:muteChanged", function(data) { - setMute(data.mute); - }); + mopidy.on('event:muteChanged', function (data) { + setMute(data.mute) + }) - mopidy.on("event:playbackStateChanged", function(data) { + mopidy.on('event:playbackStateChanged', function (data) { switch (data.new_state) { - case "paused": - case "stopped": - setPlayState(false); - break; - case "playing": - setPlayState(true); - break; + case 'paused': + case 'stopped': + setPlayState(false) + break + case 'playing': + setPlayState(true) + break } - }); + }) - mopidy.on("event:tracklistChanged", function(data) { - getCurrentPlaylist(); - }); + mopidy.on('event:tracklistChanged', function (data) { + getCurrentPlaylist() + }) - mopidy.on("event:seeked", function(data) { - setPosition(parseInt(data.time_position)); + mopidy.on('event:seeked', function (data) { + setPosition(parseInt(data.time_position)) if (play) { - startProgressTimer(); + startProgressTimer() } - }); + }) - mopidy.on("event:streamTitleChanged", function(data) { - setSongTitle(data.title, true); - }); + mopidy.on('event:streamTitleChanged', function (data) { + setSongTitle(data.title, true) + }) } -$(document).bind("pageinit", function() { - resizeMb(); +$(document).bind('pageinit', function () { + resizeMb() -}); +}) -/************** +/** ************ * gui stuff * **************/ -function toggleFullscreen() { - if (isMobileSafari) { alert ("To get this app in Full Screen, you have to add it to your home-screen using the Share button."); exit(); } - if (!isFullscreen() ) { // current working methods - var docElm = document.documentElement; +function toggleFullscreen () { + if (isMobileSafari) { alert('To get this app in Full Screen, you have to add it to your home-screen using the Share button.'); exit() } + if (!isFullscreen()) { // current working methods + var docElm = document.documentElement if (docElm.requestFullscreen) { - docElm.requestFullscreen(); + docElm.requestFullscreen() } else if (docElm.msRequestFullscreen) { - docElm.msRequestFullscreen(); + docElm.msRequestFullscreen() } else if (docElm.mozRequestFullScreen) { - docElm.mozRequestFullScreen(); + docElm.mozRequestFullScreen() } else if (docElm.webkitRequestFullScreen) { - docElm.webkitRequestFullScreen(); + docElm.webkitRequestFullScreen() } } else { if (document.exitFullscreen) { - document.exitFullscreen(); + document.exitFullscreen() } else if (document.msExitFullscreen) { - document.msExitFullscreen(); + document.msExitFullscreen() } else if (document.mozCancelFullScreen) { - document.mozCancelFullScreen(); + document.mozCancelFullScreen() } else if (document.webkitCancelFullScreen) { - document.webkitCancelFullScreen(); + document.webkitCancelFullScreen() } } } -function isFullscreen() { +function isFullscreen () { return (document.fullscreenElement || // alternative standard method - document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement ); // current working methods + document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement) // current working methods } -function switchContent(divid, uri) { - var hash = divid; +function switchContent (divid, uri) { + var hash = divid if (uri) { - hash += "?" + uri; + hash += '?' + uri } - location.hash = "#" + hash; + location.hash = '#' + hash } -function setHeadline(site){ - site = site.trim(); - str = $('.mainNav').find('a[href$='+site+']').text(); - if(str === ""){ - str = site.charAt(0).toUpperCase() + site.slice(1); +function setHeadline (site) { + site = site.trim() + str = $('.mainNav').find('a[href$=' + site + ']').text() + if (str === '') { + str = site.charAt(0).toUpperCase() + site.slice(1) } - $('#contentHeadline').html('' + str + ''); + $('#contentHeadline').html('' + str + '') } -//update tracklist options. -function updateOptions() { - mopidy.tracklist.getRepeat().then(processRepeat, console.error); - mopidy.tracklist.getRandom().then(processRandom, console.error); - mopidy.tracklist.getConsume().then(processConsume, console.error); - mopidy.tracklist.getSingle().then(processSingle, console.error); +// update tracklist options. +function updateOptions () { + mopidy.tracklist.getRepeat().then(processRepeat, console.error) + mopidy.tracklist.getRandom().then(processRandom, console.error) + mopidy.tracklist.getConsume().then(processConsume, console.error) + mopidy.tracklist.getSingle().then(processSingle, console.error) } -//update everything as if reloaded -function updateStatusOfAll() { - mopidy.playback.getCurrentTlTrack().then(processCurrenttrack, console.error); - mopidy.playback.getTimePosition().then(processCurrentposition, console.error); - mopidy.playback.getState().then(processPlaystate, console.error); +// update everything as if reloaded +function updateStatusOfAll () { + mopidy.playback.getCurrentTlTrack().then(processCurrenttrack, console.error) + mopidy.playback.getTimePosition().then(processCurrentposition, console.error) + mopidy.playback.getState().then(processPlaystate, console.error) - updateOptions(); + updateOptions() - mopidy.playback.getVolume().then(processVolume, console.error); - mopidy.mixer.getMute().then(processMute, console.error); + mopidy.playback.getVolume().then(processVolume, console.error) + mopidy.mixer.getMute().then(processMute, console.error) } -function locationHashChanged() { - var hash = document.location.hash.split('?'); - //remove # - var divid = hash[0].substr(1); - setHeadline(divid); +function locationHashChanged () { + var hash = document.location.hash.split('?') + // remove # + var divid = hash[0].substr(1) + setHeadline(divid) - var uri = hash[1]; - $('.mainNav a').removeClass('ui-state-active ui-state-persist ui-btn-active'); - //i don't know why some li elements have those classes, but they do, so we need to remove them - $('.mainNav li').removeClass('ui-state-active ui-state-persist ui-btn-active'); + var uri = hash[1] + $('.mainNav a').removeClass('ui-state-active ui-state-persist ui-btn-active') + // i don't know why some li elements have those classes, but they do, so we need to remove them + $('.mainNav li').removeClass('ui-state-active ui-state-persist ui-btn-active') if ($(window).width() < 560) { - $("#panel").panel("close"); + $('#panel').panel('close') } - $('.pane').hide(); + $('.pane').hide() - $('#' + divid + 'pane').show(); + $('#' + divid + 'pane').show() - switch(divid) { + switch (divid) { case 'home': - $('#navhome a').addClass('ui-state-active ui-state-persist ui-btn-active'); - break; + $('#navhome a').addClass('ui-state-active ui-state-persist ui-btn-active') + break case 'nowPlaying': - $('#navnowPlaying a').addClass('ui-state-active ui-state-persist ui-btn-active'); - break; + $('#navnowPlaying a').addClass('ui-state-active ui-state-persist ui-btn-active') + break case 'current': - $('#navcurrent a').addClass('ui-state-active ui-state-persist ui-btn-active'); - getCurrentPlaylist(); - break; + $('#navcurrent a').addClass('ui-state-active ui-state-persist ui-btn-active') + getCurrentPlaylist() + break case 'playlists': - $('#navplaylists a').addClass('ui-state-active ui-state-persist ui-btn-active'); - break; + $('#navplaylists a').addClass('ui-state-active ui-state-persist ui-btn-active') + break case 'browse': - $('#navbrowse a').addClass('ui-state-active ui-state-persist ui-btn-active'); - break; + $('#navbrowse a').addClass('ui-state-active ui-state-persist ui-btn-active') + break case 'search': - $('#navsearch a').addClass($.mobile.activeBtnClass); - $("#searchinput").focus(); + $('#navsearch a').addClass($.mobile.activeBtnClass) + $('#searchinput').focus() if (customTracklists['mbw:allresultscache'] === '') { - initSearch($('#searchinput').val()); + initSearch($('#searchinput').val()) } - break; + break case 'stream': - $('#navstream a').addClass('ui-state-active ui-state-persist ui-btn-active'); - break; + $('#navstream a').addClass('ui-state-active ui-state-persist ui-btn-active') + break case 'artists': if (uri !== '') { - showArtist(uri); + showArtist(uri) } - break; + break case 'albums': if (uri !== '') { - showAlbum(uri); + showAlbum(uri) } - break; + break } - //switch the footer - switch(divid) { + // switch the footer + switch (divid) { case 'nowPlaying': - $('#normalFooter').hide(); - $('#nowPlayingFooter').show(); - break; + $('#normalFooter').hide() + $('#nowPlayingFooter').show() + break default: - $('#normalFooter').show(); - $('#nowPlayingFooter').hide(); + $('#normalFooter').show() + $('#nowPlayingFooter').hide() } // Set the page title based on the hash. - document.title = PROGRAM_NAME; - return false; + document.title = PROGRAM_NAME + return false } -/*********************** +/** ********************* * initialize software * ***********************/ -$(document).ready(function(event) { - //check for websockets +$(document).ready(function (event) { + // check for websockets if (!window.WebSocket) { - switchContent("playlists"); - $('#playlistspane').html('

    Old Browser

    Sorry. Your browser isn\'t modern enough for this webapp. Modern versions of Chrome, Firefox, Safari all will do. Maybe Opera and Internet Explorer 10 also work, but it\'s not tested.

    '); - exit; + switchContent('playlists') + $('#playlistspane').html('

    Old Browser

    Sorry. Your browser isn\'t modern enough for this webapp. Modern versions of Chrome, Firefox, Safari all will do. Maybe Opera and Internet Explorer 10 also work, but it\'s not tested.

    ') + exit } - //workaround for a bug in jQuery Mobile, without that the panel doesn't close on mobile devices... - $('.ui-panel-dismiss').on( "tap", function() { $("#panel").panel("close"); } ); - //end of workaround + // workaround for a bug in jQuery Mobile, without that the panel doesn't close on mobile devices... + $('.ui-panel-dismiss').on( 'tap', function () { $('#panel').panel('close') }) + // end of workaround - $(window).hashchange(); + $(window).hashchange() // Connect to server if (websocketUrl) { @@ -481,196 +481,196 @@ $(document).ready(function(event) { mopidy = new Mopidy({ webSocketUrl: websocketUrl, callingConvention: 'by-position-or-by-name' - }); + }) } catch (e) { - showOffline(true); + showOffline(true) } } else { try { - mopidy = new Mopidy({callingConvention: 'by-position-or-by-name'}); - } catch (e) { - showOffline(true); - } + mopidy = new Mopidy({callingConvention: 'by-position-or-by-name'}) + } catch (e) { + showOffline(true) + } } - //initialize events - initSocketevents(); + // initialize events + initSocketevents() progressTimer = new ProgressTimer({ callback: timerCallback, - //updateRate: 2000, - }); + // updateRate: 2000, + }) - resetSong(); + resetSong() if (location.hash.length < 2) { - switchContent("home"); + switchContent('home') } - initgui = false; - window.onhashchange = locationHashChanged; + initgui = false + window.onhashchange = locationHashChanged - //only show backbutton if in UIWebview + // only show backbutton if in UIWebview if (window.navigator.standalone) { - $("#btback").show(); + $('#btback').show() } else { - $("#btback").hide(); + $('#btback').hide() } - $(window).resize(function() { - resizeMb(); - }); + $(window).resize(function () { + resizeMb() + }) - //navigation temporary, rewrite this! - $('#songinfo').click(function() { - return switchContent('nowPlaying'); - }); - $('#controlspopupimage').click(function() { - return switchContent('current'); - }); - $('#navToggleFullscreen').click(function() { - toggleFullscreen(); - }); + // navigation temporary, rewrite this! + $('#songinfo').click(function () { + return switchContent('nowPlaying') + }) + $('#controlspopupimage').click(function () { + return switchContent('current') + }) + $('#navToggleFullscreen').click(function () { + toggleFullscreen() + }) // event handlers for full screen mode - $(document).on('webkitfullscreenchange mozfullscreenchange fullscreenchange, MSFullscreenChange', function(e) { + $(document).on('webkitfullscreenchange mozfullscreenchange fullscreenchange, MSFullscreenChange', function (e) { if (isFullscreen()) { - document.getElementById("toggletxt").innerHTML = "Exit Fullscreen"; + document.getElementById('toggletxt').innerHTML = "Exit Fullscreen" } else { - document.getElementById("toggletxt").innerHTML = "Fullscreen"; + document.getElementById('toggletxt').innerHTML = "Fullscreen" } - }); + }) // remove buttons only for MusicBox if (!isMusicBox) { - $('#navSettings').hide(); - $('#navshutdown').hide(); - $('#homesettings').hide(); - $('#homeshutdown').hide(); + $('#navSettings').hide() + $('#navshutdown').hide() + $('#homesettings').hide() + $('#homeshutdown').hide() } // remove Alarm Clock if it is not present if (!hasAlarmClock) { - $('#navAlarmClock').hide(); - $('#homeAlarmClock').hide(); - $('#homeAlarmClock').nextAll().find('.ui-block-a, .ui-block-b').toggleClass('ui-block-a').toggleClass('ui-block-b'); + $('#navAlarmClock').hide() + $('#homeAlarmClock').hide() + $('#homeAlarmClock').nextAll().find('.ui-block-a, .ui-block-b').toggleClass('ui-block-a').toggleClass('ui-block-b') } - //navigation stuff + // navigation stuff - $(document).keypress( function (event) { - //console.log('kp: '+event); - if (event.target.tagName != 'INPUT') { - var unicode=event.keyCode? event.keyCode : event.charCode; - var actualkey=String.fromCharCode(unicode); - switch(actualkey) { - case ' ': - doPlay(); - event.preventDefault(); - break; - case '>': - doNext(); - event.preventDefault(); - break; - case '<': - doPrevious(); - event.preventDefault(); - break; + $(document).keypress(function (event) { + // console.log('kp: '+event); + if (event.target.tagName != 'INPUT') { + var unicode = event.keyCode ? event.keyCode : event.charCode + var actualkey = String.fromCharCode(unicode) + switch (actualkey) { + case ' ': + doPlay() + event.preventDefault() + break + case '>': + doNext() + event.preventDefault() + break + case '<': + doPrevious() + event.preventDefault() + break } - return true; + return true } - }); + }) if ($(window).width() < 980) { - $("#panel").panel("close"); - }else{ - $("#panel").panel("open"); + $('#panel').panel('close') + } else { + $('#panel').panel('open') } - $.event.special.swipe.horizontalDistanceThreshold = 125; // (default: 30px) Swipe horizontal displacement must be more than this. - $.event.special.swipe.verticalDistanceThreshold = 50; // (default: 75px) Swipe vertical displacement must be less than this. - $.event.special.swipe.durationThreshold = 500; + $.event.special.swipe.horizontalDistanceThreshold = 125 // (default: 30px) Swipe horizontal displacement must be more than this. + $.event.special.swipe.verticalDistanceThreshold = 50 // (default: 75px) Swipe vertical displacement must be less than this. + $.event.special.swipe.durationThreshold = 500 // swipe songinfo and panel - $( "#normalFooter, #nowPlayingFooter" ).on( "swiperight", doPrevious ); - $( "#normalFooter, #nowPlayingFooter" ).on( "swipeleft", doNext ); - $( "#nowPlayingpane, .ui-body-c, #header, #panel, .pane" ).on( "swiperight", function() { - if(!$(event.target).is("#normalFooter") && !$(event.target).is("#nowPlayingFooter")) { - $("#panel").panel("open"); - event.stopImmediatePropagation(); } - } ); - $( "#nowPlayingpane, .ui-body-c, #header, #panel, .pane" ).on( "swipeleft", function() { - if(!$(event.target).is("#normalFooter") && !$(event.target).is("#nowPlayingFooter")) { - $("#panel").panel("close"); - event.stopImmediatePropagation(); } - } ); + $("#normalFooter, #nowPlayingFooter").on( 'swiperight', doPrevious) + $("#normalFooter, #nowPlayingFooter").on( 'swipeleft', doNext) + $("#nowPlayingpane, .ui-body-c, #header, #panel, .pane").on( 'swiperight', function () { + if (!$(event.target).is('#normalFooter') && !$(event.target).is('#nowPlayingFooter')) { + $('#panel').panel('open') + event.stopImmediatePropagation() } + }) + $("#nowPlayingpane, .ui-body-c, #header, #panel, .pane").on( 'swipeleft', function () { + if (!$(event.target).is('#normalFooter') && !$(event.target).is('#nowPlayingFooter')) { + $('#panel').panel('close') + event.stopImmediatePropagation() } + }) - $( "#trackslider" ).on( "slidestart", function() { - progressTimer.stop(); - $( "#trackslider" ).on( "change", function() { updatePosition( $(this).val() ); } ); - } ); + $("#trackslider").on( 'slidestart', function () { + progressTimer.stop() + $("#trackslider").on( 'change', function () { updatePosition($(this).val()) }) + }) - $( "#trackslider" ).on( "slidestop", function() { - $( "#trackslider" ).off( "change"); - doSeekPos( $(this).val() ); - } ); + $("#trackslider").on( 'slidestop', function () { + $("#trackslider").off( 'change') + doSeekPos($(this).val()) + }) - $( "#volumeslider" ).on( "slidestart", function() { volumeSliding = true; } ); - $( "#volumeslider" ).on( "slidestop", function() { volumeSliding = false; } ); - $( "#volumeslider" ).on( "change", function() { doVolume( $(this).val() ); } ); -}); + $("#volumeslider").on( 'slidestart', function () { volumeSliding = true }) + $("#volumeslider").on( 'slidestop', function () { volumeSliding = false }) + $("#volumeslider").on( 'change', function () { doVolume($(this).val()) }) +}) function updatePlayIcons (uri, tlid) { - //update styles of listviews - $('#currenttable li').each(function() { - var eachTlid = $(this).attr('tlid'); + // update styles of listviews + $('#currenttable li').each(function () { + var eachTlid = $(this).attr('tlid') if (typeof eachTlid != 'undefined') { - eachTlid = parseInt(eachTlid); + eachTlid = parseInt(eachTlid) } if (this.id == 'currenttable-' + uri && eachTlid == tlid) { - $(this).addClass('currenttrack'); + $(this).addClass('currenttrack') } else { - $(this).removeClass("currenttrack"); - } - }); + $(this).removeClass('currenttrack') + } + }) - $('#playlisttracks li').each(function() { + $('#playlisttracks li').each(function () { if (this.id == 'playlisttracks-' + uri) { - $(this).addClass('currenttrack2'); + $(this).addClass('currenttrack2') } else { - $(this).removeClass("currenttrack2"); - } - }); + $(this).removeClass('currenttrack2') + } + }) - $('#trackresulttable li').each(function() { + $('#trackresulttable li').each(function () { if (this.id == 'trackresulttable-' + uri) { - $(this).addClass('currenttrack2'); + $(this).addClass('currenttrack2') } else { - $(this).removeClass("currenttrack2"); - } - }); + $(this).removeClass('currenttrack2') + } + }) - $('#artiststable li').each(function() { + $('#artiststable li').each(function () { if (this.id == 'artiststable-' + uri) { - $(this).addClass('currenttrack2'); + $(this).addClass('currenttrack2') } else { - $(this).removeClass("currenttrack2"); - } - }); + $(this).removeClass('currenttrack2') + } + }) - $('#albumstable li').each(function() { + $('#albumstable li').each(function () { if (this.id == 'albumstable-' + uri) { - $(this).addClass('currenttrack2'); + $(this).addClass('currenttrack2') } else { - $(this).removeClass("currenttrack2"); - } - }); - $('#browselist li').each(function() { + $(this).removeClass('currenttrack2') + } + }) + $('#browselist li').each(function () { if (this.id == 'browselisttracks-' + uri) { - $(this).addClass('currenttrack2'); + $(this).addClass('currenttrack2') } else { - $(this).removeClass("currenttrack2"); - } - }); + $(this).removeClass('currenttrack2') + } + }) } diff --git a/mopidy_musicbox_webclient/static/js/images.js b/mopidy_musicbox_webclient/static/js/images.js index 652fae3..8cb61dc 100644 --- a/mopidy_musicbox_webclient/static/js/images.js +++ b/mopidy_musicbox_webclient/static/js/images.js @@ -2,91 +2,91 @@ * @author Wouter van Wijk */ -API_KEY = 'b6d34c3af91d62ab0ae00ab1b6fa8733'; -API_SECRET = '2c631802c2285d5d5d1502462fe42a2b'; +API_KEY = 'b6d34c3af91d62ab0ae00ab1b6fa8733' +API_SECRET = '2c631802c2285d5d5d1502462fe42a2b' -var fmcache; -var lastfm; +var fmcache +var lastfm $(window).load(function () { // create a Cache object - fmcache = new LastFMCache(); + fmcache = new LastFMCache() // create a LastFM object lastfm = new LastFM({ apiKey : API_KEY, apiSecret : API_SECRET, cache : fmcache - }); -}); + }) +}) -function getCover(uri, images, size) { - var defUrl = 'images/default_cover.png'; - $(images).attr('src', defUrl); +function getCover (uri, images, size) { + var defUrl = 'images/default_cover.png' + $(images).attr('src', defUrl) if (!uri) { - return; + return } - mopidy.library.getImages({'uris': [uri]}).then(function(imageResults) { - var uri = Object.keys(imageResults)[0]; + mopidy.library.getImages({'uris': [uri]}).then(function (imageResults) { + var uri = Object.keys(imageResults)[0] if (imageResults[uri].length > 0) { - $(images).attr('src', imageResults[uri][0].uri); + $(images).attr('src', imageResults[uri][0].uri) } else { // Also check deprecated 'album.images' in case backend does not // implement mopidy.library.getImages yet... - getCoverFromAlbum(uri, images, size); + getCoverFromAlbum(uri, images, size) } - }); + }) } // Note that this approach has been deprecated in Mopidy // TODO: Remove when Mopidy no longer supports getting images // with 'album.images'. -function getCoverFromAlbum(uri, images, size) { - mopidy.library.lookup({'uris': [uri]}).then(function(resultDict) { - var uri = Object.keys(resultDict)[0]; - var track = resultDict[uri][0]; - if (track.album && track.album.images && (track.album.images.length > 0) ) { - $(images).attr('src', track.album.images[0]); +function getCoverFromAlbum (uri, images, size) { + mopidy.library.lookup({'uris': [uri]}).then(function (resultDict) { + var uri = Object.keys(resultDict)[0] + var track = resultDict[uri][0] + if (track.album && track.album.images && (track.album.images.length > 0)) { + $(images).attr('src', track.album.images[0]) } else { // Fallback to last.fm - getCoverFromLastFm(track, images, size); + getCoverFromLastFm(track, images, size) } - }); + }) } -function getCoverFromLastFm(track, images, size) { - var defUrl = 'images/default_cover.png'; +function getCoverFromLastFm (track, images, size) { + var defUrl = 'images/default_cover.png' if (!(track.album || track.artist)) { - return; + return } - var albumname = track.album.name || ''; - var artistname = ''; - if ( track.album.artists && (track.album.artists.length > 0) ) { + var albumname = track.album.name || '' + var artistname = '' + if (track.album.artists && (track.album.artists.length > 0)) { // First look for the artist in the album - artistname = track.album.artists[0].name; - } else if (track.artists && (track.artists.length > 0) ) { + artistname = track.album.artists[0].name + } else if (track.artists && (track.artists.length > 0)) { // Fallback to using artists for specific track - artistname = track.artists[0].name; + artistname = track.artists[0].name } - lastfm.album.getInfo( {artist: artistname, album: albumname}, - { success: function(data) { + lastfm.album.getInfo({artist: artistname, album: albumname}, + { success: function (data) { for (var i = 0; i < data.album.image.length; i++) { - if ( data.album.image[i].size == size) { - $(images).attr('src', data.album.image[i]['#text'] || defUrl); + if (data.album.image[i].size == size) { + $(images).attr('src', data.album.image[i]['#text'] || defUrl) } } } - }); + }) } -function getArtistImage(nwartist, image, size) { - var defUrl = 'images/user_24x32.png'; - lastfm.artist.getInfo({artist: nwartist}, {success: function(data){ +function getArtistImage (nwartist, image, size) { + var defUrl = 'images/user_24x32.png' + lastfm.artist.getInfo({artist: nwartist}, {success: function (data) { for (var i = 0; i < data.artist.image.length; i++) { - if ( data.artist.image[i].size == size) { - $(image).attr('src', data.artist.image[i]['#text'] || defUrl); + if (data.artist.image[i].size == size) { + $(image).attr('src', data.artist.image[i]['#text'] || defUrl) } } - }}); -} \ No newline at end of file + }}) +} diff --git a/mopidy_musicbox_webclient/static/js/library.js b/mopidy_musicbox_webclient/static/js/library.js index 3a62e05..e91e6bc 100644 --- a/mopidy_musicbox_webclient/static/js/library.js +++ b/mopidy_musicbox_webclient/static/js/library.js @@ -1,167 +1,167 @@ -/********************************* +/** ******************************* * Search *********************************/ -function searchPressed(key) { - var value = $('#searchinput').val(); - switchContent('search'); +function searchPressed (key) { + var value = $('#searchinput').val() + switchContent('search') if (key == 13) { - initSearch(); - return false; + initSearch() + return false } - return true; + return true } -//init search -function initSearch() { - var value = $('#searchinput').val(); - var searchService = $('#selectSearchService').val(); +// init search +function initSearch () { + var value = $('#searchinput').val() + var searchService = $('#selectSearchService').val() if ((value.length < 100) && (value.length > 0)) { - showLoading(true); - //hide ios/android keyboard - document.activeElement.blur(); - $("input").blur(); + showLoading(true) + // hide ios/android keyboard + document.activeElement.blur() + $('input').blur() - delete customTracklists[URI_SCHEME+':allresultscache']; - delete customTracklists[URI_SCHEME+':artistresultscache']; - delete customTracklists[URI_SCHEME+':albumresultscache']; - delete customTracklists[URI_SCHEME+':trackresultscache']; - $("#searchartists").hide(); - $("#searchalbums").hide(); - $("#searchtracks").hide(); + delete customTracklists[URI_SCHEME + ':allresultscache'] + delete customTracklists[URI_SCHEME + ':artistresultscache'] + delete customTracklists[URI_SCHEME + ':albumresultscache'] + delete customTracklists[URI_SCHEME + ':trackresultscache'] + $('#searchartists').hide() + $('#searchalbums').hide() + $('#searchtracks').hide() if (searchService != 'all') { - mopidy.library.search({'query': {any:[value]}, 'uris': [searchService + ':']}).then(processSearchResults, console.error); + mopidy.library.search({'query': {any:[value]}, 'uris': [searchService + ':']}).then(processSearchResults, console.error) } else { mopidy.getUriSchemes().then(function (schemes) { var query = {}, - uris = []; + uris = [] var regexp = $.map(schemes, function (scheme) { - return '^' + scheme + ':'; - }).join('|'); + return '^' + scheme + ':' + }).join('|') - var match = value.match(regexp); + var match = value.match(regexp) if (match) { - var scheme = match[0]; - query = {uri: [value]}; - uris = [scheme]; + var scheme = match[0] + query = {uri: [value]} + uris = [scheme] } else { - query = {any: [value]}; + query = {any: [value]} } - mopidy.library.search({'query': query, 'uris': uris}).then(processSearchResults, console.error); - }); + mopidy.library.search({'query': query, 'uris': uris}).then(processSearchResults, console.error) + }) } } } -/******************************************************** +/** ****************************************************** * process results of a search *********************************************************/ -//# speed clone http://jsperf.com/cloning-an-object/2 -function clone(obj) { - var target = {}; +// # speed clone http://jsperf.com/cloning-an-object/2 +function clone (obj) { + var target = {} for (var i in obj) { if (obj.hasOwnProperty(i)) { - target[i] = obj[i]; + target[i] = obj[i] } } - return target; + return target } -function processSearchResults(resultArr) { - $(SEARCH_TRACK_TABLE).empty(); - $(SEARCH_ARTIST_TABLE).empty(); - $(SEARCH_ALBUM_TABLE).empty(); +function processSearchResults (resultArr) { + $(SEARCH_TRACK_TABLE).empty() + $(SEARCH_ARTIST_TABLE).empty() + $(SEARCH_ALBUM_TABLE).empty() // Merge results from different backends. // TODO should of coures have multiple tables - var results = {'tracks': [], 'artists': [], 'albums': []}; - var j, emptyResult = true; + var results = {'tracks': [], 'artists': [], 'albums': []} + var j, emptyResult = true for (var i = 0; i < resultArr.length; i++) { if (resultArr[i].tracks) { for (j = 0; j < resultArr[i].tracks.length; j++) { - results.tracks.push(resultArr[i].tracks[j]); - emptyResult = false; + results.tracks.push(resultArr[i].tracks[j]) + emptyResult = false } } if (resultArr[i].artists) { for (j = 0; j < resultArr[i].artists.length; j++) { - results.artists.push(resultArr[i].artists[j]); - emptyResult = false; + results.artists.push(resultArr[i].artists[j]) + emptyResult = false } } if (resultArr[i].albums) { for (j = 0; j < resultArr[i].albums.length; j++) { - results.albums.push(resultArr[i].albums[j]); - emptyResult = false; + results.albums.push(resultArr[i].albums[j]) + emptyResult = false } } } - customTracklists[URI_SCHEME+':trackresultscache'] = results.tracks; + customTracklists[URI_SCHEME + ':trackresultscache'] = results.tracks if (emptyResult) { - toast('No results'); - showLoading(false); - return false; + toast('No results') + showLoading(false) + return false } if (results.artists.length > 0) { - $("#searchartists").show(); + $('#searchartists').show() } if (results.albums.length > 0) { - $("#searchalbums").show(); + $('#searchalbums').show() } if (results.tracks.length > 0) { - $("#searchtracks").show(); + $('#searchtracks').show() } // Returns a string where {x} in template is replaced by tokens[x]. - function theme(template, tokens) { - return template.replace(/{[^}]+}/g, function(match) { - return tokens[match.slice(1,-1)]; - }); + function theme (template, tokens) { + return template.replace(/{[^}]+}/g, function (match) { + return tokens[match.slice(1, -1)] + }) } // 'Show more' pattern - var showMorePattern = '
  • Show {count} more
  • '; + var showMorePattern = '
  • Show {count} more
  • ' // Artist results - var child = ''; - var pattern = '
  • {name}
  • '; - var tokens; + var child = '' + var pattern = '
  • {name}
  • ' + var tokens for (var i = 0; i < results.artists.length; i++) { tokens = { 'id': results.artists[i].uri, 'name': results.artists[i].name, 'class': getMediaClass(results.artists[i].uri) - }; + } // Add 'Show all' item after a certain number of hits. if (i == 4 && results.artists.length > 5) { - child += theme(showMorePattern, {'count': results.artists.length - i}); - pattern = pattern.replace('
  • ', '
  • '); + child += theme(showMorePattern, {'count': results.artists.length - i}) + pattern = pattern.replace('
  • ', '
  • ') } - child += theme(pattern, tokens); + child += theme(pattern, tokens) } // Inject list items, refresh listview and hide superfluous items. - $(SEARCH_ARTIST_TABLE).html(child).listview('refresh').find('.overflow').hide(); + $(SEARCH_ARTIST_TABLE).html(child).listview('refresh').find('.overflow').hide() // Album results - child = ''; - pattern = '
  • '; - pattern += '
    {albumName}
    '; - pattern += '

    {artistName}

    '; - pattern += '
  • '; + child = '' + pattern = '
  • ' + pattern += '
    {albumName}
    ' + pattern += '

    {artistName}

    ' + pattern += '
  • ' for (var i = 0; i < results.albums.length; i++) { tokens = { @@ -170,175 +170,175 @@ function processSearchResults(resultArr) { 'artistName': '', 'albumYear': results.albums[i].date, 'class': getMediaClass(results.albums[i].uri) - }; + } if (results.albums[i].artists) { for (var j = 0; j < results.albums[i].artists.length; j++) { if (results.albums[i].artists[j].name) { - tokens.artistName += results.albums[i].artists[j].name + ' '; + tokens.artistName += results.albums[i].artists[j].name + ' ' } } } if (tokens.albumYear) { - tokens.artistName += '(' + tokens.albumYear + ')'; + tokens.artistName += '(' + tokens.albumYear + ')' } // Add 'Show all' item after a certain number of hits. if (i == 4 && results.albums.length > 5) { - child += theme(showMorePattern, {'count': results.albums.length - i}); - pattern = pattern.replace('
  • ', '
  • '); + child += theme(showMorePattern, {'count': results.albums.length - i}) + pattern = pattern.replace('
  • ', '
  • ') } - child += theme(pattern, tokens); + child += theme(pattern, tokens) } // Inject list items, refresh listview and hide superfluous items. - $(SEARCH_ALBUM_TABLE).html(child).listview('refresh').find('.overflow').hide(); + $(SEARCH_ALBUM_TABLE).html(child).listview('refresh').find('.overflow').hide() - $('#expandsearch').show(); + $('#expandsearch').show() // Track results - resultsToTables(results.tracks, SEARCH_TRACK_TABLE, URI_SCHEME+':trackresultscache'); + resultsToTables(results.tracks, SEARCH_TRACK_TABLE, URI_SCHEME + ':trackresultscache') - showLoading(false); + showLoading(false) } -function toggleSearch() { - $("#albumresulttable tr").removeClass('hidden'); - $("#artistresulttable tr").removeClass('hidden'); +function toggleSearch () { + $('#albumresulttable tr').removeClass('hidden') + $('#artistresulttable tr').removeClass('hidden') } -/********************************* +/** ******************************* * Playlists & Browse *********************************/ -function getPlaylists() { +function getPlaylists () { // get playlists without tracks - mopidy.playlists.asList().then(processGetPlaylists, console.error); + mopidy.playlists.asList().then(processGetPlaylists, console.error) } -function getBrowseDir(rootdir) { +function getBrowseDir (rootdir) { // get directory to browse - showLoading(true); + showLoading(true) if (!rootdir) { - browseStack.pop(); - rootdir = browseStack[browseStack.length - 1]; + browseStack.pop() + rootdir = browseStack[browseStack.length - 1] } else { - browseStack.push(rootdir); + browseStack.push(rootdir) } if (!rootdir) { - rootdir = null; + rootdir = null } - mopidy.library.browse({'uri': rootdir}).then(processBrowseDir, console.error); + mopidy.library.browse({'uri': rootdir}).then(processBrowseDir, console.error) } -function getCurrentPlaylist() { - mopidy.tracklist.getTlTracks().then(processCurrentPlaylist, console.error); +function getCurrentPlaylist () { + mopidy.tracklist.getTlTracks().then(processCurrentPlaylist, console.error) } -/******************************************************** +/** ****************************************************** * Show tracks of playlist ********************************************************/ -function togglePlaylists() { +function togglePlaylists () { if ($(window).width() <= 960) { $('#playlisttracksdiv').toggle(); - //Hide other div - ($('#playlisttracksdiv').is(":visible")) ? $('#playlistslistdiv').hide() : $('#playlistslistdiv').show(); + // Hide other div + ($('#playlisttracksdiv').is(':visible')) ? $('#playlistslistdiv').hide() : $('#playlistslistdiv').show() } else { - $('#playlisttracksdiv').show(); - $('#playlistslistdiv').show(); + $('#playlisttracksdiv').show() + $('#playlistslistdiv').show() } - return true; + return true } -function showTracklist(uri) { - $(PLAYLIST_TABLE).empty(); - togglePlaylists(); - var tracks = getPlaylistTracks(uri).then(function(tracks) { - resultsToTables(tracks, PLAYLIST_TABLE, uri); - }); - showLoading(false); - updatePlayIcons(uri); - $('#playlistslist li a').each(function() { - $(this).removeClass("playlistactive"); +function showTracklist (uri) { + $(PLAYLIST_TABLE).empty() + togglePlaylists() + var tracks = getPlaylistTracks(uri).then(function (tracks) { + resultsToTables(tracks, PLAYLIST_TABLE, uri) + }) + showLoading(false) + updatePlayIcons(uri) + $('#playlistslist li a').each(function () { + $(this).removeClass('playlistactive') if (this.id == uri) { - $(this).addClass('playlistactive'); + $(this).addClass('playlistactive') } - }); - return false; + }) + return false } -/****** +/** **** * Lookups */ -function showArtist(nwuri) { - $('#popupQueue').popup('close'); - $('#popupTracks').popup('close'); - $('#controlsmodal').popup('close'); - $(ARTIST_TABLE).empty(); +function showArtist (nwuri) { + $('#popupQueue').popup('close') + $('#popupTracks').popup('close') + $('#controlsmodal').popup('close') + $(ARTIST_TABLE).empty() -//TODO cache - $('#h_artistname').html(''); - showLoading(true); - mopidy.library.lookup({'uris': [nwuri]}).then(function(resultDict) { - var resultArr = resultDict[nwuri]; - resultArr.uri = nwuri; - processArtistResults(resultArr); - }, console.error); - switchContent('artists', nwuri); - scrollToTop(); - return false; +// TODO cache + $('#h_artistname').html('') + showLoading(true) + mopidy.library.lookup({'uris': [nwuri]}).then(function (resultDict) { + var resultArr = resultDict[nwuri] + resultArr.uri = nwuri + processArtistResults(resultArr) + }, console.error) + switchContent('artists', nwuri) + scrollToTop() + return false } -function showAlbum(uri) { - $('#popupQueue').popup('close'); - $('#popupTracks').popup('close'); - $('#controlsmodal').popup('close'); - $(ALBUM_TABLE).empty(); - //fill from cache - var pl = getTracksFromUri(uri, true); - if (pl.length>0) { - albumTracksToTable(pl, ALBUM_TABLE, uri); - var albumname = getAlbum(pl); - var artistname = getArtist(pl); - $('#h_albumname').html(albumname); - $('#h_albumartist').html(artistname); - $('#coverpopupalbumname').html(albumname); - $('#coverpopupartist').html(artistname); - showLoading(false); - mopidy.library.lookup({'uris': [uri]}).then(function(resultDict) { - var resultArr = resultDict[uri]; - resultArr.uri = uri; - processAlbumResults(resultArr); - }, console.error); +function showAlbum (uri) { + $('#popupQueue').popup('close') + $('#popupTracks').popup('close') + $('#controlsmodal').popup('close') + $(ALBUM_TABLE).empty() + // fill from cache + var pl = getTracksFromUri(uri, true) + if (pl.length > 0) { + albumTracksToTable(pl, ALBUM_TABLE, uri) + var albumname = getAlbum(pl) + var artistname = getArtist(pl) + $('#h_albumname').html(albumname) + $('#h_albumartist').html(artistname) + $('#coverpopupalbumname').html(albumname) + $('#coverpopupartist').html(artistname) + showLoading(false) + mopidy.library.lookup({'uris': [uri]}).then(function (resultDict) { + var resultArr = resultDict[uri] + resultArr.uri = uri + processAlbumResults(resultArr) + }, console.error) } else { - showLoading(true); - $('#h_albumname').html(''); - $('#h_albumartist').html(''); - mopidy.library.lookup({'uris': [uri]}).then(function(resultDict) { - var resultArr = resultDict[uri]; - resultArr.uri = uri; - processAlbumResults(resultArr); - }, console.error); + showLoading(true) + $('#h_albumname').html('') + $('#h_albumartist').html('') + mopidy.library.lookup({'uris': [uri]}).then(function (resultDict) { + var resultArr = resultDict[uri] + resultArr.uri = uri + processAlbumResults(resultArr) + }, console.error) } - //show page - switchContent('albums', uri); - scrollToTop(); - return false; + // show page + switchContent('albums', uri) + scrollToTop() + return false } -function getSearchSchemes() { +function getSearchSchemes () { mopidy.getUriSchemes().then( - function(schemesArray) { - var humanIndex; - $("#selectSearchService").children().remove().end(); - $("#selectSearchService").append(new Option('All services', 'all')); + function (schemesArray) { + var humanIndex + $('#selectSearchService').children().remove().end() + $('#selectSearchService').append(new Option('All services', 'all')) for (var i = 0; i < schemesArray.length; i++) { for (var j = 0; j < uriHumanList.length; j++) { - if (uriHumanList[j][0] == schemesArray[i].toLowerCase() ) { - $("#selectSearchService").append(new Option(uriHumanList[j][1], schemesArray[i])); + if (uriHumanList[j][0] == schemesArray[i].toLowerCase()) { + $('#selectSearchService').append(new Option(uriHumanList[j][1], schemesArray[i])) } } } - $("#selectSearchService").selectmenu( "refresh", true ); + $('#selectSearchService').selectmenu( 'refresh', true) }, console.error - ); + ) } diff --git a/mopidy_musicbox_webclient/static/js/process_ws.js b/mopidy_musicbox_webclient/static/js/process_ws.js index 605a398..d6c2711 100644 --- a/mopidy_musicbox_webclient/static/js/process_ws.js +++ b/mopidy_musicbox_webclient/static/js/process_ws.js @@ -5,249 +5,249 @@ * */ -/******************************************************** +/** ****************************************************** * process results of a (new) currently playing track *********************************************************/ -function processCurrenttrack(data) { - setSongInfo(data); +function processCurrenttrack (data) { + setSongInfo(data) } -/******************************************************** +/** ****************************************************** * process results of volume *********************************************************/ -function processVolume(data) { - setVolume(data); +function processVolume (data) { + setVolume(data) } -/******************************************************** +/** ****************************************************** * process results of mute *********************************************************/ -function processMute(data) { - setMute(data); +function processMute (data) { + setMute(data) } -/******************************************************** +/** ****************************************************** * process results of a repeat *********************************************************/ -function processRepeat(data) { - setRepeat(data); +function processRepeat (data) { + setRepeat(data) } -/******************************************************** +/** ****************************************************** * process results of random *********************************************************/ -function processRandom(data) { - setRandom(data); +function processRandom (data) { + setRandom(data) } -/******************************************************** +/** ****************************************************** * process results of consume *********************************************************/ -function processConsume(data) { - setConsume(data); +function processConsume (data) { + setConsume(data) } -/******************************************************** +/** ****************************************************** * process results of single *********************************************************/ -function processSingle(data) { - setSingle(data); +function processSingle (data) { + setSingle(data) } -/******************************************************** +/** ****************************************************** * process results of current position *********************************************************/ -function processCurrentposition(data) { - setPosition(parseInt(data)); +function processCurrentposition (data) { + setPosition(parseInt(data)) } -/******************************************************** +/** ****************************************************** * process results playstate *********************************************************/ -function processPlaystate(data) { +function processPlaystate (data) { if (data == 'playing') { - setPlayState(true); + setPlayState(true) } else { - setPlayState(false); + setPlayState(false) } } -/******************************************************** +/** ****************************************************** * process results of a browse list *********************************************************/ -function processBrowseDir(resultArr) { - var backHtml = '
  • Back

  • '; - if ( (!resultArr) || (resultArr === '') || (resultArr.length === 0) ) { - $('#browsepath').html('No tracks found...'); - $('#browselist').html(backHtml); - showLoading(false); - return; +function processBrowseDir (resultArr) { + var backHtml = '
  • Back

  • ' + if ((!resultArr) || (resultArr === '') || (resultArr.length === 0)) { + $('#browsepath').html('No tracks found...') + $('#browselist').html(backHtml) + showLoading(false) + return } - $('#browselist').empty(); + $('#browselist').empty() - var child = "", rooturi = "", uri = resultArr[0].uri; + var child = '', rooturi = '', uri = resultArr[0].uri - //check root uri - //find last : or / (spltting the result) - //do it twice, since. - var colonindex = uri.lastIndexOf(':'); - var slashindex = uri.lastIndexOf('/'); + // check root uri + // find last : or / (spltting the result) + // do it twice, since. + var colonindex = uri.lastIndexOf(':') + var slashindex = uri.lastIndexOf('/') - var lastindex = (colonindex > slashindex) ? colonindex : slashindex; - rooturi = uri.slice(0, lastindex); - if (resultArr[0].type == 'track' ) { - rooturi = rooturi.replace(":track:", ":directory:"); + var lastindex = (colonindex > slashindex) ? colonindex : slashindex + rooturi = uri.slice(0, lastindex) + if (resultArr[0].type == 'track') { + rooturi = rooturi.replace(':track:', ':directory:') } - colonindex = rooturi.lastIndexOf(':'); - slashindex = rooturi.lastIndexOf('/'); + colonindex = rooturi.lastIndexOf(':') + slashindex = rooturi.lastIndexOf('/') - lastindex = (colonindex > slashindex) ? colonindex : slashindex; - rooturi = rooturi.slice(0, lastindex); + lastindex = (colonindex > slashindex) ? colonindex : slashindex + rooturi = rooturi.slice(0, lastindex) if (browseStack.length > 0) { - child += backHtml; + child += backHtml } - browseTracks = []; + browseTracks = [] for (var i = 0, index = 0; i < resultArr.length; i++) { - iconClass = getMediaClass(resultArr[i].uri); + iconClass = getMediaClass(resultArr[i].uri) if (resultArr[i].type == 'track') { - //console.log(resultArr[i]); + // console.log(resultArr[i]); mopidy.library.lookup({'uris': [resultArr[i].uri]}).then(function (resultDict) { - var lookupUri = Object.keys(resultDict)[0]; - popupData[lookupUri] = resultDict[lookupUri][0]; - browseTracks.push(resultDict[lookupUri][0]); - }, console.error); + var lookupUri = Object.keys(resultDict)[0] + popupData[lookupUri] = resultDict[lookupUri][0] + browseTracks.push(resultDict[lookupUri][0]) + }, console.error) child += '
  • ' + '' + '' + '

    ' + resultArr[i].name + '

  • '; - index++; + '">

    ' + resultArr[i].name + '

    ' + index++ } else { if (browseStack.length > 0) { - iconClass="fa fa-folder-o"; + iconClass = "fa fa-folder-o" } child += '
  • ' + resultArr[i].name + '

  • '; + '"">

    ' + resultArr[i].name + '

    ' } } - $('#browselist').html(child); - if (browseStack.length > 0 ) { - child = getMediaHuman(uri); - iconClass = getMediaClass(uri); - $('#browsepath').html(' ' + child); + $('#browselist').html(child) + if (browseStack.length > 0) { + child = getMediaHuman(uri) + iconClass = getMediaClass(uri) + $('#browsepath').html(' ' + child) } else { - $('#browsepath').html(''); + $('#browsepath').html('') } - updatePlayIcons(songdata.track.uri, songdata.tlid); + updatePlayIcons(songdata.track.uri, songdata.tlid) - showLoading(false); + showLoading(false) } -/******************************************************** +/** ****************************************************** * process results of list of playlists of the user *********************************************************/ -function processGetPlaylists(resultArr) { +function processGetPlaylists (resultArr) { if ((!resultArr) || (resultArr === '')) { - $('#playlistslist').empty(); - return; + $('#playlistslist').empty() + return } - var tmp = '', favourites = '', starred = ''; + var tmp = '', favourites = '', starred = '' for (var i = 0; i < resultArr.length; i++) { - var li_html = '
  • '; - if(isSpotifyStarredPlaylist(resultArr[i])) { - starred = li_html + '★ Spotify Starred Tracks
  • ' + tmp; + var li_html = '
  • ' + if (isSpotifyStarredPlaylist(resultArr[i])) { + starred = li_html + '★ Spotify Starred Tracks
  • ' + tmp } else if (isFavouritesPlaylist(resultArr[i])) { - favourites = li_html + '♥ Musicbox Favourites'; + favourites = li_html + '♥ Musicbox Favourites' } else { - tmp = tmp + li_html + ' ' + resultArr[i].name + ''; + 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); + tmp = favourites + starred + tmp + $('#playlistslist').html(tmp) + scrollToTracklist() + showLoading(false) } -/******************************************************** +/** ****************************************************** * process results of a returned list of playlist track refs *********************************************************/ -function processPlaylistItems(resultDict) { +function processPlaylistItems (resultDict) { if (resultDict.items.length === 0) { - console.log('Playlist', resultDict.uri, 'is empty'); - showLoading(false); - return; + console.log('Playlist', resultDict.uri, 'is empty') + showLoading(false) + return } - var trackUris = []; + var trackUris = [] for (i = 0; i < resultDict.items.length; i++) { - trackUris.push(resultDict.items[i].uri); + trackUris.push(resultDict.items[i].uri) } - return mopidy.library.lookup({'uris': trackUris}).then(function(tracks) { + return mopidy.library.lookup({'uris': trackUris}).then(function (tracks) { // Transform from dict to list and cache result - var newplaylisturi = resultDict.uri; - playlists[newplaylisturi] = {'uri':newplaylisturi, 'tracks':[]}; + var newplaylisturi = resultDict.uri + playlists[newplaylisturi] = {'uri':newplaylisturi, 'tracks':[]} for (i = 0; i < trackUris.length; i++) { - playlists[newplaylisturi].tracks.push(tracks[trackUris[i]][0]); + playlists[newplaylisturi].tracks.push(tracks[trackUris[i]][0]) } - showLoading(false); - return playlists[newplaylisturi].tracks; - }); + showLoading(false) + return playlists[newplaylisturi].tracks + }) } -/******************************************************** +/** ****************************************************** * process results of the queue, the current playlist *********************************************************/ -function processCurrentPlaylist(resultArr) { - currentplaylist = resultArr; - resultsToTables(currentplaylist, CURRENT_PLAYLIST_TABLE); - mopidy.playback.getCurrentTlTrack().then(processCurrenttrack, console.error); - updatePlayIcons(songdata.track.uri, songdata.tlid); +function processCurrentPlaylist (resultArr) { + currentplaylist = resultArr + resultsToTables(currentplaylist, CURRENT_PLAYLIST_TABLE) + mopidy.playback.getCurrentTlTrack().then(processCurrenttrack, console.error) + updatePlayIcons(songdata.track.uri, songdata.tlid) } -/******************************************************** +/** ****************************************************** * process results of an artist lookup *********************************************************/ -function processArtistResults(resultArr) { +function processArtistResults (resultArr) { if (!resultArr || (resultArr.length === 0)) { - $('#h_artistname').text('Artist not found...'); - getCover('', '#artistviewimage, #artistpopupimage', 'extralarge'); - showLoading(false); - return; + $('#h_artistname').text('Artist not found...') + getCover('', '#artistviewimage, #artistpopupimage', 'extralarge') + showLoading(false) + return } - customTracklists[resultArr.uri] = resultArr; + customTracklists[resultArr.uri] = resultArr - resultsToTables(resultArr, ARTIST_TABLE, resultArr.uri); - var artistname = getArtist(resultArr); - $('#h_artistname, #artistpopupname').html(artistname); - getArtistImage(artistname, '#artistviewimage, #artistpopupimage', 'extralarge'); - showLoading(false); + resultsToTables(resultArr, ARTIST_TABLE, resultArr.uri) + var artistname = getArtist(resultArr) + $('#h_artistname, #artistpopupname').html(artistname) + getArtistImage(artistname, '#artistviewimage, #artistpopupimage', 'extralarge') + showLoading(false) } -/******************************************************** +/** ****************************************************** * process results of an album lookup *********************************************************/ -function processAlbumResults(resultArr) { +function processAlbumResults (resultArr) { if (!resultArr || (resultArr.length === 0)) { - $('#h_albumname').text('Album not found...'); - getCover('', '#albumviewcover, #coverpopupimage', 'extralarge'); - showLoading(false); - return; + $('#h_albumname').text('Album not found...') + getCover('', '#albumviewcover, #coverpopupimage', 'extralarge') + showLoading(false) + return } - customTracklists[resultArr.uri] = resultArr; + customTracklists[resultArr.uri] = resultArr - albumTracksToTable(resultArr, ALBUM_TABLE, resultArr.uri); - var albumname = getAlbum(resultArr); - var artistname = getArtist(resultArr); - $('#h_albumname').html(albumname); - $('#h_albumartist').html(artistname); - $('#coverpopupalbumname').html(albumname); - $('#coverpopupartist').html(artistname); - getCover(resultArr[0].uri, '#albumviewcover, #coverpopupimage', 'extralarge'); - showLoading(false); + albumTracksToTable(resultArr, ALBUM_TABLE, resultArr.uri) + var albumname = getAlbum(resultArr) + var artistname = getArtist(resultArr) + $('#h_albumname').html(albumname) + $('#h_albumartist').html(artistname) + $('#coverpopupalbumname').html(albumname) + $('#coverpopupartist').html(artistname) + getCover(resultArr[0].uri, '#albumviewcover, #coverpopupimage', 'extralarge') + showLoading(false) } diff --git a/mopidy_musicbox_webclient/static/js/progress_timer.js b/mopidy_musicbox_webclient/static/js/progress_timer.js index 3e97fad..0a14116 100644 --- a/mopidy_musicbox_webclient/static/js/progress_timer.js +++ b/mopidy_musicbox_webclient/static/js/progress_timer.js @@ -1,26 +1,26 @@ -var progressTimer; -var progressElement = document.getElementById('trackslider'); -var positionNode = document.createTextNode(''); -var durationNode = document.createTextNode(''); +var progressTimer +var progressElement = document.getElementById('trackslider') +var positionNode = document.createTextNode('') +var durationNode = document.createTextNode('') -var START_BEATS = 5; // 0.5 seconds, needs to be less than 1s to prevent unwanted updates. -var RUN_BEATS = 300; // 30 seconds assuming default timer update rate of 100ms -var callbackHeartbeats = 0; // Timer will check syncs on every n-number of calls. -var targetPosition = null; +var START_BEATS = 5 // 0.5 seconds, needs to be less than 1s to prevent unwanted updates. +var RUN_BEATS = 300 // 30 seconds assuming default timer update rate of 100ms +var callbackHeartbeats = 0 // Timer will check syncs on every n-number of calls. +var targetPosition = null -var MAX_SYNCS = 5; // Maximum number of consecutive successful syncs to perform. -var syncsLeft = MAX_SYNCS; -var synced = false; -var consecutiveSyncs = 0; +var MAX_SYNCS = 5 // Maximum number of consecutive successful syncs to perform. +var syncsLeft = MAX_SYNCS +var synced = false +var consecutiveSyncs = 0 -document.getElementById('songelapsed').appendChild(positionNode); -document.getElementById('songlength').appendChild(durationNode); +document.getElementById('songelapsed').appendChild(positionNode) +document.getElementById('songlength').appendChild(durationNode) -function timerCallback(position, duration, isRunning) { - updateTimers(position, duration, isRunning); +function timerCallback (position, duration, isRunning) { + updateTimers(position, duration, isRunning) if (callbackHeartbeats === 0) { - callbackHeartbeats = getHeartbeat(); + callbackHeartbeats = getHeartbeat() } if (mopidy && position > 0) { @@ -29,102 +29,102 @@ function timerCallback(position, duration, isRunning) { // Get time position from Mopidy on every nth callback until // synced. mopidy.playback.getTimePosition().then( - function(mopidy_position) { - syncTimer(position, mopidy_position); + function (mopidy_position) { + syncTimer(position, mopidy_position) } - ); + ) } } } -function updateTimers(position, duration, isRunning) { - var ready = !(duration == Infinity && position === 0 && !isRunning); // Timer has been properly initialized. - var streaming = (duration == Infinity && position > 0); // Playing a stream. - var ok = synced && isRunning; // Normal operation. - var syncing = !synced && isRunning; // Busy syncing. +function updateTimers (position, duration, isRunning) { + var ready = !(duration == Infinity && position === 0 && !isRunning) // Timer has been properly initialized. + var streaming = (duration == Infinity && position > 0) // Playing a stream. + var ok = synced && isRunning // Normal operation. + var syncing = !synced && isRunning // Busy syncing. if (!ready) { - //Make sure that default values are displayed while the timer is being initialized. - positionNode.nodeValue = ''; - durationNode.nodeValue = ''; - $("#trackslider").val(0).slider('refresh'); + // Make sure that default values are displayed while the timer is being initialized. + positionNode.nodeValue = '' + durationNode.nodeValue = '' + $('#trackslider').val(0).slider('refresh') } else { - durationNode.nodeValue = format(duration || Infinity); + durationNode.nodeValue = format(duration || Infinity) if (syncing) { if (!targetPosition) { // Waiting for Mopidy to provide a target position. - positionNode.nodeValue = '(wait)'; + positionNode.nodeValue = '(wait)' } else { // Busy seeking to new target position. - positionNode.nodeValue = '(sync)'; + positionNode.nodeValue = '(sync)' } } else if (synced || streaming) { - positionNode.nodeValue = format(position); + positionNode.nodeValue = format(position) } } if (ok) { // Don't update the track slider unless it is synced and running. // (prevents awkward 'jitter' animation). - $("#trackslider").val(position).slider('refresh'); + $('#trackslider').val(position).slider('refresh') } } -function getHeartbeat() { +function getHeartbeat () { if (syncsLeft > 0 && callbackHeartbeats === 0) { // Step back exponentially while increasing heartbeat. - return Math.round(delay_exponential(5, 2, MAX_SYNCS - syncsLeft)); + return Math.round(delay_exponential(5, 2, MAX_SYNCS - syncsLeft)) } else if (syncsLeft === 0 && callbackHeartbeats === 0) { // Sync completed, keep checking using maximum number of heartbeats. - return RUN_BEATS; + return RUN_BEATS } else { - return START_BEATS; + return START_BEATS } } -function syncTimer(current, target) { +function syncTimer (current, target) { if (target) { - var drift = Math.abs(target - current); + var drift = Math.abs(target - current) if (drift <= 500) { - syncsLeft--; + syncsLeft-- // Less than 500ms == in sync. if (++consecutiveSyncs == 2) { // Need at least two consecutive syncs to know that Mopidy // is progressing playback and we are in sync. - synced = true; - targetPosition = null; - consecutiveSyncs = 0; + synced = true + targetPosition = null + consecutiveSyncs = 0 } } else { // Drift is too large, re-sync with Mopidy. - reset(); - targetPosition = target; - progressTimer.set(targetPosition); + reset() + targetPosition = target + progressTimer.set(targetPosition) } } } -function toInt(value) { - return value.match(/^\w*\d+\w*$/) ? parseInt(value) : null; +function toInt (value) { + return value.match(/^\w*\d+\w*$/) ? parseInt(value) : null } -function format(milliseconds) { +function format (milliseconds) { if (milliseconds === Infinity) { - return '(n/a)'; + return '(n/a)' } else if (milliseconds === 0) { - return '0:00'; + return '0:00' } - var seconds = Math.floor(milliseconds / 1000); - var minutes = Math.floor(seconds / 60); - seconds = seconds % 60; + var seconds = Math.floor(milliseconds / 1000) + var minutes = Math.floor(seconds / 60) + seconds = seconds % 60 - seconds = seconds < 10 ? '0' + seconds : seconds; - return minutes + ':' + seconds; + seconds = seconds < 10 ? '0' + seconds : seconds + return minutes + ':' + seconds } -function delay_exponential(base, growthFactor, attempts) { - /*Calculate number of beats between syncs based on exponential function. +function delay_exponential (base, growthFactor, attempts) { + /* Calculate number of beats between syncs based on exponential function. The format is:: base * growthFactor ^ (attempts - 1) @@ -134,43 +134,43 @@ function delay_exponential(base, growthFactor, attempts) { Base must be greater than 0. */ if (base == 'rand') { - base = Math.random(); + base = Math.random() } - beats = base * (Math.pow(growthFactor, (attempts - 1))); - return beats; + beats = base * (Math.pow(growthFactor, (attempts - 1))) + return beats } -function reset() { - synced = false; - consecutiveSyncs = 0; - syncsLeft = MAX_SYNCS; - callbackHeartbeats = START_BEATS; - targetPosition = null; +function reset () { + synced = false + consecutiveSyncs = 0 + syncsLeft = MAX_SYNCS + callbackHeartbeats = START_BEATS + targetPosition = null } -function setProgressTimer(pos) { - reset(); - targetPosition = pos; - progressTimer.set(pos); +function setProgressTimer (pos) { + reset() + targetPosition = pos + progressTimer.set(pos) if (!play) { // Set lapsed time and slider position directly as timer callback is not currently // running. - positionNode.nodeValue = format(pos); - $("#trackslider").val(pos).slider('refresh'); + positionNode.nodeValue = format(pos) + $('#trackslider').val(pos).slider('refresh') } } -function updatePosition(pos) { - positionNode.nodeValue = format(pos); +function updatePosition (pos) { + positionNode.nodeValue = format(pos) } -function startProgressTimer() { - reset(); - progressTimer.start(); +function startProgressTimer () { + reset() + progressTimer.start() } -function resetProgressTimer() { - progressTimer.reset(); - reset(); - targetPosition = 0; +function resetProgressTimer () { + progressTimer.reset() + reset() + targetPosition = 0 }