diff --git a/app/src/main/java/com/github/catvod/bean/Vod.java b/app/src/main/java/com/github/catvod/bean/Vod.java index eedda88a..4f6df77c 100644 --- a/app/src/main/java/com/github/catvod/bean/Vod.java +++ b/app/src/main/java/com/github/catvod/bean/Vod.java @@ -42,6 +42,14 @@ public class Vod { setVodRemarks(vodRemarks); } + public Vod(String vodId, String vodName, String vodPic, String vodRemarks, String vodTag) { + setVodId(vodId); + setVodName(vodName); + setVodPic(vodPic); + setVodRemarks(vodRemarks); + setVodTag(vodTag); + } + public void setTypeName(String typeName) { this.typeName = Trans.get(typeName); } @@ -50,6 +58,10 @@ public class Vod { this.vodId = vodId; } + public String getVodName() { + return vodName; + } + public void setVodName(String vodName) { this.vodName = Trans.get(vodName); } @@ -87,7 +99,7 @@ public class Vod { } public void setVodPlayUrl(String vodPlayUrl) { - this.vodPlayUrl = Trans.get(vodPlayUrl); + this.vodPlayUrl = vodPlayUrl; } public void setVodTag(String vodTag) { diff --git a/app/src/main/java/com/github/catvod/bean/alist/Item.java b/app/src/main/java/com/github/catvod/bean/alist/Item.java new file mode 100644 index 00000000..ecedced4 --- /dev/null +++ b/app/src/main/java/com/github/catvod/bean/alist/Item.java @@ -0,0 +1,113 @@ +package com.github.catvod.bean.alist; + +import android.text.TextUtils; + +import com.github.catvod.bean.Vod; +import com.github.catvod.utils.Misc; +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +public class Item { + + @SerializedName("name") + private String name; + @SerializedName("type") + private int type; + @SerializedName("size") + private long size; + @SerializedName(value = "thumb", alternate = "thumbnail") + private String thumb; + @SerializedName(value = "url", alternate = "raw_url") + private String url; + @SerializedName(value = "modified", alternate = "updated_at") + private String modified; + + public static Item objectFrom(String str) { + return new Gson().fromJson(str, Item.class); + } + + public static List arrayFrom(String str) { + Type listType = new TypeToken>() {}.getType(); + return new Gson().fromJson(str, listType); + } + + public String getName() { + return name; + } + + public int getType() { + return type; + } + + public long getSize() { + return size; + } + + public String getThumb() { + return thumb; + } + + public String getUrl() { + return TextUtils.isEmpty(url) ? "" : url.startsWith("//") ? "http:" + url : url; + } + + public String getModified() { + return modified; + } + + public Date getDate() { + try { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.getDefault()); + return format.parse(getModified()); + } catch (Exception e) { + return new Date(); + } + } + + public boolean isFolder() { + return getType() == 1; + } + + public boolean isMedia() { + return getType() == 2 || getType() == 3 || getType() == 4 || getType() == 6; + } + + public boolean isSub() { + return getType() == 5 && Misc.isSub(getExt()); + } + + public boolean ignore() { + return !isFolder() && !isMedia() && !isSub(); + } + + public String getExt() { + return getName().substring(getName().lastIndexOf(".") + 1); + } + + public String getVodId(String tid) { + return tid + "/" + getName(); + } + + public String getPic() { + return getThumb().isEmpty() && isFolder() ? "http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png" : getThumb(); + } + + public String getRemark() { + return Misc.getSize(getSize()) + (isFolder() ? " 文件夹" : ""); + } + + public String getVodTag() { + return isFolder() ? "folder" : "file"; + } + + public Vod getVod(String tid) { + return new Vod(getVodId(tid), getName(), getPic(), getRemark(), getVodTag()); + } +} diff --git a/app/src/main/java/com/github/catvod/bean/alist/Sorter.java b/app/src/main/java/com/github/catvod/bean/alist/Sorter.java new file mode 100644 index 00000000..5b4fb2ef --- /dev/null +++ b/app/src/main/java/com/github/catvod/bean/alist/Sorter.java @@ -0,0 +1,32 @@ +package com.github.catvod.bean.alist; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class Sorter implements Comparator { + + private final String type; + + public static void sort(String type, List items) { + Collections.sort(items, new Sorter(type)); + } + + public Sorter(String type) { + this.type = type; + } + + @Override + public int compare(Item o1, Item o2) { + switch (type) { + case "name": + return o1.getName().compareTo(o2.getName()); + case "size": + return Long.compare(o1.getSize(), o2.getSize()); + case "date": + return o1.getDate().compareTo(o2.getDate()); + default: + return -1; + } + } +} diff --git a/app/src/main/java/com/github/catvod/spider/AList.java b/app/src/main/java/com/github/catvod/spider/AList.java index 6548387f..a227a95d 100644 --- a/app/src/main/java/com/github/catvod/spider/AList.java +++ b/app/src/main/java/com/github/catvod/spider/AList.java @@ -1,12 +1,17 @@ package com.github.catvod.spider; import android.content.Context; +import android.text.TextUtils; import com.github.catvod.bean.Class; +import com.github.catvod.bean.Filter; import com.github.catvod.bean.Result; import com.github.catvod.bean.Vod; +import com.github.catvod.bean.alist.Item; +import com.github.catvod.bean.alist.Sorter; import com.github.catvod.crawler.Spider; import com.github.catvod.net.OkHttpUtil; +import com.github.catvod.utils.Misc; import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; @@ -14,17 +19,19 @@ import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; -import java.util.Locale; import java.util.Map; +import java.util.Objects; public class AList extends Spider { + private LinkedHashMap ext; + private Map> sub; private Map map; - private JSONObject ext; private boolean isJson(String json) { try { @@ -35,18 +42,6 @@ public class AList extends Spider { } } - @Override - public void init(Context context, String extend) { - try { - map = new HashMap<>(); - ext = new JSONObject(); - if (extend.startsWith("http")) extend = OkHttpUtil.string(extend); - if (isJson(extend)) parseJson(extend); - else parseText(extend); - } catch (Exception ignored) { - } - } - private void parseJson(String extend) throws Exception { JSONObject object = new JSONObject(extend); JSONArray array = object.names(); @@ -56,106 +51,142 @@ public class AList extends Spider { } } - private void parseText(String extend) throws Exception { + private void parseText(String extend) { String[] array = extend.split("#"); for (String text : array) { String[] arr = text.split("\\$"); - if (arr.length == 1) { - ext.put("alist", arr[0]); - } else if (arr.length == 2) { - ext.put(arr[0], arr[1]); - } + if (arr.length == 2) ext.put(arr[0], arr[1]); } } - private String getVersion(String name) throws Exception { - if (!map.containsKey(name)) map.put(name, OkHttpUtil.string(ext.getString(name) + "/api/public/settings").contains("v3.") ? "3" : "2"); + private String getVersion(String name) { + if (!map.containsKey(name)) map.put(name, OkHttpUtil.string(ext.get(name) + "/api/public/settings").contains("v3.") ? "3" : "2"); return map.get(name); } + @Override + public void init(Context context, String extend) { + try { + map = new HashMap<>(); + ext = new LinkedHashMap<>(); + if (extend.startsWith("http")) extend = OkHttpUtil.string(extend); + if (isJson(extend)) parseJson(extend); + else parseText(extend); + } catch (Exception ignored) { + } + } + @Override public String homeContent(boolean filter) { List classes = new ArrayList<>(); - Iterator keys = this.ext.keys(); - while (keys.hasNext()) { - String key = keys.next(); - classes.add(new Class(key + "$/", key, "1")); - } - return Result.string(classes, Collections.emptyList()); + LinkedHashMap> filters = new LinkedHashMap<>(); + for (String entry : ext.keySet()) classes.add(new Class(entry, entry, "1")); + for (Class item : classes) filters.put(item.getTypeId(), Arrays.asList(new Filter("type", "排序", Arrays.asList(new Filter.Value("名稱", "name"), new Filter.Value("大小", "size"), new Filter.Value("修改時間", "date"))))); + return Result.string(classes, filters); } @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) throws Exception { - int index = tid.indexOf('$'); - String name = tid.substring(0, index); - String path = tid.substring(index + 1); - boolean v3 = getVersion(name).equals("3"); - String url = ext.getString(name) + (v3 ? "/api/fs/list" : "/api/public/path"); - JSONObject params = new JSONObject(); - params.put("path", path); - String response = OkHttpUtil.postJson(url, params.toString()); - JSONArray array = new JSONObject(response).getJSONObject("data").getJSONArray(v3 ? "content" : "files"); + public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { + String type = extend.containsKey("type") ? extend.get("type") : ""; + List folders = new ArrayList<>(); + List files = new ArrayList<>(); List list = new ArrayList<>(); - for (int i = 0; i < array.length(); ++i) { - JSONObject o = array.getJSONObject(i); - String pic = o.getString(v3 ? "thumb" : "thumbnail"); - boolean folder = o.getInt("type") == 1; - if (pic.isEmpty() && folder) pic = "http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png"; - Vod vod = new Vod(); - vod.setVodId(tid + (tid.charAt(tid.length() - 1) == '/' ? "" : "/") + o.getString("name")); - vod.setVodName(o.getString("name")); - vod.setVodPic(pic); - vod.setVodTag(folder ? "folder" : "file"); - String size = getSize(o.getLong("size")); - vod.setVodRemarks(folder ? size + " 文件夹" : size); - list.add(vod); + sub = new HashMap<>(); + for (Item item : getList(tid)) { + if (item.ignore()) continue; + if (item.isSub()) addSub(tid, item); + else if (item.isFolder()) folders.add(item); + else files.add(item); } + Sorter.sort(type, folders); + Sorter.sort(type, files); + for (Item item : folders) list.add(item.getVod(tid)); + for (Item item : files) list.add(item.getVod(tid)); return Result.string(list); } @Override - public String detailContent(List ids) throws Exception { + public String detailContent(List ids) { String tid = ids.get(0); - int index = tid.indexOf('$'); - String name = tid.substring(0, index); - String path = tid.substring(index + 1); - boolean v3 = getVersion(name).equals("3"); - String url = ext.getString(name) + (v3 ? "/api/fs/get" : "/api/public/path"); - JSONObject params = new JSONObject(); - params.put("path", path); - String response = OkHttpUtil.postJson(url, params.toString()); - JSONObject data = v3 ? new JSONObject(response).getJSONObject("data") : new JSONObject(response).getJSONObject("data").getJSONArray("files").getJSONObject(0); - url = data.getString(v3 ? "raw_url" : "url"); - if (url.indexOf("//") == 0) url = "http:" + url; + Item item = getDetail(tid); Vod vod = new Vod(); - vod.setVodId(tid + "/" + data.getString("name")); - vod.setVodName(data.getString("name")); - vod.setVodPic(data.getString(v3 ? "thumb" : "thumbnail")); - vod.setVodTag(data.getInt("type") == 1 ? "folder" : "file"); + vod.setVodId(item.getVodId(tid)); + vod.setVodName(item.getName()); + vod.setVodPic(item.getPic()); + vod.setVodTag(item.getVodTag()); vod.setVodPlayFrom("播放"); - vod.setVodPlayUrl(data.getString("name") + "$" + url); + vod.setVodPlayUrl(item.getName() + "$" + item.getUrl() + findSubs(item.getName())); return Result.string(vod); } @Override public String playerContent(String flag, String id, List vipFlags) { - return Result.get().url(id).string(); + String[] ids = id.split("\\+"); + return Result.get().url(ids[0]).sub(getSub(ids)).string(); } - private String getSize(double size) { - if (size == 0) return ""; - if (size > 1024 * 1024 * 1024 * 1024.0) { - size /= (1024 * 1024 * 1024 * 1024.0); - return String.format(Locale.getDefault(), "%.2f%s", size, "TB"); - } else if (size > 1024 * 1024 * 1024.0) { - size /= (1024 * 1024 * 1024.0); - return String.format(Locale.getDefault(), "%.2f%s", size, "GB"); - } else if (size > 1024 * 1024.0) { - size /= (1024 * 1024.0); - return String.format(Locale.getDefault(), "%.2f%s", size, "MB"); - } else { - size /= 1024.0; - return String.format(Locale.getDefault(), "%.2f%s", size, "KB"); + private List getList(String tid) { + try { + String key = tid.contains("/") ? tid.substring(0, tid.indexOf("/")) : tid; + String path = tid.contains("/") ? tid.substring(tid.indexOf("/") + 1) : ""; + boolean v3 = getVersion(key).equals("3"); + String url = ext.get(key) + (v3 ? "/api/fs/list" : "/api/public/path"); + JSONObject params = new JSONObject(); + params.put("path", path); + String response = OkHttpUtil.postJson(url, params.toString()); + String json = new JSONObject(response).getJSONObject("data").getJSONArray(v3 ? "content" : "files").toString(); + return Item.arrayFrom(json); + } catch (Exception e) { + return Collections.emptyList(); } } + + private Item getDetail(String tid) { + try { + String key = tid.contains("/") ? tid.substring(0, tid.indexOf("/")) : tid; + String path = tid.contains("/") ? tid.substring(tid.indexOf("/") + 1) : ""; + boolean v3 = getVersion(key).equals("3"); + String url = ext.get(key) + (v3 ? "/api/fs/get" : "/api/public/path"); + JSONObject params = new JSONObject(); + params.put("path", path); + String response = OkHttpUtil.postJson(url, params.toString()); + String json = v3 ? new JSONObject(response).getJSONObject("data").toString() : new JSONObject(response).getJSONObject("data").getJSONArray("files").getJSONObject(0).toString(); + return Item.objectFrom(json); + } catch (Exception e) { + return new Item(); + } + } + + private void addSub(String tid, Item item) { + String name = item.getName().substring(0, item.getName().lastIndexOf(".")); + if (!sub.containsKey(name)) sub.put(name, new ArrayList<>()); + Objects.requireNonNull(sub.get(name)).add(item.getName() + "@" + item.getVodId(tid) + "@" + item.getExt()); + } + + private String findSubs(String name) { + name = name.substring(0, name.lastIndexOf(".")); + List subs = sub.get(name); + if (subs != null && subs.size() > 0) return combineSubs(subs); + StringBuilder sb = new StringBuilder(); + for (Map.Entry> entry : sub.entrySet()) sb.append(combineSubs(entry.getValue())); + return sb.toString(); + } + + private String combineSubs(List subs) { + StringBuilder sb = new StringBuilder(); + for (String sub : subs) sb.append("+").append(sub); + return sb.toString(); + } + + private String getSub(String[] ids) { + StringBuilder sb = new StringBuilder(); + for (String text : ids) { + if (!text.contains("@")) continue; + String[] arr = text.split("@"); + String url = getDetail(arr[1]).getUrl(); + if (TextUtils.isEmpty(url)) continue; + sb.append(arr[0]).append("#").append(Misc.getSubMimeType(arr[2])).append("#").append(url).append("$$$"); + } + return Misc.substring(sb.toString(), 3); + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/catvod/spider/Ali.java b/app/src/main/java/com/github/catvod/spider/Ali.java index 14f333b2..cca89426 100644 --- a/app/src/main/java/com/github/catvod/spider/Ali.java +++ b/app/src/main/java/com/github/catvod/spider/Ali.java @@ -142,7 +142,7 @@ public class Ali { name2id.put(name, shareId + "+" + shareToken + "+" + fileId); continue; } - if (isSubFile(ext)) { + if (Misc.isSub(ext)) { name = name.replace("." + ext, ""); if (!subMap.containsKey(name)) subMap.put(name, new ArrayList<>()); Objects.requireNonNull(subMap.get(name)).add(name + "@" + fileId + "@" + ext); @@ -180,8 +180,9 @@ public class Ali { name = name.substring(0, name.lastIndexOf(".")); List subs = subMap.get(name); if (subs != null && subs.size() > 0) return combineSubs(subs); - for (Map.Entry> entry : subMap.entrySet()) if (entry.getKey().contains(name)) return combineSubs(entry.getValue()); - return ""; + StringBuilder sb = new StringBuilder(); + for (Map.Entry> entry : subMap.entrySet()) sb.append(combineSubs(entry.getValue())); + return sb.toString(); } private String combineSubs(List subs) { @@ -196,20 +197,9 @@ public class Ali { if (!text.contains("@")) continue; String[] arr = text.split("@"); String url = Proxy.getUrl() + "?do=ali&type=sub&share_id=" + shareId + "&share_token=" + shareToken + "&file_id=" + arr[1]; - sb.append(arr[0]).append("#").append(getSubMimeType(arr[2])).append("#").append(url).append("$$$"); - return Misc.substring(sb.toString(), 3); + sb.append(arr[0]).append("#").append(Misc.getSubMimeType(arr[2])).append("#").append(url).append("$$$"); } - return ""; - } - - private boolean isSubFile(String ext) { - return ext.equals("srt") || ext.equals("ass") || ext.equals("ssa"); - } - - private String getSubMimeType(String type) { - if (type.equals("srt")) return "application/x-subrip"; - if (type.equals("ass") || type.equals("ssa")) return "text/x-ssa"; - return "application/x-subrip"; + return Misc.substring(sb.toString(), 3); } private String getShareToken(String shareId) { diff --git a/app/src/main/java/com/github/catvod/utils/Misc.java b/app/src/main/java/com/github/catvod/utils/Misc.java index ef74be74..9b751794 100644 --- a/app/src/main/java/com/github/catvod/utils/Misc.java +++ b/app/src/main/java/com/github/catvod/utils/Misc.java @@ -17,6 +17,7 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.Locale; import java.util.regex.Pattern; public class Misc { @@ -53,6 +54,33 @@ public class Misc { return SNIFFER.matcher(url).find(); } + public static boolean isSub(String ext) { + return ext.equals("srt") || ext.equals("ass") || ext.equals("ssa"); + } + + public static String getSubMimeType(String type) { + if (type.equals("srt")) return "application/x-subrip"; + if (type.equals("ass") || type.equals("ssa")) return "text/x-ssa"; + return "application/x-subrip"; + } + + public static String getSize(double size) { + if (size == 0) return ""; + if (size > 1024 * 1024 * 1024 * 1024.0) { + size /= (1024 * 1024 * 1024 * 1024.0); + return String.format(Locale.getDefault(), "%.2f%s", size, "TB"); + } else if (size > 1024 * 1024 * 1024.0) { + size /= (1024 * 1024 * 1024.0); + return String.format(Locale.getDefault(), "%.2f%s", size, "GB"); + } else if (size > 1024 * 1024.0) { + size /= (1024 * 1024.0); + return String.format(Locale.getDefault(), "%.2f%s", size, "MB"); + } else { + size /= 1024.0; + return String.format(Locale.getDefault(), "%.2f%s", size, "KB"); + } + } + public static String fixUrl(String base, String src) { try { if (src.startsWith("//")) { diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 4b07314f..be40927e 100644 Binary files a/jar/custom_spider.jar and b/jar/custom_spider.jar differ diff --git a/jar/custom_spider.jar.md5 b/jar/custom_spider.jar.md5 index 98d95d2f..724210bb 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -2238f733904942609bb90b337dee9713 +5e45ee53bd37b87d71cc591d1a2c208b