From f006238f851eede15dfaa7b2e156aedb96d3cffe Mon Sep 17 00:00:00 2001 From: ZxwyWebSite Date: Thu, 21 Dec 2023 00:51:32 +0800 Subject: [PATCH] 2023-12-19 1.0.2-b0.3 --- main.go | 8 ++++ src/env/env.go | 8 +++- src/middleware/dynlink/dynlink.go | 65 +++++++++++++++++++++++++++++++ src/middleware/util/util.go | 13 +++++++ src/router/router.go | 22 ++++++----- update.md | 14 ++++++- 6 files changed, 118 insertions(+), 12 deletions(-) create mode 100644 src/middleware/dynlink/dynlink.go create mode 100644 src/middleware/util/util.go diff --git a/main.go b/main.go index 74b8c35..c786d02 100644 --- a/main.go +++ b/main.go @@ -95,6 +95,14 @@ func init() { env.Loger.NewGroup(`DebugMode`).Debug(`已开启调试模式, 将输出更详细日志 (配置文件中 [Main].Debug 改为 false 关闭)`) } genAuth() + if env.Config.Main.SysLev { + sl := env.Loger.NewGroup(`(beta)SysLev`) + if err := ztool.Sys_SetPriorityLev(ztool.Sys_GetPid(), ztool.Sys_PriorityHighest); err != nil { + sl.Error(`系统优先级设置失败: %v`, err) + } else { + sl.Warn(`成功设置较高优先级,此功能可能导致系统不稳定`) + } + } } func main() { diff --git a/src/env/env.go b/src/env/env.go index 5cbc82f..d49dca2 100644 --- a/src/env/env.go +++ b/src/env/env.go @@ -9,7 +9,7 @@ import ( ) const ( - Version = `1.0.2-β0.2` + Version = `1.0.2-β0.3` ) var ( @@ -29,6 +29,7 @@ type ( Gzip bool `comment:"开启GZip (对已压缩的内容使用会产生反效果)"` LogPath string `comment:"文件日志路径,不填禁用"` Print bool `comment:"控制台输出"` + SysLev bool `comment:"(实验性) 设置进程高优先级"` } Conf_Apis struct { // BindAddr string `comment:"外部访问地址,用于生成文件链接"` @@ -65,7 +66,8 @@ type ( Force bool `comment:"强制推送更新" json:"force"` } Conf_Cache struct { - Mode string `comment:"缓存模式 0: off(关闭), 1: local(本地), 2: cloudreve(云盘 未完善)"` + Mode string `comment:"缓存模式 0: off(关闭), 1: local(本地), 2: cloudreve(云盘 未完善)"` + LinkMode string `comment:"外链样式 1: static(永久链), 2: dynamic(临时链)"` // 本地 Local_Path string `comment:"本地缓存保存路径"` Local_Bind string `comment:"本地缓存外部访问地址"` @@ -95,6 +97,7 @@ var ( Gzip: false, LogPath: `/data/logfile.log`, Print: true, + SysLev: false, }, Apis: &Conf_Apis{ // BindAddr: `http://192.168.10.22:1011/`, @@ -123,6 +126,7 @@ var ( }, Cache: &Conf_Cache{ Mode: `local`, // 缓存模式 + LinkMode: `1`, Local_Path: `data/cache`, Local_Bind: `http://127.0.0.1:1011/`, Cloud_Site: `https://cloudreveplus-demo.onrender.com/`, diff --git a/src/middleware/dynlink/dynlink.go b/src/middleware/dynlink/dynlink.go new file mode 100644 index 0000000..c616d06 --- /dev/null +++ b/src/middleware/dynlink/dynlink.go @@ -0,0 +1,65 @@ +package dynlink + +import ( + "lx-source/src/caches" + "lx-source/src/caches/localcache" + "lx-source/src/env" + + // "lx-source/src/middleware/util" + // "net/http" + + // "github.com/ZxwyWebSite/ztool" + "github.com/gin-gonic/gin" +) + +type DynLink struct { + Mode uint8 + Link string +} + +func LoadHandler(r *gin.Engine) { + loger := env.Loger.NewGroup(`DynLink`) + if cache, ok := caches.UseCache.(*localcache.Cache); ok { + loger.Debug(`UseStatic`) + r.Static(`/file`, cache.Path) + } + // 动态链暂未完成... +} + +// func FileHandler() gin.HandlerFunc { +// loger := env.Loger.NewGroup(`DynLink`) +// // 为了兼容原静态链,必须设置3个参数 +// // file/:{time.unix}/:{md5(cquery)}/:{fname} 1703006183//77792f3434343730363834382f3332306b.mp3 +// // file/:date/:second/:fname 20231219/1703006183/77792f3434343730363834382f3332306b.mp3 +// env.Cache.Set(`20211008/hello/test.mp3`, DynLink{Link: `/www/wwwroot/lx-source/data/cache/wy/3203127/320k.mp3`}, 0) + +// if env.Config.Cache.LinkMode == `dynamic` || env.Config.Cache.LinkMode == `2` /*|| true*/ { +// loger.Debug(`UseDynamic`) +// return func(c *gin.Context) { +// parms := util.ParaMap(c) +// t, x, f := parms[`t`], parms[`x`], parms[`f`] +// if clink, ok := env.Cache.Get(ztool.Str_FastConcat(t, `/`, x, `/`, f)); ok { +// if dyn, ok := clink.(DynLink); ok { +// if dyn.Mode == 0 { +// c.File(ztool.Str_FastConcat(dyn.Link)) +// return +// } +// c.Redirect(http.StatusFound, dyn.Link) +// return +// } +// } +// c.AbortWithStatus(http.StatusNotFound) +// } +// } +// if cache, ok := caches.UseCache.(*localcache.Cache); ok { +// loger.Debug(`UseStatic`) +// return func(c *gin.Context) { +// parms := util.ParaMap(c) +// t, x, f := parms[`t`], parms[`x`], parms[`f`] +// c.File(ztool.Str_FastConcat(cache.Path, `/`, t, `/`, x, `/`, f)) +// } +// } +// return func(c *gin.Context) { +// c.AbortWithStatus(http.StatusNotFound) +// } +// } diff --git a/src/middleware/util/util.go b/src/middleware/util/util.go new file mode 100644 index 0000000..2ac49fa --- /dev/null +++ b/src/middleware/util/util.go @@ -0,0 +1,13 @@ +package util + +import "github.com/gin-gonic/gin" + +// 将路由参数转为Map +func ParaMap(c *gin.Context) map[string]string { + parmlen := len(c.Params) + parms := make(map[string]string, parmlen) + for i := 0; i < parmlen; i++ { + parms[c.Params[i].Key] = c.Params[i].Value + } + return parms +} diff --git a/src/router/router.go b/src/router/router.go index adf7a80..36ca1e6 100644 --- a/src/router/router.go +++ b/src/router/router.go @@ -2,11 +2,12 @@ package router import ( "lx-source/src/caches" - "lx-source/src/caches/localcache" "lx-source/src/env" "lx-source/src/middleware/auth" + "lx-source/src/middleware/dynlink" "lx-source/src/middleware/loadpublic" "lx-source/src/middleware/resp" + "lx-source/src/middleware/util" "lx-source/src/sources" "net/http" @@ -52,9 +53,11 @@ func InitRouter() *gin.Engine { // r.StaticFile(`/lx-custom-source.js`, `public/lx-custom-source.js`) // 解析接口 r.GET(`/link/:s/:id/:q`, auth.AuthHandler, linkHandler) - if cache, ok := caches.UseCache.(*localcache.Cache); ok { - r.Static(`/file`, cache.Path) - } + dynlink.LoadHandler(r) + // r.GET(`/file/:t/:x/:f`, dynlink.FileHandler()) + // if cache, ok := caches.UseCache.(*localcache.Cache); ok { + // r.Static(`/file`, cache.Path) + // } // if env.Config.Cache.Mode == `local` { // r.Static(`/file`, env.Config.Cache.Local_Path) // } @@ -83,11 +86,12 @@ const ( func linkHandler(c *gin.Context) { resp.Wrap(c, func() *resp.Resp { // 获取传入参数 检查合法性 - parmlen := len(c.Params) - parms := make(map[string]string, parmlen) - for i := 0; i < parmlen; i++ { - parms[c.Params[i].Key] = c.Params[i].Value - } + // parmlen := len(c.Params) + // parms := make(map[string]string, parmlen) + // for i := 0; i < parmlen; i++ { + // parms[c.Params[i].Key] = c.Params[i].Value + // } + parms := util.ParaMap(c) // getParam := func(p string) string { return strings.TrimSuffix(strings.TrimPrefix(c.Param(p), `/`), `/`) } //strings.Trim(c.Param(p), `/`) s := parms[`s`] //c.Param(`s`) //getParam(`s`) // source 平台 wy, mg, kw id := parms[`id`] //c.Param(`id`) //getParam(`id`) // sid 音乐ID wy: songmid, mg: copyrightId diff --git a/update.md b/update.md index fdd37e4..24b6ff6 100644 --- a/update.md +++ b/update.md @@ -1,12 +1,24 @@ ## Lx-Source/更新日志 -#### 2023-12-(17-18) (beta) +#### 2023-12-19 1.0.2-b0.3 (dev) ++ 增加dev分支,日常开发,稳定了再合main,防止临时补充更新情况 ++ 上次补充更新内容:将error.mp3换成远程连接 + - 洛雪客户端似乎无法识别Base64编码后的音频文件 + - 待解决问题:无法获取真实请求URL,如套一层Nginx或分路径反代,只能依赖手动配置的 [Cache].Local_Bind 确定外部地址 ++ zTool: + - 略微降低FileLogs缓存大小,防止异常退出丢**太多**日志情况 (TODO: Error及以上情况强制刷新缓冲区) + - cmd: 优化io.Copy缓存问题 ++ (未完成) 临时链生成功能 (需要维护双倍的映射表,实际速度可能减慢) ++ (实验性) [Main].SysLev 尝试调高程序优先级以解决windows下最小化降低资源分配问题 + +#### 2023-12-(17-18) 1.0.2-β0.2 (beta) + 脚本增加请求耗时输出 + 优化zTool文件下载逻辑 + 链接缓存由Source上移至Router级 (为临时链实现基础) + 完善缓存规则 - 查询成功将链接写入内存,保留一小时 (MemCache HIT) - 解析错误将空字符串写入内存,阻止请求10分钟 (MemCache Reject) + + 可提升后续重复查询响应速度 (实际效果不明显,后端几十µs的差距) + 防止自动换源机制瞎查,解析失败返回一段提示语音 ``` 非常抱歉,