Use title for Icecast metadata.
[sonitus.git] / src / main / java / net / pterodactylus / sonitus / data / sink / Icecast2Sink.java
index 0a5d22d..87d9496 100644 (file)
@@ -23,18 +23,18 @@ import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.Socket;
 import java.net.URLEncoder;
-import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import net.pterodactylus.sonitus.data.Controller;
 import net.pterodactylus.sonitus.data.Metadata;
 import net.pterodactylus.sonitus.data.Sink;
+import net.pterodactylus.sonitus.data.event.MetadataUpdated;
 import net.pterodactylus.sonitus.io.InputStreamDrainer;
 
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.base.Optional;
-import com.google.common.collect.FluentIterable;
+import com.google.common.eventbus.EventBus;
 import com.google.common.io.BaseEncoding;
 import com.google.common.io.Closeables;
 
@@ -49,6 +49,9 @@ public class Icecast2Sink implements Sink {
        /** The logger. */
        private static final Logger logger = Logger.getLogger(Icecast2Sink.class.getName());
 
+       /** The event bus. */
+       private final EventBus eventBus;
+
        /** The server name. */
        private final String server;
 
@@ -73,11 +76,17 @@ public class Icecast2Sink implements Sink {
        /** Whether to publish the server. */
        private final boolean publishServer;
 
+       /** The output stream to the server. */
        private OutputStream socketOutputStream;
 
+       /** The current metadata. */
+       private Metadata metadata;
+
        /**
         * Creates a new Icecast2 sink.
         *
+        * @param eventBus
+        *              The event bus
         * @param server
         *              The hostname of the server
         * @param port
@@ -96,7 +105,8 @@ public class Icecast2Sink implements Sink {
         *              {@code true} to publish the server in a public directory, {@code false} to
         *              not publish it
         */
-       public Icecast2Sink(String server, int port, String password, String mountPoint, String serverName, String serverDescription, String genre, boolean publishServer) {
+       public Icecast2Sink(EventBus eventBus, String server, int port, String password, String mountPoint, String serverName, String serverDescription, String genre, boolean publishServer) {
+               this.eventBus = eventBus;
                this.server = server;
                this.port = port;
                this.password = password;
@@ -108,6 +118,25 @@ public class Icecast2Sink implements Sink {
        }
 
        //
+       // CONTROLLED METHODS
+       //
+
+       @Override
+       public String name() {
+               return String.format("icecast://%s:%d/%s", server, port, mountPoint);
+       }
+
+       @Override
+       public Metadata metadata() {
+               return metadata;
+       }
+
+       @Override
+       public List<Controller<?>> controllers() {
+               return Collections.emptyList();
+       }
+
+       //
        // SINK METHODS
        //
 
@@ -145,17 +174,12 @@ public class Icecast2Sink implements Sink {
 
        @Override
        public void metadataUpdated(final Metadata metadata) {
+               this.metadata = metadata;
                new Thread(new Runnable() {
 
                        @Override
                        public void run() {
-                               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");
+                               String metadataString = String.format("%s (%s)", metadata.title(), "Sonitus");
                                logger.info(String.format("Updating metadata to %s", metadataString));
 
                                Socket socket = null;
@@ -185,6 +209,7 @@ public class Icecast2Sink implements Sink {
                                }
                        }
                }).start();
+               eventBus.post(new MetadataUpdated(this, metadata));
        }
 
        @Override
@@ -227,8 +252,8 @@ public class Icecast2Sink implements Sink {
        }
 
        /**
-        * Returns a MIME type for the given metadata. Currently only Vorbis, MP3, and
-        * PCM formats are recognized.
+        * Returns a MIME type for the given metadata. Currently only Vorbis, MP3, PCM,
+        * Ogg Vorbis, Opus, and FLAC formats are recognized.
         *
         * @param metadata
         *              The metadata to get a MIME type for
@@ -245,6 +270,15 @@ public class Icecast2Sink implements Sink {
                if ("PCM".equalsIgnoreCase(encoding)) {
                        return "audio/vnd.wave";
                }
+               if ("Vorbis".equalsIgnoreCase(encoding)) {
+                       return "application/ogg";
+               }
+               if ("Opus".equalsIgnoreCase(encoding)) {
+                       return "audio/ogg; codecs=opus";
+               }
+               if ("FLAC".equalsIgnoreCase(encoding)) {
+                       return "audio/flac";
+               }
                return "application/octet-stream";
        }