package webinterface; import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.URL; import java.util.List; import java.util.Map; import player.Player; import songstreams.SongStream; import library.Library; import library.exceptions.InvalidQueryException; import net.freeutils.httpserver.HTTPServer.ContextHandler; import net.freeutils.httpserver.HTTPServer.Request; import net.freeutils.httpserver.HTTPServer.Response; public class LibraryListContextHandler implements ContextHandler { private Library lib; private Player player; public LibraryListContextHandler(Library lib, Player player) { this.lib = lib; this.player = player; } @Override public int serve(Request req, Response resp) throws IOException { Map<String, String> params = req.getParams(); if(params.containsKey("url")) { try { player.queue(lib.getSong(params.get("url"))); } catch (InvalidQueryException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(params.containsKey("control")) { String playercontrol = params.get("control"); if(playercontrol.equals("play")) player.play(); else if(playercontrol.equals("pause")) player.pause(); else if(playercontrol.equals("skip")) player.skip(); else if(playercontrol.equals("back")) player.back(); } StringBuilder body = new StringBuilder(); List<SongStream> songs; try { songs = lib.getAllSongs(); String javascriptFunctions = "<script type=\"text/javascript\">\n" + " function ChangeColor(tableRow, highlight) {\n" + " if(highlight) {\n" + " tableRow.style.backgroundColor = '#dcfac9';\n" + " }\n" + " else {\n" + " tableRow.style.backgroundColor = 'white';\n" + " }\n" + " }\n" + "\n" + " function Queue(url) {\n" + " form = document.forms['queue'];\n" + " urlElement = form.elements['url'];\n" + " urlElement.value = url;\n" + " form.submit();\n" + " }\n" + " function PlayerControl(control) {\n" + " form = document.forms['playerControl'];\n" + " controlElement = form.elements['control'];\n" + " controlElement.value = control;\n" + " form.submit();\n" + " }\n" + "</script>"; StringBuilder header = new StringBuilder("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n"); header.append("\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"); header.append("<html>\n <head>\n <meta http-equiv=\"Content-Type\"\n"); header.append(" content=\"text/html; charset=UTF-8\" />\n"); header.append(" <title>PartyPlayer</title>\n"); header.append(" <LINK REL=StyleSheet HREF=\"/stylesheets/style.css\" TYPE=\"text/css\">"); header.append(javascriptFunctions); header.append("</head>\n"); body.append("<body>\n\n"); body.append("<div id=\"toolbar\"><p>" + getToolbar() + "</p></div>"); body.append("<form name=\"queue\" action=\"/\" method=\"POST\">\n"); body.append("<input type=\"hidden\" name=\"url\" value=\"\">\n"); body.append("</form>\n"); body.append("<table>\n"); for(SongStream song : songs) { body.append(song.getTableRow(true)).append("\n"); } body.append("</table>\n\n</body>\n</html>"); header.append(body); byte[] bytes = header.toString().getBytes("UTF-8"); resp.sendHeaders(200, bytes.length, System.currentTimeMillis(), null, "text/html", null); resp.sendBody(new ByteArrayInputStream(bytes), bytes.length, null); return 200; } catch (Exception e) { return 404; } } public String getToolbar() { StringBuilder builder = new StringBuilder(); builder.append("<form name=\"playerControl\" action=\"/\" method=\"POST\"><input type=\"hidden\" name=\"control\" value=\"\"></form><table><tr>"); if(player.isPlaying()) { builder.append("<td><a href=\"#no-op\" onclick=\"PlayerControl('pause'); return false;\">Pause</a></td>"); builder.append("<td><a href=\"#no-op\" onclick=\"PlayerControl('stop'); return false;\">Stop</a></td>"); builder.append("<td><a href=\"#no-op\" onclick=\"PlayerControl('back'); return false;\">Back</a></td>"); builder.append("<td><a href=\"#no-op\" onclick=\"PlayerControl('skip'); return false;\">Skip</a></td>"); if(player.getNowPlaying() != null) { builder.append("</table>\n"); builder.append("Now playing:\n"); builder.append("<table>" + player.getNowPlaying().getTableRow(false)); } } else builder.append("<td><a href=\"#no-op\" onclick=\"PlayerControl('play'); return false;\">Play</a></td></tr>"); builder.append("</table>"); return builder.toString(); } }