Put search result for artists and albums inside jQuery Mobile listviews. These listviews are limited to a hardcoded number of items to display at first, with the option of expanding the list with the rest.
241 lines
7.1 KiB
JavaScript
Executable File
241 lines
7.1 KiB
JavaScript
Executable File
/*********************************
|
|
* Search
|
|
*********************************/
|
|
function searchPressed(key) {
|
|
var value = $('#searchinput').val();
|
|
switchContent('search');
|
|
|
|
if (key == 13) {
|
|
initSearch();
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//init search
|
|
function initSearch() {
|
|
var value = $('#searchinput').val();
|
|
|
|
if ((value.length < 100) && (value.length > 0)) {
|
|
showLoading(true);
|
|
//hide ios/android keyboard
|
|
document.activeElement.blur();
|
|
$("input").blur();
|
|
|
|
$('#artistresulttable').empty();
|
|
$('#albumresulttable').empty();
|
|
$('#trackresulttable').empty();
|
|
delete customTracklists['allresultscache'];
|
|
delete customTracklists['artistresultscache'];
|
|
delete customTracklists['albumresultscache'];
|
|
delete customTracklists['trackresultscache'];
|
|
$("#searchresults").hide();
|
|
|
|
mopidy.library.search({
|
|
any : value
|
|
}).then(processSearchResults, console.error);
|
|
}
|
|
}
|
|
|
|
/********************************************************
|
|
* process results of a search
|
|
*********************************************************/
|
|
function processSearchResults(resultArr) {
|
|
$(SEARCH_TRACK_TABLE).empty();
|
|
$(SEARCH_ARTIST_TABLE).empty();
|
|
$(SEARCH_ALBUM_TABLE).empty();
|
|
|
|
// Merge results from different backends.
|
|
var results = {'tracks': [], 'artists': [], 'albums': []};
|
|
var emptyResult = true;
|
|
|
|
console.log(resultArr, 'resultArr');
|
|
|
|
for (var i = 0; i < resultArr.length; ++i) {
|
|
for (var prop in results) {
|
|
if (resultArr[i][prop] && resultArr[i][prop].length) {
|
|
results[prop] = results[prop].concat(resultArr[i][prop]);
|
|
emptyResult = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
customTracklists['trackresultscache'] = results.tracks;
|
|
|
|
if (emptyResult) {
|
|
alert('No results');
|
|
showLoading(false);
|
|
return false;
|
|
}
|
|
|
|
$("#searchresults").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)];
|
|
});
|
|
}
|
|
|
|
// 'Show more' pattern
|
|
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}><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
|
|
};
|
|
|
|
// 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(pattern, tokens);
|
|
}
|
|
|
|
// Inject list items, refresh listview and hide superfluous items.
|
|
$(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">{albumName}</h5>';
|
|
pattern += '<p data-role="desc">{artistName} ({albumYear})</p>';
|
|
pattern += '</a></li>';
|
|
|
|
for (var i = 0; i < results.albums.length; i++) {
|
|
tokens = {
|
|
'albumId': results.albums[i].uri,
|
|
'albumName': results.albums[i].name,
|
|
'artistName': '',
|
|
'albumYear': results.albums[i].date
|
|
};
|
|
|
|
for (var j = 0; j < results.albums[i].artists.length; j++) {
|
|
tokens.artistName += results.albums[i].artists[j].name + ' ';
|
|
}
|
|
|
|
// 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(pattern, tokens);
|
|
}
|
|
|
|
// Inject list items, refresh listview and hide superfluous items.
|
|
$(SEARCH_ALBUM_TABLE).html(child).listview('refresh').find('.overflow').hide();
|
|
|
|
$('#expandsearch').show();
|
|
|
|
// Track results
|
|
playlisttotable(results.tracks, SEARCH_TRACK_TABLE, 'trackresultscache');
|
|
|
|
setSongInfo();
|
|
showLoading(false);
|
|
}
|
|
|
|
function toggleSearch() {
|
|
$("#albumresulttable tr").removeClass('hidden');
|
|
$("#artistresulttable tr").removeClass('hidden');
|
|
}
|
|
|
|
/*********************************
|
|
* Playlists
|
|
*********************************/
|
|
|
|
function getPlaylists() {
|
|
// get playlists without tracks
|
|
mopidy.playlists.getPlaylists(false).then(processGetPlaylists, console.error);
|
|
}
|
|
|
|
function getCurrentPlaylist() {
|
|
mopidy.tracklist.getTracks().then(processCurrentPlaylist, console.error);
|
|
}
|
|
|
|
/********************************************************
|
|
* Show tracks of playlist
|
|
********************************************************/
|
|
function showTracklist(uri) {
|
|
$(PLAYLIST_TABLE).empty();
|
|
$('#playlisttracksdiv').show();
|
|
|
|
var pl = getPlaylistFromUri(uri);
|
|
//load from cache
|
|
if (pl) {
|
|
resultsToTables(pl.tracks, PLAYLIST_TABLE, uri);
|
|
} else {
|
|
showLoading(true);
|
|
}
|
|
|
|
$('#playlistslist li a').each(function() {
|
|
$(this).removeClass("playlistactive");
|
|
if (this.id == uri) {
|
|
$(this).addClass('playlistactive');
|
|
}
|
|
});
|
|
scrollToTracklist();
|
|
//lookup recent tracklist
|
|
mopidy.playlists.lookup(uri).then(processGetTracklist, console.error);
|
|
return false;
|
|
}
|
|
|
|
/******
|
|
* Lookups
|
|
*/
|
|
|
|
function showArtist(nwuri) {
|
|
$('#popupTracks').popup('close');
|
|
$('#controlsmodal').popup('close');
|
|
$(ARTIST_TABLE).empty();
|
|
//fill from cache
|
|
// var pl = getTracksFromUri(nwuri);
|
|
//TODO cache
|
|
$('#h_artistname').html('');
|
|
showLoading(true);
|
|
mopidy.library.lookup(nwuri).then(processArtistResults, console.error);
|
|
switchContent('artists', nwuri);
|
|
scrollToTop();
|
|
setSongInfo();
|
|
return false;
|
|
}
|
|
|
|
function showAlbum(uri) {
|
|
$('#popupTracks').popup('close');
|
|
$('#controlsmodal').popup('close');
|
|
$(ALBUM_TABLE).empty();
|
|
//fill from cache
|
|
var pl = getTracksFromUri(uri);
|
|
if (pl) {
|
|
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);
|
|
getCover(artistname, albumname, '#albumviewcover, #coverpopupimage', 'extralarge');
|
|
mopidy.library.lookup(uri).then(processAlbumResults, console.error);
|
|
} else {
|
|
showLoading(true);
|
|
$('#h_albumname').html('');
|
|
$('#h_albumartist').html('');
|
|
mopidy.library.lookup(uri).then(processAlbumResults, console.error);
|
|
}
|
|
//show page
|
|
switchContent('albums', uri);
|
|
scrollToTop();
|
|
setSongInfo();
|
|
return false;
|
|
}
|
|
|