From 4509b393fab9b9036b6783c5d1aa2d911d2b3572 Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 21 Jan 2026 17:51:38 +0800 Subject: [PATCH 01/22] Fix large bitmap load --- app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java | 3 +-- .../main/java/com/fongmi/android/tv/utils/OkGlideModule.java | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java index eb960a6f0..bceda35d4 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java @@ -16,7 +16,6 @@ import androidx.annotation.Nullable; import com.bumptech.glide.Glide; import com.bumptech.glide.RequestBuilder; import com.bumptech.glide.load.DataSource; -import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.GlideException; import com.bumptech.glide.load.model.GlideUrl; import com.bumptech.glide.load.model.LazyHeaders; @@ -72,7 +71,7 @@ public class ImgUtil { if (!vod) view.setVisibility(TextUtils.isEmpty(url) ? View.GONE : View.VISIBLE); if (TextUtils.isEmpty(url) || failed.contains(url)) view.setImageDrawable(getTextDrawable(text, vod)); else try { - RequestBuilder builder = Glide.with(view).load(getUrl(url)).diskCacheStrategy(DiskCacheStrategy.RESOURCE).listener(getListener(text, url, view, vod)); + RequestBuilder builder = Glide.with(view).load(getUrl(url)).listener(getListener(text, url, view, vod)); if (vod) builder.centerCrop().into(view); else builder.fitCenter().into(view); } catch (Throwable e) { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/OkGlideModule.java b/app/src/main/java/com/fongmi/android/tv/utils/OkGlideModule.java index cd3ffb9d3..a6b157580 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/OkGlideModule.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/OkGlideModule.java @@ -12,6 +12,7 @@ import com.bumptech.glide.annotation.GlideModule; import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader; import com.bumptech.glide.load.model.GlideUrl; import com.bumptech.glide.module.AppGlideModule; +import com.fongmi.android.tv.BuildConfig; import com.github.catvod.net.OkHttp; import java.io.InputStream; @@ -21,7 +22,7 @@ public class OkGlideModule extends AppGlideModule { @Override public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) { - builder.setLogLevel(Log.ERROR); + builder.setLogLevel(BuildConfig.DEBUG ? Log.DEBUG : Log.ERROR); } @Override From 666b302bd213df748441fadd92bd35a92d921af0 Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 21 Jan 2026 18:24:52 +0800 Subject: [PATCH 02/22] Update build.gradle --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 59c8a2fb6..e8a7a3126 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { minSdk 24 //noinspection ExpiredTargetSdkVersion targetSdk 28 - versionCode 513 - versionName "5.1.3" + versionCode 514 + versionName "5.1.4" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString(), "eventBusIndex": "com.fongmi.android.tv.event.EventIndex"] From b92c1c4582df65ceef9ee9ee911374ef553fc894 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 22 Jan 2026 11:19:12 +0800 Subject: [PATCH 03/22] Clean code --- .../android/tv/ui/activity/VideoActivity.java | 14 ++++++++------ .../java/com/fongmi/android/tv/bean/Result.java | 8 ++++++++ .../android/tv/ui/activity/VideoActivity.java | 16 +++++++++------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 02ffec766..f2942e00c 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -518,9 +518,9 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private void setPlayer(Result result) { result.getUrl().set(mQualityAdapter.getPosition()); - if (!result.getArtwork().isEmpty()) setArtwork(result.getArtwork()); + if (result.hasArtwork()) setArtwork(result.getArtwork()); if (result.hasPosition()) mHistory.setPosition(result.getPosition()); - if (!result.getDesc().isEmpty()) setText(mBinding.content, R.string.detail_content, result.getDesc()); + if (result.hasDesc()) setText(mBinding.content, R.string.detail_content, result.getDesc()); setUseParse(VodConfig.hasParse() && ((result.getPlayUrl().isEmpty() && VodConfig.get().getFlags().contains(result.getFlag())) || result.getJx() == 1)); mPlayers.start(result, isUseParse(), getSite().isChangeable() ? getSite().getTimeout() : -1); mBinding.control.parse.setVisibility(isUseParse() ? View.VISIBLE : View.GONE); @@ -913,12 +913,14 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List App.post(mR2, 500); } - private void setArtwork() { - setArtwork(mHistory.getVodPic()); + private void setArtwork(String url) { + mHistory.setVodPic(url); + setMetadata(); + setArtwork(); } - private void setArtwork(String url) { - ImgUtil.load(this, url, new CustomTarget<>() { + private void setArtwork() { + ImgUtil.load(this, mHistory.getVodPic(), new CustomTarget<>() { @Override public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { mBinding.exo.setDefaultArtwork(resource); diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Result.java b/app/src/main/java/com/fongmi/android/tv/bean/Result.java index 1ced44cd5..596a50b4a 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Result.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Result.java @@ -305,10 +305,18 @@ public class Result implements Parcelable { return !getMsg().isEmpty(); } + public boolean hasArtwork() { + return !getArtwork().isEmpty(); + } + public boolean hasPosition() { return getPosition() != null; } + public boolean hasDesc() { + return !getDesc().isEmpty(); + } + public String getRealUrl() { return getPlayUrl() + getUrl().v(); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 0635c25de..e1463e144 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -548,9 +548,9 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo private void setPlayer(Result result) { result.getUrl().set(mQualityAdapter.getPosition()); - if (!result.getArtwork().isEmpty()) setArtwork(result.getArtwork()); + if (result.hasArtwork()) setArtwork(result.getArtwork()); if (result.hasPosition()) mHistory.setPosition(result.getPosition()); - if (!result.getDesc().isEmpty()) setText(mBinding.content, R.string.detail_content, result.getDesc()); + if (result.hasDesc()) setText(mBinding.content, 0, result.getDesc()); setUseParse(VodConfig.hasParse() && ((result.getPlayUrl().isEmpty() && VodConfig.get().getFlags().contains(result.getFlag())) || result.getJx() == 1)); if (mControlDialog != null && mControlDialog.isVisible()) mControlDialog.setParseVisible(isUseParse()); mBinding.control.parse.setVisibility(isFullscreen() && isUseParse() ? View.VISIBLE : View.GONE); @@ -1001,12 +1001,14 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo App.post(mR1, Constant.INTERVAL_HIDE); } - private void setArtwork() { - setArtwork(mHistory.getVodPic()); + private void setArtwork(String url) { + mHistory.setVodPic(url); + setMetadata(); + setArtwork(); } - private void setArtwork(String url) { - ImgUtil.load(this, url, new CustomTarget<>() { + private void setArtwork() { + ImgUtil.load(this, mHistory.getVodPic(), new CustomTarget<>() { @Override public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { mBinding.exo.setDefaultArtwork(resource); @@ -1434,7 +1436,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo } public void setRotate(boolean rotate) { - this.rotate = rotate;; + this.rotate = rotate; if (fullscreen && !rotate) setPadding(mBinding.control.getRoot()); else noPadding(mBinding.control.getRoot()); } From bb3c4e2633ca41cb097ac6bc308d10bbaeab7299 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 22 Jan 2026 12:02:56 +0800 Subject: [PATCH 04/22] Clean code --- .../java/com/fongmi/android/tv/bean/Cate.java | 24 ++++++------- .../com/fongmi/android/tv/bean/Class.java | 24 ++++++------- .../java/com/fongmi/android/tv/bean/Vod.java | 35 ++++++++++++------- 3 files changed, 47 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Cate.java b/app/src/main/java/com/fongmi/android/tv/bean/Cate.java index c468b5dec..56fb48fc9 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Cate.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Cate.java @@ -8,22 +8,22 @@ import com.google.gson.annotations.SerializedName; public class Cate implements Parcelable { @SerializedName("land") - private int land; + private Integer land; @SerializedName("circle") - private int circle; + private Integer circle; @SerializedName("ratio") - private float ratio; + private Float ratio; public int getLand() { - return land; + return land == null ? 0 : land; } public int getCircle() { - return circle; + return circle == null ? 0 : circle; } public float getRatio() { - return ratio; + return ratio == null ? 0 : ratio; } public Style getStyle() { @@ -37,15 +37,15 @@ public class Cate implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(this.land); - dest.writeInt(this.circle); - dest.writeFloat(this.ratio); + dest.writeValue(this.land); + dest.writeValue(this.circle); + dest.writeValue(this.ratio); } protected Cate(Parcel in) { - this.land = in.readInt(); - this.circle = in.readInt(); - this.ratio = in.readFloat(); + this.land = (Integer) in.readValue(Integer.class.getClassLoader()); + this.circle = (Integer) in.readValue(Integer.class.getClassLoader()); + this.ratio = (Float) in.readValue(Float.class.getClassLoader()); } public static final Creator CREATOR = new Creator<>() { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Class.java b/app/src/main/java/com/fongmi/android/tv/bean/Class.java index aed0545d9..e4b03a461 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Class.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Class.java @@ -36,13 +36,13 @@ public class Class implements Parcelable, Diffable { private List filters; @SerializedName("land") - private int land; + private Integer land; @SerializedName("circle") - private int circle; + private Integer circle; @SerializedName("ratio") - private float ratio; + private Float ratio; private boolean filter; private boolean activated; @@ -87,15 +87,15 @@ public class Class implements Parcelable, Diffable { } public int getLand() { - return land; + return land == null ? 0 : land; } public int getCircle() { - return circle; + return circle == null ? 0 : circle; } public float getRatio() { - return ratio; + return ratio == null ? 0 : ratio; } public void setFilter(boolean filter) { @@ -154,9 +154,9 @@ public class Class implements Parcelable, Diffable { dest.writeString(this.typeName); dest.writeString(this.typeFlag); dest.writeByte(this.filter ? (byte) 1 : (byte) 0); - dest.writeInt(this.land); - dest.writeInt(this.circle); - dest.writeFloat(this.ratio); + dest.writeValue(this.land); + dest.writeValue(this.circle); + dest.writeValue(this.ratio); dest.writeByte(this.activated ? (byte) 1 : (byte) 0); } @@ -165,9 +165,9 @@ public class Class implements Parcelable, Diffable { this.typeName = in.readString(); this.typeFlag = in.readString(); this.filter = in.readByte() != 0; - this.land = in.readInt(); - this.circle = in.readInt(); - this.ratio = in.readFloat(); + this.land = (Integer) in.readValue(Integer.class.getClassLoader()); + this.circle = (Integer) in.readValue(Integer.class.getClassLoader()); + this.ratio = (Float) in.readValue(Float.class.getClassLoader()); this.activated = in.readByte() != 0; } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java index 6f37654e4..89328f826 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java @@ -6,6 +6,7 @@ import android.text.Html; import android.text.TextUtils; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.fongmi.android.tv.App; @@ -90,13 +91,13 @@ public class Vod implements Parcelable, Diffable { private Style style; @SerializedName("land") - private int land; + private Integer land; @SerializedName("circle") - private int circle; + private Integer circle; @SerializedName("ratio") - private float ratio; + private Float ratio; @Path("dl") @ElementList(entry = "dd", required = false, inline = true) @@ -104,6 +105,10 @@ public class Vod implements Parcelable, Diffable { private Site site; + public static Vod objectFrom(String str) { + return App.gson().fromJson(str, Vod.class); + } + public static List arrayFrom(String str) { Type listType = new TypeToken>() {}.getType(); List items = App.gson().fromJson(str, listType); @@ -206,15 +211,15 @@ public class Vod implements Parcelable, Diffable { } public int getLand() { - return land; + return land == null ? 0 : land; } public int getCircle() { - return circle; + return circle == null ? 0 : circle; } public float getRatio() { - return ratio; + return ratio == null ? 0 : ratio; } public List getFlags() { @@ -299,6 +304,12 @@ public class Vod implements Parcelable, Diffable { return this; } + @NonNull + @Override + public String toString() { + return App.gson().toJson(this); + } + @Override public boolean equals(@Nullable Object obj) { if (this == obj) return true; @@ -332,9 +343,9 @@ public class Vod implements Parcelable, Diffable { dest.writeString(this.vodPlayUrl); dest.writeString(this.vodTag); dest.writeString(this.action); - dest.writeInt(this.land); - dest.writeInt(this.circle); - dest.writeFloat(this.ratio); + dest.writeValue(this.land); + dest.writeValue(this.circle); + dest.writeValue(this.ratio); dest.writeParcelable(this.cate, flags); dest.writeParcelable(this.style, flags); dest.writeTypedList(this.vodFlags); @@ -356,9 +367,9 @@ public class Vod implements Parcelable, Diffable { this.vodPlayUrl = in.readString(); this.vodTag = in.readString(); this.action = in.readString(); - this.land = in.readInt(); - this.circle = in.readInt(); - this.ratio = in.readFloat(); + this.land = (Integer) in.readValue(Integer.class.getClassLoader()); + this.circle = (Integer) in.readValue(Integer.class.getClassLoader()); + this.ratio = (Float) in.readValue(Float.class.getClassLoader()); this.cate = in.readParcelable(Cate.class.getClassLoader()); this.style = in.readParcelable(Style.class.getClassLoader()); this.vodFlags = in.createTypedArrayList(Flag.CREATOR); From 8d438bdeb5f6612410a921ed6ba6cb8ab81cc2cb Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 22 Jan 2026 12:10:06 +0800 Subject: [PATCH 05/22] Clean code --- .../android/tv/ui/activity/VideoActivity.java | 5 +++-- .../main/java/com/fongmi/android/tv/bean/Vod.java | 14 ++++++-------- .../android/tv/ui/activity/VideoActivity.java | 5 +++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index f2942e00c..0354d6ff8 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -441,9 +441,10 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void setDetail(Vod item) { + item.checkPic(getPic()); + item.checkName(getName()); + mBinding.name.setText(item.getName()); mBinding.progressLayout.showContent(); - mBinding.video.setTag(item.getPic(getPic())); - mBinding.name.setText(item.getName(getName())); setText(mBinding.remark, 0, item.getRemarks()); setText(mBinding.year, R.string.detail_year, item.getYear()); setText(mBinding.area, R.string.detail_area, item.getArea()); diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java index 89328f826..103808689 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java @@ -270,18 +270,16 @@ public class Vod implements Parcelable, Diffable { return !getAction().isEmpty(); } - public Style getStyle(Style style) { - return getStyle() != null ? getStyle() : style != null ? style : Style.rect(); - } - - public String getPic(String pic) { + public void checkPic(String pic) { if (getPic().isEmpty()) setPic(pic); - return getPic(); } - public String getName(String name) { + public void checkName(String name) { if (getName().isEmpty()) setName(name); - return getName(); + } + + public Style getStyle(Style style) { + return getStyle() != null ? getStyle() : style != null ? style : Style.rect(); } public Vod setFlags() { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index e1463e144..8a56f9f65 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -473,9 +473,10 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo } private void setDetail(Vod item) { + item.checkPic(getPic()); + item.checkName(getName()); + mBinding.name.setText(item.getName()); mBinding.progressLayout.showContent(); - mBinding.video.setTag(item.getPic(getPic())); - mBinding.name.setText(item.getName(getName())); setText(mBinding.remark, 0, item.getRemarks()); setText(mBinding.content, 0, item.getContent()); setText(mBinding.site, R.string.detail_site, getSite().getName()); From 6a646575d50c97571a17544e5c4fd6d1957149d3 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 22 Jan 2026 12:55:11 +0800 Subject: [PATCH 06/22] Support more vod data upadte --- .../android/tv/ui/activity/VideoActivity.java | 18 +++++++++---- .../android/tv/ui/activity/VideoActivity.java | 25 +++++++++++++------ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 0354d6ff8..e4357c6e4 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -450,9 +450,9 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List setText(mBinding.area, R.string.detail_area, item.getArea()); setText(mBinding.type, R.string.detail_type, item.getTypeName()); setText(mBinding.site, R.string.detail_site, getSite().getName()); - setText(mBinding.actor, R.string.detail_actor, item.getActor()); setText(mBinding.content, R.string.detail_content, item.getContent()); setText(mBinding.director, R.string.detail_director, item.getDirector()); + setText(mBinding.actor, R.string.detail_actor, item.getActor()); mFlagAdapter.setItems(item.getFlags(), null); mBinding.content.setMaxLines(getMaxLines()); mBinding.video.requestFocus(); @@ -472,6 +472,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void setText(TextView view, int resId, String text) { + if (TextUtils.isEmpty(text) && !TextUtils.isEmpty(view.getText())) return; view.setText(getSpan(resId, text), TextView.BufferType.SPANNABLE); view.setVisibility(text.isEmpty() ? View.GONE : View.VISIBLE); view.setLinkTextColor(MDColor.YELLOW_500); @@ -1015,12 +1016,19 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void updateVod(Vod item) { - mHistory.setVodPic(item.getPic()); - mHistory.setVodName(item.getName()); - mBinding.name.setText(item.getName()); - mBinding.widget.title.setText(item.getName()); + boolean pic = !item.getPic().isEmpty(); + boolean name = !item.getName().isEmpty(); + if (pic) mHistory.setVodPic(item.getPic()); + if (name) mHistory.setVodName(item.getName()); + if (name) mBinding.name.setText(item.getName()); + if (name) mBinding.widget.title.setText(item.getName()); + setText(mBinding.year, R.string.detail_year, item.getYear()); + setText(mBinding.area, R.string.detail_area, item.getArea()); + setText(mBinding.type, R.string.detail_type, item.getTypeName()); setText(mBinding.content, R.string.detail_content, item.getContent()); setText(mBinding.director, R.string.detail_director, item.getDirector()); + setText(mBinding.actor, R.string.detail_actor, item.getActor()); + setText(mBinding.remark, 0, item.getRemarks()); mBinding.content.setMaxLines(getMaxLines()); setPartAdapter(); updateKeep(); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 8a56f9f65..bb1845023 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -480,9 +480,8 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo setText(mBinding.remark, 0, item.getRemarks()); setText(mBinding.content, 0, item.getContent()); setText(mBinding.site, R.string.detail_site, getSite().getName()); - setText(mBinding.actor, R.string.detail_actor, item.getActor()); setText(mBinding.director, R.string.detail_director, item.getDirector()); - mBinding.contentLayout.setVisibility(mBinding.content.getVisibility()); + setText(mBinding.actor, R.string.detail_actor, item.getActor()); mFlagAdapter.addAll(item.getFlags()); setOther(mBinding.other, item); App.removeCallbacks(mR4); @@ -493,12 +492,18 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo } private void setText(TextView view, int resId, String text) { + if (TextUtils.isEmpty(text) && !TextUtils.isEmpty(view.getText())) return; view.setText(getSpan(resId, text), TextView.BufferType.SPANNABLE); view.setVisibility(text.isEmpty() ? View.GONE : View.VISIBLE); + if (view == mBinding.content) setContentVisible(); view.setLinkTextColor(MDColor.YELLOW_500); CustomMovement.bind(view); } + private void setContentVisible() { + mBinding.contentLayout.setVisibility(mBinding.content.getVisibility()); + } + private SpannableStringBuilder getSpan(int resId, String text) { if (resId > 0) text = getString(resId, text); Map map = new HashMap<>(); @@ -1113,13 +1118,17 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo } private void updateVod(Vod item) { - mHistory.setVodPic(item.getPic()); - mHistory.setVodName(item.getName()); - mBinding.name.setText(item.getName()); - mBinding.control.title.setText(item.getName()); - setText(mBinding.content, 0, item.getContent()); + boolean pic = !item.getPic().isEmpty(); + boolean name = !item.getName().isEmpty(); + if (pic) mHistory.setVodPic(item.getPic()); + if (name) mHistory.setVodName(item.getName()); + if (name) mBinding.name.setText(item.getName()); + if (name) mBinding.control.title.setText(item.getName()); setText(mBinding.director, R.string.detail_director, item.getDirector()); - mBinding.contentLayout.setVisibility(mBinding.content.getVisibility()); + setText(mBinding.actor, R.string.detail_actor, item.getActor()); + setText(mBinding.content, 0, item.getContent()); + setText(mBinding.remark, 0, item.getRemarks()); + setOther(mBinding.other, item); updateKeep(); setArtwork(); setMetadata(); From 3bf2c0ec6a5b5d12a1eebbe9c15d170b03892344 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 22 Jan 2026 12:55:30 +0800 Subject: [PATCH 07/22] Add vod upadte api --- .../main/java/com/fongmi/android/tv/server/process/Action.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/fongmi/android/tv/server/process/Action.java b/app/src/main/java/com/fongmi/android/tv/server/process/Action.java index 6c2e95685..54a16284c 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/process/Action.java +++ b/app/src/main/java/com/fongmi/android/tv/server/process/Action.java @@ -9,6 +9,7 @@ import com.fongmi.android.tv.bean.Config; import com.fongmi.android.tv.bean.Device; import com.fongmi.android.tv.bean.History; import com.fongmi.android.tv.bean.Keep; +import com.fongmi.android.tv.bean.Vod; import com.fongmi.android.tv.event.ActionEvent; import com.fongmi.android.tv.event.CastEvent; import com.fongmi.android.tv.event.RefreshEvent; @@ -81,11 +82,13 @@ public class Action implements Process { private void onRefresh(Map params) { String type = params.get("type"); String path = params.get("path"); + String json = params.get("json"); if ("live".equals(type)) RefreshEvent.live(); else if ("detail".equals(type)) RefreshEvent.detail(); else if ("player".equals(type)) RefreshEvent.player(); else if ("danmaku".equals(type)) RefreshEvent.danmaku(path); else if ("subtitle".equals(type)) RefreshEvent.subtitle(path); + else if ("vod".equals(type)) RefreshEvent.vod(Vod.objectFrom(json)); } private void onControl(Map params) { From 60e45306068af4492e21a0a96cc518f4b8477e92 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 22 Jan 2026 13:59:24 +0800 Subject: [PATCH 08/22] Fix subtitle bug --- app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java b/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java index c93155dee..2949add68 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java @@ -69,8 +69,8 @@ public class ExoUtil { public static void setSubtitleView(PlayerView exo) { exo.getSubtitleView().setStyle(getCaptionStyle()); + exo.getSubtitleView().setApplyEmbeddedStyles(true); exo.getSubtitleView().setApplyEmbeddedFontSizes(false); - exo.getSubtitleView().setApplyEmbeddedStyles(!Setting.isCaption()); if (Setting.getSubtitlePosition() != 0) exo.getSubtitleView().setBottomPosition(Setting.getSubtitlePosition()); if (Setting.getSubtitleTextSize() != 0) exo.getSubtitleView().setFractionalTextSize(Setting.getSubtitleTextSize()); } From 3757c65ecb028028669af9eb7e13fc7d05a2e44c Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 23 Jan 2026 00:10:35 +0800 Subject: [PATCH 09/22] Optimize redirect play --- .../java/com/fongmi/android/tv/ui/activity/CastActivity.java | 2 +- .../java/com/fongmi/android/tv/ui/activity/LiveActivity.java | 2 +- .../java/com/fongmi/android/tv/ui/activity/VideoActivity.java | 2 +- .../java/com/fongmi/android/tv/ui/activity/LiveActivity.java | 2 +- .../java/com/fongmi/android/tv/ui/activity/VideoActivity.java | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java index 7497a7b3a..7a15c1929 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java @@ -519,7 +519,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownVod.Liste @Override protected void onPause() { super.onPause(); - if (isRedirect()) onPaused(); + if (isRedirect()) mPlayers.stop(); } @Override diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index b679165fd..25d2210ee 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -1032,7 +1032,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override protected void onPause() { super.onPause(); - if (isRedirect()) onPaused(); + if (isRedirect()) mPlayers.stop(); } @Override diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index e4357c6e4..e3f2008d7 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1408,7 +1408,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List @Override protected void onPause() { super.onPause(); - if (isRedirect()) onPaused(); + if (isRedirect()) mPlayers.stop(); } @Override diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 4986d3dfd..d2c0911db 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -1134,7 +1134,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener @Override protected void onPause() { super.onPause(); - if (isRedirect()) onPaused(); + if (isRedirect()) mPlayers.stop(); } @Override diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index bb1845023..bb1185cbd 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1477,7 +1477,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo @Override public void onCasted() { - onPaused(); + mPlayers.stop(); } @Override @@ -1643,7 +1643,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo @Override protected void onPause() { super.onPause(); - if (isRedirect()) onPaused(); + if (isRedirect()) mPlayers.stop(); } @Override From 83b3588e753d25b360da5d17935bb314d982d5c3 Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 23 Jan 2026 14:07:51 +0800 Subject: [PATCH 10/22] Optimize hashCode --- .../main/java/com/fongmi/android/tv/bean/Channel.java | 9 +++++---- app/src/main/java/com/fongmi/android/tv/bean/Class.java | 5 +++-- .../main/java/com/fongmi/android/tv/bean/Collect.java | 2 +- app/src/main/java/com/fongmi/android/tv/bean/Device.java | 5 +++-- .../main/java/com/fongmi/android/tv/bean/EpgData.java | 8 +++----- .../main/java/com/fongmi/android/tv/bean/Episode.java | 6 ++++-- app/src/main/java/com/fongmi/android/tv/bean/Flag.java | 5 +++-- .../main/java/com/fongmi/android/tv/bean/History.java | 5 +++-- app/src/main/java/com/fongmi/android/tv/bean/Keep.java | 5 +++-- app/src/main/java/com/fongmi/android/tv/bean/Parse.java | 5 +++-- app/src/main/java/com/fongmi/android/tv/bean/Site.java | 5 +++-- app/src/main/java/com/fongmi/android/tv/bean/Value.java | 6 ++++-- app/src/main/java/com/fongmi/android/tv/bean/Vod.java | 7 ++++--- 13 files changed, 42 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java index 5eec8a1be..b553da673 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java @@ -22,6 +22,7 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; public class Channel { @@ -385,16 +386,16 @@ public class Channel { if (!(obj instanceof Channel it)) return false; String name1 = getName(), name2 = it.getName(); String number1 = getNumber(), number2 = it.getNumber(); - if (!name1.isEmpty() && !name2.isEmpty()) return name1.equals(name2); - if (!number1.isEmpty() && !number2.isEmpty()) return number1.equals(number2); + if (!name1.isEmpty() && !name2.isEmpty()) return Objects.equals(name1, name2); + if (!number1.isEmpty() && !number2.isEmpty()) return Objects.equals(number1, number2); return false; } @Override public int hashCode() { String name = getName(), number = getNumber(); - if (!name.isEmpty()) return name.hashCode(); - if (!number.isEmpty()) return number.hashCode(); + if (!name.isEmpty()) return Objects.hash(name); + if (!number.isEmpty()) return Objects.hash(number); return 0; } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Class.java b/app/src/main/java/com/fongmi/android/tv/bean/Class.java index e4b03a461..db2545d73 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Class.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Class.java @@ -17,6 +17,7 @@ import org.simpleframework.xml.Text; import java.util.Collections; import java.util.List; +import java.util.Objects; @Root(strict = false) public class Class implements Parcelable, Diffable { @@ -135,12 +136,12 @@ public class Class implements Parcelable, Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Class it)) return false; - return getTypeId().equals(it.getTypeId()); + return Objects.equals(getTypeId(), it.getTypeId()); } @Override public int hashCode() { - return getTypeId().hashCode(); + return Objects.hash(getTypeId()); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Collect.java b/app/src/main/java/com/fongmi/android/tv/bean/Collect.java index 0d87df7da..1cfc66e91 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Collect.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Collect.java @@ -63,7 +63,7 @@ public class Collect implements Parcelable, Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Collect it)) return false; - return getSite().equals(it.getSite()); + return Objects.equals(getSite(), it.getSite()); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Device.java b/app/src/main/java/com/fongmi/android/tv/bean/Device.java index b2a74bed7..927a3a2db 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Device.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Device.java @@ -20,6 +20,7 @@ import com.google.gson.annotations.SerializedName; import java.util.Comparator; import java.util.List; +import java.util.Objects; @Entity(indices = @Index(value = {"uuid", "name"}, unique = true)) public class Device implements Diffable, Comparable { @@ -167,12 +168,12 @@ public class Device implements Diffable, Comparable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Device it)) return false; - return getUuid().equals(it.getUuid()); + return Objects.equals(getUuid(), it.getUuid()); } @Override public int hashCode() { - return getUuid().hashCode(); + return Objects.hash(getUuid()); } @NonNull diff --git a/app/src/main/java/com/fongmi/android/tv/bean/EpgData.java b/app/src/main/java/com/fongmi/android/tv/bean/EpgData.java index 534eaa19f..e671f13f3 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/EpgData.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/EpgData.java @@ -10,6 +10,7 @@ import com.github.catvod.utils.Trans; import com.google.gson.annotations.SerializedName; import java.util.Calendar; +import java.util.Objects; public class EpgData { @@ -111,14 +112,11 @@ public class EpgData { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof EpgData it)) return false; - return getTitle().equals(it.getTitle()) && getEnd().equals(it.getEnd()) && getStart().equals(it.getStart()); + return Objects.equals(getTitle(), it.getTitle()) && Objects.equals(getEnd(), it.getEnd()) && Objects.equals(getStart(), it.getStart()); } @Override public int hashCode() { - int result = getTitle().hashCode(); - result = 31 * result + getEnd().hashCode(); - result = 31 * result + getStart().hashCode(); - return result; + return Objects.hash(getTitle(), getEnd(), getStart()); } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Episode.java b/app/src/main/java/com/fongmi/android/tv/bean/Episode.java index 04a1c19e5..da19e11ce 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Episode.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Episode.java @@ -11,6 +11,8 @@ import com.fongmi.android.tv.utils.Util; import com.github.catvod.utils.Trans; import com.google.gson.annotations.SerializedName; +import java.util.Objects; + public class Episode implements Parcelable, Diffable { @SerializedName("name") @@ -111,12 +113,12 @@ public class Episode implements Parcelable, Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Episode it)) return false; - return getName().equals(it.getName()); + return Objects.equals(getName(), it.getName()); } @Override public int hashCode() { - return getName().hashCode(); + return Objects.hash(getName()); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Flag.java b/app/src/main/java/com/fongmi/android/tv/bean/Flag.java index 74ec2800a..233d91677 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Flag.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Flag.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Locale; +import java.util.Objects; public class Flag implements Parcelable, Diffable { @@ -135,12 +136,12 @@ public class Flag implements Parcelable, Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Flag it)) return false; - return getFlag().equals(it.getFlag()); + return Objects.equals(getFlag(), it.getFlag()); } @Override public int hashCode() { - return getFlag().hashCode(); + return Objects.hash(getFlag()); } @NonNull diff --git a/app/src/main/java/com/fongmi/android/tv/bean/History.java b/app/src/main/java/com/fongmi/android/tv/bean/History.java index 8346036a3..96133dc8f 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/History.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/History.java @@ -21,6 +21,7 @@ import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.concurrent.TimeUnit; @Entity @@ -344,12 +345,12 @@ public class History implements Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof History it)) return false; - return getKey().equals(it.getKey()); + return Objects.equals(getKey(), it.getKey()); } @Override public int hashCode() { - return getKey().hashCode(); + return Objects.hash(getKey()); } @NonNull diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Keep.java b/app/src/main/java/com/fongmi/android/tv/bean/Keep.java index b556d56f9..0655b2fc5 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Keep.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Keep.java @@ -15,6 +15,7 @@ import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.Collections; import java.util.List; +import java.util.Objects; @Entity public class Keep implements Diffable { @@ -163,12 +164,12 @@ public class Keep implements Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Keep it)) return false; - return getKey().equals(it.getKey()); + return Objects.equals(getKey(), it.getKey()); } @Override public int hashCode() { - return getKey().hashCode(); + return Objects.hash(getKey()); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Parse.java b/app/src/main/java/com/fongmi/android/tv/bean/Parse.java index 0fe3f75c8..96ab9a0a8 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Parse.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Parse.java @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; public class Parse implements Diffable { @@ -131,12 +132,12 @@ public class Parse implements Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Parse it)) return false; - return getName().equals(it.getName()); + return Objects.equals(getName(), it.getName()); } @Override public int hashCode() { - return getName().hashCode(); + return Objects.hash(getName()); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Site.java b/app/src/main/java/com/fongmi/android/tv/bean/Site.java index ffdca1638..1e3f799f5 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Site.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Site.java @@ -28,6 +28,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.concurrent.TimeUnit; @Entity @@ -319,12 +320,12 @@ public class Site implements Parcelable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Site it)) return false; - return getKey().equals(it.getKey()); + return Objects.equals(getKey(), it.getKey()); } @Override public int hashCode() { - return getKey().hashCode(); + return Objects.hash(getKey()); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Value.java b/app/src/main/java/com/fongmi/android/tv/bean/Value.java index 594353f72..ef9d79280 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Value.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Value.java @@ -10,6 +10,8 @@ import com.fongmi.android.tv.impl.Diffable; import com.github.catvod.utils.Trans; import com.google.gson.annotations.SerializedName; +import java.util.Objects; + public class Value implements Parcelable, Diffable { @SerializedName("n") @@ -71,12 +73,12 @@ public class Value implements Parcelable, Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Value it)) return false; - return getV().equals(it.getV()); + return Objects.equals(getV(), it.getV()); } @Override public int hashCode() { - return getV().hashCode(); + return Objects.hash(getV()); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java index 103808689..79d61672c 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java @@ -106,7 +106,8 @@ public class Vod implements Parcelable, Diffable { private Site site; public static Vod objectFrom(String str) { - return App.gson().fromJson(str, Vod.class); + Vod vod = App.gson().fromJson(str, Vod.class); + return vod == null ? new Vod() : vod.trans().setFlags(); } public static List arrayFrom(String str) { @@ -312,12 +313,12 @@ public class Vod implements Parcelable, Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Vod it)) return false; - return !getId().isEmpty() && !it.getId().isEmpty() ? getId().equals(it.getId()) : getName().equals(it.getName()); + return !getId().isEmpty() && !it.getId().isEmpty() ? Objects.equals(getId(), it.getId()) : Objects.equals(getName(), it.getName()); } @Override public int hashCode() { - return !getId().isEmpty() ? getId().hashCode() : getName().hashCode(); + return !getId().isEmpty() ? Objects.hash(getId()) : Objects.hash(getName()); } @Override From b1c11c8ad6e60ce0cf9419b74aaa661a0f488836 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sat, 24 Jan 2026 21:46:35 +0800 Subject: [PATCH 11/22] Support update flag --- .../android/tv/ui/activity/VideoActivity.java | 49 +++++++++++-------- .../java/com/fongmi/android/tv/bean/Flag.java | 8 +++ .../android/tv/ui/activity/VideoActivity.java | 39 +++++++++------ .../android/tv/ui/adapter/FlagAdapter.java | 9 ++++ 4 files changed, 69 insertions(+), 36 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index e3f2008d7..6b47882e4 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -96,6 +96,7 @@ import java.util.Map; import java.util.Objects; import java.util.UUID; import java.util.regex.Matcher; +import java.util.stream.IntStream; public class VideoActivity extends BaseActivity implements CustomKeyDownVod.Listener, TrackDialog.Listener, ArrayPresenter.OnClickListener, Clock.Callback { @@ -443,9 +444,19 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private void setDetail(Vod item) { item.checkPic(getPic()); item.checkName(getName()); - mBinding.name.setText(item.getName()); mBinding.progressLayout.showContent(); - setText(mBinding.remark, 0, item.getRemarks()); + mBinding.name.setText(item.getName()); + mFlagAdapter.setItems(item.getFlags(), null); + mBinding.video.requestFocus(); + App.removeCallbacks(mR4); + checkHistory(item); + checkFlag(item); + checkKeepImg(); + setText(item); + updateKeep(); + } + + private void setText(Vod item) { setText(mBinding.year, R.string.detail_year, item.getYear()); setText(mBinding.area, R.string.detail_area, item.getArea()); setText(mBinding.type, R.string.detail_type, item.getTypeName()); @@ -453,14 +464,8 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List setText(mBinding.content, R.string.detail_content, item.getContent()); setText(mBinding.director, R.string.detail_director, item.getDirector()); setText(mBinding.actor, R.string.detail_actor, item.getActor()); - mFlagAdapter.setItems(item.getFlags(), null); + setText(mBinding.remark, 0, item.getRemarks()); mBinding.content.setMaxLines(getMaxLines()); - mBinding.video.requestFocus(); - App.removeCallbacks(mR4); - checkHistory(item); - checkFlag(item); - checkKeepImg(); - updateKeep(); } private int getMaxLines() { @@ -1022,18 +1027,20 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List if (name) mHistory.setVodName(item.getName()); if (name) mBinding.name.setText(item.getName()); if (name) mBinding.widget.title.setText(item.getName()); - setText(mBinding.year, R.string.detail_year, item.getYear()); - setText(mBinding.area, R.string.detail_area, item.getArea()); - setText(mBinding.type, R.string.detail_type, item.getTypeName()); - setText(mBinding.content, R.string.detail_content, item.getContent()); - setText(mBinding.director, R.string.detail_director, item.getDirector()); - setText(mBinding.actor, R.string.detail_actor, item.getActor()); - setText(mBinding.remark, 0, item.getRemarks()); - mBinding.content.setMaxLines(getMaxLines()); - setPartAdapter(); - updateKeep(); - setArtwork(); - setMetadata(); + updateFlag(getFlag(), item.getFlags()); + if (pic || name) setMetadata(); + if (pic || name) updateKeep(); + if (name) setPartAdapter(); + if (pic) setArtwork(); + setText(item); + } + + private void updateFlag(Flag activated, List items) { + items.forEach(item -> IntStream.range(0, mFlagAdapter.size()).mapToObj(i -> (Flag) mFlagAdapter.get(i)) + .filter(item::equals).findFirst().ifPresentOrElse(target -> { + target.mergeEpisodes(item.getEpisodes(), mHistory.isRevSort()); + if (target.equals(activated)) setEpisodeAdapter(target.getEpisodes()); + }, () -> mFlagAdapter.add(item))); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Flag.java b/app/src/main/java/com/fongmi/android/tv/bean/Flag.java index 233d91677..abad0f219 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Flag.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Flag.java @@ -126,6 +126,14 @@ public class Flag implements Parcelable, Diffable { } } + public void mergeEpisodes(List items, boolean rev) { + for (Episode item : items) { + if (episodes.contains(item)) continue; + if (rev) episodes.add(0, item); + else episodes.add(item); + } + } + public Flag trans() { if (Trans.pass()) return this; this.show = Trans.s2t(flag); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index bb1185cbd..c8f037968 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -475,22 +475,26 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo private void setDetail(Vod item) { item.checkPic(getPic()); item.checkName(getName()); - mBinding.name.setText(item.getName()); mBinding.progressLayout.showContent(); - setText(mBinding.remark, 0, item.getRemarks()); - setText(mBinding.content, 0, item.getContent()); - setText(mBinding.site, R.string.detail_site, getSite().getName()); - setText(mBinding.director, R.string.detail_director, item.getDirector()); - setText(mBinding.actor, R.string.detail_actor, item.getActor()); + mBinding.name.setText(item.getName()); mFlagAdapter.addAll(item.getFlags()); - setOther(mBinding.other, item); App.removeCallbacks(mR4); checkHistory(item); checkFlag(item); checkKeepImg(); + setText(item); updateKeep(); } + private void setText(Vod item) { + setText(mBinding.site, R.string.detail_site, getSite().getName()); + setText(mBinding.director, R.string.detail_director, item.getDirector()); + setText(mBinding.actor, R.string.detail_actor, item.getActor()); + setText(mBinding.content, 0, item.getContent()); + setText(mBinding.remark, 0, item.getRemarks()); + setOther(mBinding.other, item); + } + private void setText(TextView view, int resId, String text) { if (TextUtils.isEmpty(text) && !TextUtils.isEmpty(view.getText())) return; view.setText(getSpan(resId, text), TextView.BufferType.SPANNABLE); @@ -1124,14 +1128,19 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo if (name) mHistory.setVodName(item.getName()); if (name) mBinding.name.setText(item.getName()); if (name) mBinding.control.title.setText(item.getName()); - setText(mBinding.director, R.string.detail_director, item.getDirector()); - setText(mBinding.actor, R.string.detail_actor, item.getActor()); - setText(mBinding.content, 0, item.getContent()); - setText(mBinding.remark, 0, item.getRemarks()); - setOther(mBinding.other, item); - updateKeep(); - setArtwork(); - setMetadata(); + updateFlag(getFlag(), item.getFlags()); + if (pic || name) setMetadata(); + if (pic || name) updateKeep(); + if (pic) setArtwork(); + setText(item); + } + + private void updateFlag(Flag activated, List items) { + items.forEach(item -> mFlagAdapter.getItems().stream() + .filter(item::equals).findFirst().ifPresentOrElse(target -> { + target.mergeEpisodes(item.getEpisodes(), mHistory.isRevSort()); + if (target.equals(activated)) setEpisodeAdapter(target.getEpisodes()); + }, () -> mFlagAdapter.add(item))); } @Override diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/FlagAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/FlagAdapter.java index a33e7b834..bcf045c05 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/FlagAdapter.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/FlagAdapter.java @@ -35,6 +35,11 @@ public class FlagAdapter extends RecyclerView.Adapter { notifyDataSetChanged(); } + public void add(Flag item) { + mItems.add(item); + notifyItemInserted(mItems.size() - 1); + } + public int getPosition() { for (int i = 0; i < mItems.size(); i++) if (mItems.get(i).isActivated()) return i; return 0; @@ -44,6 +49,10 @@ public class FlagAdapter extends RecyclerView.Adapter { return mItems.get(position); } + public List getItems() { + return mItems; + } + public Flag getActivated() { return mItems.get(getPosition()); } From aadbe2652a2b7229899dc0a7afcea066136c3b38 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 25 Jan 2026 14:30:37 +0800 Subject: [PATCH 12/22] Fix bug --- .../com/fongmi/android/tv/ui/fragment/FolderFragment.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java index c990bb6cc..dd1bf5bfc 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java @@ -18,6 +18,7 @@ import com.fongmi.android.tv.ui.activity.VodActivity; import com.fongmi.android.tv.ui.base.BaseFragment; import java.util.HashMap; +import java.util.List; import java.util.Optional; public class FolderFragment extends BaseFragment { @@ -62,8 +63,10 @@ public class FolderFragment extends BaseFragment { } private HashMap getExtend() { + List cache = Cache.get(mType); HashMap extend = new HashMap<>(); - for (Filter filter : Cache.get(mType)) if (filter.getInit() != null) extend.put(filter.getKey(), filter.getInit()); + for (Filter filter : cache) filter.getValue().forEach(value -> value.setActivated(false)); + for (Filter filter : cache) if (filter.getInit() != null) extend.put(filter.getKey(), filter.getInit()); return extend; } From 2ca26f5a4bcfc3f3997a35bdb69825e7149d362b Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 27 Jan 2026 15:16:34 +0800 Subject: [PATCH 13/22] Clean code --- .../java/com/fongmi/android/tv/bean/Cache.java | 6 ++++++ .../android/tv/ui/fragment/FolderFragment.java | 5 +---- .../fongmi/android/tv/ui/fragment/TypeFragment.java | 2 +- .../java/com/fongmi/android/tv/bean/Filter.java | 13 +++++++++++++ .../main/java/com/fongmi/android/tv/bean/Value.java | 6 ++++++ 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/bean/Cache.java b/app/src/leanback/java/com/fongmi/android/tv/bean/Cache.java index 4e8c42dec..a190417e1 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/bean/Cache.java +++ b/app/src/leanback/java/com/fongmi/android/tv/bean/Cache.java @@ -35,6 +35,12 @@ public class Cache { return filters == null ? Collections.emptyList() : filters; } + public static List copy(String typeId) { + List filters = get().cache.get(typeId); + if (filters == null) return Collections.emptyList(); + return filters.stream().map(Filter::copy).toList(); + } + public static Cache clear() { get().cache.clear(); return get(); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java index dd1bf5bfc..c990bb6cc 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java @@ -18,7 +18,6 @@ import com.fongmi.android.tv.ui.activity.VodActivity; import com.fongmi.android.tv.ui.base.BaseFragment; import java.util.HashMap; -import java.util.List; import java.util.Optional; public class FolderFragment extends BaseFragment { @@ -63,10 +62,8 @@ public class FolderFragment extends BaseFragment { } private HashMap getExtend() { - List cache = Cache.get(mType); HashMap extend = new HashMap<>(); - for (Filter filter : cache) filter.getValue().forEach(value -> value.setActivated(false)); - for (Filter filter : cache) if (filter.getInit() != null) extend.put(filter.getKey(), filter.getInit()); + for (Filter filter : Cache.get(mType)) if (filter.getInit() != null) extend.put(filter.getKey(), filter.getInit()); return extend; } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java index 12d2e84d5..6eb032cdb 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java @@ -90,7 +90,7 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac } private List getFilter() { - return Cache.get(getTypeId()); + return Cache.copy(getTypeId()); } private Site getSite() { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Filter.java b/app/src/main/java/com/fongmi/android/tv/bean/Filter.java index 469a48165..3367e8477 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Filter.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Filter.java @@ -38,6 +38,9 @@ public class Filter implements Parcelable { return items == null ? Collections.emptyList() : items; } + public Filter() { + } + public String getKey() { return key; } @@ -64,6 +67,16 @@ public class Filter implements Parcelable { return this; } + public Filter copy() { + Filter copy = new Filter(); + copy.key = this.key; + copy.name = this.name; + copy.init = this.init; + copy.value = new ArrayList<>(); + getValue().forEach(item -> copy.value.add(item.copy())); + return copy; + } + public Filter trans() { if (Trans.pass()) return this; getValue().forEach(Value::trans); diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Value.java b/app/src/main/java/com/fongmi/android/tv/bean/Value.java index ef9d79280..f84b6f5c0 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Value.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Value.java @@ -64,6 +64,12 @@ public class Value implements Parcelable, Diffable { else activated = equal; } + public Value copy() { + Value copy = new Value(n, v); + copy.activated = this.activated; + return copy; + } + public Value trans() { this.n = Trans.s2t(n); return this; From 888ffb72eb79a477a9eca410321747de9e01f39d Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 27 Jan 2026 15:20:21 +0800 Subject: [PATCH 14/22] Update build.gradle --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e8a7a3126..15f3f47ba 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { minSdk 24 //noinspection ExpiredTargetSdkVersion targetSdk 28 - versionCode 514 - versionName "5.1.4" + versionCode 515 + versionName "5.1.5" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString(), "eventBusIndex": "com.fongmi.android.tv.event.EventIndex"] From 19dd91da301d20817a8ac54c8ab4d4b95d91e018 Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 28 Jan 2026 16:38:14 +0800 Subject: [PATCH 15/22] Update yt lib --- app/build.gradle | 6 +++--- build.gradle | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 15f3f47ba..8fad710b5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { minSdk 24 //noinspection ExpiredTargetSdkVersion targetSdk 28 - versionCode 515 - versionName "5.1.5" + versionCode 516 + versionName "5.1.6" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString(), "eventBusIndex": "com.fongmi.android.tv.event.EventIndex"] @@ -109,7 +109,7 @@ dependencies { implementation 'com.github.bumptech.glide:okhttp3-integration:' + glideVersion implementation 'com.github.jahirfiquitiva:TextDrawable:1.0.3' implementation 'com.github.mcxinyu:LibRtmp-Client-for-Android:v3.2.0.m2' - implementation 'com.github.teamnewpipe:NewPipeExtractor:v0.25.0' + implementation 'com.github.teamnewpipe:NewPipeExtractor:v0.25.1' implementation 'com.google.android.material:material:1.13.0' implementation 'com.guolindev.permissionx:permissionx:1.8.1' implementation 'javax.servlet:javax.servlet-api:3.1.0' diff --git a/build.gradle b/build.gradle index 7134cdc6c..df6f694ea 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,6 @@ tasks.register('clean', Delete) { project.ext { gsonVersion = '2.13.2' glideVersion = '5.0.5' - media3Version = '1.9.0' + media3Version = '1.9.1' okhttpVersion = '5.3.2' } From 2d26666f503dc04d6d0be5dc5e57f8ad5a6b3411 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 1 Feb 2026 14:12:45 +0800 Subject: [PATCH 16/22] Fix bug --- .../com/fongmi/android/tv/ui/activity/VideoActivity.java | 3 +++ app/src/main/java/com/fongmi/android/tv/utils/Util.java | 5 +++-- .../com/fongmi/android/tv/ui/activity/VideoActivity.java | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 6b47882e4..1ce088d3c 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1021,8 +1021,11 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void updateVod(Vod item) { + boolean id = !item.getId().isEmpty(); boolean pic = !item.getPic().isEmpty(); boolean name = !item.getName().isEmpty(); + if (id) getIntent().putExtra("id", item.getId()); + if (id) mHistory.setKey(getHistoryKey()); if (pic) mHistory.setVodPic(item.getPic()); if (name) mHistory.setVodName(item.getName()); if (name) mBinding.name.setText(item.getName()); diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Util.java b/app/src/main/java/com/fongmi/android/tv/utils/Util.java index 2a1b4ee2b..ba570275e 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Util.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Util.java @@ -120,9 +120,10 @@ public class Util { } public static String clean(String text) { + if (!text.contains("<")) return text; StringBuilder sb = new StringBuilder(); - text = Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY).toString().replace("\u00A0", "").replace("\u3000", ""); - for (String line : text.split("\\r?\\n")) if (!line.isEmpty()) sb.append(line.trim()).append("\n"); + text = Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY).toString().replace("\u00A0", " ").replace("\u3000", " "); + for (String line : text.split("\\r?\\n")) sb.append(line.trim()).append("\n"); return substring(sb.toString()); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index c8f037968..0b07fb687 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1122,8 +1122,11 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo } private void updateVod(Vod item) { + boolean id = !item.getId().isEmpty(); boolean pic = !item.getPic().isEmpty(); boolean name = !item.getName().isEmpty(); + if (id) getIntent().putExtra("id", item.getId()); + if (id) mHistory.setKey(getHistoryKey()); if (pic) mHistory.setVodPic(item.getPic()); if (name) mHistory.setVodName(item.getName()); if (name) mBinding.name.setText(item.getName()); From 40a822744db380aee60f0f88f58958facb7de22f Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 2 Feb 2026 12:05:56 +0800 Subject: [PATCH 17/22] Update build.gradle --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8fad710b5..f16830890 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { minSdk 24 //noinspection ExpiredTargetSdkVersion targetSdk 28 - versionCode 516 - versionName "5.1.6" + versionCode 517 + versionName "5.1.7" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString(), "eventBusIndex": "com.fongmi.android.tv.event.EventIndex"] From 990d9f4851537ab2551ccf13a443ddce9d868951 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 8 Feb 2026 23:47:37 +0800 Subject: [PATCH 18/22] Fix bug --- .../java/com/fongmi/quickjs/utils/Crypto.java | 35 +++---------------- 1 file changed, 5 insertions(+), 30 deletions(-) diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java index 809c2d840..8b9c4297d 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java @@ -7,9 +7,6 @@ import com.github.catvod.utils.Util; import java.nio.charset.StandardCharsets; import java.security.Key; import java.security.KeyFactory; -import java.security.PublicKey; -import java.security.interfaces.RSAPrivateKey; -import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Arrays; @@ -50,21 +47,13 @@ public class Crypto { public static String rsa(String mode, boolean pub, boolean encrypt, String input, boolean inBase64, String key, boolean outBase64) { try { Key rsaKey = generateKey(pub, key); - int len = getModulusLength(rsaKey); - byte[] outBytes = new byte[0]; byte[] inBytes = inBase64 ? Base64.decode(input.replaceAll("_", "/").replaceAll("-", "+"), Base64.DEFAULT) : input.getBytes(StandardCharsets.UTF_8); - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); + String tranformation = "RSA/ECB/PKCS1Padding"; + if ("RSA/PKCS1".equals(mode)) tranformation = "RSA/ECB/PKCS1Padding"; + else if ("RSA/None/NoPadding".equals(mode)) tranformation = "RSA/None/NoPadding"; + Cipher cipher = Cipher.getInstance(tranformation); cipher.init(encrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, rsaKey); - int blockLen = encrypt ? len / 8 - 11 : len / 8; - int bufIdx = 0; - while (bufIdx < inBytes.length) { - int bufEndIdx = Math.min(bufIdx + blockLen, inBytes.length); - byte[] tmpInBytes = new byte[bufEndIdx - bufIdx]; - System.arraycopy(inBytes, bufIdx, tmpInBytes, 0, tmpInBytes.length); - byte[] tmpBytes = cipher.doFinal(tmpInBytes); - bufIdx = bufEndIdx; - outBytes = concatArrays(outBytes, tmpBytes); - } + byte[] outBytes = cipher.doFinal(inBytes); return outBase64 ? Base64.encodeToString(outBytes, Base64.NO_WRAP) : new String(outBytes, StandardCharsets.UTF_8); } catch (Exception e) { e.printStackTrace(); @@ -77,18 +66,4 @@ public class Crypto { else key = key.replaceAll(System.lineSeparator(), "").replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", ""); return pub ? KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode(key, Base64.DEFAULT))) : KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(Base64.decode(key, Base64.DEFAULT))); } - - private static int getModulusLength(Key key) { - if (key instanceof PublicKey) return ((RSAPublicKey) key).getModulus().bitLength(); - else return ((RSAPrivateKey) key).getModulus().bitLength(); - } - - private static byte[] concatArrays(byte[] a, byte[] b) { - int aLen = a.length; - int bLen = b.length; - byte[] result = new byte[aLen + bLen]; - System.arraycopy(a, 0, result, 0, aLen); - System.arraycopy(b, 0, result, aLen, bLen); - return result; - } } From 89f6d9679af09d6dff5aea45d4e9476da4a366d6 Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 9 Feb 2026 00:29:18 +0800 Subject: [PATCH 19/22] Update gradle --- app/build.gradle | 4 ++-- build.gradle | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f16830890..31ec3b2e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { minSdk 24 //noinspection ExpiredTargetSdkVersion targetSdk 28 - versionCode 517 - versionName "5.1.7" + versionCode 518 + versionName "5.1.8" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString(), "eventBusIndex": "com.fongmi.android.tv.event.EventIndex"] diff --git a/build.gradle b/build.gradle index df6f694ea..923366d89 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,6 @@ tasks.register('clean', Delete) { project.ext { gsonVersion = '2.13.2' glideVersion = '5.0.5' - media3Version = '1.9.1' + media3Version = '1.9.2' okhttpVersion = '5.3.2' } From b152bcb4af0919c6b4fcb0fc8ccf7ca6aef2ebf9 Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 9 Feb 2026 12:11:33 +0800 Subject: [PATCH 20/22] Update Result.java --- app/src/main/java/com/fongmi/android/tv/bean/Result.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Result.java b/app/src/main/java/com/fongmi/android/tv/bean/Result.java index 596a50b4a..4b585e76e 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Result.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Result.java @@ -83,6 +83,8 @@ public class Result implements Parcelable { private String click; @SerializedName("key") private String key; + @SerializedName("lrc") + private String lrc; @SerializedName("position") private Long position; @SerializedName("pagecount") @@ -269,6 +271,10 @@ public class Result implements Parcelable { this.key = key; } + public String getLrc() { + return TextUtils.isEmpty(lrc) ? "" : lrc; + } + public Long getPosition() { return position; } From 97d5d88ebf793209dfc0b45aa94dadc187c6346a Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 16 Feb 2026 13:20:06 +0800 Subject: [PATCH 21/22] Update build.gradle --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 31ec3b2e0..1a1b7b77f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -109,7 +109,7 @@ dependencies { implementation 'com.github.bumptech.glide:okhttp3-integration:' + glideVersion implementation 'com.github.jahirfiquitiva:TextDrawable:1.0.3' implementation 'com.github.mcxinyu:LibRtmp-Client-for-Android:v3.2.0.m2' - implementation 'com.github.teamnewpipe:NewPipeExtractor:v0.25.1' + implementation 'com.github.teamnewpipe:NewPipeExtractor:v0.25.2' implementation 'com.google.android.material:material:1.13.0' implementation 'com.guolindev.permissionx:permissionx:1.8.1' implementation 'javax.servlet:javax.servlet-api:3.1.0' @@ -121,7 +121,7 @@ dependencies { implementation 'org.greenrobot:eventbus:3.3.1' implementation 'org.nanohttpd:nanohttpd:2.3.1' implementation('org.simpleframework:simple-xml:2.7.1') { exclude group: 'stax', module: 'stax-api' exclude group: 'xpp3', module: 'xpp3' } - implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.30' + implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.31' leanbackImplementation 'androidx.leanback:leanback:1.2.0' leanbackImplementation 'com.github.JessYanCoding:AndroidAutoSize:1.2.1' mobileImplementation 'androidx.biometric:biometric:1.1.0' From 447aac007e3e46d0a56c794b2e44ccb4063d1a3d Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 16 Feb 2026 13:20:21 +0800 Subject: [PATCH 22/22] Update build.gradle --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1a1b7b77f..00d352c74 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { minSdk 24 //noinspection ExpiredTargetSdkVersion targetSdk 28 - versionCode 518 - versionName "5.1.8" + versionCode 519 + versionName "5.1.9" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString(), "eventBusIndex": "com.fongmi.android.tv.event.EventIndex"]