package com.sleazyweasel.applescriptifier; import com.google.gson.Gson; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class SpotifyServlet extends HttpServlet { private final AppleScriptTemplate appleScriptTemplate = new AppleScriptTemplateFactory().getActiveTemplate(); private final SpotifySupport spotifySupport = new SpotifySupport(appleScriptTemplate); @Override protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { // Set to expire far in the past. response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT"); // Set standard HTTP/1.1 no-cache headers. response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); // Set IE extended HTTP/1.1 no-cache headers (use addHeader). response.addHeader("Cache-Control", "post-check=0, pre-check=0"); // Set standard HTTP/1.0 no-cache header. response.setHeader("Pragma", "no-cache"); response.setContentType("application/json; charset=utf-8"); response.setCharacterEncoding("UTF-8"); String pathInfo = req.getPathInfo(); if (pathInfo.startsWith("/playpause")) { spotifySupport.playPause(); } else if (pathInfo.startsWith("/previous")) { spotifySupport.previous(); } else if (pathInfo.startsWith("/next")) { spotifySupport.next(); } else if (pathInfo.startsWith("/artwork")) { File tempFile = File.createTempFile("spotify", ".tiff"); tempFile.deleteOnExit(); appleScriptTemplate.execute(Application.SPOTIFY(), getImageCommand(tempFile)); BufferedImage image = ImageIO.read(tempFile); response.setContentType("image/png"); ImageIO.write(image, "PNG", response.getOutputStream()); response.setStatus(HttpServletResponse.SC_OK); return; } else if (pathInfo.startsWith("/setVolume")) { String value = req.getParameter("value"); Integer volume = Integer.valueOf(value); spotifySupport.setVolume(volume); } response.setStatus(HttpServletResponse.SC_OK); appendStatus(response); } private void appendStatus(HttpServletResponse response) throws IOException { response.getWriter().append(new Gson().toJson(spotifySupport.getStatus())); } private String[] getImageCommand(File tempFile) { List<String> commands = new ArrayList<String>(); commands.add(imageCommandPart1); commands.add(String.format(midPart, tempFile.getAbsolutePath())); commands.addAll(Arrays.asList(imageCommandPart2)); return commands.toArray(new String[commands.size()]); } private static final String midPart = "set the_file to \"%s\""; private static final String imageCommandPart1 = "set imagedata to artwork of current track"; private static final String[] imageCommandPart2 = { "try", " open for access the_file with write permission", " set eof of the_file to 0", " write (imagedata) to the_file starting at eof", " close access the_file", "on error", " try", " close access the_file", " end try", "end try"}; }