Merge pull request #559 from okcaptain/dev

Dev
pull/560/head^2
okcaptain 2 years ago committed by GitHub
commit cf409c1f73
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 7
      app/build.gradle
  2. BIN
      app/libs/media3ext-release.aar
  3. 4
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java
  4. 4
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  5. 4
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  6. 8
      app/src/main/java/com/fongmi/android/tv/Setting.java
  7. 18
      app/src/main/java/com/fongmi/android/tv/api/Decoder.java
  8. 12
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  9. 23
      app/src/main/java/com/fongmi/android/tv/player/exo/NextRenderersFactory.java
  10. 1
      app/src/main/res/values-zh-rCN/strings.xml
  11. 1
      app/src/main/res/values-zh-rTW/strings.xml
  12. 1
      app/src/main/res/values/strings.xml
  13. 4
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  14. 4
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  15. 8
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java
  16. 27
      app/src/mobile/res/layout/fragment_setting_player.xml
  17. 1
      pyramid/src/main/python/base/spider.py

@ -13,8 +13,8 @@ android {
minSdk 21
//noinspection ExpiredTargetSdkVersion
targetSdk 28
versionCode 244
versionName "0726"
versionCode 245
versionName "2.4.5"
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
@ -112,7 +112,6 @@ dependencies {
implementation 'androidx.room:room-runtime:2.6.1'
implementation 'androidx.media:media:1.7.0'
implementation 'cat.ereza:customactivityoncrash:2.4.0'
implementation('com.github.anilbeesetti.nextlib:nextlib-media3ext:0.7.1') { exclude group: 'androidx.media3', module: 'media3-exoplayer' }
implementation 'com.github.bassaer:materialdesigncolors:1.0.0'
implementation 'com.github.bumptech.glide:glide:4.16.0'
implementation 'com.github.bumptech.glide:annotations:4.16.0'
@ -142,6 +141,7 @@ dependencies {
implementation(ext: 'aar', name: 'dlna-core-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'dlna-dmc-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'dlna-dmr-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'media3ext-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-common-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-container-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-database-release', group: 'fongmi', version: 'release')
@ -150,7 +150,6 @@ dependencies {
implementation(ext: 'aar', name: 'lib-datasource-rtmp-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-decoder-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-decoder-av1-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-decoder-ffmpeg-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-exoplayer-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-exoplayer-dash-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-exoplayer-hls-release', group: 'fongmi', version: 'release')

Binary file not shown.

@ -144,7 +144,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List
}
private void setVideoView() {
mPlayers.set(getExo(), getIjk());
mPlayers.init(getExo(), getIjk());
mPlayers.setPlayer(Setting.getPlayer());
findViewById(R.id.timeBar).setNextFocusUpId(R.id.reset);
mBinding.control.reset.setText(ResUtil.getStringArray(R.array.select_reset)[0]);
@ -220,7 +220,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List
private void onDecode(boolean save) {
mPlayers.toggleDecode(save);
mPlayers.set(getExo(), getIjk());
mPlayers.init(getExo(), getIjk());
setDecodeView();
onReset();
}

@ -210,7 +210,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP
}
private void setVideoView() {
mPlayers.set(getExo(), getIjk());
mPlayers.init(getExo(), getIjk());
setScale(Setting.getLiveScale());
mBinding.control.invert.setActivated(Setting.isInvert());
mBinding.control.across.setActivated(Setting.isAcross());
@ -430,7 +430,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP
private void onDecode(boolean save) {
mPlayers.toggleDecode(save);
mPlayers.set(getExo(), getIjk());
mPlayers.init(getExo(), getIjk());
setDecodeView();
fetch();
}

@ -450,7 +450,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
}
private void setVideoView() {
mPlayers.set(getExo(), getIjk());
mPlayers.init(getExo(), getIjk());
mBinding.control.reset.setText(ResUtil.getStringArray(R.array.select_reset)[Setting.getReset()]);
}
@ -1072,7 +1072,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
private void onDecode(boolean save) {
mPlayers.toggleDecode(save);
mPlayers.set(getExo(), getIjk());
mPlayers.init(getExo(), getIjk());
setDecodeView();
onRefresh();
}

@ -258,6 +258,14 @@ public class Setting {
Prefers.put("update", update);
}
public static boolean isPlayWithOthers() {
return Prefers.getBoolean("play_with_others", false);
}
public static void putPlayWithOthers(boolean play) {
Prefers.put("play_with_others", play);
}
public static boolean isDanmu() {
return Prefers.getBoolean("danmu");
}

@ -35,16 +35,9 @@ public class Decoder {
}
private static String fix(String url, String data) {
if (url.startsWith("file") || url.startsWith("assets")) url = UrlUtil.convert(url);
url = UrlUtil.convert(url);
Matcher matcher = JS_URI.matcher(data);
while (matcher.find()) {
String ext = matcher.group(0);
String t = ext.replace("\"./", "\"" + UrlUtil.resolve(url, "./"));
t = t.replace("\"../", "\"" + UrlUtil.resolve(url, "../"));
t = t.replace("./", "__JS1__");
t = t.replace("../", "__JS2__");
data = data.replace(ext, t);
}
while (matcher.find()) data = replace(url, data, matcher.group());
if (data.contains("../")) data = data.replace("../", UrlUtil.resolve(url, "../"));
if (data.contains("./")) data = data.replace("./", UrlUtil.resolve(url, "./"));
if (data.contains("__JS1__")) data = data.replace("__JS1__", "./");
@ -52,6 +45,13 @@ public class Decoder {
return data;
}
private static String replace(String url, String data, String ext) {
String t = ext.replace("\"./", "\"" + UrlUtil.resolve(url, "./"));
t = t.replace("\"../", "\"" + UrlUtil.resolve(url, "../"));
t = t.replace("./", "__JS1__").replace("../", "__JS2__");
return data.replace(ext, t);
}
public static String getExt(String ext) {
try {
return base64(getData(ext.substring(4)));

@ -140,16 +140,16 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal
MediaControllerCompat.setMediaController(activity, session.getController());
}
public void set(PlayerView exo, IjkVideoView ijk) {
public void init(PlayerView exo, IjkVideoView ijk) {
releaseExo();
releaseIjk();
setupExo(exo);
setupIjk(ijk);
initExo(exo);
initIjk(ijk);
}
private void setupExo(PlayerView view) {
private void initExo(PlayerView view) {
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.setAudioAttributes(AudioAttributes.DEFAULT, !Setting.isPlayWithOthers());
exoPlayer.addAnalyticsListener(new EventLogger());
exoPlayer.setHandleAudioBecomingNoisy(true);
view.setRender(Setting.getRender());
@ -158,7 +158,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal
view.setPlayer(exoPlayer);
}
private void setupIjk(IjkVideoView view) {
private void initIjk(IjkVideoView view) {
ijkPlayer = view.render(Setting.getRender()).decode(decode);
ijkPlayer.addListener(this);
ijkPlayer.setPlayer(player);

@ -7,6 +7,8 @@ import androidx.annotation.NonNull;
import androidx.media3.common.util.Log;
import androidx.media3.exoplayer.DefaultRenderersFactory;
import androidx.media3.exoplayer.Renderer;
import androidx.media3.exoplayer.audio.AudioRendererEventListener;
import androidx.media3.exoplayer.audio.AudioSink;
import androidx.media3.exoplayer.mediacodec.MediaCodecSelector;
import androidx.media3.exoplayer.video.VideoRendererEventListener;
@ -14,24 +16,39 @@ import com.fongmi.android.tv.player.Players;
import java.util.ArrayList;
import io.github.anilbeesetti.nextlib.media3ext.ffdecoder.FfmpegAudioRenderer;
import io.github.anilbeesetti.nextlib.media3ext.ffdecoder.FfmpegVideoRenderer;
public class NextRenderersFactory extends DefaultRenderersFactory {
private static final String TAG = NextRenderersFactory.class.getSimpleName();
private final int decode;
public NextRenderersFactory(@NonNull Context context, int decode) {
super(context);
this.decode = decode;
setEnableDecoderFallback(true);
setExtensionRendererMode(Players.isHard(decode) ? EXTENSION_RENDERER_MODE_ON : EXTENSION_RENDERER_MODE_PREFER);
}
@Override
protected void buildAudioRenderers(@NonNull Context context, int extensionRendererMode, @NonNull MediaCodecSelector mediaCodecSelector, boolean enableDecoderFallback, @NonNull AudioSink audioSink, @NonNull Handler eventHandler, @NonNull AudioRendererEventListener eventListener, @NonNull ArrayList<Renderer> out) {
super.buildAudioRenderers(context, extensionRendererMode, mediaCodecSelector, enableDecoderFallback, audioSink, eventHandler, eventListener, out);
int extensionRendererIndex = out.size();
if (extensionRendererMode == EXTENSION_RENDERER_MODE_PREFER) {
extensionRendererIndex--;
}
try {
Renderer renderer = new FfmpegAudioRenderer(eventHandler, eventListener, audioSink);
out.add(extensionRendererIndex++, renderer);
Log.i(TAG, "Loaded FfmpegAudioRenderer.");
} catch (Exception e) {
throw new RuntimeException("Error instantiating Ffmpeg extension", e);
}
}
@Override
protected void buildVideoRenderers(@NonNull Context context, int extensionRendererMode, @NonNull MediaCodecSelector mediaCodecSelector, boolean enableDecoderFallback, @NonNull Handler eventHandler, @NonNull VideoRendererEventListener eventListener, long allowedVideoJoiningTimeMs, @NonNull ArrayList<Renderer> out) {
super.buildVideoRenderers(context, extensionRendererMode, mediaCodecSelector, enableDecoderFallback, eventHandler, eventListener, allowedVideoJoiningTimeMs, out);
if (Players.isHard(decode)) return;
if (extensionRendererMode == EXTENSION_RENDERER_MODE_ON) return;
int extensionRendererIndex = out.size();
try {
Renderer renderer = new FfmpegVideoRenderer(allowedVideoJoiningTimeMs, eventHandler, eventListener, MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY);

@ -112,6 +112,7 @@
<string name="player_scale">缩放比例</string>
<string name="player_caption">字幕样式</string>
<string name="player_subtitle">字幕大小</string>
<string name="player_play_with_others">同时播放</string>
<string name="player_danmu_load">弹幕加载</string>
<string name="player_danmu_speed">弹幕速度</string>
<string name="player_danmu_size">弹幕大小</string>

@ -112,6 +112,7 @@
<string name="player_scale">縮放比例</string>
<string name="player_caption">字幕樣式</string>
<string name="player_subtitle">字幕大小</string>
<string name="player_play_with_others">同时播放</string>
<string name="player_danmu_load">彈幕載入</string>
<string name="player_danmu_speed">彈幕速度</string>
<string name="player_danmu_size">彈幕大小</string>

@ -113,6 +113,7 @@
<string name="player_scale">Scale</string>
<string name="player_caption">Caption style</string>
<string name="player_subtitle">Subtitle size</string>
<string name="player_play_with_others">Play with others</string>
<string name="player_danmu_load">Danmu load</string>
<string name="player_danmu_speed">Danmu speed</string>
<string name="player_danmu_size">Danmu size</string>

@ -235,7 +235,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom
}
private void setVideoView() {
mPlayers.set(getExo(), getIjk());
mPlayers.init(getExo(), getIjk());
setScale(Setting.getLiveScale());
mBinding.control.action.invert.setActivated(Setting.isInvert());
mBinding.control.action.across.setActivated(Setting.isAcross());
@ -468,7 +468,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom
private void onDecode(boolean save) {
mPlayers.toggleDecode(save);
mPlayers.set(getExo(), getIjk());
mPlayers.init(getExo(), getIjk());
setDecodeView();
setR1Callback();
fetch();

@ -432,7 +432,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
}
private void setVideoView() {
mPlayers.set(getExo(), getIjk());
mPlayers.init(getExo(), getIjk());
if (isPort() && ResUtil.isLand(this)) enterFullscreen();
mBinding.control.action.reset.setText(ResUtil.getStringArray(R.array.select_reset)[Setting.getReset()]);
mBinding.video.addOnLayoutChangeListener((view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> mPiP.update(getActivity(), view));
@ -924,7 +924,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
private void onDecode(boolean save) {
mPlayers.toggleDecode(save);
mPlayers.set(getExo(), getIjk());
mPlayers.init(getExo(), getIjk());
setDecodeView();
setR1Callback();
onRefresh();

@ -58,6 +58,7 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B
mBinding.captionText.setText(getSwitch(Setting.isCaption()));
mBinding.bufferText.setText(String.valueOf(Setting.getBuffer()));
mBinding.subtitleText.setText(String.valueOf(Setting.getSubtitle()));
mBinding.playWithOthersText.setText(getSwitch(Setting.isPlayWithOthers()));
mBinding.danmuLoadText.setText(getSwitch(Setting.isDanmuLoad()));
mBinding.rtspText.setText((rtsp = ResUtil.getStringArray(R.array.select_rtsp))[Setting.getRtsp()]);
mBinding.flagText.setText((flag = ResUtil.getStringArray(R.array.select_flag))[Setting.getFlag()]);
@ -85,6 +86,7 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B
mBinding.caption.setOnClickListener(this::setCaption);
mBinding.subtitle.setOnClickListener(this::onSubtitle);
mBinding.caption.setOnLongClickListener(this::onCaption);
mBinding.playWithOthers.setOnClickListener(this::setPlayWithOthers);
mBinding.danmuLoad.setOnClickListener(this::setDanmuLoad);
mBinding.background.setOnClickListener(this::onBackground);
}
@ -94,6 +96,7 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B
mBinding.http.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE);
mBinding.buffer.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE);
mBinding.tunnel.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE);
mBinding.playWithOthers.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE);
}
private void onUa(View view) {
@ -189,6 +192,11 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B
mBinding.subtitleText.setText(String.valueOf(size));
}
private void setPlayWithOthers(View view) {
Setting.putPlayWithOthers(!Setting.isPlayWithOthers());
mBinding.playWithOthersText.setText(getSwitch(Setting.isPlayWithOthers()));
}
private void setDanmuLoad(View view) {
Setting.putDanmuLoad(!Setting.isDanmuLoad());
mBinding.danmuLoadText.setText(getSwitch(Setting.isDanmuLoad()));

@ -239,6 +239,33 @@
</LinearLayout>
<LinearLayout
android:id="@+id/playWithOthers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@drawable/shape_item"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/player_play_with_others"
android:textColor="@color/white"
android:textSize="16sp" />
<TextView
android:id="@+id/playWithOthersText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="開" />
</LinearLayout>
<LinearLayout
android:id="@+id/background"
android:layout_width="match_parent"

@ -1,6 +1,7 @@
import re
import os
import json
import time
import requests
from lxml import etree
from com.chaquo.python import Python

Loading…
Cancel
Save