package io.github.xwz.iview.api; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import io.github.xwz.base.api.EpisodeBaseModel; public class EpisodeModel extends EpisodeBaseModel { private static final String TAG = "EpisodeModel"; private boolean extras = false; private String stream; public static EpisodeModel create(JSONObject data) { EpisodeModel ep = new EpisodeModel(); ep.set(data); return ep; } @SuppressWarnings({"unchecked", "TypeParameterExplicitlyExtendsObject"}) private static <T extends Object> T get(JSONObject data, String key, T fallback) { T value = null; try { value = data != null && key != null ? (T) data.get(key) : null; } catch (JSONException e) { //Log.d(TAG, "No string value for: " + key); } return value != null ? value : fallback; } private void set(JSONObject data) { setSeriesTitle(get(data, "seriesTitle", getSeriesTitle())); setHref(get(data, "href", getHref())); setChannel(get(data, "channel", getChannel())); setThumbnail(get(data, "thumbnail", getThumbnail())); setEpisodeHouseNumber(get(data, "episodeHouseNumber", getEpisodeHouseNumber())); setTitle(get(data, "title", getTitle())); setDuration(getInt(data, "duration", getDuration())); setRating(get(data, "rating", getRating())); setEpisodeCount(getInt(data, "episodeCount", getEpisodeCount())); setDescription(get(data, "description", getDescription())); setRelated(get(data, "related", getRelated())); String date = get(data, "pubDate", null); setPubDate(parseDate(date)); try { stream = getStream(data); } catch (JSONException ignored) { } if (stream != null) { extras = true; } } public String getStream() { return stream; } private long parseDate(String d) { if (d != null) { // 2015-09-17 07:02:00 DateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date date = f.parse(d); return date.getTime(); } catch (ParseException e) { e.printStackTrace(); } } return 0; } public void merge(EpisodeModel ep) { super.merge(ep); this.stream = ep.stream == null ? this.stream : ep.stream; this.extras = this.stream != null; } private String getStream(JSONObject data) throws JSONException { if (data.has("playlist") && data.get("playlist") instanceof JSONArray) { JSONArray playlists = data.getJSONArray("playlist"); for (int i = 0, k = playlists.length(); i < k; i++) { if (playlists.get(i) instanceof JSONObject) { JSONObject playlist = (JSONObject) playlists.get(i); String type = get(playlist, "type", ""); if ("program".equals(type)) { return get(playlist, "hls-high", null); } } } } return null; } private static int getInt(JSONObject data, String key, int fallback) { if (data != null && key != null && data.has(key)) { try { return data.getInt(key); } catch (JSONException e) { //Log.d(TAG, "No int value for: " + key); } } return fallback; } public boolean hasExtras() { return extras; } }