Pull all interfaces into a single interface: Filter.
[sonitus.git] / src / main / java / net / pterodactylus / sonitus / data / source / StreamSource.java
index 90cf645..a66fb7a 100644 (file)
@@ -25,12 +25,13 @@ import java.net.URLConnection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.logging.Logger;
 
+import net.pterodactylus.sonitus.data.AbstractFilter;
 import net.pterodactylus.sonitus.data.ContentMetadata;
 import net.pterodactylus.sonitus.data.Controller;
 import net.pterodactylus.sonitus.data.FormatMetadata;
 import net.pterodactylus.sonitus.data.Metadata;
-import net.pterodactylus.sonitus.data.Source;
 import net.pterodactylus.sonitus.io.MetadataStream;
 
 import com.google.common.base.Optional;
@@ -45,28 +46,34 @@ import com.google.common.primitives.Ints;
  *
  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
  */
-public class StreamSource implements Source {
+public class StreamSource extends AbstractFilter {
+
+       /** The logger. */
+       private static final Logger logger = Logger.getLogger(StreamSource.class.getName());
 
        /** The URL of the stream. */
        private final String streamUrl;
 
+       /** The name of the station. */
+       private final String streamName;
+
        /** The metadata stream. */
        private final MetadataStream metadataStream;
 
-       /** The current metadata. */
-       private Metadata metadata;
-
        /**
         * Creates a new stream source. This will also connect to the server and parse
         * the response header for vital information (sampling frequency, number of
         * channels, etc.).
         *
+        * @param eventBus
+        *              The event bus
         * @param streamUrl
         *              The URL of the stream
         * @throws IOException
         *              if an I/O error occurs
         */
        public StreamSource(String streamUrl) throws IOException {
+               super(null);
                this.streamUrl = streamUrl;
                URL url = new URL(streamUrl);
 
@@ -79,6 +86,7 @@ public class StreamSource implements Source {
                httpUrlConnection.setRequestProperty("ICY-Metadata", "1");
 
                /* connect. */
+               logger.info(String.format("Connecting to %s...", streamUrl));
                httpUrlConnection.connect();
 
                /* check content type. */
@@ -112,30 +120,33 @@ public class StreamSource implements Source {
                        throw new IllegalArgumentException(String.format("Invalid Metadata Interval header: %s", metadataIntervalHeader));
                }
 
-               metadata = new Metadata(new FormatMetadata(audioParameters.get("ice-channels"), audioParameters.get("ice-samplerate"), "MP3"), new ContentMetadata());
+               metadataUpdated(new Metadata(new FormatMetadata(audioParameters.get("ice-channels"), audioParameters.get("ice-samplerate"), "MP3"), new ContentMetadata()));
                metadataStream = new MetadataStream(new BufferedInputStream(httpUrlConnection.getInputStream()), metadataInterval);
+               streamName = httpUrlConnection.getHeaderField("ICY-Name");
        }
 
        //
-       // CONTROLLED METHODS
+       // FILTER METHODS
        //
 
        @Override
+       public String name() {
+               return streamName;
+       }
+
+       @Override
        public List<Controller<?>> controllers() {
                return Collections.emptyList();
        }
 
-       //
-       // SOURCE METHODS
-       //
-
        @Override
        public Metadata metadata() {
                Optional<ContentMetadata> streamMetadata = metadataStream.getContentMetadata();
                if (!streamMetadata.isPresent()) {
-                       return metadata;
+                       return super.metadata();
                }
-               return metadata = metadata.title(streamMetadata.get().title());
+               metadataUpdated(super.metadata().title(streamMetadata.get().title()));
+               return super.metadata();
        }
 
        @Override
@@ -151,7 +162,7 @@ public class StreamSource implements Source {
 
        @Override
        public String toString() {
-               return String.format("StreamSource(%s,%s)", streamUrl, metadata);
+               return String.format("StreamSource(%s,%s)", streamUrl, metadata());
        }
 
 }