View Javadoc

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       * Read the RadioList.xml file and build a List of Radio Channels
34       * @return
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       * @param element
80       * @param name
81       * @return
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                  //log.debug("ElementName: " + name + " Value: " + res);
91                  return res;
92  
93              }
94          }
95          return res;
96      }
97  
98      /***
99       * Create a Channel and add it to the List
100      * @param name
101      * @param url
102      * @param image
103      * @param id
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      * Build a simple MetaData String for the Channel
115      * @param name
116      * @param url
117      * @param image
118      * @return
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             //int count = item.getAttributes().getLength();
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                 //log.debug("Name: " + n.getNodeName() + " Value " + n.getTextContent());
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 }