package io.github.xwz.sbs.api; import android.content.Context; import android.net.Uri; import android.util.Log; import java.util.ArrayList; import java.util.List; import java.util.Map; import io.github.xwz.base.ImmutableMap; import io.github.xwz.base.api.EpisodeBaseModel; import io.github.xwz.base.content.ContentManagerBase; import io.github.xwz.sbs.content.ContentManager; public class SBSRelatedApi extends SBSApiBase { private static final String TAG = "SBSRelatedApi"; private static final int CACHE_EXPIRY = 3600; // 1h private final String id; private boolean success = false; public SBSRelatedApi(Context context, String id) { super(context); this.id = id; } @Override protected Void doInBackground(String... urls) { if (urls.length > 0) { updateEpisode(urls[0]); } return null; } private boolean updateEpisode(String url) { EpisodeModel current = (EpisodeModel) ContentManager.getInstance().getEpisode(url); if (current != null) { Log.d(TAG, "Fetched related info for: " + current); String series = current.getSeriesTitle(); List<EpisodeBaseModel> related = fetchRelated(url); if (related != null) { List<EpisodeBaseModel> more = new ArrayList<>(); for (EpisodeBaseModel ep : related) { if (series != null && !series.equals(ep.getSeriesTitle())) { more.add(ep); } } if (more.size() > 0) { current.setOtherEpisodes(ContentManagerBase.MORE_LIKE_THIS, more); } current.setHasExtra(true); current.setHasFetchedRelated(true); success = true; } } else { Log.d(TAG, "Unable to find current episode"); } return false; } private List<EpisodeBaseModel> fetchRelated(String url) { String id = getIdFromUrl(url); if (id != null) { List<EpisodeBaseModel> all = new ArrayList<>(); List<EpisodeBaseModel> related = fetchContent(getRelatedUrl(id), CACHE_EXPIRY); for (EpisodeBaseModel ep : related) { // load from existing cache if possible, has better data. EpisodeBaseModel info = ContentManager.getInstance().getEpisode(ep.getHref()); if (info != null) { all.add(info); } else { all.add(ep); } } return all; } return null; } private Uri getRelatedUrl(String id) { Map<String, String> params = ImmutableMap.of("context", "android", "form", "json", "id", id); return buildRelatedUrl(params); } protected void onPreExecute() { ContentManager.getInstance().broadcastChange(ContentManager.CONTENT_EPISODE_START, id); } protected void onPostExecute(Void v) { if (success) { ContentManager.getInstance().broadcastChange(ContentManager.CONTENT_EPISODE_DONE, id); } else { ContentManager.getInstance().broadcastChange(ContentManager.CONTENT_EPISODE_ERROR, id); } } }