diff --git a/server/djrandom/frontend/static/player.js b/server/djrandom/frontend/static/player.js index 4550760da66643d8e786a41cf22e0f843d038651..3e739f6a733a7ff3c36a0f53b72cd4cb1ea4fce6 100644 --- a/server/djrandom/frontend/static/player.js +++ b/server/djrandom/frontend/static/player.js @@ -40,7 +40,7 @@ djr.Backend.prototype.getPlaylist = function(uuid, callback, ctx) { type: 'GET', context: ctx || this, success: function(data, status, jqxhr) { - callback(new djr.PlaylistChunk(data.songs)); + callback(new djr.PlaylistChunk(data.songs, uuid)); } }); }; @@ -74,8 +74,9 @@ djr.Backend.prototype.nowPlaying = function(song) { // A Playlist chunk (basically, an array of songs). -djr.PlaylistChunk = function(songs) { +djr.PlaylistChunk = function(songs, title) { this.songs = songs || []; + this.title = title; }; djr.PlaylistChunk.prototype.hasSong = function(sha1) { @@ -108,12 +109,8 @@ djr.Playlist.prototype.allSongs = function() { return songs; }; -// Add a new chunk (only adds unique songs). -// Returns the chunk ID, or -1 if no songs were added. -djr.Playlist.prototype.addChunk = function(playlist_chunk) { - djr.debug('adding chunk to playlist ' + this.uuid); - var chunk_id = this.next_chunk_id++; - +// Creates a new chunk with only unique songs. +djr.Playlist.prototype.createUniqueChunk = function(songs, title) { var songs = [], i; for (i = 0; i < playlist_chunk.songs.length; i++) { var song = playlist_chunk.songs[i]; @@ -121,16 +118,26 @@ djr.Playlist.prototype.addChunk = function(playlist_chunk) { continue; } songs.push(song); - this.song_map[song] = chunk_id; } + if (songs.length > 0) { + return new djr.PlaylistChunk(songs, title); + } else { + return null; + } +}; - if (songs.length == 0) { - return -1; - } else { - this.chunk_map[chunk_id] = new djr.PlaylistChunk(songs); - this.chunks.push(chunk_id); - return chunk_id; +// Add a new chunk (only adds unique songs). +// Returns the chunk ID, or -1 if no songs were added. +djr.Playlist.prototype.addChunk = function(playlist_chunk) { + djr.debug('adding chunk to playlist ' + this.uuid); + var i, chunk_id = this.next_chunk_id++; + for (i = 0; i < playlist_chunk.songs.length; i++) { + var song = playlist_chunk.songs[i]; + this.song_map[song] = chunk_id; } + this.chunk_map[chunk_id] = playlist_chunk; + this.chunks.push(chunk_id); + return chunk_id; }; // Return the songs for a specific chunk. @@ -150,9 +157,15 @@ djr.Playlist.prototype.removeChunk = function(chunk_id) { // Return a new Playlist with all the current chunks merged. djr.Playlist.prototype.merge = function() { + var new_title_parts = [], i; + for (i = 0; i < this.chunks.length; i++) { + new_title_parts.push(this.chunk_map[this.chunks[i]].title); + } + var new_title = new_title_parts.join(' + '); var new_playlist = new djr.Playlist(); new_playlist.uuid = this.uuid; - new_playlist.addChunk(this.allSongs()); + new_playlist.addChunk( + new djr.PlaylistChunk(this.allSongs(), new_title)); return new_playlist; }; @@ -201,7 +214,7 @@ djr.Player = function(backend, selector) { }; djr.Player.prototype.hideAllChunks = function() { - $('.chunk .inner').hide(); + $('.chunk .chunk_inner').hide(); }; // Callback for removechunk click. @@ -211,6 +224,10 @@ djr.Player.prototype.removeChunkCallback = function() { $(this).remove(); }; +djr.Player.prototype.mergePlaylistChunks = function() { + this.playlist = this.playlist.merge(); +}; + // Search! djr.Player.prototype.search = function(query) { var player = this; @@ -225,12 +242,22 @@ djr.Player.prototype.search = function(query) { return; } - var chunk_id = player.playlist.addChunk(new djr.PlaylistChunk(songs)); - if (chunk_id < 0) { + // Create a chunk of unique new songs. + var new_chunk = player.playlist.createUniqueChunk(songs, query); + if (!new_chunk) { djr.debug('All the results are already in the playlist.'); return; } - songs = player.playlist.getChunkSongs(chunk_id); + songs = new_chunk.songs; + + // Ok, now, if we have more than 1 chunk in the playlist, we + // merge them. + if (player.playlist.chunks.length > 1) { + player.mergePlaylistChunks(); + } + + // Now add the new chunks with the search results. + var chunk_id = player.playlist.addChunk(new_chunk); djr.debug('search: new chunk ' + chunk_id + ', ' + songs.length + ' songs'); player.backend.getHtmlForSongs(songs, function(songs_html) {