From d2ebbeaea6097748673a28d55ba51c815664a073 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 29 Feb 2024 01:13:10 +0800 Subject: [PATCH] Add cookie jar --- .../java/com/fongmi/android/tv/bean/Url.java | 14 +++++ .../fongmi/android/tv/gson/UrlAdapter.java | 8 ++- .../com/github/catvod/crawler/Spider.java | 2 +- .../java/com/github/catvod/net/OkHttp.java | 4 +- ...ultInterceptor.java => OkInterceptor.java} | 4 +- .../catvod/net/cookie/MemoryCookieJar.java | 52 +++++++++++++++++++ .../catvod/net/cookie/WrappedCookie.java | 48 +++++++++++++++++ 7 files changed, 125 insertions(+), 7 deletions(-) rename catvod/src/main/java/com/github/catvod/net/{interceptor/DefaultInterceptor.java => OkInterceptor.java} (96%) create mode 100644 catvod/src/main/java/com/github/catvod/net/cookie/MemoryCookieJar.java create mode 100644 catvod/src/main/java/com/github/catvod/net/cookie/WrappedCookie.java diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Url.java b/app/src/main/java/com/fongmi/android/tv/bean/Url.java index 448ff3e1b..ae7f64059 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Url.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Url.java @@ -2,14 +2,28 @@ package com.fongmi.android.tv.bean; import android.text.TextUtils; +import com.fongmi.android.tv.App; +import com.google.gson.JsonElement; +import com.google.gson.annotations.SerializedName; + import java.util.ArrayList; import java.util.List; public class Url { + @SerializedName("values") private List values; + @SerializedName("position") private int position; + public static Url objectFrom(JsonElement element) { + try { + return App.gson().fromJson(element, Url.class); + } catch (Exception e) { + return create(); + } + } + public static Url create() { return new Url(); } diff --git a/app/src/main/java/com/fongmi/android/tv/gson/UrlAdapter.java b/app/src/main/java/com/fongmi/android/tv/gson/UrlAdapter.java index d3e4dfc70..0b976ade9 100644 --- a/app/src/main/java/com/fongmi/android/tv/gson/UrlAdapter.java +++ b/app/src/main/java/com/fongmi/android/tv/gson/UrlAdapter.java @@ -13,9 +13,13 @@ public class UrlAdapter implements JsonDeserializer { @Override public Url deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + if (json.isJsonArray()) return convert(json.getAsJsonArray()); + if (json.isJsonObject()) return Url.objectFrom(json); + return Url.create().add(json.getAsString()); + } + + private Url convert(JsonArray array) { Url url = Url.create(); - if (!json.isJsonArray()) return url.add(json.getAsString()); - JsonArray array = json.getAsJsonArray(); for (int i = 0; i < array.size(); i += 2) url.add(array.get(i).getAsString(), array.get(i + 1).getAsString()); return url; } diff --git a/catvod/src/main/java/com/github/catvod/crawler/Spider.java b/catvod/src/main/java/com/github/catvod/crawler/Spider.java index 358229e5d..df3efb161 100644 --- a/catvod/src/main/java/com/github/catvod/crawler/Spider.java +++ b/catvod/src/main/java/com/github/catvod/crawler/Spider.java @@ -67,7 +67,7 @@ public abstract class Spider { return OkHttp.dns(); } - public OkHttpClient client() { + public static OkHttpClient client() { return OkHttp.client(); } } diff --git a/catvod/src/main/java/com/github/catvod/net/OkHttp.java b/catvod/src/main/java/com/github/catvod/net/OkHttp.java index ff10e20fe..74c2ea44b 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkHttp.java +++ b/catvod/src/main/java/com/github/catvod/net/OkHttp.java @@ -5,7 +5,7 @@ import android.text.TextUtils; import androidx.collection.ArrayMap; import com.github.catvod.bean.Doh; -import com.github.catvod.net.interceptor.DefaultInterceptor; +import com.github.catvod.net.cookie.MemoryCookieJar; import com.github.catvod.utils.Path; import java.net.ProxySelector; @@ -132,7 +132,7 @@ public class OkHttp { } private static OkHttpClient.Builder getBuilder() { - OkHttpClient.Builder builder = new OkHttpClient.Builder().addNetworkInterceptor(new DefaultInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier((hostname, session) -> true).sslSocketFactory(new SSLCompat(), SSLCompat.TM); + OkHttpClient.Builder builder = new OkHttpClient.Builder().addNetworkInterceptor(new OkInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier((hostname, session) -> true).followRedirects(true).cookieJar(new MemoryCookieJar()).sslSocketFactory(new SSLCompat(), SSLCompat.TM); builder.proxySelector(get().proxy ? selector() : defaultSelector); return builder; } diff --git a/catvod/src/main/java/com/github/catvod/net/interceptor/DefaultInterceptor.java b/catvod/src/main/java/com/github/catvod/net/OkInterceptor.java similarity index 96% rename from catvod/src/main/java/com/github/catvod/net/interceptor/DefaultInterceptor.java rename to catvod/src/main/java/com/github/catvod/net/OkInterceptor.java index 4814accd5..9401db592 100644 --- a/catvod/src/main/java/com/github/catvod/net/interceptor/DefaultInterceptor.java +++ b/catvod/src/main/java/com/github/catvod/net/OkInterceptor.java @@ -1,4 +1,4 @@ -package com.github.catvod.net.interceptor; +package com.github.catvod.net; import android.net.Uri; @@ -22,7 +22,7 @@ import okhttp3.ResponseBody; import okio.BufferedSource; import okio.Okio; -public class DefaultInterceptor implements Interceptor { +public class OkInterceptor implements Interceptor { @NonNull @Override diff --git a/catvod/src/main/java/com/github/catvod/net/cookie/MemoryCookieJar.java b/catvod/src/main/java/com/github/catvod/net/cookie/MemoryCookieJar.java new file mode 100644 index 000000000..a0b71b8af --- /dev/null +++ b/catvod/src/main/java/com/github/catvod/net/cookie/MemoryCookieJar.java @@ -0,0 +1,52 @@ +package com.github.catvod.net.cookie; + +import android.text.TextUtils; +import android.webkit.CookieManager; + +import androidx.annotation.NonNull; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import okhttp3.Cookie; +import okhttp3.CookieJar; +import okhttp3.HttpUrl; + +public class MemoryCookieJar implements CookieJar { + + private final Set cache; + private final CookieManager manager; + + public MemoryCookieJar() { + cache = new HashSet<>(); + manager = CookieManager.getInstance(); + } + + @NonNull + @Override + public synchronized List loadForRequest(@NonNull HttpUrl url) { + List items = new ArrayList<>(); + for (WrappedCookie item : cache) if (item.isExpired()) cache.remove(item); + for (WrappedCookie item : cache) if (item.matches(url)) items.add(item.unwrap()); + items.addAll(fromManager(url)); + return items; + } + + @Override + public synchronized void saveFromResponse(@NonNull HttpUrl url, List cookies) { + List items = new ArrayList<>(); + for (Cookie cookie : cookies) items.add(WrappedCookie.wrap(cookie)); + for (Cookie cookie : cookies) manager.setCookie(url.toString(), cookie.toString()); + cache.removeAll(items); + cache.addAll(items); + } + + private List fromManager(HttpUrl url) { + List items = new ArrayList<>(); + String cookie = manager.getCookie(url.toString()); + if (!TextUtils.isEmpty(cookie)) for (String split : cookie.split(";")) items.add(Cookie.parse(url, split)); + return items; + } +} diff --git a/catvod/src/main/java/com/github/catvod/net/cookie/WrappedCookie.java b/catvod/src/main/java/com/github/catvod/net/cookie/WrappedCookie.java new file mode 100644 index 000000000..1d34114ea --- /dev/null +++ b/catvod/src/main/java/com/github/catvod/net/cookie/WrappedCookie.java @@ -0,0 +1,48 @@ +package com.github.catvod.net.cookie; + +import okhttp3.Cookie; +import okhttp3.HttpUrl; + +public class WrappedCookie { + + private final Cookie cookie; + + public static WrappedCookie wrap(Cookie cookie) { + return new WrappedCookie(cookie); + } + + private WrappedCookie(Cookie cookie) { + this.cookie = cookie; + } + + public Cookie unwrap() { + return cookie; + } + + public boolean isExpired() { + return cookie.expiresAt() < System.currentTimeMillis(); + } + + public boolean matches(HttpUrl url) { + return cookie.matches(url); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof WrappedCookie)) return false; + WrappedCookie it = (WrappedCookie) obj; + return cookie.name().equals(it.cookie.name()) && cookie.domain().equals(it.cookie.domain()) && cookie.path().equals(it.cookie.path()) && cookie.secure() == it.cookie.secure() && cookie.hostOnly() == it.cookie.hostOnly(); + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + cookie.name().hashCode(); + result = 31 * result + cookie.domain().hashCode(); + result = 31 * result + cookie.path().hashCode(); + result = 31 * result + (cookie.secure() ? 0 : 1); + result = 31 * result + (cookie.hostOnly() ? 0 : 1); + return result; + } +}