From 15eeea6aebefcf9c0dfc1a732c2e28563bb24157 Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 28 Aug 2023 15:06:29 +0800 Subject: [PATCH] Clean code and fix ali --- .../java/com/github/catvod/api/AliYun.java | 39 ++-- .../com/github/catvod/bean/ali/Drive.java | 28 +-- .../java/com/github/catvod/bean/ali/Item.java | 3 +- .../java/com/github/catvod/spider/Ali.java | 2 +- .../catvod/utils/ChineseComparator.java | 213 +++++++++--------- 5 files changed, 130 insertions(+), 155 deletions(-) diff --git a/app/src/main/java/com/github/catvod/api/AliYun.java b/app/src/main/java/com/github/catvod/api/AliYun.java index 6fdd9850..c0664bef 100644 --- a/app/src/main/java/com/github/catvod/api/AliYun.java +++ b/app/src/main/java/com/github/catvod/api/AliYun.java @@ -60,10 +60,9 @@ public class AliYun { private String refreshToken; private String shareToken; private String shareId; - private String driveId; private OAuth oauth; - private User user; private Drive drive; + private User user; private static class Loader { static volatile AliYun INSTANCE = new AliYun(); @@ -87,8 +86,8 @@ public class AliYun { private AliYun() { tempIds = new ArrayList<>(); - oauth = OAuth.objectFrom(FileUtil.read(getOAuthCache())); user = User.objectFrom(FileUtil.read(getUserCache())); + oauth = OAuth.objectFrom(FileUtil.read(getOAuthCache())); drive = Drive.objectFrom(FileUtil.read(getDriveCache())); } @@ -105,9 +104,10 @@ public class AliYun { } public void setShareId(String shareId) { - if (!getOAuthCache().exists()) oauth.clean().save(); if (!getUserCache().exists()) user.clean().save(); + if (!getOAuthCache().exists()) oauth.clean().save(); if (!getDriveCache().exists()) drive.clean().save(); + if (shareId.equals(this.shareId)) return; this.shareId = shareId; refreshShareToken(); } @@ -194,7 +194,7 @@ public class AliYun { JsonObject param = new JsonObject(); String token = user.getRefreshToken(); if (token.isEmpty()) token = refreshToken; - if (token.startsWith("http")) token = OkHttp.string(token).trim(); + if (token != null && token.startsWith("http")) token = OkHttp.string(token).trim(); param.addProperty("refresh_token", token); param.addProperty("grant_type", "refresh_token"); String json = post("https://auth.aliyundrive.com/v2/account/token", param); @@ -214,10 +214,9 @@ public class AliYun { } private void getDriveId() { - SpiderDebug.log("Obtain drive id..."); - String result = auth("https://user.aliyundrive.com/v2/user/get", "{}", false); - drive = Drive.objectFrom(result).save(); - driveId = drive.getResourceDriveId().isEmpty() ? drive.getDriveId() : drive.getResourceDriveId(); + SpiderDebug.log("Get Drive Id..."); + String json = auth("https://user.aliyundrive.com/v2/user/get", "{}", true); + drive = Drive.objectFrom(json).save(); } private boolean oauthRequest() { @@ -340,12 +339,11 @@ public class AliYun { public String getDownloadUrl(String fileId) { try { - getDriveId(); SpiderDebug.log("getDownloadUrl..." + fileId); - tempIds.add(0, copy(fileId, true)); + tempIds.add(0, copy(fileId)); JsonObject param = new JsonObject(); param.addProperty("file_id", tempIds.get(0)); - param.addProperty("drive_id", driveId); + param.addProperty("drive_id", drive.getDriveId()); String json = oauth("openFile/getDownloadUrl", param.toString(), true); return Download.objectFrom(json).getUrl(); } catch (Exception e) { @@ -358,12 +356,11 @@ public class AliYun { public Preview.Info getVideoPreviewPlayInfo(String fileId) { try { - getDriveId(); SpiderDebug.log("getVideoPreviewPlayInfo..." + fileId); - tempIds.add(0, copy(fileId, true)); + tempIds.add(0, copy(fileId)); JsonObject param = new JsonObject(); param.addProperty("file_id", tempIds.get(0)); - param.addProperty("drive_id", driveId); + param.addProperty("drive_id", drive.getDriveId()); param.addProperty("category", "live_transcoding"); param.addProperty("url_expire_sec", "14400"); String json = oauth("openFile/getVideoPreviewPlayInfo", param.toString(), true); @@ -405,14 +402,12 @@ public class AliYun { return subs; } - private String copy(String fileId, boolean retry) throws Exception { - SpiderDebug.log("Copy..." + fileId); + private String copy(String fileId) { + if (drive.getDriveId().isEmpty()) getDriveId(); + SpiderDebug.log("Copy..." + fileId + "," + shareId + "," + drive.getDriveId()); String json = "{\"requests\":[{\"body\":{\"file_id\":\"%s\",\"share_id\":\"%s\",\"auto_rename\":true,\"to_parent_file_id\":\"root\",\"to_drive_id\":\"%s\"},\"headers\":{\"Content-Type\":\"application/json\"},\"id\":\"0\",\"method\":\"POST\",\"url\":\"/file/copy\"}],\"resource\":\"file\"}"; - json = String.format(json, fileId, shareId, driveId); + json = String.format(json, fileId, shareId, drive.getDriveId()); Res res = Res.objectFrom(auth("adrive/v2/batch", json, true)); - if (res.getResponse().getStatus() == 403 && retry) refreshShareToken(); - if (res.getResponse().getStatus() == 403 && retry) copy(fileId, false); - if (res.getResponse().getStatus() == 403 && !retry) throw new Exception(res.getResponse().getBody().getMessage()); return res.getResponse().getBody().getFileId(); } @@ -427,7 +422,7 @@ public class AliYun { private boolean delete(String fileId) { SpiderDebug.log("Delete..." + fileId); String json = "{\"requests\":[{\"body\":{\"drive_id\":\"%s\",\"file_id\":\"%s\"},\"headers\":{\"Content-Type\":\"application/json\"},\"id\":\"%s\",\"method\":\"POST\",\"url\":\"/file/delete\"}],\"resource\":\"file\"}"; - json = String.format(json, driveId, fileId, fileId); + json = String.format(json, drive.getDriveId(), fileId, fileId); Res res = Res.objectFrom(auth("adrive/v2/batch", json, true)); return res.getResponse().getStatus() == 404; } diff --git a/app/src/main/java/com/github/catvod/bean/ali/Drive.java b/app/src/main/java/com/github/catvod/bean/ali/Drive.java index 58bcb9e0..acf2d9a9 100644 --- a/app/src/main/java/com/github/catvod/bean/ali/Drive.java +++ b/app/src/main/java/com/github/catvod/bean/ali/Drive.java @@ -10,43 +10,29 @@ import com.google.gson.annotations.SerializedName; public class Drive { @SerializedName("default_drive_id") - private String driveId; - @SerializedName("user_id") - private String userId; - @SerializedName("backup_drive_id") - private String backupDriveId; + private String defaultDriveId; @SerializedName("resource_drive_id") private String resourceDriveId; - @SerializedName("sbox_drive_id") - private String sboxDriveId; public static Drive objectFrom(String str) { Drive item = new Gson().fromJson(str, Drive.class); return item == null ? new Drive() : item; } - public String getDriveId() { - return TextUtils.isEmpty(driveId) ? "" : driveId; + private String getDefaultDriveId() { + return TextUtils.isEmpty(defaultDriveId) ? "" : defaultDriveId; } - public String getUserId() { - return TextUtils.isEmpty(userId) ? "" : userId; - } - - public String getBackupDriveId() { - return TextUtils.isEmpty(backupDriveId) ? "" : backupDriveId; - } - - public String getResourceDriveId() { + private String getResourceDriveId() { return TextUtils.isEmpty(resourceDriveId) ? "" : resourceDriveId; } - public String getSboxDriveId() { - return TextUtils.isEmpty(sboxDriveId) ? "" : sboxDriveId; + public String getDriveId() { + return getResourceDriveId().isEmpty() ? getDefaultDriveId() : getResourceDriveId(); } public Drive clean() { - this.driveId = ""; + this.defaultDriveId = ""; this.resourceDriveId = ""; return this; } diff --git a/app/src/main/java/com/github/catvod/bean/ali/Item.java b/app/src/main/java/com/github/catvod/bean/ali/Item.java index 5d3daf6f..47715fd1 100644 --- a/app/src/main/java/com/github/catvod/bean/ali/Item.java +++ b/app/src/main/java/com/github/catvod/bean/ali/Item.java @@ -1,6 +1,7 @@ package com.github.catvod.bean.ali; import android.text.TextUtils; + import com.github.catvod.utils.ChineseComparator; import com.github.catvod.utils.Utils; import com.google.gson.Gson; @@ -85,7 +86,7 @@ public class Item implements Comparable { public String getDisplayName() { return TextUtils.join(" ", Arrays.asList(getParent(), getName(), getSize())).trim(); } - + @Override public int compareTo(Item item) { return ChineseComparator.compare(this.getDisplayName(), item.getDisplayName()); 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 930d98d2..476c1982 100644 --- a/app/src/main/java/com/github/catvod/spider/Ali.java +++ b/app/src/main/java/com/github/catvod/spider/Ali.java @@ -56,7 +56,7 @@ public class Ali extends Spider { */ public String detailContentVodPlayFrom(List ids) { List playFrom = new ArrayList<>(); - if (ids.size() < 1) return TextUtils.join("$$$", Arrays.asList("原畫", "普畫")); + if (ids.size() < 2) return TextUtils.join("$$$", Arrays.asList("原畫", "普畫")); for (int i = 1; i <= ids.size(); i++) { playFrom.add(String.format(Locale.getDefault(), "原畫#%02d", i)); playFrom.add(String.format(Locale.getDefault(), "普畫#%02d", i)); diff --git a/app/src/main/java/com/github/catvod/utils/ChineseComparator.java b/app/src/main/java/com/github/catvod/utils/ChineseComparator.java index 5f95b32e..bcc45ec1 100644 --- a/app/src/main/java/com/github/catvod/utils/ChineseComparator.java +++ b/app/src/main/java/com/github/catvod/utils/ChineseComparator.java @@ -11,114 +11,107 @@ import java.util.Locale; * @author Oiltea */ public class ChineseComparator { - - /** - * 数字类型 - */ - private static final Integer TYPE_NUMBER = 0; - - /** - * 字符类型(非数字) - */ - private static final Integer TYPE_CHARACTER = 1; - - public static int compare(String o1, String o2) { - // 根据字符数组生成带分类的字符列表 - // List的第一位为该字符的类型(TYPE_NUMBER, TYPE_CHARACTER) - // List的第二位为该字符的内容(一位数字, 一位非数字, 多位数字) - List> o1CharList = getCharList(o1); - List> o2CharList = getCharList(o2); - - // 统一CharList的长度 - int max = Math.max(o1CharList.size(), o2CharList.size()); - while (o1CharList.size() < max) { - o1CharList.add(new ArrayList<>()); - } - while (o2CharList.size() < max) { - o2CharList.add(new ArrayList<>()); - } - - // 开始比较 - int compare = 0; - for (int i = 0; i < max; i++) { - List o1list = o1CharList.get(i); - List o2list = o2CharList.get(i); - - // CharList短的,排在前面 - if (o1list.size() == 0) { - compare = -1; - break; - } - if (o2list.size() == 0) { - compare = 1; - break; - } - - // 先比较类型 - Integer o1Type = (Integer) o1list.get(0); - Integer o2Type = (Integer) o2list.get(0); - int typeCompare = Integer.compare(o1Type, o2Type); - if (typeCompare != 0) { - // 类型不同,则数字在前,非数字在后 - compare = typeCompare; - break; - } else { - // 类型相同,则比较内容 - if (TYPE_NUMBER.equals(o1Type)) { - // 比较数字 - int o1Content = Integer.parseInt(o1list.get(1).toString()); - int o2Content = Integer.parseInt(o2list.get(1).toString()); - compare = Integer.compare(o1Content, o2Content); - } else if (TYPE_CHARACTER.equals(o1Type)) { - // 比较非数字 - String o1Content = (String) o1list.get(1); - String o2Content = (String) o2list.get(1); - compare = Collator.getInstance(Locale.CHINESE).compare(o1Content, o2Content); - } - // 如果不相等,则退出比较 - if (compare != 0) { - break; - } - } - } - return compare; - } - - /** - * 根据字符数组生成带分类的字符列表 - * - * @param text 字符串 - * @return 带分类的字符列表,List的第一位为该字符的类型(TYPE_NUMBER, TYPE_CHARACTER),第二位为该字符的内容 - */ - private static List> getCharList(String text) { - char[] chars = text.toCharArray(); - List> charList = new ArrayList<>(); - for (int i = 0; i < chars.length; i++) { - List list = new ArrayList<>(); - // 是否为数字 - char c = chars[i]; - if ((int) c >= '0' && (int) c <= '9') { - StringBuilder str = new StringBuilder(); - // 下一位是否为数字,如果为数字则组成多位数 - do { - str.append(c); - if (i + 1 < chars.length) { - c = chars[++i]; - } else { - break; - } - } while ((int) c >= '0' && (int) c <= '9'); - if (!(i + 1 == chars.length) || !((int) c >= '0' && (int) c <= '9')) { - i--; - } - list.add(TYPE_NUMBER); - list.add(str.toString()); - } else { - list.add(TYPE_CHARACTER); - list.add(String.valueOf(c)); - } - charList.add(list); - } - return charList; - } + + private static final Integer TYPE_NUMBER = 0; + private static final Integer TYPE_CHARACTER = 1; + + public static int compare(String o1, String o2) { + // 根据字符数组生成带分类的字符列表 + // List的第一位为该字符的类型(TYPE_NUMBER, TYPE_CHARACTER) + // List的第二位为该字符的内容(一位数字, 一位非数字, 多位数字) + List> o1CharList = getCharList(o1); + List> o2CharList = getCharList(o2); + + // 统一CharList的长度 + int max = Math.max(o1CharList.size(), o2CharList.size()); + while (o1CharList.size() < max) { + o1CharList.add(new ArrayList<>()); + } + while (o2CharList.size() < max) { + o2CharList.add(new ArrayList<>()); + } + + // 开始比较 + int compare = 0; + for (int i = 0; i < max; i++) { + List o1list = o1CharList.get(i); + List o2list = o2CharList.get(i); + + // CharList短的,排在前面 + if (o1list.size() == 0) { + compare = -1; + break; + } + if (o2list.size() == 0) { + compare = 1; + break; + } + + // 先比较类型 + Integer o1Type = (Integer) o1list.get(0); + Integer o2Type = (Integer) o2list.get(0); + int typeCompare = Integer.compare(o1Type, o2Type); + if (typeCompare != 0) { + // 类型不同,则数字在前,非数字在后 + compare = typeCompare; + break; + } else { + // 类型相同,则比较内容 + if (TYPE_NUMBER.equals(o1Type)) { + // 比较数字 + int o1Content = Integer.parseInt(o1list.get(1).toString()); + int o2Content = Integer.parseInt(o2list.get(1).toString()); + compare = Integer.compare(o1Content, o2Content); + } else if (TYPE_CHARACTER.equals(o1Type)) { + // 比较非数字 + String o1Content = (String) o1list.get(1); + String o2Content = (String) o2list.get(1); + compare = Collator.getInstance(Locale.CHINESE).compare(o1Content, o2Content); + } + // 如果不相等,则退出比较 + if (compare != 0) { + break; + } + } + } + return compare; + } + + /** + * 根据字符数组生成带分类的字符列表 + * + * @param text 字符串 + * @return 带分类的字符列表,List的第一位为该字符的类型(TYPE_NUMBER, TYPE_CHARACTER),第二位为该字符的内容 + */ + private static List> getCharList(String text) { + char[] chars = text.toCharArray(); + List> charList = new ArrayList<>(); + for (int i = 0; i < chars.length; i++) { + List list = new ArrayList<>(); + // 是否为数字 + char c = chars[i]; + if ((int) c >= '0' && (int) c <= '9') { + StringBuilder str = new StringBuilder(); + // 下一位是否为数字,如果为数字则组成多位数 + do { + str.append(c); + if (i + 1 < chars.length) { + c = chars[++i]; + } else { + break; + } + } while ((int) c >= '0' && (int) c <= '9'); + if (!(i + 1 == chars.length) || !((int) c >= '0' && (int) c <= '9')) { + i--; + } + list.add(TYPE_NUMBER); + list.add(str.toString()); + } else { + list.add(TYPE_CHARACTER); + list.add(String.valueOf(c)); + } + charList.add(list); + } + return charList; + } } \ No newline at end of file