1 /***
2 * Ambient - A music player for the Android platform
3 Copyright (C) 2007 Martin Vysny
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 package sk.baka.ambient.stream.shoutcast;
20
21 import java.io.IOException;
22 import java.net.MalformedURLException;
23 import java.net.URL;
24 import java.text.ParseException;
25 import java.util.Collections;
26 import java.util.List;
27
28 import org.xml.sax.Attributes;
29
30 import sk.baka.ambient.collection.TrackMetadataBean;
31 import sk.baka.ambient.commons.NullArgumentException;
32
33 /***
34 * A SHOUTcast radio station.
35 *
36 * @author Martin Vysny
37 */
38 public final class Radio {
39 /***
40 * The displayable radio station name.
41 */
42 public final String name;
43 /***
44 * the radio ID
45 */
46 public final String id;
47 /***
48 * The radio genre.
49 */
50 public final String genre;
51 /***
52 * currently played track, <code>null</code> if not known.
53 */
54 public final String currentTrack;
55
56 /***
57 * Creates new radio
58 *
59 * @param name
60 * The displayable radio station name.
61 * @param id
62 * the radio ID
63 * @param genre
64 * The radio genre.
65 * @param currentTrack
66 * currently played track, <code>null</code> if not known.
67 */
68 public Radio(final String name, final String id, final String genre,
69 final String currentTrack) {
70 this.currentTrack = currentTrack;
71 if (name == null)
72 throw new NullArgumentException("name");
73 if (id == null)
74 throw new NullArgumentException("id");
75 this.genre = genre;
76 this.name = name;
77 this.id = id;
78 }
79
80 @Override
81 public String toString() {
82 return "SHOUTcast radio: " + name + " [" + id + "]";
83 }
84
85 /***
86 * Retrieves the radio playlist URL.
87 *
88 * @return the URL
89 * @throws MalformedURLException
90 */
91 public URL getPlaylistURL() throws MalformedURLException {
92 final String url = "http://www.shoutcast.com/sbin/tunein-station.pls?id="
93 + id;
94 return new URL(url);
95 }
96
97 /***
98 * Cached URLs - radio sources.
99 */
100 private List<TrackMetadataBean> radioURLs = null;
101
102 /***
103 * Returns a list of URLs - radio sources. Blocks until the list is
104 * retrieved.
105 *
106 * @return non-<code>null</code> list of radio sources, read-only.
107 * @throws IOException
108 * if i/o error occurs.
109 * @throws ParseException
110 * if the playlist is not well formed.
111 */
112 public synchronized List<TrackMetadataBean> getRadioURLs()
113 throws IOException, ParseException {
114 if (radioURLs == null) {
115 radioURLs = ShoutcastUtils.parsePlaylist(getPlaylistURL()
116 .openStream());
117 radioURLs = Collections.unmodifiableList(radioURLs);
118 }
119 return radioURLs;
120 }
121
122 /***
123 * Parse the radio from given XML attributes.
124 *
125 * @param attrs
126 * the attributes to parse
127 * @return radio instance, never <code>null</code>.
128 */
129 public static Radio fromXML(final Attributes attrs) {
130 final String name = ShoutcastUtils.removeAsciiGraphics(attrs
131 .getValue("name"));
132 final String genre = ShoutcastUtils.removeAsciiGraphics(attrs
133 .getValue("genre"));
134 final String ct = ShoutcastUtils.removeAsciiGraphics(attrs
135 .getValue("ct"));
136 final String id = attrs.getValue("id");
137 return new Radio(name, id, genre, ct);
138 }
139 }