/**
DR Radio 2 is developed by Jacob Nordfalk, Hanafi Mughrabi and Frederik Aagaard.
Some parts of the code are loosely based on Sveriges Radio Play for Android.
DR Radio 2 for Android is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as published by
the Free Software Foundation.
DR Radio 2 for Android is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
DR Radio 2 for Android. If not, see <http://www.gnu.org/licenses/>.
*/
package dk.dr.radio.data;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import dk.dr.radio.data.spiller_nu.SpillerNu;
import dk.dr.radio.data.spiller_nu.SpillerNuElement;
import dk.dr.radio.data.stamdata.Kanal;
import dk.dr.radio.data.stamdata.Stamdata;
import dk.dr.radio.data.udsendelser.Udsendelse;
import dk.dr.radio.data.udsendelser.Udsendelser;
import dk.dr.radio.diverse.Log;
public class JsonIndlaesning {
/**
* Henter stamdata (faste data)
*
* @throws IOException hvis der er et problem med netværk
* eller parsning (dvs interne fejl af forskellig art som bør rapporteres til udvikler)
*/
public static Stamdata parseStamdata(String str) throws JSONException {
//Log.d("str=\n============="+str+"\n==================");
Stamdata d = new Stamdata();
JSONObject json = d.json = new JSONObject(str);
d.kanalkoder = jsonArrayTilArrayListString(json.getJSONArray("kanalkoder"));
d.p4koder = jsonArrayTilArrayListString(json.getJSONArray("p4koder"));
JSONArray kanaler = json.getJSONArray("kanaler");
int antal = kanaler.length();
for (int i = 0; i < antal; i++) {
JSONObject j = kanaler.getJSONObject(i);
Kanal k = new Kanal();
k.shortName = j.optString("shortName", "");
k.longName = j.optString("longName", "");
k.aacUrl = j.optString("aacUrl", "");
k.rtspUrl = j.optString("rtspUrl", "");
k.shoutcastUrl = j.optString("shoutcastUrl", "");
d.kanaler.add(k);
}
//Log.d("TIDSTAGNING parsning tog "+dt("parsning stamdataUrl"));
//d.lavKanalkodeTilKanalMap();
for (Kanal k : d.kanaler) {
d.kanalkodeTilKanal.put(k.shortName, k);
}
d.kanalerDerSkalViseSpillerNu.addAll(jsonArrayTilArrayListString(json.getJSONArray("vis_spiller_nu")));
return d;
}
static Udsendelser hentUdsendelser(String url) throws Exception {
String jsondata = hentUrlSomStreng(url);
JSONObject json = new JSONObject(jsondata);
Udsendelser uds = new Udsendelser();
uds.currentProgram = jsonTilUdsendelse(json.getJSONObject("currentProgram"));
uds.nextProgram = jsonTilUdsendelse(json.getJSONObject("nextProgram"));
//Log.d("TIDSTAGNING parsning tog "+dt("parsning "+url));
return uds;
}
private static HttpClient httpClient;
public static String hentUrlSomStreng(String url) throws IOException {
// AndroidHttpClient er først defineret fra Android 2.2
//if (httpClient == null) httpClient = android.net.http.AndroidHttpClient.newInstance("Android DRRadio");
if (httpClient == null) {
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 15 * 1000);
HttpConnectionParams.setSoTimeout(params, 15 * 1000);
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
//HttpProtocolParams.setUseExpectContinue(params, true);
HttpProtocolParams.setUserAgent(params, "Android DRRadio/1.x");
httpClient = new DefaultHttpClient(params);
}
//dt("");
//Log.d("Henter " + url);
//Log.e(new Exception("Henter "+url));
//InputStream is = new URL(url).openStream();
HttpGet c = new HttpGet(url);
HttpResponse response = httpClient.execute(c);
InputStream is = response.getEntity().getContent();
String jsondata = læsInputStreamSomStreng(is);
//Log.d("Hentede "+url+" på "+dt("hente "+url));
// frederik: GratisDanmark fix: Strip the file of XML tags that might ruin the JSON format
jsondata.replaceAll("<[^>]*>", "");
return jsondata;
}
public static String læsInputStreamSomStreng(InputStream is) throws IOException, UnsupportedEncodingException {
// Det kan være nødvendigt at hoppe over BOM mark - se http://android.forums.wordpress.org/topic/xml-pull-error?replies=2
//is.read(); is.read(); is.read(); // - dette virker kun hvis der ALTID er en BOM
// Hop over BOM - hvis den er der!
is = new BufferedInputStream(is); // bl.a. FileInputStream understøtter ikke mark, så brug BufferedInputStream
is.mark(1); // vi har faktisk kun brug for at søge én byte tilbage
if (is.read() == 0xef) {
is.read();
is.read();
} // Der var en BOM! Læs de sidste 2 byte
else is.reset(); // Der var ingen BOM - hop tilbage til start
final char[] buffer = new char[0x3000];
StringBuilder out = new StringBuilder();
Reader in = new InputStreamReader(is, "UTF-8");
int read;
do {
read = in.read(buffer, 0, buffer.length);
if (read > 0) {
out.append(buffer, 0, read);
}
} while (read >= 0);
in.close();
return out.toString();
}
static SpillerNu hentSpillerNuListe(String url) throws Exception {
String str = hentUrlSomStreng(url);
SpillerNu d = new SpillerNu(); //mapper.readValue(jsondata, SpillerNu.class);
JSONObject json = new JSONObject(str);
JSONArray liste = json.getJSONArray("tracks");
int antal = liste.length();
for (int i = 0; i < antal; i++) {
JSONObject j = liste.getJSONObject(i);
SpillerNuElement e = new SpillerNuElement();
e.title = j.optString("title", "");
e.displayArtist = j.optString("displayArtist", "");
e.lastFM = j.optString("lastFM", "");
e.start = j.optString("start", "");
d.liste.add(e);
}
return d;
}
/*
private static long førsteTid;
private static long sidsteTid;
private static Map<String,Integer> tidstagning = new TreeMap<String,Integer>();
private static String dt(String hvad) {
hvad = hvad + " ";
long nu = System.currentTimeMillis();
int dt = (int) (nu - sidsteTid);
sidsteTid = nu;
if (førsteTid==0) førsteTid = nu;
int samlet = dt;
if (tidstagning.containsKey(hvad)) samlet += tidstagning.get(hvad);
tidstagning.put(hvad, samlet);
return dt + " ms";
}*/
public static ArrayList<String> jsonArrayTilArrayListString(JSONArray j) throws JSONException {
int n = j.length();
ArrayList<String> res = new ArrayList<String>(n);
for (int i = 0; i < n; i++) {
res.add(j.getString(i));
}
return res;
}
private static Udsendelse jsonTilUdsendelse(JSONObject j) throws JSONException {
Udsendelse u = new Udsendelse();
u.description = j.optString("description", "");
u.start = j.optString("start", "");
u.stop = j.optString("stop", "");
u.title = j.optString("title", "");
return u;
}
}