|
|
|
|
@ -57,35 +57,41 @@ public class Players implements Player.Listener, ParseCallback { |
|
|
|
|
public static final int SOFT = 0; |
|
|
|
|
public static final int HARD = 1; |
|
|
|
|
|
|
|
|
|
private final StringBuilder builder; |
|
|
|
|
private final Formatter formatter; |
|
|
|
|
private final Runnable runnable; |
|
|
|
|
|
|
|
|
|
private Map<String, String> headers; |
|
|
|
|
private MediaSessionCompat session; |
|
|
|
|
private StringBuilder builder; |
|
|
|
|
private Formatter formatter; |
|
|
|
|
private ExoPlayer exoPlayer; |
|
|
|
|
private ParseJob parseJob; |
|
|
|
|
private Runnable runnable; |
|
|
|
|
private String format; |
|
|
|
|
private String url; |
|
|
|
|
private Sub sub; |
|
|
|
|
|
|
|
|
|
private long position; |
|
|
|
|
private int decode; |
|
|
|
|
private int error; |
|
|
|
|
private int retry; |
|
|
|
|
|
|
|
|
|
public static boolean isHard() { |
|
|
|
|
return Setting.getDecode() == HARD; |
|
|
|
|
public static Players create(Activity activity) { |
|
|
|
|
return new Players(activity); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static boolean isHard(int decode) { |
|
|
|
|
return decode == HARD; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static boolean isSoft() { |
|
|
|
|
return Setting.getDecode() == SOFT; |
|
|
|
|
public static boolean isSoft(int decode) { |
|
|
|
|
return decode == SOFT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public Players init(Activity activity) { |
|
|
|
|
private Players(Activity activity) { |
|
|
|
|
decode = Setting.getDecode(); |
|
|
|
|
builder = new StringBuilder(); |
|
|
|
|
runnable = ErrorEvent::timeout; |
|
|
|
|
formatter = new Formatter(builder, Locale.getDefault()); |
|
|
|
|
createSession(activity); |
|
|
|
|
return this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void createSession(Activity activity) { |
|
|
|
|
@ -96,24 +102,24 @@ public class Players implements Player.Listener, ParseCallback { |
|
|
|
|
MediaControllerCompat.setMediaController(activity, session.getController()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void set(PlayerView exo) { |
|
|
|
|
public void setup(PlayerView exo) { |
|
|
|
|
releasePlayer(); |
|
|
|
|
setupExo(exo); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void setupExo(PlayerView view) { |
|
|
|
|
exoPlayer = new ExoPlayer.Builder(App.get()).setLoadControl(ExoUtil.buildLoadControl()).setTrackSelector(ExoUtil.buildTrackSelector()).setRenderersFactory(ExoUtil.buildRenderersFactory()).setMediaSourceFactory(ExoUtil.buildMediaSourceFactory()).build(); |
|
|
|
|
private void setupExo(PlayerView exo) { |
|
|
|
|
exoPlayer = new ExoPlayer.Builder(App.get()).setLoadControl(ExoUtil.buildLoadControl()).setTrackSelector(ExoUtil.buildTrackSelector()).setRenderersFactory(ExoUtil.buildRenderersFactory(decode)).setMediaSourceFactory(ExoUtil.buildMediaSourceFactory()).build(); |
|
|
|
|
exoPlayer.setAudioAttributes(AudioAttributes.DEFAULT, true); |
|
|
|
|
exoPlayer.setHandleAudioBecomingNoisy(true); |
|
|
|
|
view.setRender(Setting.getRender()); |
|
|
|
|
exo.setRender(Setting.getRender()); |
|
|
|
|
exoPlayer.setPlayWhenReady(true); |
|
|
|
|
exoPlayer.addListener(this); |
|
|
|
|
view.setPlayer(exoPlayer); |
|
|
|
|
exo.setPlayer(exoPlayer); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void setSub(Sub sub) { |
|
|
|
|
this.sub = sub; |
|
|
|
|
setMediaSource(headers, url, format); |
|
|
|
|
setMediaItem(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public ExoPlayer get() { |
|
|
|
|
@ -209,6 +215,10 @@ public class Players implements Player.Listener, ParseCallback { |
|
|
|
|
return getDuration() > 5 * 60 * 1000 && !exoPlayer.isCurrentMediaItemLive(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public boolean isHard() { |
|
|
|
|
return decode == HARD; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public boolean isPortrait() { |
|
|
|
|
return getVideoHeight() > getVideoWidth(); |
|
|
|
|
} |
|
|
|
|
@ -222,7 +232,7 @@ public class Players implements Player.Listener, ParseCallback { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public String getDecodeText() { |
|
|
|
|
return ResUtil.getStringArray(R.array.select_decode)[Setting.getDecode()]; |
|
|
|
|
return ResUtil.getStringArray(R.array.select_decode)[decode]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public String setSpeed(float speed) { |
|
|
|
|
@ -255,8 +265,10 @@ public class Players implements Player.Listener, ParseCallback { |
|
|
|
|
return setSpeed(speed); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void toggleDecode() { |
|
|
|
|
Setting.putDecode(Setting.getDecode() == HARD ? SOFT : HARD); |
|
|
|
|
public void toggleDecode(PlayerView exo) { |
|
|
|
|
decode = isHard(decode) ? SOFT : HARD; |
|
|
|
|
Setting.putDecode(decode); |
|
|
|
|
setup(exo); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public String getPositionTime(long time) { |
|
|
|
|
@ -321,7 +333,7 @@ public class Players implements Player.Listener, ParseCallback { |
|
|
|
|
} else if (isIllegal(channel.getUrl())) { |
|
|
|
|
ErrorEvent.url(); |
|
|
|
|
} else { |
|
|
|
|
setMediaSource(channel, timeout); |
|
|
|
|
setMediaItem(channel, timeout); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -333,7 +345,7 @@ public class Players implements Player.Listener, ParseCallback { |
|
|
|
|
} else if (isIllegal(result.getRealUrl())) { |
|
|
|
|
ErrorEvent.url(); |
|
|
|
|
} else { |
|
|
|
|
setMediaSource(result, timeout); |
|
|
|
|
setMediaItem(result, timeout); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -360,28 +372,28 @@ public class Players implements Player.Listener, ParseCallback { |
|
|
|
|
return subs; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void setMediaSource(String url) { |
|
|
|
|
setMediaSource(new HashMap<>(), url); |
|
|
|
|
private void setMediaItem() { |
|
|
|
|
setMediaItem(headers, url, format, null, new ArrayList<>(), Constant.TIMEOUT_PLAY); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void setMediaSource(Map<String, String> headers, String url) { |
|
|
|
|
setMediaSource(headers, url, null, null, new ArrayList<>(), Constant.TIMEOUT_PLAY); |
|
|
|
|
public void setMediaItem(String url) { |
|
|
|
|
setMediaItem(new HashMap<>(), url); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void setMediaSource(Map<String, String> headers, String url, String format) { |
|
|
|
|
setMediaSource(headers, url, format, null, new ArrayList<>(), Constant.TIMEOUT_PLAY); |
|
|
|
|
private void setMediaItem(Map<String, String> headers, String url) { |
|
|
|
|
setMediaItem(headers, url, null, null, new ArrayList<>(), Constant.TIMEOUT_PLAY); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void setMediaSource(Channel channel, int timeout) { |
|
|
|
|
setMediaSource(channel.getHeaders(), channel.getUrl(), channel.getFormat(), channel.getDrm(), new ArrayList<>(), timeout); |
|
|
|
|
private void setMediaItem(Channel channel, int timeout) { |
|
|
|
|
setMediaItem(channel.getHeaders(), channel.getUrl(), channel.getFormat(), channel.getDrm(), new ArrayList<>(), timeout); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void setMediaSource(Result result, int timeout) { |
|
|
|
|
setMediaSource(result.getHeaders(), result.getRealUrl(), result.getFormat(), result.getDrm(), result.getSubs(), timeout); |
|
|
|
|
private void setMediaItem(Result result, int timeout) { |
|
|
|
|
setMediaItem(result.getHeaders(), result.getRealUrl(), result.getFormat(), result.getDrm(), result.getSubs(), timeout); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void setMediaSource(Map<String, String> headers, String url, String format, Drm drm, List<Sub> subs, int timeout) { |
|
|
|
|
if (exoPlayer != null) exoPlayer.setMediaItem(ExoUtil.getMediaItem(this.headers = checkUa(headers), UrlUtil.uri(this.url = url), ExoUtil.getMimeType(this.format = format, error), drm, checkSub(subs)), position); |
|
|
|
|
private void setMediaItem(Map<String, String> headers, String url, String format, Drm drm, List<Sub> subs, int timeout) { |
|
|
|
|
if (exoPlayer != null) exoPlayer.setMediaItem(ExoUtil.getMediaItem(this.headers = checkUa(headers), UrlUtil.uri(this.url = url), ExoUtil.getMimeType(this.format = format, error), drm, checkSub(subs), decode), position); |
|
|
|
|
if (exoPlayer != null) exoPlayer.prepare(); |
|
|
|
|
Logger.t(TAG).d(error + "," + url); |
|
|
|
|
App.post(runnable, timeout); |
|
|
|
|
@ -493,7 +505,7 @@ public class Players implements Player.Listener, ParseCallback { |
|
|
|
|
@Override |
|
|
|
|
public void onParseSuccess(Map<String, String> headers, String url, String from) { |
|
|
|
|
if (!TextUtils.isEmpty(from)) Notify.show(ResUtil.getString(R.string.parse_from, from)); |
|
|
|
|
setMediaSource(headers, url); |
|
|
|
|
setMediaItem(headers, url); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|