package dk.dr.radio.data;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Date;
import dk.dr.radio.diverse.App;
import dk.dr.radio.diverse.Log;
/**
* Repræsenterer en udsendelse
* Created by j on 28-01-14.
*/
public class Udsendelse extends Lydkilde implements Comparable<Udsendelse>, Cloneable {
// 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 = -9161602458987716481L;
public String titel;
public String beskrivelse;
public String billedeUrl; // Bemærk - kan være tom
public String kanalSlug; // Bemærk - kan være tom!
public String programserieSlug; // Bemærk - kan være tom!
public Date startTid;
public String startTidKl;
public Date slutTid;
public String slutTidKl;
public String dagsbeskrivelse;
public transient ArrayList<Playlisteelement> playliste;
/** 'Chapters' i API'et, undgå undersættelsen 'kapitler' */
public transient ArrayList<Indslaglisteelement> indslag;
/**
* API'ets udmelding på, om der er en lydstream egnet til direkte afspilning
* Desværre er API'et ikke pålideligt, så den eneste måde reelt at vide det er faktisk at hente streamsne.
* Når streamsne er hentet opdateres feltet
*/
public boolean kanHøres;
/** Om der er mulighed for at hente udsendelsen ned til offline brug. Opdateret efter at streams er hentet. */
public boolean kanHentes;
public String produktionsnummer;
public String shareLink;
//public transient int startposition;// hvis der allerede er lyttet til denne senestLyttet så notér det her så afspilning kan fortsætte herfra
public int episodeIProgramserie;
/** Berigtigelser er noget som sjældent sker, men vi er forpligtiget til at vise en information til brugeren, hvis vi har måtte tage en program af, eller ændre et program.
* Bemærk: Normalk null */
public String berigtigelseTitel;
/** Normalt null */
public String berigtigelseTekst;
public Udsendelse(String s) {
titel = s;
}
public Udsendelse() {
}
@Override
public String toString() {
return slug + "/" + episodeIProgramserie;//startTid + "/" + slutTid;
}
@Override
public String getStreamsUrl() {
return DRData.getUdsendelseStreamsUrl(this);
}
@Override
public Kanal getKanal() {
Kanal k = DRData.instans.grunddata.kanalFraSlug.get(kanalSlug);
if (k == null) {
Log.d(kanalSlug + " manglede i grunddata.kanalFraSlug");
return Grunddata.ukendtKanal;
}
//if (Kanal.P4kode.equals(k.kode)) {
// Log.rapporterFejl(new IllegalStateException("Vi fik P4 overkanalen - ved ikke hvilken underkanal"), kanalSlug);
// return Grunddata.ukendtKanal;
//}
return k;
}
@Override
public boolean erDirekte() {
return false;
}
@Override
public Udsendelse getUdsendelse() {
return this;
}
@Override
public String getNavn() {
return titel;
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Udsendelse)) return false;
Udsendelse u = (Udsendelse) o;
if (slug != null) return slug.equals(u.slug);
return false;
}
@Override
public int compareTo(Udsendelse u2) {
int e = episodeIProgramserie;
int e2 = u2.episodeIProgramserie;
if (e != e2) return e2 < e ? -1 : 1;
if (slug == null) return u2.slug == null ? 0 : 1;
return slug.compareTo(u2.slug);
}
public boolean streamsKlar() {
return hentetStream != null || streams != null && streams.size() > 0;
}
/**
* Finder index på playlisteelement, der spiller på et bestemt offset i udsendelsen
* @param offsetMs Tidspunkt
* @param indeks Gæt på index, f.eks fra sidste kald
* @return korrekt indeks
*/
public int findPlaylisteElemTilTid(long offsetMs, int indeks) {
if (playliste == null || playliste.size() == 0) return -1;
if (indeks < 0 || playliste.size() <= indeks) {
indeks = 0;
} else if (offsetMs < playliste.get(indeks).offsetMs - 10000) {
indeks = 0; // offsetMs mere end 10 sekunder tidligere end startgæt => søg fra starten
}
// Søg nu fremad til næste nummer er for langt
while (indeks < playliste.size() - 1 && playliste.get(indeks + 1).offsetMs < offsetMs) {
Log.d("findPlaylisteElemTilTid() skip playliste[" + indeks + "].offsetMs=" + playliste.get(indeks).offsetMs);
indeks++;
}
return indeks;
}
@Override
public void setStreams(JSONObject o) throws JSONException {
super.setStreams(o);
if (!App.PRODUKTION) {
boolean kanHøresNy = findBedsteStreams(false).size() > 0;
boolean kanHentesNy = findBedsteStreams(true).size() > 0;
if (kanHentes && !kanHentesNy)
Log.d("API løj om kanHentes for " + o.optString(DRJson.Slug.name())+": "+kanHentes +"->" +kanHentesNy);
if (kanHøres && !kanHøresNy)
Log.d("API løj om kanHøres for " + o.optString(DRJson.Slug.name())+": "+kanHøres +"->" +kanHøresNy);
}
kanHøres = findBedsteStreams(false).size() > 0;
kanHentes = findBedsteStreams(true).size() > 0;
}
public Udsendelse kopi() {
try {
return (Udsendelse) this.clone();
} catch (Exception e) {
Log.rapporterFejl(e);
}
return this;
}
}