From 10eec323dd73e6206a5eb6fe9220fc78653a1a1d Mon Sep 17 00:00:00 2001 From: QAIU <736226400@qq.com> Date: Sun, 20 Oct 2024 18:16:51 +0800 Subject: [PATCH] =?UTF-8?q?1.=20add=20=E7=BD=91=E6=98=93=E4=BA=91=E9=9F=B3?= =?UTF-8?q?=E4=B9=90=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../src/main/java/cn/qaiu/vx/core/Deploy.java | 2 +- .../core/verticle/ReverseProxyVerticle.java | 7 ++-- .../cn/qaiu/parser/PanDomainTemplate.java | 5 +++ .../java/cn/qaiu/parser/impl/MneTool.java | 35 +++++++++++++++++++ web-front/src/App.vue | 2 +- .../cn/qaiu/lz/common/cache/CacheManager.java | 33 +++-------------- .../qaiu/lz/common/cache/CacheTotalField.java | 10 ++++++ .../lz/web/service/impl/CacheServiceImpl.java | 5 +-- web-service/src/main/resources/app-dev.yml | 3 +- .../main/resources/http-tools/pan-mne.http | 11 ++++++ .../src/main/resources/http-tools/test.http | 5 +++ .../src/main/resources/server-proxy.yml | 2 +- 13 files changed, 83 insertions(+), 38 deletions(-) create mode 100644 parser/src/main/java/cn/qaiu/parser/impl/MneTool.java create mode 100644 web-service/src/main/java/cn/qaiu/lz/common/cache/CacheTotalField.java create mode 100644 web-service/src/main/resources/http-tools/pan-mne.http diff --git a/README.md b/README.md index 0e134d6..ed46e3e 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ main分支依赖JDK17, 提供了JDK11分支[main-jdk11](https://github.com/qaiu/ - [QQ邮箱文件中转站 (qq)](https://mail.qq.com/) - [超星网盘-开发中 (cx)](https://passport2.chaoxing.com/login?newversion=true&refer=https%3A%2F%2Fpan-yz.chaoxing.com%2F) - [城通网盘(ct)](https://www.ctfile.com) +- [网易云音乐(mne)](https://music.163.com) - [Cloudreve自建网盘(ce)](https://github.com/cloudreve/Cloudreve) **TODO:** diff --git a/core/src/main/java/cn/qaiu/vx/core/Deploy.java b/core/src/main/java/cn/qaiu/vx/core/Deploy.java index 352df8d..927b7f4 100644 --- a/core/src/main/java/cn/qaiu/vx/core/Deploy.java +++ b/core/src/main/java/cn/qaiu/vx/core/Deploy.java @@ -185,7 +185,7 @@ public final class Deploy { private DeploymentOptions getWorkDeploymentOptions(String name, int ins) { return new DeploymentOptions() .setWorkerPoolName(name) - .setWorker(true) + .setThreadingModel(ThreadingModel.WORKER) .setInstances(ins); } diff --git a/core/src/main/java/cn/qaiu/vx/core/verticle/ReverseProxyVerticle.java b/core/src/main/java/cn/qaiu/vx/core/verticle/ReverseProxyVerticle.java index 8f35fcc..c8a6ad0 100644 --- a/core/src/main/java/cn/qaiu/vx/core/verticle/ReverseProxyVerticle.java +++ b/core/src/main/java/cn/qaiu/vx/core/verticle/ReverseProxyVerticle.java @@ -48,8 +48,9 @@ public class ReverseProxyVerticle extends AbstractVerticle { @Override - public void start(Promise startPromise) throws Exception { + public void start(Promise startPromise) { CONFIG.onSuccess(this::handleProxyConfList); +// createFileListener startPromise.complete(); } @@ -116,9 +117,7 @@ public class ReverseProxyVerticle extends AbstractVerticle { } // Send page404 page - proxyRouter.errorHandler(404, ctx -> { - ctx.response().sendFile(proxyConf.getString("page404")); - }); + proxyRouter.errorHandler(404, ctx -> ctx.response().sendFile(proxyConf.getString("page404"))); HttpServer server = getHttpsServer(proxyConf); server.requestHandler(proxyRouter); diff --git a/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java b/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java index ec6c7f1..0aa7826 100644 --- a/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java +++ b/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java @@ -75,6 +75,11 @@ public enum PanDomainTemplate { "https://474b\\.com/file/(.+)", "https://474b.com/file/{shareKey}", CtTool.class), + // http://163cn.tv/xxx + MNE("网易云音乐", + "http(s)?://163cn\\.tv/(.+)", + "http://163cn.tv/{shareKey}", + MneTool.class), // https://pan.huang1111.cn/s/xxx // 通用域名([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,} CE("Cloudreve", diff --git a/parser/src/main/java/cn/qaiu/parser/impl/MneTool.java b/parser/src/main/java/cn/qaiu/parser/impl/MneTool.java new file mode 100644 index 0000000..c79f2ce --- /dev/null +++ b/parser/src/main/java/cn/qaiu/parser/impl/MneTool.java @@ -0,0 +1,35 @@ +package cn.qaiu.parser.impl; + +import cn.qaiu.entity.ShareLinkInfo; +import cn.qaiu.parser.PanBase; +import io.vertx.core.Future; +import io.vertx.uritemplate.UriTemplate; + +/** + * 网易云音乐, 单歌曲直链解析 + * 示例分享 + */ +public class MneTool extends PanBase { + + + public static final String API_URL = "https://music.163.com/song/media/outer/url?id={id}"; + + + public MneTool(ShareLinkInfo shareLinkInfo) { + super(shareLinkInfo); + } + + public Future parse() { + String shareUrl = shareLinkInfo.getStandardUrl(); + clientNoRedirects.getAbs(shareUrl).send().onSuccess(res -> { + String locationURL = res.headers().get("Location"); + String substring = locationURL.substring(locationURL.indexOf("id=")); + String id = substring.substring("id=".length(), substring.indexOf('&')); + clientNoRedirects.getAbs(UriTemplate.of(API_URL)).setTemplateParam("id", id).send() + .onSuccess(res2 -> { + promise.complete(res2.headers().get("Location")); + }).onFailure(handleFail(API_URL.replace("{id}", id))); + }).onFailure(handleFail(shareUrl)); + return promise.future(); + } +} diff --git a/web-front/src/App.vue b/web-front/src/App.vue index c6d1072..398c9fb 100644 --- a/web-front/src/App.vue +++ b/web-front/src/App.vue @@ -193,7 +193,7 @@ export default { this.showQrc = false this.respData = {} this.tjData = {} - if (!this.link.startsWith("https://")) { + if (!this.link.startsWith("https://") && !this.link.startsWith("http://")) { this.$message.error("请输入有效链接!") throw new Error('请输入有效链接') } diff --git a/web-service/src/main/java/cn/qaiu/lz/common/cache/CacheManager.java b/web-service/src/main/java/cn/qaiu/lz/common/cache/CacheManager.java index c98a562..449947d 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/cache/CacheManager.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/cache/CacheManager.java @@ -52,15 +52,16 @@ public class CacheManager { } // 写入网盘厂商API解析次数 - public Future updateTotalByCached(String shareKey) { + public Future updateTotalByField(String shareKey, CacheTotalField field) { Promise promise = Promise.promise(); + String fieldLower = field.name().toLowerCase(); String sql = """ - MERGE INTO `api_statistics_info` (`pan_type`, `share_key`, `cache_hit_total`, `update_ts`) + MERGE INTO `api_statistics_info` (`pan_type`, `share_key`, `{field}`, `update_ts`) KEY (`share_key`) VALUES (#{panType}, #{shareKey}, #{total}, #{ts}) - """; + """.replace("field", fieldLower); - getShareKeyTotal(shareKey, "cache_hit_total").onSuccess(total -> { + getShareKeyTotal(shareKey, fieldLower).onSuccess(total -> { Integer newTotal = (total == null ? 0 : total) + 1; SqlTemplate.forUpdate(jdbcPool, sql) .execute(new HashMap<>() {{ @@ -81,30 +82,6 @@ public class CacheManager { return fullShareKey.split(":")[0]; } - // 写入网盘厂商API解析次数 - public Future updateTotalByParser(String shareKey) { - Promise promise = Promise.promise(); - String sql = """ - MERGE INTO `api_statistics_info` (`pan_type`, `share_key`, `api_parser_total`, `update_ts`) - KEY (`share_key`) - VALUES (#{panType}, #{shareKey}, #{total}, #{ts}) - """; - - getShareKeyTotal(shareKey, "api_parser_total").onSuccess(total -> { - Integer newTotal = (total == null ? 0 : total) + 1; - SqlTemplate.forUpdate(jdbcPool, sql) - .execute(new HashMap<>() {{ - put("panType", getShareType(shareKey)); - put("shareKey", shareKey); - put("total", newTotal); - put("ts", System.currentTimeMillis()); - }}) - .onSuccess(res -> promise.complete(res.rowCount())) - .onFailure(Throwable::printStackTrace); - }); - return promise.future(); - } - public Future getShareKeyTotal(String shareKey, String name) { String sql = """ select `share_key`, sum({total_name}) sum_num diff --git a/web-service/src/main/java/cn/qaiu/lz/common/cache/CacheTotalField.java b/web-service/src/main/java/cn/qaiu/lz/common/cache/CacheTotalField.java new file mode 100644 index 0000000..c44711b --- /dev/null +++ b/web-service/src/main/java/cn/qaiu/lz/common/cache/CacheTotalField.java @@ -0,0 +1,10 @@ +package cn.qaiu.lz.common.cache; + +/** + * 缓存字段 + */ +public enum CacheTotalField { + API_PARSER_TOTAL, // 解析次数 + CACHE_HIT_TOTAL, // 缓存次数 + FAILED_TOTAL // 解析失败次数 +} diff --git a/web-service/src/main/java/cn/qaiu/lz/web/service/impl/CacheServiceImpl.java b/web-service/src/main/java/cn/qaiu/lz/web/service/impl/CacheServiceImpl.java index ae3cca3..45ffb22 100644 --- a/web-service/src/main/java/cn/qaiu/lz/web/service/impl/CacheServiceImpl.java +++ b/web-service/src/main/java/cn/qaiu/lz/web/service/impl/CacheServiceImpl.java @@ -3,6 +3,7 @@ package cn.qaiu.lz.web.service.impl; import cn.qaiu.entity.ShareLinkInfo; import cn.qaiu.lz.common.cache.CacheConfigLoader; import cn.qaiu.lz.common.cache.CacheManager; +import cn.qaiu.lz.common.cache.CacheTotalField; import cn.qaiu.lz.web.model.CacheLinkInfo; import cn.qaiu.lz.web.service.CacheService; import cn.qaiu.parser.ParserCreate; @@ -46,12 +47,12 @@ public class CacheServiceImpl implements CacheService { "shareKey", cacheKey )); cacheManager.cacheShareLink(cacheLinkInfo).onFailure(Throwable::printStackTrace); - cacheManager.updateTotalByParser(cacheKey).onFailure(Throwable::printStackTrace); + cacheManager.updateTotalByField(cacheKey, CacheTotalField.API_PARSER_TOTAL).onFailure(Throwable::printStackTrace); }).onFailure(promise::fail); } else { result.setExpires(generateDate(result.getExpiration())); promise.complete(result); - cacheManager.updateTotalByCached(cacheKey).onFailure(Throwable::printStackTrace); + cacheManager.updateTotalByField(cacheKey, CacheTotalField.CACHE_HIT_TOTAL).onFailure(Throwable::printStackTrace); } }).onFailure(t -> promise.fail(t.fillInStackTrace())); return promise.future(); diff --git a/web-service/src/main/resources/app-dev.yml b/web-service/src/main/resources/app-dev.yml index 67ce826..e345e3f 100644 --- a/web-service/src/main/resources/app-dev.yml +++ b/web-service/src/main/resources/app-dev.yml @@ -54,8 +54,9 @@ cache: iz: 20 le: 2879 lz: 20 - qq: 999999 + qq: 9999999 ws: ye: + mne: 30 diff --git a/web-service/src/main/resources/http-tools/pan-mne.http b/web-service/src/main/resources/http-tools/pan-mne.http new file mode 100644 index 0000000..6c0d593 --- /dev/null +++ b/web-service/src/main/resources/http-tools/pan-mne.http @@ -0,0 +1,11 @@ +#@no-redirect +# https://y.music.163.com/m/song?id=472194327&uct2=qzCghKR6RWwXkHGVOZeRrg%3D%3D&fx-wechatnew=t1&fx-wxqd=c&fx-wordtest=&fx-listentest=t3&H5_DownloadVIPGift=&playerUIModeId=76001&PlayerStyles_SynchronousSharing=t3&dlt=0846&app_version=9.1.78&sc=wm&tn= +http://163cn.tv/ykLZJJT + +### +#@no-redirect +https://music.163.com/song?id=233334 + +### +#@no-redirect +https://music.163.com/song/media/outer/url?id=233334 diff --git a/web-service/src/main/resources/http-tools/test.http b/web-service/src/main/resources/http-tools/test.http index 67474aa..16f9846 100644 --- a/web-service/src/main/resources/http-tools/test.http +++ b/web-service/src/main/resources/http-tools/test.http @@ -195,6 +195,11 @@ GET http://127.0.0.1:6401/json/parser?url=https://iwx.mail.qq.com/ftn/download?f GET http://127.0.0.1:6401/parser?url=https://474b.com/file/4015376-131945810 +### PASS MNE +# @no-redirect +GET http://127.0.0.1:6401/parser?url=http://163cn.tv/ykLZJJT + + ### n1 http://127.0.0.1:6401/n1/statisticsInfo diff --git a/web-service/src/main/resources/server-proxy.yml b/web-service/src/main/resources/server-proxy.yml index 0fe8b9f..9842d01 100644 --- a/web-service/src/main/resources/server-proxy.yml +++ b/web-service/src/main/resources/server-proxy.yml @@ -15,7 +15,7 @@ proxy: # 1.origin代理地址端口后有目录(包括 / ),转发后地址:代理地址+访问URL目录部分去除location匹配目录 # 2.origin代理地址端口后无任何,转发后地址:代理地址+访问URL目录部 location: - - path: ~^/(json/|v2/|parser|ye/|lz/|cow/|ec/|fj/|fc/|le/|qq/|ws/|iz/|ce/).* + - path: ~^/(json/|v2/|parser|ye/|lz/|cow/|ec/|fj/|fc/|le/|qq/|ws/|iz/|ce|mne/).* origin: 127.0.0.1:6400 # json/parser -> xxx/parser