package dk.dr.radio.data; import org.json.JSONException; import org.json.JSONObject; import java.io.File; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import dk.dr.radio.diverse.App; import dk.dr.radio.diverse.Log; import dk.dr.radio.net.Netvaerksstatus; /** * En lydkilde der kan spilles af afspilleren */ public abstract class Lydkilde implements Serializable { // Fix for https://www.bugsense.com/dashboard/project/cd78aa05/errors/1415558087 // - at proguard obfuskering havde // Se også http://stackoverflow.com/questions/16210831/serialization-deserialization-proguard private static final long serialVersionUID = 6061992240626233386L; public String urn; // Bemærk - kan være tom! public String slug; // Bemærk - kan være tom! transient ArrayList<Lydstream> streams; public transient Lydstream hentetStream; public static final String INDST_lydformat = "lydformat2"; @Override public boolean equals(Object o) { if (o == null) return false; if (o instanceof Lydkilde && slug != null) return slug.equals(((Lydkilde) o).slug); return super.equals(o); } public void nulstilForetrukkenStream() { if (streams == null) return; for (Lydstream s : streams) s.foretrukken = false; } public List<Lydstream> findBedsteStreams(boolean tilHentning) { ArrayList<Lydstream> kandidater = new ArrayList<Lydstream>(); if (hentetStream != null && new File(hentetStream.url).canRead()) kandidater.add(hentetStream); if (streams == null) return kandidater; //Bedst bedst = new Bedst(); String ønsketkvalitet = App.prefs.getString("lydkvalitet", "auto"); String ønsketformat = App.prefs.getString(INDST_lydformat, "auto"); Lydstream sxxx = null; næste_stream: for (Lydstream s : streams) try { sxxx = s; int score = 100; switch (s.type) { case HLS_fra_Akamai: if (DRData.instans.grunddata.udelukHLS) continue næste_stream; if (tilHentning) continue næste_stream; if ("hls".equals(ønsketformat)) score += 40; if ("auto".equals(ønsketformat)) score += 20; break; // bryd ud af switch case HTTP: if (tilHentning) score += 20; if ("shoutcast".equals(ønsketformat)) score += 40; break; // bryd ud af switch case RTSP: if (tilHentning) continue næste_stream; score -= 40; // RTSP udfases og har en enorm ventetid, foretræk andre case Shoutcast: if (tilHentning) continue næste_stream; if ("shoutcast".equals(ønsketformat)) score += 40; break; // bryd ud af switch default: continue næste_stream; } switch (s.kvalitet) { case High: if ("høj".equals(ønsketkvalitet)) score += 10; if ("auto".equals(ønsketkvalitet) && App.netværk.status == Netvaerksstatus.Status.WIFI) score += 10; break; case Low: case Medium: if ("standard".equals(ønsketkvalitet)) score += 10; if ("auto".equals(ønsketkvalitet) && App.netværk.status == Netvaerksstatus.Status.MOBIL) score += 10; break; case Variable: if ("auto".equals(ønsketkvalitet)) score += 10; break; } if (s.foretrukken) score += 1000; if ("mp3".equals(s.format)) score += 10; // mp3 er mere pålideligt end mp4 s.score = score; kandidater.add(s); } catch (Exception e) { Log.rapporterFejl(e, " ls=" + sxxx); } Collections.sort(kandidater); if (App.fejlsøgning) Log.d("findBedsteStreams " + kandidater); return kandidater; } public abstract String getStreamsUrl(); public abstract Kanal getKanal(); public abstract boolean erDirekte(); public abstract Udsendelse getUdsendelse(); public abstract String getNavn(); public void setStreams(JSONObject o) throws JSONException { streams = DRJson.parsStreams(o.getJSONArray(DRJson.Streams.name())); } public void setStreams(String json) throws JSONException { setStreams(new JSONObject(json)); } public boolean harStreams() { return streams != null || hentetStream != null; } @Override public String toString() { return slug + " str=" + streams; } }