package com.androideasyapps.phoenix.util;
import com.androideasyapps.phoenix.dao.MediaFile;
import com.androideasyapps.phoenix.dao.Server;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.androideasyapps.phoenix.util.Util.nullIfEmpty;
/**
* Created by seans on 21/12/14.
*/
public class MediaUtil {
public static final int DEFAULT_POSTER_WIDTH=300;
public static final int DEFAULT_BACKGROUND_WIDTH=1280;
static Pattern TVSEASONPattern = Pattern.compile("S([0-9]+)[ex\\.]+([0-9]+)", Pattern.CASE_INSENSITIVE);
static Pattern TVAiringPattern = Pattern.compile("-([0-9]{4,12})-([0-9]{1,2})\\.", Pattern.CASE_INSENSITIVE);
public static boolean isTVSeason(String name) {
Matcher m = TVSEASONPattern.matcher(name);
return m.find();
}
public static boolean isTVAiring(String name) {
Matcher m = TVAiringPattern.matcher(name);
return m.find();
}
public static String getGenres(String[] showCategoriesList) {
if (showCategoriesList==null || showCategoriesList.length==0) return null;
StringBuilder sb = new StringBuilder();
for (int i=0;i<showCategoriesList.length;i++) {
if (i>0) sb.append(" / ");
sb.append(showCategoriesList[i]);
}
return sb.toString();
}
public static String getFileName(com.androideasyapps.phoenix.services.sagetv.model.MediaFile mf) {
if (mf.SegmentFiles!=null&&mf.SegmentFiles.length>0) {
return nullIfEmpty(mf.SegmentFiles[0]);
}
return null;
}
public static int getFileCount(com.androideasyapps.phoenix.services.sagetv.model.MediaFile mf) {
if (mf.SegmentFiles!=null) {
return mf.SegmentFiles.length;
}
return 0;
}
public static String getBackgroundURL(Server server, MediaFile mf, int width) {
if (mf.getMediaFileId()>0) {
return scale(getBaseServerUrl(server) + "/sagex/media/background/" + mf.getMediaFileId(), width);
} else {
if (mf.getSeason()>0) {
return scale(getBaseServerUrl(server) + "/sagex/media/fanart?title=" + URLEncode(mf.getTitle()) + "&mediatype=" + URLEncode(mf.getMediaType()) + "&artifact=background&season="+String.valueOf(mf.getSeason()), width);
} else {
return scale(getBaseServerUrl(server) + "/sagex/media/fanart?title=" + URLEncode(mf.getTitle()) + "&mediatype=" + URLEncode(mf.getMediaType()) + "&artifact=background", width);
}
}
}
private static String scale(String url, int width) {
if (url.contains("?")) {
url=url+"&";
} else {
url=url+"?";
}
return url+"scalex="+width;
}
private static String URLEncode(String str) {
if (str==null) return "";
try {
return URLEncoder.encode(str, "UTF-8");
} catch (UnsupportedEncodingException e) {
return URLEncoder.encode(str);
}
}
public static String getPosterURL(Server server, MediaFile mf, int width) {
if (mf.getMediaFileId()>0) {
return scale(getBaseServerUrl(server) + "/sagex/media/poster/" + mf.getMediaFileId(), width);
} else {
if (mf.getSeason()>0) {
return scale(getBaseServerUrl(server) + "/sagex/media/fanart?title=" + URLEncode(mf.getTitle()) + "&mediatype=" + URLEncode(mf.getMediaType()) + "&artifact=poster&season="+String.valueOf(mf.getSeason()), width);
} else {
return scale(getBaseServerUrl(server) + "/sagex/media/fanart?title=" + URLEncode(mf.getTitle()) + "&mediatype=" + URLEncode(mf.getMediaType()) + "&artifact=poster", width);
}
}
}
public static String getBaseServerUrl(Server server) {
return "http://" + server.getHost() + ":" + server.getPort();
}
public static String getBaseServerUrlWithEmbeddedAuth(Server server) {
return "http://sage:frey@" + server.getHost() + ":" + server.getPort();
}
public static String getVideoURL(Server server, MediaFile movie) {
// TODO: Need to store # of segments and provide a getVideoUrl(movie, segment)
return getBaseServerUrl(server) + "/sagex/media/mediafile/" + movie.getMediaFileId() + "?force-mime=video/mp4";
}
public static String getVideoURLWithEmbeddedAuth(Server server, MediaFile movie) {
// TODO: Need to store # of segments and provide a getVideoUrl(movie, segment)
return getBaseServerUrlWithEmbeddedAuth(server) + "/sagex/media/mediafile/" + movie.getMediaFileId() + "?force-mime=video/mp4";
}
public static String formatShortDateTimeForAiring(MediaFile file) {
if (isToday(file.getOriginalAirDate())) {
return formatTime(file.getOriginalAirDate()) + " Today" ;
} else if (isTomorrow(file.getOriginalAirDate())) {
return formatTime(file.getOriginalAirDate()) + " Tomorrow";
} else {
SimpleDateFormat df = new SimpleDateFormat("h:mm a - EEE, MMM d");
return df.format(new Date(file.getOriginalAirDate()));
}
}
public static String formatTime(long time) {
SimpleDateFormat df = new SimpleDateFormat("h:mm a");
return df.format(new Date(time));
}
public static boolean isTomorrow(long time) {
return dateDayDiff(time)==1;
}
public static int dateDayDiff(long time) {
Calendar now = Calendar.getInstance();
Calendar then = Calendar.getInstance();
then.setTimeInMillis(time);
return then.get(Calendar.DAY_OF_YEAR) - now.get(Calendar.DAY_OF_YEAR);
}
public static boolean isToday(long time) {
return dateDayDiff(time)==0;
}
public static boolean isGroupedItem(MediaFile item) {
return item.getUserdata()!=null&&item.getUserdata().trim().length()>0;
}
public static boolean isTV(MediaFile movie) {
return movie!=null && "tv".equalsIgnoreCase(movie.getMediaType());
}
public static CharSequence getMediaDescription(MediaFile file) {
if (isTV(file)) {
return getTVContextText(file);
} else {
return getMovieContentText(file);
}
}
public static CharSequence getTVContextText(MediaFile file) {
if (file.getEpisode()>0) {
return String.format("%dx%d %s",file.getSeason(), file.getEpisode(), file.getEpisodeTitle());
} else {
return file.getEpisodeTitle();
}
}
public static CharSequence getMovieContentText(MediaFile movie) {
long minutes = movie.getDuration() / (60 * 1000);
String str = String.format("%d mins", minutes);
return str + ((movie.getGenre()!=null)?(" " + movie.getGenre()):"");
}
public static boolean isMovie(MediaFile file) {
return file!=null&&"movie".equalsIgnoreCase(file.getMediaType());
}
public static CharSequence getLongTitle(MediaFile mf) {
if (mf==null) return "N/A";
if (isMovie(mf)) {
return mf.getTitle() + (mf.getYear()>0?" ("+mf.getYear()+")":"");
} else if (isTV(mf)) {
return mf.getTitle() + getTVContextText(mf);
}
return null;
}
}