var genreRadio = function() { var populating = false; var running = false; var genre; var tracks; var tracksneeded = 0; function searchForTracks(genre) { if (populating) { debug.warn("GENRE RADIO","Asked to populate but already doing so!"); return false; } populating = true; var domains = new Array(); if (prefs.player_backend == "mopidy") { domains = $("#radiodomains").makeDomainChooser("getSelection"); } debug.shout("GENRE RADIO","Searching for Genre",genre,"in domains",domains); // Generally, using faveFinder is better but that doesn't support Genres player.controller.rawsearch({genre: [genre]}, domains, false, genreRadio.checkResults, false); } function sendTracks() { if (running) { var ta = new Array(); while (tracks.length > 0 && tracksneeded > 0) { ta.push(tracks.shift()); tracksneeded--; } if (ta.length > 0) { player.controller.addTracks(ta, playlist.radioManager.playbackStartPos(), null); } } } return { populate: function(g,numtracks) { if (g && g != genre) { debug.log("GENRE RADIO","Populating Genre",g); running = true; tracks = new Array(); genre = g; searchForTracks(g); tracksneeded = numtracks; } else { debug.log("GENRE RADIO","Repopulating"); tracksneeded += (numtracks - tracksneeded); sendTracks(); } }, checkResults: function(data) { debug.log("GENRE RADIO","Search Results",data); running = true; for (var i in data) { if (data[i].tracks) { for (var k = 0; k < data[i].tracks.length; k++) { if (!data[i].tracks[k].uri.match(/:album:/) && !data[i].tracks[k].uri.match(/:artist:/)) { tracks.push({type: 'uri', name: data[i].tracks[k].uri}); } } } } if (tracks.length == 0) { genreRadio.fail(); return; } tracks.sort(randomsort); sendTracks(); }, fail: function() { debug.error("GENRE RADIO","Well, that didn't work"); infobar.notify(language.gettext('label_gotnotracks')); playlist.radioManager.stop(null); }, stop: function() { populating = false; genre = null; }, modeHtml: function(g) { return ''+g+' '+language.gettext('label_radio')+''; } } }(); playlist.radioManager.register("genreRadio", genreRadio, null);