fox:Automatic style changes applied by running eslint --fix
This commit is contained in:
parent
785d923fcf
commit
168f2c549b
500
mopidy_musicbox_webclient/static/js/controls.js
vendored
500
mopidy_musicbox_webclient/static/js/controls.js
vendored
@ -2,90 +2,90 @@
|
||||
* play tracks from a browse list *
|
||||
***********************************/
|
||||
function playBrowsedTracks (action, trackIndex) {
|
||||
$('#popupBrowse').popup('close');
|
||||
toast('Loading...');
|
||||
$('#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) {
|
||||
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);
|
||||
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);
|
||||
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:
|
||||
@ -93,22 +93,22 @@ function playTrack(action) {
|
||||
mopidy.tracklist.clear().then(
|
||||
mopidy.tracklist.add({'uris': trackUris}).then(
|
||||
function (tlTracks) {
|
||||
mopidy.playback.play({'tl_track': tlTracks[selected]});
|
||||
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.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
|
||||
}
|
||||
|
||||
/** *
|
||||
@ -122,35 +122,35 @@ function playTrackByUri(track_uri, playlist_uri) {
|
||||
// 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');
|
||||
$('#popupTracks').popup('close')
|
||||
$('#controlspopup').popup('close')
|
||||
// end of deprecated
|
||||
|
||||
toast('Loading...');
|
||||
toast('Loading...')
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
@ -165,23 +165,23 @@ function playTrackByUri(track_uri, playlist_uri) {
|
||||
*/
|
||||
function playTrackQueueByTlid (uri, tlid) {
|
||||
// stop directly, for user feedback
|
||||
mopidy.playback.stop();
|
||||
$('#popupQueue').popup('close');
|
||||
toast('Loading...');
|
||||
mopidy.playback.stop()
|
||||
$('#popupQueue').popup('close')
|
||||
toast('Loading...')
|
||||
|
||||
tlid = parseInt(tlid);
|
||||
tlid = parseInt(tlid)
|
||||
mopidy.tracklist.filter({
|
||||
'tlid': [tlid]
|
||||
}).then(
|
||||
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
|
||||
}
|
||||
|
||||
/** *
|
||||
@ -189,86 +189,86 @@ function playTrackQueueByTlid(uri, tlid) {
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function playTrackQueue () {
|
||||
uri = $('#popupQueue').data("track");
|
||||
tlid = $('#popupQueue').data("tlid");
|
||||
return playTrackQueueByTlid(uri, tlid);
|
||||
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...');
|
||||
$('#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 () {
|
||||
mopidy.tracklist.clear().then(
|
||||
resetSong()
|
||||
);
|
||||
return false;
|
||||
)
|
||||
return false
|
||||
}
|
||||
|
||||
function savePressed (key) {
|
||||
if (key == 13) {
|
||||
saveQueue();
|
||||
return false;
|
||||
saveQueue()
|
||||
return false
|
||||
}
|
||||
return true;
|
||||
return true
|
||||
}
|
||||
|
||||
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 !== "") {
|
||||
var playlistName = $('#saveinput').val().trim()
|
||||
if (playlistName !== null && playlistName !== '') {
|
||||
getPlaylistByName(playlistName, 'm3u', false).then(function (exists) {
|
||||
if (exists) {
|
||||
$('#popupSave').popup('close');
|
||||
$('#popupOverwrite').popup('open');
|
||||
$('#popupSave').popup('close')
|
||||
$('#popupOverwrite').popup('open')
|
||||
$('#overwriteConfirmBtn').click(function () {
|
||||
initSave(playlistName, tracks);
|
||||
});
|
||||
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();
|
||||
});
|
||||
$('#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;
|
||||
playlists = {}
|
||||
$('#playlisttracksdiv').hide()
|
||||
$('#playlistslistdiv').show()
|
||||
})
|
||||
return false
|
||||
}
|
||||
|
||||
/** ***********
|
||||
@ -276,58 +276,58 @@ function refreshPlaylists() {
|
||||
*************/
|
||||
|
||||
function doShuffle () {
|
||||
mopidy.playback.stop();
|
||||
mopidy.tracklist.shuffle();
|
||||
mopidy.playback.play();
|
||||
mopidy.playback.stop()
|
||||
mopidy.tracklist.shuffle()
|
||||
mopidy.playback.play()
|
||||
}
|
||||
|
||||
/* Toggle state of play button */
|
||||
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);
|
||||
toast('Please wait...', 250)
|
||||
if (!play) {
|
||||
mopidy.playback.play();
|
||||
mopidy.playback.play()
|
||||
} else {
|
||||
if (isStreamUri(songdata.track.uri)) {
|
||||
mopidy.playback.stop();
|
||||
mopidy.playback.stop()
|
||||
} else {
|
||||
mopidy.playback.pause();
|
||||
mopidy.playback.pause()
|
||||
}
|
||||
}
|
||||
setPlayState(!play);
|
||||
setPlayState(!play)
|
||||
}
|
||||
|
||||
function doPrevious () {
|
||||
toast('Playing previous track...');
|
||||
mopidy.playback.previous();
|
||||
toast('Playing previous track...')
|
||||
mopidy.playback.previous()
|
||||
}
|
||||
|
||||
function doNext () {
|
||||
toast('Playing next track...');
|
||||
mopidy.playback.next();
|
||||
toast('Playing next track...')
|
||||
mopidy.playback.next()
|
||||
}
|
||||
|
||||
function backbt () {
|
||||
history.back();
|
||||
return false;
|
||||
history.back()
|
||||
return false
|
||||
}
|
||||
|
||||
/** ***********
|
||||
@ -335,51 +335,51 @@ function backbt() {
|
||||
*************/
|
||||
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) {
|
||||
if (repeat != nwrepeat) {
|
||||
repeat = setTracklistOption("repeat", nwrepeat);
|
||||
repeat = setTracklistOption('repeat', nwrepeat)
|
||||
}
|
||||
}
|
||||
|
||||
function setRandom (nwrandom) {
|
||||
if (random != nwrandom) {
|
||||
random = setTracklistOption("random", nwrandom);
|
||||
random = setTracklistOption('random', nwrandom)
|
||||
}
|
||||
}
|
||||
|
||||
function setConsume (nwconsume) {
|
||||
if (consume != nwconsume) {
|
||||
consume = setTracklistOption("consume", nwconsume);
|
||||
consume = setTracklistOption('consume', nwconsume)
|
||||
}
|
||||
}
|
||||
|
||||
function setSingle (nwsingle) {
|
||||
if (single != nwsingle) {
|
||||
single = setTracklistOption("single", nwsingle);
|
||||
single = setTracklistOption('single', nwsingle)
|
||||
}
|
||||
}
|
||||
|
||||
function doRandom () {
|
||||
mopidy.tracklist.setRandom({'value': !random}).then();
|
||||
mopidy.tracklist.setRandom({'value': !random}).then()
|
||||
}
|
||||
|
||||
function doRepeat () {
|
||||
mopidy.tracklist.setRepeat({'value': !repeat}).then();
|
||||
mopidy.tracklist.setRepeat({'value': !repeat}).then()
|
||||
}
|
||||
|
||||
function doConsume () {
|
||||
mopidy.tracklist.setConsume({'value': !consume}).then();
|
||||
mopidy.tracklist.setConsume({'value': !consume}).then()
|
||||
}
|
||||
|
||||
function doSingle () {
|
||||
mopidy.tracklist.setSingle({'value': !single}).then();
|
||||
mopidy.tracklist.setSingle({'value': !single}).then()
|
||||
}
|
||||
|
||||
|
||||
@ -389,16 +389,16 @@ function doSingle() {
|
||||
***********************************************/
|
||||
function doSeekPos (value) {
|
||||
if (!positionChanging) {
|
||||
positionChanging = value;
|
||||
positionChanging = value
|
||||
mopidy.playback.seek({'time_position': Math.round(value)}).then(function () {
|
||||
positionChanging = null;
|
||||
});
|
||||
positionChanging = null
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function setPosition (pos) {
|
||||
if (!positionChanging && $("#trackslider").val() != pos) {
|
||||
setProgressTimer(pos);
|
||||
if (!positionChanging && $('#trackslider').val() != pos) {
|
||||
setProgressTimer(pos)
|
||||
}
|
||||
}
|
||||
|
||||
@ -408,35 +408,35 @@ function setPosition(pos) {
|
||||
***********************************************/
|
||||
|
||||
function setVolume (value) {
|
||||
if (!volumeChanging && !volumeSliding && $("#volumeslider").val() != value) {
|
||||
$( "#volumeslider" ).off( "change");
|
||||
$( "#volumeslider" ).val(value).slider('refresh');
|
||||
$( "#volumeslider" ).on( "change", function() { doVolume( $(this).val() ); } );
|
||||
if (!volumeChanging && !volumeSliding && $('#volumeslider').val() != value) {
|
||||
$("#volumeslider").off( 'change')
|
||||
$("#volumeslider").val(value).slider('refresh')
|
||||
$("#volumeslider").on( 'change', function () { doVolume($(this).val()) })
|
||||
}
|
||||
}
|
||||
|
||||
function doVolume (value) {
|
||||
if (!volumeChanging) {
|
||||
volumeChanging = value;
|
||||
volumeChanging = value
|
||||
mopidy.playback.setVolume({'volume': parseInt(volumeChanging)}).then(function () {
|
||||
volumeChanging = null;
|
||||
});
|
||||
volumeChanging = null
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
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});
|
||||
mopidy.mixer.setMute({'mute': !mute})
|
||||
}
|
||||
|
||||
/** **********
|
||||
@ -444,85 +444,85 @@ function doMute() {
|
||||
************/
|
||||
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();
|
||||
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...');
|
||||
toast('Playing...')
|
||||
// stop directly, for user feedback
|
||||
mopidy.playback.stop();
|
||||
mopidy.playback.stop()
|
||||
// hide ios/android keyboard
|
||||
document.activeElement.blur();
|
||||
clearQueue();
|
||||
$("input").blur();
|
||||
mopidy.tracklist.add({'uris': [nwuri]});
|
||||
mopidy.playback.play();
|
||||
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;
|
||||
$('#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 = {};
|
||||
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 = '';
|
||||
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) {
|
||||
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;
|
||||
});
|
||||
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;
|
||||
});
|
||||
playlists[uri] = pl
|
||||
return pl
|
||||
})
|
||||
}
|
||||
|
||||
function getFavourites () {
|
||||
@ -530,136 +530,136 @@ function getFavourites() {
|
||||
STREAMS_PLAYLIST_SCHEME,
|
||||
true).then(function (playlist) {
|
||||
if (playlist) {
|
||||
return getPlaylistFull(playlist.uri);
|
||||
return getPlaylistFull(playlist.uri)
|
||||
}
|
||||
return Mopidy.when(false);
|
||||
});
|
||||
return Mopidy.when(false)
|
||||
})
|
||||
}
|
||||
|
||||
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();
|
||||
});
|
||||
showFavourites()
|
||||
})
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function addFavourite (uri, name) {
|
||||
var uri = uri || $('#streamuriinput').val().trim();
|
||||
var name = name || $('#streamnameinput').val().trim();
|
||||
var uri = uri || $('#streamuriinput').val().trim()
|
||||
var name = name || $('#streamnameinput').val().trim()
|
||||
mopidy.library.lookup({'uris': [uri]}).then(function (results) {
|
||||
var newTracks = results[uri];
|
||||
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) {
|
||||
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);
|
||||
favourites.tracks.splice(index, 1)
|
||||
mopidy.playlists.save({'playlist': favourites}).then(function (s) {
|
||||
showFavourites();
|
||||
});
|
||||
showFavourites()
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function showFavourites () {
|
||||
$('#streamuristable').empty();
|
||||
$('#streamuristable').empty()
|
||||
getFavourites().then(function (favourites) {
|
||||
if (!favourites) {
|
||||
return;
|
||||
return
|
||||
}
|
||||
var tmp = '';
|
||||
var tmp = ''
|
||||
|
||||
$.cookie.json = true;
|
||||
$.cookie.json = true
|
||||
if ($.cookie('streamUris')) {
|
||||
tmp = '<button class="btn" style="padding: 5px; width: 100%" type="button" onclick="return upgradeStreamUrisToFavourites();">Convert StreamUris</button>';
|
||||
tmp = '<button class="btn" style="padding: 5px; width: 100%" type="button" onclick="return upgradeStreamUrisToFavourites();">Convert StreamUris</button>'
|
||||
}
|
||||
if (favourites.tracks) {
|
||||
var child = '';
|
||||
var child = ''
|
||||
for (var i = 0; i < favourites.tracks.length; i++) {
|
||||
child = '<li><span class="ui-icon ui-icon-delete ui-icon-shadow" style="float:right; margin: .5em; margin-top: .8em;"><a href="#" onclick="return deleteFavourite(\'' + i + '\');"> </a></span>' +
|
||||
'<i class="fa fa-rss" style="float: left; padding: .5em; padding-top: 1em;"></i>' +
|
||||
' <a style="margin-left: 20px" href="#" onclick="return playStreamUri(\'' + favourites.tracks[i].uri + '\');">';
|
||||
child += '<h1>' + favourites.tracks[i].name + '</h1></a></li>';
|
||||
tmp += child;
|
||||
' <a style="margin-left: 20px" href="#" onclick="return playStreamUri(\'' + favourites.tracks[i].uri + '\');">'
|
||||
child += '<h1>' + favourites.tracks[i].name + '</h1></a></li>'
|
||||
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.
|
||||
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.
|
||||
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);
|
||||
$.post('/settings/shutdown')
|
||||
toast('Stopping system...', 10000)
|
||||
setTimeout(function () {
|
||||
window.history.back();
|
||||
}, 10000);
|
||||
window.history.back()
|
||||
}, 10000)
|
||||
}
|
||||
|
||||
function rebootSystem () {
|
||||
$.post("/settings/reboot");
|
||||
toast('Rebooting...', 10000);
|
||||
$.post('/settings/reboot')
|
||||
toast('Rebooting...', 10000)
|
||||
setTimeout(function () {
|
||||
window.history.back();
|
||||
}, 10000);
|
||||
window.history.back()
|
||||
}, 10000)
|
||||
}
|
||||
|
||||
@ -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;
|
||||
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 = [];
|
||||
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';
|
||||
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,20 +107,20 @@ var uriHumanList = [
|
||||
['youtube', 'YouTube'],
|
||||
['audioaddict', 'AudioAddict'],
|
||||
['subsonic', 'Subsonic']
|
||||
];
|
||||
]
|
||||
|
||||
function scrollToTop () {
|
||||
var divtop = 0;
|
||||
var divtop = 0
|
||||
$('body,html').animate({
|
||||
scrollTop: divtop
|
||||
}, 250);
|
||||
}, 250)
|
||||
}
|
||||
|
||||
function scrollToTracklist () {
|
||||
var divtop = $("#playlisttracksdiv").offset().top - 120;
|
||||
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
|
||||
@ -129,7 +129,7 @@ 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
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -139,315 +139,315 @@ function getArtist(pl) {
|
||||
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;
|
||||
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 = '<ul class="songsOfAlbum table" >';
|
||||
var liId = '';
|
||||
var targetmin = target.substr(1);
|
||||
$(target).empty();
|
||||
var tmp = '<ul class="songsOfAlbum table" >'
|
||||
var liId = ''
|
||||
var targetmin = target.substr(1)
|
||||
$(target).empty()
|
||||
for (var i = 0; i < pl.length; i++) {
|
||||
popupData[pl[i].uri] = pl[i];
|
||||
liID = targetmin + '-' + pl[i].uri;
|
||||
tmp += renderSongLi(pl[i], liID, uri);
|
||||
popupData[pl[i].uri] = pl[i]
|
||||
liID = targetmin + '-' + pl[i].uri
|
||||
tmp += renderSongLi(pl[i], liID, uri)
|
||||
}
|
||||
tmp += '</ul>';
|
||||
$(target).html(tmp);
|
||||
$(target).attr('data', uri);
|
||||
tmp += '</ul>'
|
||||
$(target).html(tmp)
|
||||
$(target).attr('data', uri)
|
||||
}
|
||||
|
||||
function renderSongLi (song, liID, uri) {
|
||||
var name;
|
||||
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 = '<li class="song albumli" id="' + liID + '">' +
|
||||
'<a href="#" class="moreBtn" onclick="return popupTracks(event, \'' + uri + '\',\'' + song.uri + '\');">' +
|
||||
'<i class="fa fa-ellipsis-v"></i></a>' +
|
||||
'<a href="#" onclick="return playTrackByUri(\'' + song.uri + '\',\'' + uri + '\');">' +
|
||||
'<h1 class="trackname">' + name + '</h1></a>' +
|
||||
'</li>';
|
||||
return songLi;
|
||||
'</li>'
|
||||
return songLi
|
||||
}
|
||||
|
||||
function renderQueueSongLi (song, liID, uri, tlid) {
|
||||
var name;
|
||||
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 = '<li class="song albumli" id="' + liID + '" tlid="' + tlid + '">' +
|
||||
'<a href="#" class="moreBtn" onclick="return popupTracks(event, \'' + uri + '\',\'' + song.uri + '\',\'' + tlid + '\');">' +
|
||||
'<i class="fa fa-ellipsis-v"></i></a>' +
|
||||
'<a href="#" onclick="return playTrackQueueByTlid(\'' + song.uri + '\',\'' + tlid + '\');">' +
|
||||
'<h1 class="trackname">' + name + '</h1></a>' +
|
||||
'</li>';
|
||||
return songLi;
|
||||
'</li>'
|
||||
return songLi
|
||||
}
|
||||
|
||||
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 = [];
|
||||
var newalbum = []
|
||||
var newtlids = []
|
||||
// keep a list of track URIs for retrieving of covers
|
||||
var coversList = [];
|
||||
var nextname = '';
|
||||
var count = 0;
|
||||
$(target).html('');
|
||||
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;
|
||||
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
|
||||
if (!results[i].album) {
|
||||
results[i].album = {"__model__": "Album"};
|
||||
results[i].album = {'__model__': 'Album'}
|
||||
}
|
||||
// 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
|
||||
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;
|
||||
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 += '<li class="albumli"><a href="#"><h1><i class="' + iconClass + '"></i> ' + results[i].name + ' [Stream]</h1></a></li>';
|
||||
newalbum = [];
|
||||
newtlids = [];
|
||||
nextname = '';
|
||||
html += '<li class="albumli"><a href="#"><h1><i class="' + iconClass + '"></i> ' + results[i].name + ' [Stream]</h1></a></li>'
|
||||
newalbum = []
|
||||
newtlids = []
|
||||
nextname = ''
|
||||
} else {
|
||||
if ((results[i].album.name != nextname) || (nextname === '')) {
|
||||
tableid = 'art' + i;
|
||||
tableid = 'art' + i
|
||||
// render differently if only one track in the album
|
||||
if (newalbum.length == 1) {
|
||||
if (i !== 0) {
|
||||
html += '<li class="smalldivider"> </li>';
|
||||
html += '<li class="smalldivider"> </li>'
|
||||
}
|
||||
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 += '<li class="song albumli" id="' + liID + '" tlid="' + newtlids[0] + '">' +
|
||||
'<a href="#" class="moreBtn" onclick="return popupTracks(event, \'' + uri + '\',\'' + newalbum[0].uri + '\',\'' + newtlids[0] + '\');">' +
|
||||
'<i class="fa fa-ellipsis-v"></i></a>' +
|
||||
'<a href="#" onclick="return playTrackQueueByTlid(\'' + newalbum[0].uri + '\',\'' + newtlids[0] + '\');">' +
|
||||
'<h1><i class="' + iconClass + '"></i> ' + newalbum[0].name + "</h1><p>";
|
||||
'<h1><i class="' + iconClass + '"></i> ' + newalbum[0].name + "</h1><p>"
|
||||
} else {
|
||||
html += '<li class="song albumli" id="' + liID + '">' +
|
||||
'<a href="#" class="moreBtn" onclick="return popupTracks(event, \'' + uri + '\',\'' + newalbum[0].uri + '\');">' +
|
||||
'<i class="fa fa-ellipsis-v"></i></a>' +
|
||||
'<a href="#" onclick="return playTrackByUri(\'' + newalbum[0].uri + '\',\'' + uri + '\');">' +
|
||||
'<h1><i class="' + iconClass + '"></i> ' + newalbum[0].name + "</h1><p>";
|
||||
'<h1><i class="' + iconClass + '"></i> ' + newalbum[0].name + "</h1><p>"
|
||||
}
|
||||
|
||||
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) ? '' : ' / ';
|
||||
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 += '<em>' + newalbum[0].album.name + '</em></p>';
|
||||
html += '</a></li>';
|
||||
html += '<em>' + newalbum[0].album.name + '</em></p>'
|
||||
html += '</a></li>'
|
||||
|
||||
popupData[newalbum[0].uri] = newalbum[0];
|
||||
newalbum = [];
|
||||
newtlids = [];
|
||||
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 += '<li class="albumdivider">';
|
||||
iconClass = getMediaClass(newalbum[0].uri)
|
||||
html += '<li class="albumdivider">'
|
||||
html += '<a href="#" onclick="return showAlbum(\'' + results[i].album.uri + '\');"><img id="' +
|
||||
targetmin + '-cover-' + i + '" class="artistcover" width="30" height="30" /><h1><i class="' + iconClass + '"></i> ' + results[i].album.name + '</h1><p>';
|
||||
targetmin + '-cover-' + i + '" class="artistcover" width="30" height="30" /><h1><i class="' + iconClass + '"></i> ' + results[i].album.name + '</h1><p>'
|
||||
}
|
||||
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) ? '' : ' / ';
|
||||
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 += '</p></a></li>';
|
||||
html += '</p></a></li>'
|
||||
for (j = 0; j < newalbum.length; j++) {
|
||||
popupData[newalbum[j].uri] = newalbum[j];
|
||||
popupData[newalbum[j].uri] = newalbum[j]
|
||||
// hERE!
|
||||
var liID = targetmin + '-' + newalbum[j].uri;
|
||||
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
|
||||
}
|
||||
}
|
||||
tableid = "#" + tableid;
|
||||
$(target).html(html);
|
||||
$(target).attr('data', uri);
|
||||
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 = '';
|
||||
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 = '<li id="' + targetmin + '-' + pl[i].uri + '"><a href="#" onclick="return popupTracks(event, \'' + uri + '\',\'' + pl[i].uri + '\');">';
|
||||
child += '<h1>' + pl[i].name + "</h1>";
|
||||
child += '<p>';
|
||||
child += '<span style="float: right;">' + timeFromSeconds(pl[i].length / 1000) + '</span>';
|
||||
popupData[pl[i].uri] = pl[i]
|
||||
child = '<li id="' + targetmin + '-' + pl[i].uri + '"><a href="#" onclick="return popupTracks(event, \'' + uri + '\',\'' + pl[i].uri + '\');">'
|
||||
child += '<h1>' + pl[i].name + "</h1>"
|
||||
child += '<p>'
|
||||
child += '<span style="float: right;">' + timeFromSeconds(pl[i].length / 1000) + '</span>'
|
||||
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) ? '' : ' / ';
|
||||
child += pl[i].artists[j].name
|
||||
child += (j == pl[i].artists.length - 1) ? '' : ' / '
|
||||
// stop after 3
|
||||
if (j > 2) {
|
||||
child += '...';
|
||||
break;
|
||||
child += '...'
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
child += ' / <em>' + pl[i].album.name + '</em></p>';
|
||||
child += '</a></li>';
|
||||
tmp += child;
|
||||
child += ' / <em>' + pl[i].album.name + '</em></p>'
|
||||
child += '</a></li>'
|
||||
tmp += child
|
||||
}
|
||||
}
|
||||
|
||||
$(target).html(tmp);
|
||||
$(target).attr('data', uri);
|
||||
$(target).html(tmp)
|
||||
$(target).attr('data', 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);
|
||||
showLoading(true)
|
||||
return mopidy.playlists.getItems({'uri': uri}).then(function (refs) {
|
||||
return processPlaylistItems({'uri': uri, 'items': refs});
|
||||
}, console.error);
|
||||
return processPlaylistItems({'uri': uri, 'items': refs})
|
||||
}, console.error)
|
||||
}
|
||||
}
|
||||
|
||||
function getUris (tracks) {
|
||||
var results = [];
|
||||
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);
|
||||
};
|
||||
if (customTracklists[uri]) {
|
||||
return returnTracksOrUris(customTracklists[uri]);
|
||||
} else if (playlists[uri] && playlists[uri].tracks) {
|
||||
return returnTracksOrUris(playlists[uri].tracks);
|
||||
return (full_track_data || false) ? tracks : getUris(tracks)
|
||||
}
|
||||
return [];
|
||||
if (customTracklists[uri]) {
|
||||
return returnTracksOrUris(customTracklists[uri])
|
||||
} else if (playlists[uri] && playlists[uri].tracks) {
|
||||
return returnTracksOrUris(playlists[uri].tracks)
|
||||
}
|
||||
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);
|
||||
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;
|
||||
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);
|
||||
$.mobile.loading('hide')
|
||||
}, delay)
|
||||
}
|
||||
}
|
||||
|
||||
@ -456,15 +456,15 @@ function toast(message, delay, textOnly) {
|
||||
******************/
|
||||
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')
|
||||
}
|
||||
}
|
||||
|
||||
@ -474,74 +474,74 @@ function showOffline(on) {
|
||||
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);
|
||||
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);
|
||||
return validUri(str) || isServiceUri(str)
|
||||
}
|
||||
|
||||
function getScheme (uri) {
|
||||
return uri.split(':')[0].toLowerCase();
|
||||
return uri.split(':')[0].toLowerCase()
|
||||
}
|
||||
|
||||
function isStreamUri (uri) {
|
||||
var a = validUri(uri);
|
||||
var b = radioExtensionsList.indexOf(getScheme(uri)) >= 0;
|
||||
return a || b;
|
||||
var a = validUri(uri)
|
||||
var b = radioExtensionsList.indexOf(getScheme(uri)) >= 0
|
||||
return a || b
|
||||
}
|
||||
|
||||
function getMediaClass (uri) {
|
||||
var scheme = getScheme(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);
|
||||
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);
|
||||
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) {
|
||||
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');
|
||||
var starredRegex = /spotify:user:.*:starred/g
|
||||
return (starredRegex.test(playlist.uri) && playlist.name == 'Starred')
|
||||
}
|
||||
|
||||
@ -7,28 +7,28 @@
|
||||
* 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);
|
||||
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);
|
||||
$('#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) {
|
||||
@ -69,158 +69,158 @@ function resizeMb() {
|
||||
}
|
||||
|
||||
function setSongTitle (title, refresh_ui) {
|
||||
songdata.track.name = title;
|
||||
$("#modalname").html(title);
|
||||
songdata.track.name = title
|
||||
$('#modalname').html(title)
|
||||
if (refresh_ui) {
|
||||
resizeMb();
|
||||
resizeMb()
|
||||
}
|
||||
}
|
||||
|
||||
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 += '<a href="#" onclick="return showArtist(\'' + data.track.artists[j].uri + '\');">' + data.track.artists[j].name + '</a>';
|
||||
artiststext += data.track.artists[j].name;
|
||||
artistshtml += '<a href="#" onclick="return showArtist(\'' + data.track.artists[j].uri + '\');">' + data.track.artists[j].name + '</a>'
|
||||
artiststext += data.track.artists[j].name
|
||||
if (j != data.track.artists.length - 1) {
|
||||
artistshtml += ', ';
|
||||
artiststext += ', ';
|
||||
artistshtml += ', '
|
||||
artiststext += ', '
|
||||
}
|
||||
}
|
||||
arttmp = artistshtml;
|
||||
arttmp = artistshtml
|
||||
}
|
||||
if (data.track.album && data.track.album.name) {
|
||||
$("#modalalbum").html('<a href="#" onclick="return showAlbum(\'' + data.track.album.uri + '\');">' + data.track.album.name + '</a>');
|
||||
getCover(data.track.uri, '#infocover, #controlspopupimage', 'extralarge');
|
||||
$('#modalalbum').html('<a href="#" onclick="return showAlbum(\'' + data.track.album.uri + '\');">' + data.track.album.name + '</a>')
|
||||
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');
|
||||
$('#popupTracks').popup('close')
|
||||
$('#artistpopup').popup('close')
|
||||
$('#coverpopup').popup('close')
|
||||
$('#popupQueue').popup('close')
|
||||
$('#controlspopup').popup('close')
|
||||
}
|
||||
|
||||
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 = '<a href="#" onclick="showArtist(\'' + popupData[trackuri].artists[0].uri + '\');">Show Artist</a>';
|
||||
$('.popupArtistName').html(popupData[trackuri].artists[0].name);
|
||||
$('.popupArtistHref').attr('onclick', 'showArtist("' + popupData[trackuri].artists[0].uri + '");' );
|
||||
$('.popupArtistsDiv').hide();
|
||||
$('.popupArtistsLi').show();
|
||||
child = '<a href="#" onclick="showArtist(\'' + popupData[trackuri].artists[0].uri + '\');">Show Artist</a>'
|
||||
$('.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 += '<li><a href="#" onclick="showArtist(\'' + popupData[trackuri].artists[j].uri + '\');"><span class="popupArtistName">' + popupData[trackuri].artists[j].name + '</span></a></li>';
|
||||
child += '<li><a href="#" onclick="showArtist(\'' + popupData[trackuri].artists[j].uri + '\');"><span class="popupArtistName">' + popupData[trackuri].artists[j].name + '</span></a></li>'
|
||||
}
|
||||
$('.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);
|
||||
uri = $(popupId).data('track')
|
||||
showAlbum(popupData[uri].album.uri)
|
||||
}
|
||||
|
||||
/** ********************
|
||||
@ -228,234 +228,234 @@ function showAlbumPopup(popupId) {
|
||||
**********************/
|
||||
|
||||
function initSocketevents () {
|
||||
mopidy.on("state:online", function() {
|
||||
showOffline(false);
|
||||
getCurrentPlaylist();
|
||||
updateStatusOfAll();
|
||||
getPlaylists();
|
||||
mopidy.on('state:online', function () {
|
||||
showOffline(false)
|
||||
getCurrentPlaylist()
|
||||
updateStatusOfAll()
|
||||
getPlaylists()
|
||||
getUriSchemes().then(function () {
|
||||
showFavourites();
|
||||
});
|
||||
getBrowseDir();
|
||||
getSearchSchemes();
|
||||
showLoading(false);
|
||||
$(window).hashchange();
|
||||
});
|
||||
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 (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;
|
||||
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 () {
|
||||
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;
|
||||
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);
|
||||
site = site.trim()
|
||||
str = $('.mainNav').find('a[href$=' + site + ']').text()
|
||||
if (str === '') {
|
||||
str = site.charAt(0).toUpperCase() + site.slice(1)
|
||||
}
|
||||
$('#contentHeadline').html('<a href="#home" onclick="switchContent(\'home\'); return false;">' + str + '</a>');
|
||||
$('#contentHeadline').html('<a href="#home" onclick="switchContent(\'home\'); return false;">' + str + '</a>')
|
||||
}
|
||||
|
||||
// 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);
|
||||
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);
|
||||
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('?');
|
||||
var hash = document.location.hash.split('?')
|
||||
// remove #
|
||||
var divid = hash[0].substr(1);
|
||||
setHeadline(divid);
|
||||
var divid = hash[0].substr(1)
|
||||
setHeadline(divid)
|
||||
|
||||
|
||||
var uri = hash[1];
|
||||
$('.mainNav a').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');
|
||||
$('.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) {
|
||||
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) {
|
||||
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
|
||||
}
|
||||
|
||||
/** *********************
|
||||
@ -464,16 +464,16 @@ function locationHashChanged() {
|
||||
$(document).ready(function (event) {
|
||||
// check for websockets
|
||||
if (!window.WebSocket) {
|
||||
switchContent("playlists");
|
||||
$('#playlistspane').html('<h2>Old Browser</h2><p>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.</p>');
|
||||
exit;
|
||||
switchContent('playlists')
|
||||
$('#playlistspane').html('<h2>Old Browser</h2><p>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.</p>')
|
||||
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"); } );
|
||||
$('.ui-panel-dismiss').on( 'tap', function () { $('#panel').panel('close') })
|
||||
// end of workaround
|
||||
|
||||
$(window).hashchange();
|
||||
$(window).hashchange()
|
||||
|
||||
// Connect to server
|
||||
if (websocketUrl) {
|
||||
@ -481,79 +481,79 @@ $(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'});
|
||||
mopidy = new Mopidy({callingConvention: 'by-position-or-by-name'})
|
||||
} catch (e) {
|
||||
showOffline(true);
|
||||
showOffline(true)
|
||||
}
|
||||
}
|
||||
|
||||
// initialize events
|
||||
initSocketevents();
|
||||
initSocketevents()
|
||||
|
||||
progressTimer = new ProgressTimer({
|
||||
callback: timerCallback,
|
||||
// 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
|
||||
if (window.navigator.standalone) {
|
||||
$("#btback").show();
|
||||
$('#btback').show()
|
||||
} else {
|
||||
$("#btback").hide();
|
||||
$('#btback').hide()
|
||||
}
|
||||
|
||||
$(window).resize(function () {
|
||||
resizeMb();
|
||||
});
|
||||
resizeMb()
|
||||
})
|
||||
|
||||
// navigation temporary, rewrite this!
|
||||
$('#songinfo').click(function () {
|
||||
return switchContent('nowPlaying');
|
||||
});
|
||||
return switchContent('nowPlaying')
|
||||
})
|
||||
$('#controlspopupimage').click(function () {
|
||||
return switchContent('current');
|
||||
});
|
||||
return switchContent('current')
|
||||
})
|
||||
$('#navToggleFullscreen').click(function () {
|
||||
toggleFullscreen();
|
||||
});
|
||||
toggleFullscreen()
|
||||
})
|
||||
|
||||
// event handlers for full screen mode
|
||||
$(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
|
||||
@ -561,116 +561,116 @@ $(document).ready(function(event) {
|
||||
$(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);
|
||||
var unicode = event.keyCode ? event.keyCode : event.charCode
|
||||
var actualkey = String.fromCharCode(unicode)
|
||||
switch (actualkey) {
|
||||
case ' ':
|
||||
doPlay();
|
||||
event.preventDefault();
|
||||
break;
|
||||
doPlay()
|
||||
event.preventDefault()
|
||||
break
|
||||
case '>':
|
||||
doNext();
|
||||
event.preventDefault();
|
||||
break;
|
||||
doNext()
|
||||
event.preventDefault()
|
||||
break
|
||||
case '<':
|
||||
doPrevious();
|
||||
event.preventDefault();
|
||||
break;
|
||||
doPrevious()
|
||||
event.preventDefault()
|
||||
break
|
||||
}
|
||||
return true;
|
||||
return true
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
|
||||
if ($(window).width() < 980) {
|
||||
$("#panel").panel("close");
|
||||
$('#panel').panel('close')
|
||||
} else {
|
||||
$("#panel").panel("open");
|
||||
$('#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');
|
||||
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 () {
|
||||
if (this.id == 'playlisttracks-' + uri) {
|
||||
$(this).addClass('currenttrack2');
|
||||
$(this).addClass('currenttrack2')
|
||||
} else {
|
||||
$(this).removeClass("currenttrack2");
|
||||
$(this).removeClass('currenttrack2')
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
$('#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 () {
|
||||
if (this.id == 'artiststable-' + uri) {
|
||||
$(this).addClass('currenttrack2');
|
||||
$(this).addClass('currenttrack2')
|
||||
} else {
|
||||
$(this).removeClass("currenttrack2");
|
||||
$(this).removeClass('currenttrack2')
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
$('#albumstable li').each(function () {
|
||||
if (this.id == 'albumstable-' + uri) {
|
||||
$(this).addClass('currenttrack2');
|
||||
$(this).addClass('currenttrack2')
|
||||
} else {
|
||||
$(this).removeClass("currenttrack2");
|
||||
$(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')
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
@ -2,40 +2,40 @@
|
||||
* @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);
|
||||
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];
|
||||
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
|
||||
@ -43,50 +43,50 @@ function getCover(uri, images, size) {
|
||||
// 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];
|
||||
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]);
|
||||
$(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';
|
||||
var defUrl = 'images/default_cover.png'
|
||||
if (!(track.album || track.artist)) {
|
||||
return;
|
||||
return
|
||||
}
|
||||
var albumname = track.album.name || '';
|
||||
var artistname = '';
|
||||
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;
|
||||
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) {
|
||||
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);
|
||||
$(images).attr('src', data.album.image[i]['#text'] || defUrl)
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function getArtistImage (nwartist, image, size) {
|
||||
var defUrl = 'images/user_24x32.png';
|
||||
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);
|
||||
$(image).attr('src', data.artist.image[i]['#text'] || defUrl)
|
||||
}
|
||||
}
|
||||
}});
|
||||
}})
|
||||
}
|
||||
@ -2,56 +2,56 @@
|
||||
* Search
|
||||
*********************************/
|
||||
function searchPressed (key) {
|
||||
var value = $('#searchinput').val();
|
||||
switchContent('search');
|
||||
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();
|
||||
var value = $('#searchinput').val()
|
||||
var searchService = $('#selectSearchService').val()
|
||||
|
||||
if ((value.length < 100) && (value.length > 0)) {
|
||||
showLoading(true);
|
||||
showLoading(true)
|
||||
// hide ios/android keyboard
|
||||
document.activeElement.blur();
|
||||
$("input").blur();
|
||||
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)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -62,106 +62,106 @@ function initSearch() {
|
||||
|
||||
// # speed clone http://jsperf.com/cloning-an-object/2
|
||||
function clone (obj) {
|
||||
var target = {};
|
||||
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();
|
||||
$(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)];
|
||||
});
|
||||
return tokens[match.slice(1, -1)]
|
||||
})
|
||||
}
|
||||
|
||||
// 'Show more' pattern
|
||||
var showMorePattern = '<li onclick="$(this).hide().siblings().show(); return false;"><a>Show {count} more</a></li>';
|
||||
var showMorePattern = '<li onclick="$(this).hide().siblings().show(); return false;"><a>Show {count} more</a></li>'
|
||||
|
||||
// Artist results
|
||||
var child = '';
|
||||
var pattern = '<li><a href="#" onclick="return showArtist(this.id)" id={id}><i class="{class}"></i> <strong>{name}</strong></a></li>';
|
||||
var tokens;
|
||||
var child = ''
|
||||
var pattern = '<li><a href="#" onclick="return showArtist(this.id)" id={id}><i class="{class}"></i> <strong>{name}</strong></a></li>'
|
||||
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('<li>', '<li class="overflow">');
|
||||
child += theme(showMorePattern, {'count': results.artists.length - i})
|
||||
pattern = pattern.replace('<li>', '<li class="overflow">')
|
||||
}
|
||||
|
||||
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 = '<li><a href="#" onclick="return showAlbum(this.id)" id="{albumId}">';
|
||||
pattern += '<h5 data-role="heading"><i class="{class}"></i> {albumName}</h5>';
|
||||
pattern += '<p data-role="desc">{artistName}</p>';
|
||||
pattern += '</a></li>';
|
||||
child = ''
|
||||
pattern = '<li><a href="#" onclick="return showAlbum(this.id)" id="{albumId}">'
|
||||
pattern += '<h5 data-role="heading"><i class="{class}"></i> {albumName}</h5>'
|
||||
pattern += '<p data-role="desc">{artistName}</p>'
|
||||
pattern += '</a></li>'
|
||||
|
||||
for (var i = 0; i < results.albums.length; i++) {
|
||||
tokens = {
|
||||
@ -170,39 +170,39 @@ 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('<li>', '<li class="overflow">');
|
||||
child += theme(showMorePattern, {'count': results.albums.length - i})
|
||||
pattern = pattern.replace('<li>', '<li class="overflow">')
|
||||
}
|
||||
|
||||
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');
|
||||
$('#albumresulttable tr').removeClass('hidden')
|
||||
$('#artistresulttable tr').removeClass('hidden')
|
||||
}
|
||||
|
||||
/** *******************************
|
||||
@ -211,26 +211,26 @@ function toggleSearch() {
|
||||
|
||||
function getPlaylists () {
|
||||
// get playlists without tracks
|
||||
mopidy.playlists.asList().then(processGetPlaylists, console.error);
|
||||
mopidy.playlists.asList().then(processGetPlaylists, console.error)
|
||||
}
|
||||
|
||||
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);
|
||||
mopidy.tracklist.getTlTracks().then(processCurrentPlaylist, console.error)
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
@ -240,29 +240,29 @@ function togglePlaylists() {
|
||||
if ($(window).width() <= 960) {
|
||||
$('#playlisttracksdiv').toggle();
|
||||
// Hide other div
|
||||
($('#playlisttracksdiv').is(":visible")) ? $('#playlistslistdiv').hide() : $('#playlistslistdiv').show();
|
||||
($('#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();
|
||||
$(PLAYLIST_TABLE).empty()
|
||||
togglePlaylists()
|
||||
var tracks = getPlaylistTracks(uri).then(function (tracks) {
|
||||
resultsToTables(tracks, PLAYLIST_TABLE, uri);
|
||||
});
|
||||
showLoading(false);
|
||||
updatePlayIcons(uri);
|
||||
resultsToTables(tracks, PLAYLIST_TABLE, uri)
|
||||
})
|
||||
showLoading(false)
|
||||
updatePlayIcons(uri)
|
||||
$('#playlistslist li a').each(function () {
|
||||
$(this).removeClass("playlistactive");
|
||||
$(this).removeClass('playlistactive')
|
||||
if (this.id == uri) {
|
||||
$(this).addClass('playlistactive');
|
||||
$(this).addClass('playlistactive')
|
||||
}
|
||||
});
|
||||
return false;
|
||||
})
|
||||
return false
|
||||
}
|
||||
|
||||
/** ****
|
||||
@ -270,75 +270,75 @@ function showTracklist(uri) {
|
||||
*/
|
||||
|
||||
function showArtist (nwuri) {
|
||||
$('#popupQueue').popup('close');
|
||||
$('#popupTracks').popup('close');
|
||||
$('#controlsmodal').popup('close');
|
||||
$(ARTIST_TABLE).empty();
|
||||
$('#popupQueue').popup('close')
|
||||
$('#popupTracks').popup('close')
|
||||
$('#controlsmodal').popup('close')
|
||||
$(ARTIST_TABLE).empty()
|
||||
|
||||
// TODO cache
|
||||
$('#h_artistname').html('');
|
||||
showLoading(true);
|
||||
$('#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;
|
||||
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();
|
||||
$('#popupQueue').popup('close')
|
||||
$('#popupTracks').popup('close')
|
||||
$('#controlsmodal').popup('close')
|
||||
$(ALBUM_TABLE).empty()
|
||||
// fill from cache
|
||||
var pl = getTracksFromUri(uri, true);
|
||||
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);
|
||||
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);
|
||||
var resultArr = resultDict[uri]
|
||||
resultArr.uri = uri
|
||||
processAlbumResults(resultArr)
|
||||
}, console.error)
|
||||
} else {
|
||||
showLoading(true);
|
||||
$('#h_albumname').html('');
|
||||
$('#h_albumartist').html('');
|
||||
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);
|
||||
var resultArr = resultDict[uri]
|
||||
resultArr.uri = uri
|
||||
processAlbumResults(resultArr)
|
||||
}, console.error)
|
||||
}
|
||||
// show page
|
||||
switchContent('albums', uri);
|
||||
scrollToTop();
|
||||
return false;
|
||||
switchContent('albums', uri)
|
||||
scrollToTop()
|
||||
return false
|
||||
}
|
||||
|
||||
function getSearchSchemes () {
|
||||
mopidy.getUriSchemes().then(
|
||||
function (schemesArray) {
|
||||
var humanIndex;
|
||||
$("#selectSearchService").children().remove().end();
|
||||
$("#selectSearchService").append(new Option('All services', 'all'));
|
||||
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]));
|
||||
$('#selectSearchService').append(new Option(uriHumanList[j][1], schemesArray[i]))
|
||||
}
|
||||
}
|
||||
}
|
||||
$("#selectSearchService").selectmenu( "refresh", true );
|
||||
$('#selectSearchService').selectmenu( 'refresh', true)
|
||||
}, console.error
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
@ -9,56 +9,56 @@
|
||||
* process results of a (new) currently playing track
|
||||
*********************************************************/
|
||||
function processCurrenttrack (data) {
|
||||
setSongInfo(data);
|
||||
setSongInfo(data)
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
* process results of volume
|
||||
*********************************************************/
|
||||
function processVolume (data) {
|
||||
setVolume(data);
|
||||
setVolume(data)
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
* process results of mute
|
||||
*********************************************************/
|
||||
function processMute (data) {
|
||||
setMute(data);
|
||||
setMute(data)
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
* process results of a repeat
|
||||
*********************************************************/
|
||||
function processRepeat (data) {
|
||||
setRepeat(data);
|
||||
setRepeat(data)
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
* process results of random
|
||||
*********************************************************/
|
||||
function processRandom (data) {
|
||||
setRandom(data);
|
||||
setRandom(data)
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
* process results of consume
|
||||
*********************************************************/
|
||||
function processConsume (data) {
|
||||
setConsume(data);
|
||||
setConsume(data)
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
* process results of single
|
||||
*********************************************************/
|
||||
function processSingle (data) {
|
||||
setSingle(data);
|
||||
setSingle(data)
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
* process results of current position
|
||||
*********************************************************/
|
||||
function processCurrentposition (data) {
|
||||
setPosition(parseInt(data));
|
||||
setPosition(parseInt(data))
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
@ -66,9 +66,9 @@ function processCurrentposition(data) {
|
||||
*********************************************************/
|
||||
function processPlaystate (data) {
|
||||
if (data == 'playing') {
|
||||
setPlayState(true);
|
||||
setPlayState(true)
|
||||
} else {
|
||||
setPlayState(false);
|
||||
setPlayState(false)
|
||||
}
|
||||
}
|
||||
|
||||
@ -76,76 +76,76 @@ function processPlaystate(data) {
|
||||
* process results of a browse list
|
||||
*********************************************************/
|
||||
function processBrowseDir (resultArr) {
|
||||
var backHtml = '<li style="background-color:#ccc"><a href="#" onclick="return getBrowseDir();"><h1 class="trackname"><i class="fa fa-arrow-circle-left"></i> Back</h1></a></li>';
|
||||
var backHtml = '<li style="background-color:#ccc"><a href="#" onclick="return getBrowseDir();"><h1 class="trackname"><i class="fa fa-arrow-circle-left"></i> Back</h1></a></li>'
|
||||
if ((!resultArr) || (resultArr === '') || (resultArr.length === 0)) {
|
||||
$('#browsepath').html('No tracks found...');
|
||||
$('#browselist').html(backHtml);
|
||||
showLoading(false);
|
||||
return;
|
||||
$('#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('/');
|
||||
var colonindex = uri.lastIndexOf(':')
|
||||
var slashindex = uri.lastIndexOf('/')
|
||||
|
||||
var lastindex = (colonindex > slashindex) ? colonindex : slashindex;
|
||||
rooturi = uri.slice(0, lastindex);
|
||||
var lastindex = (colonindex > slashindex) ? colonindex : slashindex
|
||||
rooturi = uri.slice(0, lastindex)
|
||||
if (resultArr[0].type == 'track') {
|
||||
rooturi = rooturi.replace(":track:", ":directory:");
|
||||
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]);
|
||||
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 += '<li class="song albumli" id="browselisttracks-' + resultArr[i].uri + '">' +
|
||||
'<a href="#" class="moreBtn" onclick="return popupTracks(event, \'' + uri + '\', \'' + resultArr[i].uri + '\', \'' + index + '\');">' +
|
||||
'<i class="fa fa-ellipsis-v"></i></a>' +
|
||||
'<a href="#" class="browsetrack" onclick="return playBrowsedTracks(PLAY_ALL, ' + index + ');" id="' + resultArr[i].uri +
|
||||
'"><h1 class="trackname"><i class="' + iconClass + '"></i> ' + resultArr[i].name + '</h1></a></li>';
|
||||
index++;
|
||||
'"><h1 class="trackname"><i class="' + iconClass + '"></i> ' + resultArr[i].name + '</h1></a></li>'
|
||||
index++
|
||||
} else {
|
||||
if (browseStack.length > 0) {
|
||||
iconClass="fa fa-folder-o";
|
||||
iconClass = "fa fa-folder-o"
|
||||
}
|
||||
child += '<li><a href="#" onclick="return getBrowseDir(this.id);" id="' + resultArr[i].uri +
|
||||
'""><h1 class="trackname"><i class="' + iconClass + '"></i> ' + resultArr[i].name + '</h1></a></li>';
|
||||
'""><h1 class="trackname"><i class="' + iconClass + '"></i> ' + resultArr[i].name + '</h1></a></li>'
|
||||
}
|
||||
}
|
||||
|
||||
$('#browselist').html(child);
|
||||
$('#browselist').html(child)
|
||||
if (browseStack.length > 0) {
|
||||
child = getMediaHuman(uri);
|
||||
iconClass = getMediaClass(uri);
|
||||
$('#browsepath').html('<i class="' + iconClass + '"></i> ' + child);
|
||||
child = getMediaHuman(uri)
|
||||
iconClass = getMediaClass(uri)
|
||||
$('#browsepath').html('<i class="' + iconClass + '"></i> ' + child)
|
||||
} else {
|
||||
$('#browsepath').html('');
|
||||
$('#browsepath').html('')
|
||||
}
|
||||
|
||||
updatePlayIcons(songdata.track.uri, songdata.tlid);
|
||||
updatePlayIcons(songdata.track.uri, songdata.tlid)
|
||||
|
||||
showLoading(false);
|
||||
showLoading(false)
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
@ -153,26 +153,26 @@ function processBrowseDir(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 = '<li><a href="#" onclick="return showTracklist(this.id);" id="' + resultArr[i].uri + '">';
|
||||
var li_html = '<li><a href="#" onclick="return showTracklist(this.id);" id="' + resultArr[i].uri + '">'
|
||||
if (isSpotifyStarredPlaylist(resultArr[i])) {
|
||||
starred = li_html + '★ Spotify Starred Tracks</a></li>' + tmp;
|
||||
starred = li_html + '★ Spotify Starred Tracks</a></li>' + tmp
|
||||
} else if (isFavouritesPlaylist(resultArr[i])) {
|
||||
favourites = li_html + '♥ Musicbox Favourites</a></li>';
|
||||
favourites = li_html + '♥ Musicbox Favourites</a></li>'
|
||||
} else {
|
||||
tmp = tmp + li_html + '<i class="' + getMediaClass(resultArr[i].uri) + '"></i> ' + resultArr[i].name + '</a></li>';
|
||||
tmp = tmp + li_html + '<i class="' + getMediaClass(resultArr[i].uri) + '"></i> ' + resultArr[i].name + '</a></li>'
|
||||
}
|
||||
}
|
||||
// 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)
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
@ -180,34 +180,34 @@ function processGetPlaylists(resultArr) {
|
||||
*********************************************************/
|
||||
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) {
|
||||
// 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);
|
||||
currentplaylist = resultArr
|
||||
resultsToTables(currentplaylist, CURRENT_PLAYLIST_TABLE)
|
||||
mopidy.playback.getCurrentTlTrack().then(processCurrenttrack, console.error)
|
||||
updatePlayIcons(songdata.track.uri, songdata.tlid)
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
@ -215,18 +215,18 @@ function processCurrentPlaylist(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)
|
||||
}
|
||||
|
||||
/** ******************************************************
|
||||
@ -234,20 +234,20 @@ function processArtistResults(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)
|
||||
}
|
||||
|
||||
@ -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);
|
||||
updateTimers(position, duration, isRunning)
|
||||
|
||||
if (callbackHeartbeats === 0) {
|
||||
callbackHeartbeats = getHeartbeat();
|
||||
callbackHeartbeats = getHeartbeat()
|
||||
}
|
||||
|
||||
if (mopidy && position > 0) {
|
||||
@ -30,97 +30,97 @@ function timerCallback(position, duration, isRunning) {
|
||||
// synced.
|
||||
mopidy.playback.getTimePosition().then(
|
||||
function (mopidy_position) {
|
||||
syncTimer(position, 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.
|
||||
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');
|
||||
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 () {
|
||||
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) {
|
||||
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;
|
||||
return value.match(/^\w*\d+\w*$/) ? parseInt(value) : null
|
||||
}
|
||||
|
||||
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) {
|
||||
@ -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;
|
||||
synced = false
|
||||
consecutiveSyncs = 0
|
||||
syncsLeft = MAX_SYNCS
|
||||
callbackHeartbeats = START_BEATS
|
||||
targetPosition = null
|
||||
}
|
||||
|
||||
function setProgressTimer (pos) {
|
||||
reset();
|
||||
targetPosition = pos;
|
||||
progressTimer.set(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);
|
||||
positionNode.nodeValue = format(pos)
|
||||
}
|
||||
|
||||
function startProgressTimer () {
|
||||
reset();
|
||||
progressTimer.start();
|
||||
reset()
|
||||
progressTimer.start()
|
||||
}
|
||||
|
||||
function resetProgressTimer () {
|
||||
progressTimer.reset();
|
||||
reset();
|
||||
targetPosition = 0;
|
||||
progressTimer.reset()
|
||||
reset()
|
||||
targetPosition = 0
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user