Merge pull request #2 from ZxwyWebSite/dev

2023-12-19 1.0.2-b0.3
This commit is contained in:
Zxwy 2023-12-21 01:04:40 +08:00 committed by GitHub
commit a1302ad0b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 118 additions and 12 deletions

View File

@ -95,6 +95,14 @@ func init() {
env.Loger.NewGroup(`DebugMode`).Debug(`已开启调试模式, 将输出更详细日志 (配置文件中 [Main].Debug 改为 false 关闭)`) env.Loger.NewGroup(`DebugMode`).Debug(`已开启调试模式, 将输出更详细日志 (配置文件中 [Main].Debug 改为 false 关闭)`)
} }
genAuth() 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() { func main() {

8
src/env/env.go vendored
View File

@ -9,7 +9,7 @@ import (
) )
const ( const (
Version = `1.0.2-β0.2` Version = `1.0.2-β0.3`
) )
var ( var (
@ -29,6 +29,7 @@ type (
Gzip bool `comment:"开启GZip (对已压缩的内容使用会产生反效果)"` Gzip bool `comment:"开启GZip (对已压缩的内容使用会产生反效果)"`
LogPath string `comment:"文件日志路径,不填禁用"` LogPath string `comment:"文件日志路径,不填禁用"`
Print bool `comment:"控制台输出"` Print bool `comment:"控制台输出"`
SysLev bool `comment:"(实验性) 设置进程高优先级"`
} }
Conf_Apis struct { Conf_Apis struct {
// BindAddr string `comment:"外部访问地址,用于生成文件链接"` // BindAddr string `comment:"外部访问地址,用于生成文件链接"`
@ -65,7 +66,8 @@ type (
Force bool `comment:"强制推送更新" json:"force"` Force bool `comment:"强制推送更新" json:"force"`
} }
Conf_Cache struct { 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_Path string `comment:"本地缓存保存路径"`
Local_Bind string `comment:"本地缓存外部访问地址"` Local_Bind string `comment:"本地缓存外部访问地址"`
@ -95,6 +97,7 @@ var (
Gzip: false, Gzip: false,
LogPath: `/data/logfile.log`, LogPath: `/data/logfile.log`,
Print: true, Print: true,
SysLev: false,
}, },
Apis: &Conf_Apis{ Apis: &Conf_Apis{
// BindAddr: `http://192.168.10.22:1011/`, // BindAddr: `http://192.168.10.22:1011/`,
@ -123,6 +126,7 @@ var (
}, },
Cache: &Conf_Cache{ Cache: &Conf_Cache{
Mode: `local`, // 缓存模式 Mode: `local`, // 缓存模式
LinkMode: `1`,
Local_Path: `data/cache`, Local_Path: `data/cache`,
Local_Bind: `http://127.0.0.1:1011/`, Local_Bind: `http://127.0.0.1:1011/`,
Cloud_Site: `https://cloudreveplus-demo.onrender.com/`, Cloud_Site: `https://cloudreveplus-demo.onrender.com/`,

View File

@ -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)
// }
// }

View File

@ -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
}

View File

@ -2,11 +2,12 @@ package router
import ( import (
"lx-source/src/caches" "lx-source/src/caches"
"lx-source/src/caches/localcache"
"lx-source/src/env" "lx-source/src/env"
"lx-source/src/middleware/auth" "lx-source/src/middleware/auth"
"lx-source/src/middleware/dynlink"
"lx-source/src/middleware/loadpublic" "lx-source/src/middleware/loadpublic"
"lx-source/src/middleware/resp" "lx-source/src/middleware/resp"
"lx-source/src/middleware/util"
"lx-source/src/sources" "lx-source/src/sources"
"net/http" "net/http"
@ -52,9 +53,11 @@ func InitRouter() *gin.Engine {
// r.StaticFile(`/lx-custom-source.js`, `public/lx-custom-source.js`) // r.StaticFile(`/lx-custom-source.js`, `public/lx-custom-source.js`)
// 解析接口 // 解析接口
r.GET(`/link/:s/:id/:q`, auth.AuthHandler, linkHandler) r.GET(`/link/:s/:id/:q`, auth.AuthHandler, linkHandler)
if cache, ok := caches.UseCache.(*localcache.Cache); ok { dynlink.LoadHandler(r)
r.Static(`/file`, cache.Path) // 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` { // if env.Config.Cache.Mode == `local` {
// r.Static(`/file`, env.Config.Cache.Local_Path) // r.Static(`/file`, env.Config.Cache.Local_Path)
// } // }
@ -83,11 +86,12 @@ const (
func linkHandler(c *gin.Context) { func linkHandler(c *gin.Context) {
resp.Wrap(c, func() *resp.Resp { resp.Wrap(c, func() *resp.Resp {
// 获取传入参数 检查合法性 // 获取传入参数 检查合法性
parmlen := len(c.Params) // parmlen := len(c.Params)
parms := make(map[string]string, parmlen) // parms := make(map[string]string, parmlen)
for i := 0; i < parmlen; i++ { // for i := 0; i < parmlen; i++ {
parms[c.Params[i].Key] = c.Params[i].Value // 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), `/`) // 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 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 id := parms[`id`] //c.Param(`id`) //getParam(`id`) // sid 音乐ID wy: songmid, mg: copyrightId

View File

@ -1,12 +1,24 @@
## Lx-Source/更新日志 ## 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文件下载逻辑 + 优化zTool文件下载逻辑
+ 链接缓存由Source上移至Router级 (为临时链实现基础) + 链接缓存由Source上移至Router级 (为临时链实现基础)
+ 完善缓存规则 + 完善缓存规则
- 查询成功将链接写入内存,保留一小时 (MemCache HIT) - 查询成功将链接写入内存,保留一小时 (MemCache HIT)
- 解析错误将空字符串写入内存阻止请求10分钟 (MemCache Reject) - 解析错误将空字符串写入内存阻止请求10分钟 (MemCache Reject)
+ 可提升后续重复查询响应速度 (实际效果不明显后端几十µs的差距)
+ 防止自动换源机制瞎查,解析失败返回一段提示语音 + 防止自动换源机制瞎查,解析失败返回一段提示语音
``` ```
非常抱歉, 非常抱歉,