Optimize header parse

pull/605/head
jhengazuji 5 months ago
parent 5885e41d97
commit 3d275fa02b
  1. 4
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java
  2. 19
      app/src/main/java/com/fongmi/android/tv/bean/Channel.java
  3. 22
      app/src/main/java/com/fongmi/android/tv/bean/Drm.java
  4. 14
      app/src/main/java/com/fongmi/android/tv/bean/Live.java
  5. 22
      app/src/main/java/com/fongmi/android/tv/bean/Parse.java
  6. 22
      app/src/main/java/com/fongmi/android/tv/bean/Result.java
  7. 19
      app/src/main/java/com/fongmi/android/tv/bean/Site.java
  8. 8
      app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java
  9. 12
      app/src/main/java/com/fongmi/android/tv/player/ParseJob.java
  10. 2
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  11. 4
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SearchFragment.java
  12. 20
      catvod/src/main/java/com/github/catvod/gson/MapAdapter.java
  13. 14
      catvod/src/main/java/com/github/catvod/net/OkHttp.java
  14. 6
      catvod/src/main/java/com/github/catvod/utils/Json.java

@ -32,9 +32,9 @@ import com.google.common.net.HttpHeaders;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Headers;
import okhttp3.Response;
public class SearchActivity extends BaseActivity implements WordAdapter.OnClickListener, RecordAdapter.OnClickListener, CustomKeyboard.Callback {
@ -101,7 +101,7 @@ public class SearchActivity extends BaseActivity implements WordAdapter.OnClickL
private void getHot() {
mBinding.word.setText(R.string.search_hot);
mWordAdapter.setItems(Word.objectFrom(Setting.getHot()).getData());
OkHttp.newCall("https://api.web.360kan.com/v1/rank?cat=1", Headers.of(HttpHeaders.REFERER, "https://www.360kan.com/rank/general")).enqueue(getCallback(true));
OkHttp.newCall("https://api.web.360kan.com/v1/rank?cat=1", Map.of(HttpHeaders.REFERER, "https://www.360kan.com/rank/general")).enqueue(getCallback(true));
}
private void getSuggest(String text) {

@ -8,15 +8,17 @@ import androidx.annotation.Nullable;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.R;
import com.github.catvod.gson.MapAdapter;
import com.fongmi.android.tv.utils.ImgUtil;
import com.fongmi.android.tv.utils.ResUtil;
import com.github.catvod.utils.Json;
import com.github.catvod.utils.Trans;
import com.google.common.net.HttpHeaders;
import com.google.gson.JsonElement;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@ -50,7 +52,8 @@ public class Channel {
@SerializedName("catchup")
private Catchup catchup;
@SerializedName("header")
private JsonElement header;
@JsonAdapter(MapAdapter.class)
private Map<String, String> header;
@SerializedName("parse")
private Integer parse;
@SerializedName("drm")
@ -197,11 +200,11 @@ public class Channel {
this.catchup = catchup;
}
public JsonElement getHeader() {
return header;
public Map<String, String> getHeader() {
return header == null ? new HashMap<>() : header;
}
public void setHeader(JsonElement header) {
public void setHeader(Map<String, String> header) {
this.header = header;
}
@ -310,8 +313,8 @@ public class Channel {
public void live(Live live) {
if (!live.getUa().isEmpty() && getUa().isEmpty()) setUa(live.getUa());
if (live.getHeader() != null && getHeader() == null) setHeader(live.getHeader());
if (!live.getClick().isEmpty() && getClick().isEmpty()) setClick(live.getClick());
if (!live.getHeader().isEmpty() && getHeader().isEmpty()) setHeader(live.getHeader());
if (!live.getOrigin().isEmpty() && getOrigin().isEmpty()) setOrigin(live.getOrigin());
if (!live.getCatchup().isEmpty() && getCatchup().isEmpty()) setCatchup(live.getCatchup());
if (!live.getReferer().isEmpty() && getReferer().isEmpty()) setReferer(live.getReferer());
@ -330,7 +333,7 @@ public class Channel {
}
public Map<String, String> getHeaders() {
Map<String, String> headers = Json.toMap(getHeader());
Map<String, String> headers = new HashMap<>(getHeader());
if (!getUa().isEmpty()) headers.put(HttpHeaders.USER_AGENT, getUa());
if (!getOrigin().isEmpty()) headers.put(HttpHeaders.ORIGIN, getOrigin());
if (!getReferer().isEmpty()) headers.put(HttpHeaders.REFERER, getReferer());
@ -366,7 +369,7 @@ public class Channel {
result.setClick(getClick());
result.setParse(getParse());
result.setFormat(getFormat());
result.setHeader(Json.toObject(getHeaders()));
result.setHeader(getHeaders());
return result;
}

@ -7,10 +7,12 @@ import androidx.media3.common.C;
import androidx.media3.common.MediaItem;
import com.fongmi.android.tv.App;
import com.github.catvod.utils.Json;
import com.google.gson.JsonElement;
import com.github.catvod.gson.MapAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class Drm {
@ -22,15 +24,17 @@ public class Drm {
@SerializedName("forceKey")
private boolean forceKey;
@SerializedName("header")
private JsonElement header;
@JsonAdapter(MapAdapter.class)
private Map<String, String> header;
public static Drm create(String key, String type) {
return new Drm(key, type);
public static Drm create(String key, String type, Map<String, String> header) {
return new Drm(key, type, header);
}
private Drm(String key, String type) {
private Drm(String key, String type, Map<String, String> header) {
this.key = key;
this.type = type;
this.header = header;
}
private String getKey() {
@ -45,8 +49,8 @@ public class Drm {
return forceKey;
}
private JsonElement getHeader() {
return header;
private Map<String, String> getHeader() {
return header == null ? new HashMap<>() : header;
}
public UUID getUUID() {
@ -59,8 +63,8 @@ public class Drm {
public MediaItem.DrmConfiguration get() {
MediaItem.DrmConfiguration.Builder builder = new MediaItem.DrmConfiguration.Builder(getUUID());
builder.setMultiSession(!C.CLEARKEY_UUID.equals(getUUID()));
builder.setLicenseRequestHeaders(Json.toMap(getHeader()));
builder.setForceDefaultLicenseUri(isForceKey());
builder.setLicenseRequestHeaders(getHeader());
builder.setLicenseUri(getKey());
return builder.build();
}

@ -14,9 +14,9 @@ import com.fongmi.android.tv.R;
import com.fongmi.android.tv.api.loader.BaseLoader;
import com.fongmi.android.tv.db.AppDatabase;
import com.fongmi.android.tv.gson.ExtAdapter;
import com.github.catvod.gson.MapAdapter;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.crawler.Spider;
import com.github.catvod.utils.Json;
import com.github.catvod.utils.Trans;
import com.google.common.net.HttpHeaders;
import com.google.gson.JsonElement;
@ -24,6 +24,7 @@ import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@ -45,8 +46,8 @@ public class Live {
private String api;
@Ignore
@JsonAdapter(ExtAdapter.class)
@SerializedName("ext")
@JsonAdapter(ExtAdapter.class)
private String ext;
@Ignore
@ -90,7 +91,8 @@ public class Live {
@Ignore
@SerializedName("header")
private JsonElement header;
@JsonAdapter(MapAdapter.class)
private Map<String, String> header;
@Ignore
@SerializedName("catchup")
@ -220,8 +222,8 @@ public class Live {
return timeout == null ? Constant.TIMEOUT_PLAY : TimeUnit.SECONDS.toMillis(Math.max(timeout, 1));
}
public JsonElement getHeader() {
return header;
public Map<String, String> getHeader() {
return header == null ? new HashMap<>() : header;
}
public Catchup getCatchup() {
@ -346,7 +348,7 @@ public class Live {
}
public Map<String, String> getHeaders() {
Map<String, String> headers = Json.toMap(getHeader());
Map<String, String> headers = new HashMap<>(getHeader());
if (!getUa().isEmpty()) headers.put(HttpHeaders.USER_AGENT, getUa());
if (!getOrigin().isEmpty()) headers.put(HttpHeaders.ORIGIN, getOrigin());
if (!getReferer().isEmpty()) headers.put(HttpHeaders.REFERER, getReferer());

@ -7,12 +7,13 @@ import androidx.annotation.Nullable;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.R;
import com.github.catvod.gson.MapAdapter;
import com.fongmi.android.tv.impl.Diffable;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.utils.Json;
import com.github.catvod.utils.Util;
import com.google.gson.JsonElement;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import java.util.Collections;
@ -100,12 +101,12 @@ public class Parse implements Diffable<Parse> {
this.click = click;
}
public Map<String, String> getHeaders() {
return Json.toMap(getExt().getHeader());
public Map<String, String> getHeader() {
return getExt().getHeader();
}
public void setHeader(JsonElement header) {
if (getExt().getHeader() == null) getExt().setHeader(header);
public void setHeader(Map<String, String> header) {
if (getExt().getHeader().isEmpty()) getExt().setHeader(header);
}
public boolean isEmpty() {
@ -153,7 +154,8 @@ public class Parse implements Diffable<Parse> {
@SerializedName("flag")
private List<String> flag;
@SerializedName("header")
private JsonElement header;
@JsonAdapter(MapAdapter.class)
private Map<String, String> header;
public void setFlag(List<String> flag) {
this.flag = flag;
@ -163,16 +165,16 @@ public class Parse implements Diffable<Parse> {
return flag == null ? Collections.emptyList() : flag;
}
public JsonElement getHeader() {
return header;
public Map<String, String> getHeader() {
return header == null ? new HashMap<>() : header;
}
public void setHeader(JsonElement header) {
public void setHeader(Map<String, String> header) {
this.header = header;
}
public boolean isEmpty() {
return flag == null && header == null;
return getFlag().isEmpty() && getHeader().isEmpty();
}
@NonNull

@ -10,12 +10,11 @@ import com.fongmi.android.tv.App;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.gson.DanmakuAdapter;
import com.fongmi.android.tv.gson.FilterAdapter;
import com.github.catvod.gson.MapAdapter;
import com.fongmi.android.tv.gson.MsgAdapter;
import com.fongmi.android.tv.gson.UrlAdapter;
import com.fongmi.android.tv.utils.Util;
import com.github.catvod.utils.Json;
import com.github.catvod.utils.Trans;
import com.google.gson.JsonElement;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
@ -28,6 +27,7 @@ import org.simpleframework.xml.core.Persister;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@ -49,6 +49,10 @@ public class Result implements Parcelable {
@JsonAdapter(FilterAdapter.class)
private LinkedHashMap<String, List<Filter>> filters;
@SerializedName("header")
@JsonAdapter(MapAdapter.class)
private Map<String, String> header;
@SerializedName("url")
@JsonAdapter(UrlAdapter.class)
private Url url;
@ -63,8 +67,6 @@ public class Result implements Parcelable {
@SerializedName("subs")
private List<Sub> subs;
@SerializedName("header")
private JsonElement header;
@SerializedName("playUrl")
private String playUrl;
@SerializedName("jxFrom")
@ -199,12 +201,12 @@ public class Result implements Parcelable {
return subs == null ? new ArrayList<>() : new ArrayList<>(subs);
}
public JsonElement getHeader() {
return header;
public Map<String, String> getHeader() {
return header == null ? new HashMap<>() : header;
}
public void setHeader(JsonElement header) {
if (getHeader() == null) this.header = header;
public void setHeader(Map<String, String> header) {
if (getHeader().isEmpty()) this.header = header;
}
public String getPlayUrl() {
@ -295,10 +297,6 @@ public class Result implements Parcelable {
return getPlayUrl() + getUrl().v();
}
public Map<String, String> getHeaders() {
return Json.toMap(getHeader());
}
public Style getStyle(Style style) {
return getList().isEmpty() ? Style.rect() : getList().get(0).getStyle(style);
}

@ -15,21 +15,21 @@ import com.fongmi.android.tv.Constant;
import com.fongmi.android.tv.api.loader.BaseLoader;
import com.fongmi.android.tv.db.AppDatabase;
import com.fongmi.android.tv.gson.ExtAdapter;
import com.github.catvod.gson.MapAdapter;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.crawler.Spider;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Json;
import com.github.catvod.utils.Trans;
import com.google.gson.JsonElement;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Headers;
@Entity
public class Site implements Parcelable {
@ -47,8 +47,8 @@ public class Site implements Parcelable {
private String api;
@Ignore
@JsonAdapter(ExtAdapter.class)
@SerializedName("ext")
@JsonAdapter(ExtAdapter.class)
private String ext;
@Ignore
@ -95,7 +95,8 @@ public class Site implements Parcelable {
@Ignore
@SerializedName("header")
private JsonElement header;
@JsonAdapter(MapAdapter.class)
private Map<String, String> header;
@Ignore
@SerializedName("style")
@ -218,8 +219,8 @@ public class Site implements Parcelable {
this.categories = categories;
}
public JsonElement getHeader() {
return header;
public Map<String, String> getHeader() {
return header == null ? new HashMap<>() : header;
}
public Style getStyle() {
@ -276,10 +277,6 @@ public class Site implements Parcelable {
return getKey().isEmpty() && getName().isEmpty();
}
public Headers getHeaders() {
return Headers.of(Json.toMap(getHeader()));
}
public Site fetchExt() {
if (!getExt().startsWith("http")) return this;
String extend = OkHttp.string(getExt());

@ -100,7 +100,7 @@ public class SiteViewModel extends ViewModel {
SpiderDebug.log("home", homeContent);
return Result.fromJson(homeContent);
} else {
try (Response response = OkHttp.newCall(site.getApi(), site.getHeaders()).execute()) {
try (Response response = OkHttp.newCall(site.getApi(), site.getHeader()).execute()) {
String homeContent = response.body().string();
SpiderDebug.log("home", homeContent);
return fetchPic(site, Result.fromType(site.getType(), homeContent));
@ -235,8 +235,8 @@ public class SiteViewModel extends ViewModel {
public String call(Site site, ArrayMap<String, String> params) throws IOException {
if (!site.getExt().isEmpty()) params.put("extend", site.getExt());
Call get = OkHttp.newCall(site.getApi(), site.getHeaders(), params);
Call post = OkHttp.newCall(site.getApi(), site.getHeaders(), OkHttp.toBody(params));
Call get = OkHttp.newCall(site.getApi(), site.getHeader(), params);
Call post = OkHttp.newCall(site.getApi(), site.getHeader(), OkHttp.toBody(params));
try (Response response = (site.getExt().length() <= 1000 ? get : post).execute()) {
return response.body().string();
}
@ -251,7 +251,7 @@ public class SiteViewModel extends ViewModel {
ArrayMap<String, String> params = new ArrayMap<>();
params.put("ac", site.getType() == 0 ? "videolist" : "detail");
params.put("ids", TextUtils.join(",", ids));
try (Response response = OkHttp.newCall(site.getApi(), site.getHeaders(), params).execute()) {
try (Response response = OkHttp.newCall(site.getApi(), site.getHeader(), params).execute()) {
result.setList(Result.fromType(site.getType(), response.body().string()).getList());
return result;
}

@ -30,7 +30,6 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import okhttp3.Headers;
import okhttp3.Response;
public class ParseJob implements ParseCallback {
@ -114,7 +113,7 @@ public class ParseJob implements ParseCallback {
}
private void jsonParse(Parse item, String webUrl, boolean error) throws Exception {
try (Response res = OkHttp.newCall(item.getUrl() + webUrl, Headers.of(item.getHeaders())).execute()) {
try (Response res = OkHttp.newCall(item.getUrl() + webUrl, item.getHeader()).execute()) {
JsonObject object = Json.parse(res.body().string()).getAsJsonObject();
String url = Json.safeString(object, "url");
JsonObject data = object.getAsJsonObject("data");
@ -167,8 +166,8 @@ public class ParseJob implements ParseCallback {
private void checkResult(Result result) {
result.setHeader(parse.getExt().getHeader());
if (result.getUrl().isEmpty()) onParseError();
else if (result.getParse() == 1) startWeb(result.getHeaders(), UrlUtil.convert(result.getUrl().v()));
else onParseSuccess(result.getHeaders(), result.getUrl().v(), result.getJxFrom());
else if (result.getParse() == 1) startWeb(result.getHeader(), UrlUtil.convert(result.getUrl().v()));
else onParseSuccess(result.getHeader(), result.getUrl().v(), result.getJxFrom());
}
private void startWeb(List<Parse> items, String webUrl) {
@ -178,7 +177,7 @@ public class ParseJob implements ParseCallback {
}
private void startWeb(String key, Parse item, String webUrl) {
startWeb(key, item.getName(), item.getHeaders(), item.getUrl() + webUrl, item.getClick());
startWeb(key, item.getName(), item.getHeader(), item.getUrl() + webUrl, item.getClick());
}
private void startWeb(Map<String, String> headers, String url) {
@ -196,8 +195,7 @@ public class ParseJob implements ParseCallback {
private Map<String, String> getHeader(JsonObject object) {
Map<String, String> headers = new HashMap<>();
for (Map.Entry<String, JsonElement> entry : object.entrySet()) if (!entry.getValue().isJsonNull() && (entry.getKey().equalsIgnoreCase(HttpHeaders.USER_AGENT) || entry.getKey().equalsIgnoreCase(HttpHeaders.REFERER) || entry.getKey().equalsIgnoreCase(HttpHeaders.COOKIE) || entry.getKey().equalsIgnoreCase("ua"))) headers.put(UrlUtil.fixHeader(entry.getKey()), entry.getValue().getAsString());
if (headers.isEmpty()) return parse.getHeaders();
return headers;
return !headers.isEmpty() ? headers : parse.getHeader();
}
@Override

@ -470,7 +470,7 @@ public class Players implements Player.Listener, ParseCallback {
}
private void setMediaItem(Result result, long timeout) {
setMediaItem(result.getHeaders(), result.getRealUrl(), result.getFormat(), result.getDrm(), result.getSubs(), result.getDanmaku(), timeout);
setMediaItem(result.getHeader(), result.getRealUrl(), result.getFormat(), result.getDrm(), result.getSubs(), result.getDanmaku(), timeout);
}
private void setMediaItem(Map<String, String> headers, String url, String format, Drm drm, List<Sub> subs, List<Danmaku> danmakus, long timeout) {

@ -41,10 +41,10 @@ import com.google.common.net.HttpHeaders;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Map;
import java.util.Optional;
import okhttp3.Call;
import okhttp3.Headers;
import okhttp3.Response;
public class SearchFragment extends BaseFragment implements MenuProvider, WordAdapter.OnClickListener, RecordAdapter.OnClickListener {
@ -157,7 +157,7 @@ public class SearchFragment extends BaseFragment implements MenuProvider, WordAd
private void getHot() {
mBinding.word.setText(R.string.search_hot);
mWordAdapter.setItems(Word.objectFrom(Setting.getHot()).getData());
OkHttp.newCall("https://api.web.360kan.com/v1/rank?cat=1", Headers.of(HttpHeaders.REFERER, "https://www.360kan.com/rank/general")).enqueue(getCallback(true));
OkHttp.newCall("https://api.web.360kan.com/v1/rank?cat=1", Map.of(HttpHeaders.REFERER, "https://www.360kan.com/rank/general")).enqueue(getCallback(true));
}
private void getSuggest(String text) {

@ -0,0 +1,20 @@
package com.github.catvod.gson;
import com.github.catvod.utils.Json;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
public class MapAdapter implements JsonDeserializer<Map<String, String>> {
@Override
public Map<String, String> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json.isJsonObject() || json.isJsonPrimitive()) return Json.toMap(json);
return new HashMap<>();
}
}

@ -127,7 +127,7 @@ public class OkHttp {
public static String string(String url, Map<String, String> headers) {
if (!url.startsWith("http")) return "";
try (Response res = newCall(url, Headers.of(headers)).execute()) {
try (Response res = newCall(url, headers).execute()) {
return res.body().string();
} catch (Exception e) {
e.printStackTrace();
@ -151,16 +151,16 @@ public class OkHttp {
return client.newCall(new Request.Builder().url(url).tag(tag).build());
}
public static Call newCall(String url, Headers headers) {
return client().newCall(new Request.Builder().url(url).headers(headers).build());
public static Call newCall(String url, Map<String, String> headers) {
return client().newCall(new Request.Builder().url(url).headers(Headers.of(headers)).build());
}
public static Call newCall(String url, Headers headers, ArrayMap<String, String> params) {
return client().newCall(new Request.Builder().url(buildUrl(url, params)).headers(headers).build());
public static Call newCall(String url, Map<String, String> headers, ArrayMap<String, String> params) {
return client().newCall(new Request.Builder().url(buildUrl(url, params)).headers(Headers.of(headers)).build());
}
public static Call newCall(String url, Headers headers, RequestBody body) {
return client().newCall(new Request.Builder().url(url).headers(headers).post(body).build());
public static Call newCall(String url, Map<String, String> headers, RequestBody body) {
return client().newCall(new Request.Builder().url(url).headers(Headers.of(headers)).post(body).build());
}
public static Call newCall(OkHttpClient client, String url, RequestBody body) {

@ -96,10 +96,4 @@ public class Json {
for (Map.Entry<String, JsonElement> entry : object.entrySet()) map.put(entry.getKey(), safeString(object, entry.getKey()));
return map;
}
public static JsonObject toObject(Map<String, String> map) {
JsonObject object = new JsonObject();
for (String key : map.keySet()) object.addProperty(key, map.get(key));
return object;
}
}

Loading…
Cancel
Save