+ Metadata metadata = source.metadata();
+ String metadataString = String.format("%s (%s)", Joiner.on(" - ").skipNulls().join(FluentIterable.from(Arrays.asList(metadata.artist(), metadata.name())).transform(new Function<Optional<String>, Object>() {
+
+ @Override
+ public Object apply(Optional<String> input) {
+ return input.orNull();
+ }
+ })), "Sonitus");
+ logger.info(String.format("Updating metadata to %s", metadataString));
+
+ Socket socket = null;
+ OutputStream socketOutputStream = null;
+ try {
+ socket = new Socket(server, port);
+ socketOutputStream = socket.getOutputStream();
+
+ sendLine(socketOutputStream, String.format("GET /admin/metadata?pass=%s&mode=updinfo&mount=/%s&song=%s HTTP/1.0", password, mountPoint, URLEncoder.encode(metadataString, "UTF-8")));
+ sendLine(socketOutputStream, String.format("Authorization: Basic %s", generatePassword(password)));
+ sendLine(socketOutputStream, String.format("User-Agent: Mozilla/Sonitus"));
+ sendLine(socketOutputStream, "");
+ socketOutputStream.flush();
+
+ new InputStreamDrainer(socket.getInputStream()).run();
+ } catch (IOException ioe1) {
+ logger.log(Level.WARNING, "Could not update metadata!", ioe1);
+ } finally {
+ try {
+ Closeables.close(socketOutputStream, true);
+ Closeables.close(socket, true);
+ } catch (IOException ioe1) {
+ /* ignore, will not happen. */
+ }
+ }