Skip to content

Commit 7664fed

Browse files
authored
【1300开源版本】video组件新增防盗链属性(rfc:#4) (#642)
【1300开源版本】video组件新增防盗链属性
1 parent f086154 commit 7664fed

File tree

8 files changed

+98
-17
lines changed

8 files changed

+98
-17
lines changed

core/runtime/android/runtime/src/main/java/org/hapjs/component/constants/Attributes.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ public interface Style {
526526
String OBJECT_FIT = "objectFit";
527527
String ALT_OBJECT_FIT = "altObjectFit";
528528
String SRC = "src";
529+
String MARK = "mark";
529530
String SOURCE = "source";
530531
String ALT = "alt";
531532
String QUALITY = "quality";

core/runtime/android/widgets/src/main/java/org/hapjs/widgets/video/DefaultPlayerManager.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
/*
2-
* Copyright (c) 2021, the hapjs-platform Project Contributors
2+
* Copyright (c) 2021-present, the hapjs-platform Project Contributors
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

66
package org.hapjs.widgets.video;
77

88
import android.content.Context;
9+
import android.text.TextUtils;
10+
import android.util.Log;
11+
912
import androidx.annotation.NonNull;
1013
import java.util.ArrayList;
1114
import java.util.List;
@@ -24,6 +27,7 @@ public class DefaultPlayerManager implements PlayerManager {
2427
private Context mContext;
2528
private int mPlayerCountLimit = DEFAULT_PLAYER_COUNT_LIMIT;
2629
private List<PlayerHolder> mInstances;
30+
private static final String TAG = "DefaultPlayerManager";
2731

2832
private DefaultPlayerManager() {
2933
mInstances = new ArrayList<>(DEFAULT_PLAYER_COUNT_LIMIT);
@@ -65,7 +69,7 @@ public <P extends IMediaPlayer> P obtainPlayer(PlayerProxy target) {
6569
}
6670

6771
trimToSize(mPlayerCountLimit);
68-
PlayerHolder holder = findAvaiableIdlePlayer();
72+
PlayerHolder holder = findAvaiableIdlePlayer(target);
6973
if (holder != null) {
7074
// 有可用的空闲player
7175
holder.mTarget.unbind();
@@ -98,11 +102,19 @@ private boolean hasLimit() {
98102
return mPlayerCountLimit != PLAYER_COUNT_UNLIMITED;
99103
}
100104

101-
private PlayerHolder findAvaiableIdlePlayer() {
105+
private PlayerHolder findAvaiableIdlePlayer(PlayerProxy target) {
102106
int size = mInstances.size();
103107
for (int i = 0; i < size; i++) {
104108
PlayerHolder holder = mInstances.get(i);
105109
Player player = holder.mPlayer;
110+
if (null != player && null != target) {
111+
String mark = player.getMark();
112+
String targetMark = target.getMark();
113+
if (!TextUtils.isEmpty(targetMark) && !targetMark.equals(mark)) {
114+
Log.w(TAG, "findAvaiableIdlePlayer targetMark mark not same.");
115+
continue;
116+
}
117+
}
106118
int targetState = player.getTargetState();
107119
int currentState = player.getCurrentState();
108120
if (targetState == currentState
@@ -117,7 +129,7 @@ private PlayerHolder findAvaiableIdlePlayer() {
117129
}
118130

119131
private PlayerHolder createInternal(PlayerProxy target) {
120-
Player player = new ExoPlayer(mContext);
132+
Player player = new ExoPlayer(mContext, (null != target ? target.getMark() : null));
121133
PlayerHolder holder = new PlayerHolder(player, target);
122134
mInstances.add(holder);
123135
return holder;

core/runtime/android/widgets/src/main/java/org/hapjs/widgets/video/ExoPlayer.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import com.google.android.exoplayer2.util.Util;
4141
import org.hapjs.component.constants.Attributes;
4242

43+
import java.util.HashMap;
44+
4345
public class ExoPlayer extends Player
4446
implements SimpleExoPlayer.VideoListener,
4547
com.google.android.exoplayer2.Player.EventListener {
@@ -56,14 +58,17 @@ public class ExoPlayer extends Player
5658
private boolean isBuffering;
5759
private SuspendLoadControl mSuspendLoadControl;
5860

59-
public ExoPlayer(@NonNull Context context) {
61+
public ExoPlayer(@NonNull Context context, String mark) {
6062
super(context);
6163
mManifestDataSourceFactory =
62-
new DefaultDataSourceFactory(context, Util.getUserAgent(context, "default"));
64+
new DefaultDataSourceFactory(
65+
context, Util.getUserAgent(context, TextUtils.isEmpty(mark) ? "default" : mark));
6366
mMediaDataSourceFactory =
6467
new DefaultDataSourceFactory(
65-
context, Util.getUserAgent(context, "default"),
68+
context,
69+
Util.getUserAgent(context, TextUtils.isEmpty(mark) ? "default" : mark),
6670
new DefaultBandwidthMeter());
71+
mMark = mark;
6772
}
6873

6974
@Override
@@ -406,7 +411,9 @@ public void onPlayerError(ExoPlaybackException e) {
406411
if (e != null) {
407412
what = e.type;
408413
}
409-
notifyError(what, -1);
414+
HashMap<String, Object> datas = new HashMap<>();
415+
datas.put(Attributes.Style.MARK, !TextUtils.isEmpty(mMark) ? mMark : "");
416+
notifyError(what, -1, datas);
410417
}
411418

412419
@Override

core/runtime/android/widgets/src/main/java/org/hapjs/widgets/video/IMediaPlayer.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import androidx.annotation.IntDef;
1111
import java.lang.annotation.Retention;
1212
import java.lang.annotation.RetentionPolicy;
13+
import java.util.HashMap;
1314
import java.util.Map;
1415

1516
public interface IMediaPlayer {
@@ -62,6 +63,10 @@ public interface IMediaPlayer {
6263

6364
void setMuted(boolean muted);
6465

66+
void setMark(String mark);
67+
68+
String getMark();
69+
6570
long getCurrentPosition();
6671

6772
long getDuration();
@@ -121,7 +126,7 @@ public interface IMediaPlayer {
121126
interface EventListener {
122127
void onLoadingChanged(IMediaPlayer player, boolean isLoading);
123128

124-
boolean onError(IMediaPlayer player, @MediaErrorType int what, int extra);
129+
boolean onError(IMediaPlayer player, @MediaErrorType int what, int extra, HashMap<String, Object> datas);
125130

126131
void onPlayerStateChanged(IMediaPlayer player, @PlayerState int playbackState);
127132

core/runtime/android/widgets/src/main/java/org/hapjs/widgets/video/Player.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import android.view.TextureView;
1616
import androidx.annotation.NonNull;
1717
import androidx.annotation.Nullable;
18+
19+
import java.util.HashMap;
1820
import java.util.Map;
1921
import java.util.Objects;
2022
import org.hapjs.common.executors.Executors;
@@ -46,6 +48,7 @@ public abstract class Player implements IMediaPlayer {
4648
private boolean mMuted;
4749
private boolean mAutoPlay;
4850
private boolean mSuspendBuffer = false;
51+
protected String mMark;
4952

5053
protected Player(@NonNull Context context) {
5154
mApplicationContext = context.getApplicationContext();
@@ -246,6 +249,16 @@ public boolean isSuspendBuffer() {
246249
return mSuspendBuffer;
247250
}
248251

252+
public String getMark() {
253+
return mMark;
254+
}
255+
256+
//no use now
257+
@Override
258+
public void setMark(String mark) {
259+
mMark = mark;
260+
}
261+
249262
@Override
250263
public void setSuspendBuffer(boolean suspendBuffer) {
251264
if (mSuspendBuffer == suspendBuffer) {
@@ -409,9 +422,9 @@ private void notifyStateChanged(@PlayerState int state) {
409422
}
410423
}
411424

412-
protected void notifyError(int what, int extra) {
425+
protected void notifyError(int what, int extra, HashMap<String, Object> datas) {
413426
if (mEventListener != null) {
414-
mEventListener.onError(this, what, extra);
427+
mEventListener.onError(this, what, extra, datas);
415428
}
416429
}
417430

core/runtime/android/widgets/src/main/java/org/hapjs/widgets/video/PlayerProxy.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public class PlayerProxy<P extends IMediaPlayer> implements IMediaPlayer {
2323
private float mSpeed = 1.0f;
2424
public long mCachedPosition = -1;
2525
private boolean mSuspendBuffer = false;
26+
private String mMark;
2627

2728
@Override
2829
public void prepare() {
@@ -154,6 +155,14 @@ public void setMuted(boolean muted) {
154155
}
155156
}
156157

158+
public String getMark() {
159+
return mMark;
160+
}
161+
162+
public void setMark(String mark) {
163+
this.mMark = mark;
164+
}
165+
157166
@Override
158167
public long getCurrentPosition() {
159168
if (mPlayer != null) {

core/runtime/android/widgets/src/main/java/org/hapjs/widgets/video/Video.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
import org.hapjs.runtime.HapEngine;
5353
import org.hapjs.widgets.view.video.FlexVideoView;
5454

55+
import static org.hapjs.component.constants.Attributes.Style.MARK;
56+
5557
@WidgetAnnotation(
5658
name = Video.WIDGET_NAME,
5759
methods = {
@@ -218,6 +220,10 @@ protected boolean setAttribute(String key, Object attribute) {
218220
String uri = Attributes.getString(attribute);
219221
setVideoURI(uri);
220222
return true;
223+
case MARK:
224+
String mark = Attributes.getString(attribute);
225+
setVideoMark(mark);
226+
return true;
221227
case Attributes.Style.AUTO_PLAY:
222228
boolean autoPlay = Attributes.getBoolean(attribute, false);
223229
setAutoPlay(autoPlay);
@@ -301,9 +307,12 @@ protected boolean addEvent(String event) {
301307
mHost.setOnErrorListener(
302308
new FlexVideoView.OnErrorListener() {
303309
@Override
304-
public boolean onError(int what, int extra) {
310+
public boolean onError(int what, int extra, HashMap<String, Object> datas) {
305311
Log.w(TAG, "Error, what:" + what + " extra:" + extra);
306312
Map<String, Object> params = new HashMap();
313+
if (null != datas) {
314+
params.putAll(datas);
315+
}
307316
params.put("what", what);
308317
params.put("extra", extra);
309318
mCallback
@@ -478,6 +487,13 @@ public void setVideoURI(String uri) {
478487
NetworkReportManager.getInstance().reportNetwork(NetworkReportManager.KEY_VIDEO, uri.toString());
479488
}
480489

490+
public void setVideoMark(String mark) {
491+
if (mHost == null) {
492+
return;
493+
}
494+
mHost.setMark(mark);
495+
}
496+
481497
public void setAutoPlay(boolean autoPlay) {
482498
mAutoPlay = autoPlay;
483499

core/runtime/android/widgets/src/main/java/org/hapjs/widgets/view/video/FlexVideoView.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import android.net.Uri;
1818
import android.os.Handler;
1919
import android.os.Message;
20+
import android.text.TextUtils;
2021
import android.util.Log;
2122
import android.view.KeyEvent;
2223
import android.view.LayoutInflater;
@@ -40,6 +41,7 @@
4041
import com.facebook.yoga.YogaNode;
4142

4243
import java.util.Arrays;
44+
import java.util.HashMap;
4345
import java.util.HashSet;
4446
import java.util.Set;
4547

@@ -97,6 +99,7 @@ public class FlexVideoView extends FrameLayout
9799
private Uri mPosterUri;
98100
private Boolean mMuted;
99101
private String mPlayCount;
102+
private String mMark;
100103
private float mSpeed = Video.SPEED_DEFAULT;
101104
private OnErrorListener mOnErrorListener;
102105
private OnIdleListener mOnIdleListener;
@@ -176,6 +179,20 @@ private void initBorderRadiusParams() {
176179
}
177180
}
178181

182+
public String getMark() {
183+
return mMark;
184+
}
185+
186+
public void setMark(String mark) {
187+
this.mMark = mark;
188+
if (null != mPlayer) {
189+
String curMark = mPlayer.getMark();
190+
if (!TextUtils.isEmpty(mMark) && !mMark.equals(curMark)) {
191+
releasePlayer();
192+
}
193+
}
194+
}
195+
179196
@Override
180197
protected void onDraw(Canvas canvas) {
181198
if (isRoundedBorders()) {
@@ -534,13 +551,13 @@ public void onPlayerStateChanged(IMediaPlayer player, int playbackState) {
534551
}
535552
}
536553

537-
protected boolean onError(int what, int extra) {
554+
protected boolean onError(int what, int extra, HashMap<String, Object> datas) {
538555
if (mOnTimeUpdateListener != null) {
539556
mTimeUpdateHandler.removeMessages(MSG_TIME_UPDATE);
540557
}
541558

542559
if (mOnErrorListener != null) {
543-
mOnErrorListener.onError(what, extra);
560+
mOnErrorListener.onError(what, extra, datas);
544561
}
545562

546563
switchKeepScreenOnFlagsByState(Player.STATE_ERROR);
@@ -557,8 +574,8 @@ protected boolean onError(int what, int extra) {
557574
}
558575

559576
@Override
560-
public boolean onError(IMediaPlayer player, int what, int extra) {
561-
return onError(what, extra);
577+
public boolean onError(IMediaPlayer player, int what, int extra, HashMap<String, Object> datas) {
578+
return onError(what, extra, datas);
562579
}
563580

564581
@Override
@@ -1317,6 +1334,7 @@ public void initPlayer() {
13171334
mPlayer.setEventListener(this);
13181335
mControlsManager.attachPlayer(mPlayer);
13191336
}
1337+
mPlayer.setMark(mMark);
13201338
}
13211339

13221340
public void setSpeed(float speed) {
@@ -1327,7 +1345,7 @@ public void setSpeed(float speed) {
13271345
}
13281346

13291347
public interface OnErrorListener {
1330-
boolean onError(int what, int extra);
1348+
boolean onError(int what, int extra, HashMap<String, Object> datas);
13311349
}
13321350

13331351
public interface OnIdleListener {

0 commit comments

Comments
 (0)