Skip to content
This repository was archived by the owner on Oct 19, 2024. It is now read-only.

Commit

Permalink
2024-05-18 v1.0.3.0518
Browse files Browse the repository at this point in the history
  • Loading branch information
ZxwyWebSite committed May 18, 2024
1 parent e402c10 commit 30b3260
Show file tree
Hide file tree
Showing 13 changed files with 592 additions and 38 deletions.
7 changes: 6 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ module lx-source
go 1.21

require (
github.com/ZxwyWebSite/cr-go-sdk v0.0.2
github.com/ZxwyWebSite/ztool v0.0.1
github.com/gin-contrib/gzip v1.0.0
github.com/gin-gonic/gin v1.9.1
github.com/google/uuid v1.6.0
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
)

Expand Down Expand Up @@ -43,4 +45,7 @@ require (
gopkg.in/yaml.v3 v3.0.1 // indirect
)

replace github.com/ZxwyWebSite/ztool v0.0.1 => ./pkg/ztool // ../ztool
replace (
github.com/ZxwyWebSite/cr-go-sdk v0.0.2 => ../cr-go-sdk
github.com/ZxwyWebSite/ztool v0.0.1 => ./pkg/ztool // ../ztool
)
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
Expand Down
43 changes: 27 additions & 16 deletions init.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package main
import (
"encoding/base64"
"lx-source/src/caches"
"lx-source/src/caches/cloudcache"
"lx-source/src/caches/localcache"
"lx-source/src/env"

Expand All @@ -12,6 +13,7 @@ import (
stdurl "net/url"
"path/filepath"

"github.com/ZxwyWebSite/cr-go-sdk"
"github.com/ZxwyWebSite/ztool"
"github.com/ZxwyWebSite/ztool/logs"
"github.com/ZxwyWebSite/ztool/zcypt"
Expand Down Expand Up @@ -169,22 +171,31 @@ func initMain() {
// }
// icl.Info(`使用本地缓存,文件路径 %q,绑定地址 %v`, LocalCachePath, env.Config.Apis.BindAddr)
case `2`, `cloudreve`:
icl.Fatal(`Cloudreve驱动暂未完善,未兼容新版调用方式,当前版本禁用`)
// icl.Warn(`Cloudreve驱动暂未完善,使用非本机存储时存在兼容性问题,请谨慎使用`)
// cs, err := cloudreve.NewSite(&cloudreve.Config{
// SiteUrl: env.Config.Cache.Cloud_Site,
// Username: env.Config.Cache.Cloud_User,
// Password: env.Config.Cache.Cloud_Pass,
// Session: env.Config.Cache.Cloud_Sess,
// })
// if err != nil {
// icl.Error(`驱动["cloudreve"]初始化失败: %v, 将禁用缓存功能`, err)
// }
// UseCache = &crcache.Cache{
// Cs: cs,
// Path: env.Config.Cache.Cloud_Path,
// IsOk: err == nil,
// }
icl.Warn(`欢迎使用新版 Cloudreve 驱动, 由 cr-go-sdk 提供强力支持`)
site := &cr.SiteObj{
Addr: env.Config.Cache.Cloud_Site,
ApiVer: cr.ApiV383,
Users: &cr.UserObj{
Mail: env.Config.Cache.Cloud_User,
Pass: env.Config.Cache.Cloud_Pass,
Cookie: cr.ParseCookie(env.Config.Cache.Cloud_Sess),
},
}
cache, err := caches.New(&cloudcache.Cache{
Site: site,
Path: env.Config.Cache.Cloud_Path,
})
if err != nil {
icl.Error(`驱动["cloudreve"]初始化失败: %v, 将禁用缓存功能`, err)
} else {
env.Tasker.Add(`cloud_sess`, func(l *logs.Logger, i int64) error {
if sess := site.Users.Cookie.String(); sess != env.Config.Cache.Cloud_Sess {
env.Config.Cache.Cloud_Sess = sess
}
return env.Cfg.Save(``)
}, 3600, true)
}
caches.UseCache = cache
default:
icl.Error(`未定义的缓存模式,请检查配置 [Cache].Mode,本次启动禁用缓存`)
}
Expand Down
42 changes: 42 additions & 0 deletions menu.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package main

import (
"fmt"
"lx-source/src/env"
"lx-source/src/sources/custom/tx"
wm "lx-source/src/sources/custom/wy/modules"
"runtime"
"strings"
"time"

Expand All @@ -22,6 +25,8 @@ func parseEtag(etag *string) {
// menuMian()
case `wyqr`:
wyQrLogin()
case `txqq`:
txQqLogin()
default:
loger.Fatal(`未知参数:%q`, *etag)
}
Expand All @@ -33,6 +38,17 @@ func wyQrLogin() {
loger := env.Loger.NewGroup(`WyQrLogin`)
defer loger.Free()
loger.Info(`执行模块: 网易云扫码登录`)

if env.Config.Custom.Wy_Api_Cookie != `` {
loger.Warn("已存在账号数据, 继续操作可能导致数据覆盖丢失!")
fmt.Print(`输入'y'继续: `)
var input string
fmt.Scanln(&input)
if input != `y` {
loger.Fatal(`用户取消操作`)
}
}

res, err := wm.LoginQrKey()
if err != nil {
loger.Fatal(`无法创建请求: %s`, err)
Expand Down Expand Up @@ -80,6 +96,32 @@ func wyQrLogin() {
}
}

// QQ快速登录
func txQqLogin() {
loger := env.Loger.NewGroup(`TxQqLogin`)
defer loger.Free()
loger.Info(`执行模块: QQ快速登录`)

if runtime.GOOS != `windows` {
loger.Fatal(`该模块仅支持在windows环境下使用`)
return
}

if env.Config.Custom.Tx_Ukey != `` {
loger.Warn("已存在账号数据, 继续操作可能导致数据覆盖丢失!")
fmt.Print(`输入'y'继续: `)
var input string
fmt.Scanln(&input)
if input != `y` {
loger.Fatal(`用户取消操作`)
}
}

if err := tx.Qlogin_graph(loger); err != nil {
loger.Fatal(err.Error())
}
}

// func menuMian() {
// app := menu.NewApp(`Lx-Source`)
// app.Data = menu.Data{
Expand Down
120 changes: 120 additions & 0 deletions src/caches/cloudcache/cloud.go
Original file line number Diff line number Diff line change
@@ -1 +1,121 @@
package cloudcache

import (
"lx-source/src/caches"
"lx-source/src/env"
"net/http"
"strings"

cr "github.com/ZxwyWebSite/cr-go-sdk"
"github.com/ZxwyWebSite/cr-go-sdk/service/explorer"
"github.com/ZxwyWebSite/ztool"
)

type Cache struct {
Site *cr.SiteObj
Path string
state bool
}

func (c *Cache) Get(q *caches.Query) string {
var b strings.Builder
b.WriteString(c.Path)
b.WriteByte('/')
b.WriteString(q.Source)
b.WriteByte('/')
b.WriteString(q.MusicID)
list, err := c.Site.Directory(b.String())
if err != nil {
caches.Loger.Debug(`列出目录: %v`, err)
return ``
}
name := q.Quality + `.` + q.Extname
var id string
for _, v := range list.Objects {
if v.Name == name && v.Type == `file` {
id = v.ID
break
}
}
if id == `` {
caches.Loger.Debug(`文件不存在`)
return ``
}
srcs, err := c.Site.FileSource(cr.GenerateSrc(false, id))
if err != nil {
caches.Loger.Debug(`生成外链: %v`, err)
return ``
}
return (*srcs)[0].URL
/*link, err := c.Site.FileDownload(id)
if err != nil {
caches.Loger.Debug(`下载文件: %v`, err)
return ``
}
if (*link)[0] == '/' {
return c.Site.Addr + (*link)[1:]
}
return *link*/
}

func (c *Cache) Set(q *caches.Query, l string) string {
var b strings.Builder
b.WriteString(c.Path)
b.WriteByte('/')
b.WriteString(q.Source)
b.WriteByte('/')
b.WriteString(q.MusicID)
dir := b.String()
err := c.Site.DirectoryNew(&explorer.DirectoryService{
Path: dir,
})
if err != nil {
caches.Loger.Debug(`创建目录: %v`, err)
return ``
}
/*var buf bytes.Buffer
err = ztool.Net_Download(l, &buf, nil)
if err != nil {
caches.Loger.Debug(`下载文件: %v`, err)
return ``
}*/
name := q.Quality + `.` + q.Extname
err = ztool.Net_Request(
http.MethodGet, l, nil,
[]ztool.Net_ReqHandlerFunc{ztool.Net_ReqAddHeaders()},
[]ztool.Net_ResHandlerFunc{func(res *http.Response) error {
return (&cr.UploadTask{
Site: c.Site,
File: res.Body,
Size: uint64(res.ContentLength),
Name: name,
Mime: `audio/mpeg`,
}).Do(dir)
}},
)
if err != nil {
caches.Loger.Debug(`上传文件: %v`, err)
return ``
}
return c.Get(q)
}

func (c *Cache) Stat() bool {
return c.state
}

func (c *Cache) Init() error {
cr.Cr_Debug = env.Config.Main.Debug
err := c.Site.SdkInit()
if err != nil {
return err
}
if c.Site.Users.Cookie == nil || c.Site.Config.User.Anonymous {
err = c.Site.SdkLogin()
if err != nil {
return err
}
}
c.state = true
return nil
}
31 changes: 16 additions & 15 deletions src/env/env.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (
)

const (
Version = `1.0.3.0430`
Version = `1.0.3.0518`
)

var (
Expand All @@ -36,10 +36,10 @@ type (
Print bool `comment:"控制台输出 (影响io性能,后台使用建议关闭)"`
SysLev bool `comment:"(实验性) 设置进程高优先级"`
// FFConv bool `comment:"(实验性) 使用FFMpeg修复音频(本地缓存)"`
NgProxy bool `comment:"兼容反向代理(beta)"`
Timeout int64 `comment:"网络请求超时(单位:秒,海外服务器可适当调大)"`

Store string `comment:"内存缓存持久化文件地址"`
NgProxy bool `comment:"兼容反向代理(beta)"`
Timeout int64 `comment:"网络请求超时(单位:秒,海外服务器可适当调大)"`
Store string `comment:"内存缓存持久化文件地址"`
ErrMp3 string `comment:"获取失败默认音频"`
}
// 接口
Conf_Apis struct {
Expand Down Expand Up @@ -174,11 +174,11 @@ type (
Local_Bind string `comment:"本地缓存外部访问地址"`
Local_Auto bool `comment:"自适应缓存访问地址(beta)"`
// 云盘
// Cloud_Site string `comment:"Cloudreve站点地址"`
// Cloud_User string `comment:"Cloudreve用户名"`
// Cloud_Pass string `comment:"Cloudreve密码"`
// Cloud_Sess string `comment:"Cloudreve会话"`
// Cloud_Path string `comment:"Cloudreve存储路径"`
Cloud_Site string `comment:"Cloudreve站点地址"`
Cloud_User string `comment:"Cloudreve用户名"`
Cloud_Pass string `comment:"Cloudreve密码"`
Cloud_Sess string `comment:"Cloudreve会话"`
Cloud_Path string `comment:"Cloudreve存储路径"`
}
// 结构
Conf struct {
Expand All @@ -204,6 +204,7 @@ var (
SysLev: false,
Timeout: 30,
Store: `/data/memo.bin`,
ErrMp3: `https://r2eu.zxwy.link/gh/lx-source/static/error.mp3`,
},
Apis: Conf_Apis{
// BindAddr: `http://192.168.10.22:1011/`,
Expand Down Expand Up @@ -276,11 +277,11 @@ var (
LinkMode: `1`,
Local_Path: `data/cache`,
Local_Bind: `http://127.0.0.1:1011/`,
// Cloud_Site: `https://cloudreveplus-demo.onrender.com/`,
// Cloud_User: `[email protected]`,
// Cloud_Pass: `CloudrevePlusDemo`,
// Cloud_Sess: ``,
// Cloud_Path: `/Lx-Source/cache`,
Cloud_Site: `https://cloudreveplus-demo.onrender.com/`,
Cloud_User: `[email protected]`,
Cloud_Pass: `CloudrevePlusDemo`,
Cloud_Sess: ``,
Cloud_Path: `/Lx-Source/cache`,
},
}
Config = DefCfg
Expand Down
5 changes: 3 additions & 2 deletions src/middleware/resp/resp.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
package resp

import (
"lx-source/src/env"
"net/http"

"github.com/gin-gonic/gin"
Expand All @@ -26,7 +27,7 @@ type Resp struct {
}

// 获取失败默认音频
var ErrMp3 = `https://r2eu.zxwy.link/gh/lx-source/static/error.mp3`
// var ErrMp3 = `https://r2eu.zxwy.link/gh/lx-source/static/error.mp3`

// 返回请求
/*
Expand All @@ -43,7 +44,7 @@ func (o *Resp) Execute(c *gin.Context) {
case 2:
status = http.StatusServiceUnavailable
if o.Data == nil || o.Data == `` {
o.Data = ErrMp3
o.Data = env.Config.Main.ErrMp3 //ErrMp3
}
case 3:
status = http.StatusUnauthorized
Expand Down
1 change: 1 addition & 0 deletions src/server/api_music.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ func musicHandler(c *gin.Context) {
cstat = caches.UseCache.Stat()
}
uquery := caches.NewQuery(ps, pid, pq)
uquery.Request = c.Request
defer uquery.Free()
if cstat {
loger.Debug(`FileGet: %v`, uquery.Query())
Expand Down
2 changes: 1 addition & 1 deletion src/server/public/status.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ <h2>示例:</h2>
const api = './';
function l(s, id, q) {
let url = `${api}link/${s}/${id[Math.floor(Math.random() * id.length)]}/${q}`;
const key = localStorage.getItem('apipass'); if (key) url += `?key=${key}`;
const key = localStorage.getItem('apipass'); if (key) url += `?key=${encodeURIComponent(key)}`;
fetch(url)
.then((response) => response.json())
.then((res) => {
Expand Down
Loading

0 comments on commit 30b3260

Please sign in to comment.