This commit is contained in:
Gangphon 2024-02-02 19:34:33 +08:00
parent 03df39b539
commit d7409bc19f
6 changed files with 111 additions and 16 deletions

View File

@ -577,8 +577,8 @@ public class MainActivity extends ComponentActivity implements Choreographer.Fra
var page = page(progView.curAva);
for(var layer : page.layers) for(var src : layer.srcs) if(src.view.getVisibility()==VISIBLE) {
try {
if(src.view instanceof EleVideo) {
var view = (EleVideo) src.view;
if(src.view instanceof SrcVideo) {
var view = (SrcVideo) src.view;
if(view.ijkPlayer!=null) {
writer.append("VideoPlaying: ").append(String.valueOf(view.ijkPlayer.isPlaying())).append("\tCur/Dur: ").append(String.valueOf(view.ijkPlayer.getCurrentPosition())).append("/").append(String.valueOf(view.ijkPlayer.getDuration())).append("\n");
var mediaInfo = view.ijkPlayer.getMediaInfo();

View File

@ -73,16 +73,16 @@ public class Prog extends AbsLayout {
var page = new Page();
page.repeatTimes = pageMap.intg("repeatTimes", 1);
page.parse(pageMap.jslist("schedules"));
HashMap<String, EleVideo> videoMap = new HashMap<>();
HashMap<String, SrcVideo> videoMap = new HashMap<>();
for(int ll=layers.size()-1; ll>=0; ll--) {
var layer = new Layer();
layer.isLoop = layers.get(ll).bool("repeat");
JSList<JSMap> sources = layers.get(ll).jslist("sources");
var border = layers.get(ll).jsmap("border");
EleBorder bdEle = null;
SrcBorder bdEle = null;
int bdWidth = 0, bdStart = 0xffff, bdEnd = 0;
if(border!=null) {
bdEle = new EleBorder(Util.programDir+"/"+border.stnn("img"), border.stnn("eff"), border.intg("speed"), context);
bdEle = new SrcBorder(Util.programDir+"/"+border.stnn("img"), border.stnn("eff"), border.intg("speed"), context);
bdWidth = bdEle.img.getHeight();
}
var src = new Source();
@ -174,7 +174,7 @@ public class Prog extends AbsLayout {
var speechRate = (float) source.dbl("voiceRate");
if(mode!=null ? mode.endsWith("roll") : (imgs.size()==1 && imgs.get(0).intg("picDuration")==0)) {
var img = imgs.get(0);
src.view = new EleScroll(context, img);
src.view = new SrcScroll(context, img);
if(hasTTS) {
src.text = img.str("text");
if(src.text!=null) {
@ -225,7 +225,7 @@ public class Prog extends AbsLayout {
} else if(src.type.equals("DigitalClock")) src.view = new SrcDigitalClock(context, source);
else if(src.type.startsWith("DigitalClock")) src.view = new SrcDigiClock(context, source);
else if(src.type.equals("AnalogClock")) src.view = new SrcAnaClock(geo.width, geo.height, Util.programDir + "/" + id, source, context);
else if(src.type.equals("Audio")) src.view = new EleVideo(context, Util.programDir + "/" +id, source.intg("vol", 100) / 100.0f, false);
else if(src.type.equals("Audio")) src.view = new SrcVideo(context, Util.programDir + "/" +id, source.intg("vol", 100) / 100.0f, false);
else if(src.type.endsWith("Video")) {
var isLive = src.type.startsWith("Live");
var url = source.str("url");
@ -241,8 +241,8 @@ public class Prog extends AbsLayout {
src.view = new SrcCopy(context, videoView);
((SrcCopy) src.view).scaleX = 0;
} else {
src.view = new EleVideo(context, isLive ? url : Util.programDir+"/"+id, source.intg("vol", 100) / 100.0f, isLive);
videoMap.put(key, (EleVideo) src.view);
src.view = new SrcVideo(context, isLive ? url : Util.programDir+"/"+id, source.intg("vol", 100) / 100.0f, isLive);
videoMap.put(key, (SrcVideo) src.view);
}
} else if(src.type.equals("WebURL")) {
var webView = new WebView(context);
@ -307,7 +307,7 @@ public class Prog extends AbsLayout {
try {
setVisibility(GONE);
View view;
for(int cc=0; cc<getChildCount(); cc++) if((view = getChildAt(cc)) instanceof EleVideo) ((EleVideo) view).release();
for(int cc=0; cc<getChildCount(); cc++) if((view = getChildAt(cc)) instanceof SrcVideo) ((SrcVideo) view).release();
for(var page : pages) for(var layer : page.layers) for(var src : layer.srcs) if(src.tts!=null) src.tts.shutdown();
} catch (Throwable e) {
Util.printStackTrace(e);

View File

@ -9,7 +9,7 @@ import android.graphics.Path;
import android.view.Choreographer;
import android.view.View;
public class EleBorder extends View implements Choreographer.FrameCallback {
public class SrcBorder extends View implements Choreographer.FrameCallback {
Bitmap img;
int[] lens = new int[4];
Path[] paths = new Path[4];
@ -17,7 +17,7 @@ public class EleBorder extends View implements Choreographer.FrameCallback {
byte eff;
int interval;
public EleBorder(String path, String eff, int speed, Context context) {
public SrcBorder(String path, String eff, int speed, Context context) {
super(context);
img = BitmapFactory.decodeFile(path);
if(eff.startsWith("ro")) this.eff = 'r';

View File

@ -17,7 +17,7 @@ import java.util.List;
import gnph.util.JSMap;
@SuppressLint("ViewConstructor")
public class EleScroll extends View implements Choreographer.FrameCallback {
public class SrcScroll extends View implements Choreographer.FrameCallback {
ArrayList<Bitmap> imgs = new ArrayList<>();
Rect rect = new Rect();
@ -25,7 +25,7 @@ public class EleScroll extends View implements Choreographer.FrameCallback {
int interval, cur, end, step;
char effect;
public EleScroll(Context context, JSMap json) {
public SrcScroll(Context context, JSMap json) {
super(context);
var img = BitmapFactory.decodeFile(Util.programDir+"/"+json.stnn("id"));
imgsWidth = img.getWidth();

View File

@ -16,7 +16,7 @@ import androidx.media3.exoplayer.SeekParameters;
import tv.danmaku.ijk.media.player.IMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
public class EleVideo extends TextureView implements TextureView.SurfaceTextureListener {
public class SrcVideo extends TextureView implements TextureView.SurfaceTextureListener {
String path;
float vol;
@ -25,7 +25,7 @@ public class EleVideo extends TextureView implements TextureView.SurfaceTextureL
long bitRate;
boolean isLive;
public EleVideo(Context context, String path, float vol, boolean isLive) {
public SrcVideo(Context context, String path, float vol, boolean isLive) {
super(context);
this.path = path;
this.vol = vol;

View File

@ -0,0 +1,95 @@
package com.xixun.xixunplayer;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.webkit.WebView;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.regex.Pattern;
import gnph.util.IOs;
import gnph.util.JSList;
import gnph.util.JSMap;
import gnph.util.NumFmts;
import gnph.util.Txts;
import gnph.util.URLConn;
@SuppressLint("ViewConstructor")
public class SrcVisitor extends WebView {
String html, lineHeight, prefix, url;
public SrcVisitor(Context context, JSMap json) {
super(context);
setBackgroundColor(Color.TRANSPARENT);
setVerticalScrollBarEnabled(false);
setHorizontalScrollBarEnabled(false);
setInitialScale(100);
html = json.stnn("html").replace("%{yesterday.", "%{arr.-1.");
lineHeight = json.str("lineHeight");
url = json.str("url");
prefix = "<body style=\"color:#fff;margin:0;padding:0;";
if(lineHeight!=null) prefix += "line-height:"+lineHeight+";";
prefix += "\">";
}
public void refresh() {
try {
var htm = html;
try {
var res = JSMap.fromClose(new URLConn(url).in()).jsmap("data");
int lastEnd = 0, appendIdx = 0;
var buf = new StringBuilder(htm.length()*3/2);
int start;
while((start = htm.indexOf("%{", lastEnd)) > -1) {
int fds = start+2, fde = start+2;
try {
for(; fde<=fds+16; fde++) if(htm.charAt(fde)=='}') break;
if(fde > fds+16) {
lastEnd = fds;
continue;
}
lastEnd = fde+1;
if(fde == fds) continue;
var fd = htm.substring(fds, fde);
var replace = res.str(fd);
if(replace!=null) {
buf.append(htm, appendIdx, start).append(replace);
appendIdx = lastEnd;
}
Util.println("Found: " + htm.substring(start, lastEnd)+" fd "+fd);
} catch (Exception e) {
lastEnd = fds;
Util.printStackTrace(e);
}
}
if(buf.length()>0) {
if(appendIdx < htm.length()) buf.append(htm, appendIdx, htm.length());
htm = buf.toString();
}
} catch (Exception e) {
Util.printStackTrace(e);
}
loadDataWithBaseURL(null, prefix+htm+"</body>", "text/html", "UTF-8", null);
} catch (Exception e) {
Util.printStackTrace(e);
}
}
long nextMs;
@Override
public void onVisibilityAggregated(boolean isVisible) {
super.onVisibilityAggregated(isVisible);
if(isVisible) {
var ms = System.currentTimeMillis();
if(ms>=nextMs) {
nextMs += 15000;
refresh();
}
}
}
}