1 package org.rpi.radio;
2
3 import java.io.File;
4 import java.io.StringReader;
5 import java.io.StringWriter;
6 import java.util.ArrayList;
7 import java.util.List;
8
9 import javax.xml.parsers.DocumentBuilder;
10 import javax.xml.parsers.DocumentBuilderFactory;
11 import javax.xml.transform.Transformer;
12 import javax.xml.transform.TransformerFactory;
13 import javax.xml.transform.dom.DOMSource;
14 import javax.xml.transform.stream.StreamResult;
15
16 import org.apache.log4j.Logger;
17 import org.w3c.dom.Document;
18 import org.w3c.dom.Element;
19 import org.w3c.dom.NamedNodeMap;
20 import org.w3c.dom.Node;
21 import org.w3c.dom.NodeList;
22 import org.xml.sax.InputSource;
23
24 public class ChannelReader {
25
26 private static Logger log = Logger.getLogger(ChannelReader.class);
27
28 private List<CustomChannel> channels = new ArrayList<CustomChannel>();
29
30 private String metaData = "<DIDL-Lite xmlns='urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/'><item id=''><dc:title xmlns:dc='http://purl.org/dc/elements/1.1/'></dc:title><upnp:artist role='Performer' xmlns:upnp='urn:schemas-upnp-org:metadata-1-0/upnp/'></upnp:artist><upnp:class xmlns:upnp='urn:schemas-upnp-org:metadata-1-0/upnp/'>object.item.audioItem</upnp:class><res bitrate='' nrAudioChannels='' protocolInfo='http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01'></res><upnp:albumArtURI xmlns:upnp='urn:schemas-upnp-org:metadata-1-0/upnp/'></upnp:albumArtURI></item></DIDL-Lite>";
31
32
33
34
35
36 public List<CustomChannel> getChannels() {
37
38 try {
39 channels.clear();
40 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
41 DocumentBuilder builder = factory.newDocumentBuilder();
42 Document doc = builder.parse(new File("RadioList.xml"));
43 NodeList listOfChannels = doc.getElementsByTagName("Channel");
44 int i = 1;
45 for (int s = 0; s < listOfChannels.getLength(); s++) {
46 String id = null;
47 String url = null;
48 String image = "";
49 String s_icy_reverse ="";
50 boolean icy_reverse = false;
51
52 Node channel = listOfChannels.item(s);
53 if (channel.getNodeType() == Node.ELEMENT_NODE) {
54 Element element = (Element) channel;
55 id = getElement(element, "id");
56 url = getElement(element, "url");
57 image = getElement(element, "image");
58 s_icy_reverse = getElement(element,"icy_reverse");
59 if(s_icy_reverse.equalsIgnoreCase("TRUE"))
60 {
61 icy_reverse = true;
62 }
63
64 }
65
66 if (id != null && url != null) {
67 addChannel(id, url, image, i,icy_reverse);
68 i++;
69 }
70 }
71 } catch (Exception e) {
72 log.error("Error Getting Radio List", e);
73 }
74 return channels;
75 }
76
77
78
79
80
81
82
83 private String getElement(Element element, String name) {
84 String res = "";
85 NodeList nid = element.getElementsByTagName(name);
86 if (nid != null) {
87 Element fid = (Element) nid.item(0);
88 if (fid != null) {
89 res = fid.getTextContent();
90
91 return res;
92
93 }
94 }
95 return res;
96 }
97
98
99
100
101
102
103
104
105 private void addChannel(String name, String url, String image, int id,boolean icy_reverse) {
106 String m = createMetaData(name, url, image);
107 CustomChannel channel = new CustomChannel(url, m, id,name);
108 channel.setICYReverse(icy_reverse);
109 channels.add(channel);
110 log.debug("Added Channel: " + channel.getUri() + " " + channel.getFullDetails());
111 }
112
113
114
115
116
117
118
119
120 private String createMetaData(String name, String url, String image) {
121 String res = "";
122
123 try {
124
125 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
126 DocumentBuilder builder = factory.newDocumentBuilder();
127 InputSource insrc = new InputSource(new StringReader(metaData));
128 Document doc = builder.parse(insrc);
129 Node node = doc.getFirstChild();
130 Node item = node.getFirstChild();
131
132 NamedNodeMap attts = item.getAttributes();
133 Node nid = attts.getNamedItem("id");
134 nid.setTextContent(name);
135 log.debug("Item Child Nodes " + item.getChildNodes().getLength());
136 NodeList childs = item.getChildNodes();
137 for (int i = 0; i < childs.getLength(); i++) {
138 Node n = childs.item(i);
139
140 if (n.getNodeName() == "dc:title") {
141 n.setTextContent(name);
142 } else if (n.getNodeName() == "res") {
143 n.setTextContent(url);
144 } else if (n.getNodeName() == "upnp:albumArtURI") {
145 n.setTextContent(image);
146 } else if (n.getNodeName()=="upnp:artist")
147 {
148 n.setTextContent(name);
149 }
150 }
151 Transformer transformer = TransformerFactory.newInstance().newTransformer();
152 StreamResult result = new StreamResult(new StringWriter());
153 DOMSource source = new DOMSource(doc);
154 transformer.transform(source, result);
155 res = (result.getWriter().toString());
156 } catch (Exception e) {
157 log.error("Error Creating XML Doc", e);
158 }
159 return res;
160 }
161
162 }