This commit is contained in:
2023-09-13 00:46:17 +08:00
parent d894fea89e
commit 6e5e999937
26 changed files with 10919 additions and 1155 deletions

View File

@ -2,9 +2,9 @@ package controller
import (
"net/http"
"net/url"
"sub/config"
"sub/validator"
"strings"
"sub2clash/config"
"sub2clash/validator"
"github.com/gin-gonic/gin"
"gopkg.in/yaml.v3"
@ -17,9 +17,10 @@ func SubmodHandler(c *gin.Context) {
c.String(http.StatusBadRequest, "参数错误: "+err.Error())
return
}
query.Sub, _ = url.QueryUnescape(query.Sub)
// 混合订阅和模板节点
sub, err := MixinSubTemp(query, config.Default.ClashTemplate)
sub, err := MixinSubsAndTemplate(
strings.Split(query.Sub, ","), query.Refresh, config.Default.ClashTemplate,
)
if err != nil {
c.String(http.StatusInternalServerError, err.Error())
return

View File

@ -3,14 +3,16 @@ package controller
import (
"errors"
"gopkg.in/yaml.v3"
"net/url"
"strings"
"sub/model"
"sub/parser"
"sub/utils"
"sub/validator"
"sub2clash/model"
"sub2clash/parser"
"sub2clash/utils"
)
func MixinSubTemp(query validator.SubQuery, template string) (*model.Subscription, error) {
func MixinSubsAndTemplate(subs []string, refresh bool, template string) (
*model.Subscription, error,
) {
// 定义变量
var temp *model.Subscription
var sub *model.Subscription
@ -24,28 +26,36 @@ func MixinSubTemp(query validator.SubQuery, template string) (*model.Subscriptio
if err != nil {
return nil, errors.New("解析模板失败: " + err.Error())
}
var proxies []model.Proxy
// 加载订阅
data, err := utils.LoadSubscription(
query.Sub,
query.Refresh,
)
if err != nil {
return nil, errors.New("加载订阅失败: " + err.Error())
}
// 解析订阅
var proxyList []model.Proxy
err = yaml.Unmarshal(data, &sub)
if err != nil {
// 如果无法直接解析尝试Base64解码
base64, err := parser.DecodeBase64(string(data))
for i := range subs {
subs[i], _ = url.QueryUnescape(subs[i])
if _, err := url.ParseRequestURI(subs[i]); err != nil {
return nil, errors.New("订阅地址错误: " + err.Error())
}
data, err := utils.LoadSubscription(
subs[i],
refresh,
)
if err != nil {
return nil, errors.New("加载订阅失败: " + err.Error())
}
proxyList = utils.ParseProxy(strings.Split(base64, "\n")...)
} else {
proxyList = sub.Proxies
// 解析订阅
var proxyList []model.Proxy
err = yaml.Unmarshal(data, &sub)
if err != nil {
// 如果无法直接解析尝试Base64解码
base64, err := parser.DecodeBase64(string(data))
if err != nil {
return nil, errors.New("加载订阅失败: " + err.Error())
}
proxyList = utils.ParseProxy(strings.Split(base64, "\n")...)
} else {
proxyList = sub.Proxies
}
proxies = append(proxies, proxyList...)
}
// 添加节点
utils.AddProxy(temp, proxyList...)
utils.AddProxy(temp, proxies...)
return temp, nil
}

View File

@ -3,9 +3,9 @@ package controller
import (
_ "embed"
"net/http"
"net/url"
"sub/config"
"sub/validator"
"strings"
"sub2clash/config"
"sub2clash/validator"
"github.com/gin-gonic/gin"
"gopkg.in/yaml.v3"
@ -18,9 +18,10 @@ func SubHandler(c *gin.Context) {
c.String(http.StatusBadRequest, "参数错误: "+err.Error())
return
}
query.Sub, _ = url.QueryUnescape(query.Sub)
// 混合订阅和模板节点
sub, err := MixinSubTemp(query, config.Default.MetaTemplate)
sub, err := MixinSubsAndTemplate(
strings.Split(query.Sub, ","), query.Refresh, config.Default.MetaTemplate,
)
if err != nil {
c.String(http.StatusInternalServerError, err.Error())
return

View File

@ -2,7 +2,7 @@ package api
import (
"github.com/gin-gonic/gin"
"sub/api/controller"
"sub2clash/api/controller"
)
func SetRoute(r *gin.Engine) {