package org.xbmc.android.remote.business.cm;
import java.util.ArrayList;
import java.util.List;
import org.xbmc.android.jsonrpc.api.AbstractCall;
import org.xbmc.android.jsonrpc.api.call.VideoLibrary;
import org.xbmc.android.jsonrpc.api.model.LibraryModel;
import org.xbmc.android.jsonrpc.api.model.LibraryModel.GenreDetail;
import org.xbmc.android.jsonrpc.api.model.VideoModel;
import org.xbmc.android.jsonrpc.api.model.VideoModel.Cast;
import org.xbmc.android.jsonrpc.api.model.VideoModel.EpisodeDetail;
import org.xbmc.android.jsonrpc.api.model.VideoModel.TVShowDetail;
import org.xbmc.api.business.DataResponse;
import org.xbmc.api.business.INotifiableManager;
import org.xbmc.api.business.ISortableManager;
import org.xbmc.api.business.ITvShowManager;
import org.xbmc.api.object.Actor;
import org.xbmc.api.object.Episode;
import org.xbmc.api.object.Genre;
import org.xbmc.api.object.ICoverArt;
import org.xbmc.api.object.Season;
import org.xbmc.api.object.TvShow;
import org.xbmc.httpapi.WifiStateException;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
public class TvShowManager extends AbstractManager implements ITvShowManager,
ISortableManager, INotifiableManager {
public void getTvShows(DataResponse<ArrayList<TvShow>> response,
Context context) {
call(new VideoLibrary.GetTVShows(null, getSort(TVShowDetail.TITLE),
(VideoLibrary.GetTVShows.FilterGenreId) null,
TVShowDetail.TITLE, TVShowDetail.RATING,
TVShowDetail.PREMIERED, TVShowDetail.GENRE, TVShowDetail.MPAA,
TVShowDetail.STUDIO, TVShowDetail.FILE, TVShowDetail.EPISODE,
TVShowDetail.WATCHEDEPISODES, TVShowDetail.PLOT,
TVShowDetail.THUMBNAIL),
new ApiHandler<ArrayList<TvShow>, TVShowDetail>() {
@Override
public ArrayList<TvShow> handleResponse(
AbstractCall<TVShowDetail> apiCall) {
List<TVShowDetail> tvShowDetails = apiCall.getResults();
ArrayList<TvShow> result = new ArrayList<TvShow>();
for (TVShowDetail tvShow : tvShowDetails) {
result.add(new TvShow(tvShow));
}
return result;
}
}, response, context);
}
public void getTvShowActors(DataResponse<ArrayList<Actor>> response,
Context context) {
// Currently FRODO doesn't support Actor listings.
response.value = new ArrayList<Actor>();
onFinish(response);
}
public void getTvShowGenres(DataResponse<ArrayList<Genre>> response,
Context context) {
call(new VideoLibrary.GetGenres("tvshow", null,
getSort(GenreDetail.LABEL), GenreDetail.THUMBNAIL),
new ApiHandler<ArrayList<Genre>, LibraryModel.GenreDetail>() {
@Override
public ArrayList<Genre> handleResponse(
AbstractCall<GenreDetail> apiCall) {
List<GenreDetail> genreDetails = apiCall.getResults();
ArrayList<Genre> result = new ArrayList<Genre>();
for (GenreDetail genreDetail : genreDetails) {
result.add(new Genre(genreDetail));
}
return result;
}
}, response, context);
}
public void getTvShows(DataResponse<ArrayList<TvShow>> response,
Genre genre, Context context) {
call(new VideoLibrary.GetTVShows(null, getSort(TVShowDetail.TITLE),
new VideoLibrary.GetTVShows.FilterGenreId(genre.getId()),
TVShowDetail.TITLE, TVShowDetail.RATING,
TVShowDetail.PREMIERED, TVShowDetail.GENRE, TVShowDetail.MPAA,
TVShowDetail.STUDIO, TVShowDetail.FILE, TVShowDetail.EPISODE,
TVShowDetail.WATCHEDEPISODES, TVShowDetail.PLOT,
TVShowDetail.THUMBNAIL),
new ApiHandler<ArrayList<TvShow>, TVShowDetail>() {
@Override
public ArrayList<TvShow> handleResponse(
AbstractCall<TVShowDetail> apiCall) {
List<TVShowDetail> tvShowDetails = apiCall.getResults();
ArrayList<TvShow> result = new ArrayList<TvShow>();
for (TVShowDetail tvShow : tvShowDetails) {
result.add(new TvShow(tvShow));
}
return result;
}
}, response, context);
}
public ArrayList<TvShow> getTvShows(Context context) {
// TODO Remove me
return null;
}
public ArrayList<Season> getAllSeasons(Context context) {
// TODO Remove me
return null;
}
public ArrayList<Episode> getAllEpisodes(Context context) {
// TODO Remove me
return null;
}
public void getTvShows(DataResponse<ArrayList<TvShow>> response,
Actor actor, Context context) {
call(new VideoLibrary.GetTVShows(null, getSort(TVShowDetail.TITLE),
new VideoLibrary.GetTVShows.FilterActor(actor.getName()),
TVShowDetail.TITLE, TVShowDetail.RATING,
TVShowDetail.PREMIERED, TVShowDetail.GENRE, TVShowDetail.MPAA,
TVShowDetail.STUDIO, TVShowDetail.FILE, TVShowDetail.EPISODE,
TVShowDetail.WATCHEDEPISODES, TVShowDetail.PLOT,
TVShowDetail.THUMBNAIL),
new ApiHandler<ArrayList<TvShow>, TVShowDetail>() {
@Override
public ArrayList<TvShow> handleResponse(
AbstractCall<TVShowDetail> apiCall) {
List<TVShowDetail> tvShowDetails = apiCall.getResults();
ArrayList<TvShow> result = new ArrayList<TvShow>();
for (TVShowDetail tvShow : tvShowDetails) {
result.add(new TvShow(tvShow));
}
return result;
}
}, response, context);
}
public void getEpisodes(DataResponse<ArrayList<Episode>> response,
TvShow show, Context context) {
call(new VideoLibrary.GetEpisodes(show.getId(),
getSort(TVShowDetail.TITLE), VideoModel.EpisodeDetail.TITLE,
VideoModel.EpisodeDetail.PLOT, VideoModel.EpisodeDetail.RATING,
VideoModel.EpisodeDetail.WRITER,
VideoModel.EpisodeDetail.FIRSTAIRED,
VideoModel.EpisodeDetail.DIRECTOR,
VideoModel.EpisodeDetail.EPISODE,
VideoModel.EpisodeDetail.FILE,
VideoModel.EpisodeDetail.SHOWTITLE,
VideoModel.EpisodeDetail.THUMBNAIL),
new ApiHandler<ArrayList<Episode>, VideoModel.EpisodeDetail>() {
@Override
public ArrayList<Episode> handleResponse(
AbstractCall<EpisodeDetail> apiCall) {
List<VideoModel.EpisodeDetail> episodeDetails = apiCall
.getResults();
ArrayList<Episode> result = new ArrayList<Episode>();
for (VideoModel.EpisodeDetail episode : episodeDetails) {
result.add(new Episode(episode));
}
return result;
}
}, response, context);
}
public void getEpisodes(DataResponse<ArrayList<Episode>> response,
TvShow show, Season season, Context context) {
call(new VideoLibrary.GetEpisodes(show.getId(), season.number,
getSort(VideoModel.EpisodeDetail.EPISODE),
VideoModel.EpisodeDetail.TITLE, VideoModel.EpisodeDetail.PLOT,
VideoModel.EpisodeDetail.RATING,
VideoModel.EpisodeDetail.WRITER,
VideoModel.EpisodeDetail.FIRSTAIRED,
VideoModel.EpisodeDetail.DIRECTOR,
VideoModel.EpisodeDetail.EPISODE,
VideoModel.EpisodeDetail.FILE,
VideoModel.EpisodeDetail.SHOWTITLE,
VideoModel.EpisodeDetail.THUMBNAIL),
new ApiHandler<ArrayList<Episode>, VideoModel.EpisodeDetail>() {
@Override
public ArrayList<Episode> handleResponse(
AbstractCall<EpisodeDetail> apiCall) {
List<VideoModel.EpisodeDetail> episodeDetails = apiCall
.getResults();
Log.e(TAG, "Found " + episodeDetails.size()
+ " episodes");
ArrayList<Episode> result = new ArrayList<Episode>();
for (VideoModel.EpisodeDetail episode : episodeDetails) {
result.add(new Episode(episode));
}
return result;
}
}, response, context);
}
public void getSeasons(DataResponse<ArrayList<Season>> response,
final TvShow show, Context context) {
call(new VideoLibrary.GetSeasons(show.getId(),
getSort(VideoModel.SeasonDetail.SEASON),
VideoModel.SeasonDetail.SEASON,
VideoModel.SeasonDetail.WATCHEDEPISODES,
VideoModel.SeasonDetail.TVSHOWID,
VideoModel.SeasonDetail.THUMBNAIL),
new ApiHandler<ArrayList<Season>, VideoModel.SeasonDetail>() {
@Override
public ArrayList<Season> handleResponse(
AbstractCall<VideoModel.SeasonDetail> apiCall) {
List<VideoModel.SeasonDetail> seasonDetails = apiCall
.getResults();
ArrayList<Season> result = new ArrayList<Season>();
for (VideoModel.SeasonDetail season : seasonDetails) {
result.add(new Season(season, show));
}
return result;
}
}, response, context);
}
public void updateEpisodeDetails(DataResponse<Episode> response,
final Episode episode, Context context) {
call(new VideoLibrary.GetEpisodeDetails(episode.getId(),
EpisodeDetail.CAST, EpisodeDetail.PLOT, EpisodeDetail.DIRECTOR,
EpisodeDetail.WRITER),
new ApiHandler<Episode, EpisodeDetail>() {
@Override
public Episode handleResponse(
AbstractCall<EpisodeDetail> apiCall) {
EpisodeDetail episodeDetail = apiCall.getResult();
List<Cast> cast = episodeDetail.cast;
for (Cast member : cast) {
episode.actors.add(new Actor(member));
}
episode.plot = episodeDetail.plot;
episode.director = episodeDetail.director;
episode.writer = episodeDetail.writer;
return episode;
}
}, response, context);
}
public void updateTvShowDetails(DataResponse<TvShow> response,
final TvShow show, Context context) {
call(new VideoLibrary.GetTVShowDetails(show.getId(), TVShowDetail.CAST),
new ApiHandler<TvShow, TVShowDetail>() {
@Override
public TvShow handleResponse(
AbstractCall<TVShowDetail> apiCall) {
TVShowDetail tvShowDetail = apiCall.getResult();
List<Cast> cast = tvShowDetail.cast;
for (Cast member : cast) {
show.actors.add(new Actor(member));
}
return show;
}
}, response, context);
}
public void downloadCover(DataResponse<Bitmap> response, ICoverArt cover,
int thumbSize, Context context) throws WifiStateException {
response.value = getCover(cover, thumbSize, TvShow.getThumbUri(cover),
TvShow.getFallbackThumbUri(cover));
}
public void getAllEpisodes(DataResponse<ArrayList<Episode>> response,
Context context) {
call(new VideoLibrary.GetEpisodes(getSort(TVShowDetail.TITLE),
VideoModel.EpisodeDetail.TITLE, VideoModel.EpisodeDetail.PLOT,
VideoModel.EpisodeDetail.RATING,
VideoModel.EpisodeDetail.WRITER,
VideoModel.EpisodeDetail.FIRSTAIRED,
VideoModel.EpisodeDetail.DIRECTOR,
VideoModel.EpisodeDetail.EPISODE,
VideoModel.EpisodeDetail.FILE,
VideoModel.EpisodeDetail.SHOWTITLE,
VideoModel.EpisodeDetail.THUMBNAIL),
new ApiHandler<ArrayList<Episode>, VideoModel.EpisodeDetail>() {
@Override
public ArrayList<Episode> handleResponse(
AbstractCall<EpisodeDetail> apiCall) {
List<VideoModel.EpisodeDetail> episodeDetails = apiCall
.getResults();
ArrayList<Episode> result = new ArrayList<Episode>();
for (VideoModel.EpisodeDetail episode : episodeDetails) {
result.add(new Episode(episode));
}
return result;
}
}, response, context);
}
public void getAllSeasons(DataResponse<ArrayList<Season>> response,
Context context) {
// currently we can't pull all seasons via the API
response.value = new ArrayList<Season>();
onFinish(response);
}
}