Update On Thu Jul 24 20:41:17 CEST 2025

This commit is contained in:
github-action[bot]
2025-07-24 20:41:17 +02:00
parent ef90160412
commit ae7705dddc
50 changed files with 822 additions and 547 deletions
+1
View File
@@ -1068,3 +1068,4 @@ Update On Sun Jul 20 20:38:16 CEST 2025
Update On Mon Jul 21 20:42:18 CEST 2025
Update On Tue Jul 22 20:42:19 CEST 2025
Update On Wed Jul 23 20:41:36 CEST 2025
Update On Thu Jul 24 20:41:09 CEST 2025
+7 -7
View File
@@ -29,7 +29,7 @@ jobs:
strategy:
matrix:
jobs:
- { goos: darwin, goarch: amd64, goamd64: v1, output: amd64-compatible }
- { goos: darwin, goarch: amd64, goamd64: v1, output: amd64-compatible } # old style file name will be removed in next released
- { goos: darwin, goarch: amd64, goamd64: v3, output: amd64 }
- { goos: darwin, goarch: amd64, goamd64: v1, output: amd64-v1 }
- { goos: darwin, goarch: amd64, goamd64: v2, output: amd64-v2 }
@@ -38,10 +38,10 @@ jobs:
- { goos: linux, goarch: '386', go386: sse2, output: '386', debian: i386, rpm: i386}
- { goos: linux, goarch: '386', go386: softfloat, output: '386-softfloat' }
- { goos: linux, goarch: amd64, goamd64: v1, output: amd64-compatible}
- { goos: linux, goarch: amd64, goamd64: v3, output: amd64}
- { goos: linux, goarch: amd64, goamd64: v1, output: amd64-v1, test: test }
- { goos: linux, goarch: amd64, goamd64: v2, output: amd64-v2 }
- { goos: linux, goarch: amd64, goamd64: v1, output: amd64-compatible} # old style file name will be removed in next released
- { goos: linux, goarch: amd64, goamd64: v3, output: amd64, debian: amd64, rpm: x86_64, pacman: x86_64}
- { goos: linux, goarch: amd64, goamd64: v1, output: amd64-v1, debian: amd64, rpm: x86_64, pacman: x86_64, test: test }
- { goos: linux, goarch: amd64, goamd64: v2, output: amd64-v2, debian: amd64, rpm: x86_64, pacman: x86_64}
- { goos: linux, goarch: amd64, goamd64: v3, output: amd64-v3, debian: amd64, rpm: x86_64, pacman: x86_64}
- { goos: linux, goarch: arm64, output: arm64, debian: arm64, rpm: aarch64, pacman: aarch64}
- { goos: linux, goarch: arm, goarm: '5', output: armv5 }
@@ -60,7 +60,7 @@ jobs:
- { goos: linux, goarch: ppc64le, output: ppc64le, debian: ppc64el, rpm: ppc64le }
- { goos: windows, goarch: '386', output: '386' }
- { goos: windows, goarch: amd64, goamd64: v1, output: amd64-compatible }
- { goos: windows, goarch: amd64, goamd64: v1, output: amd64-compatible } # old style file name will be removed in next released
- { goos: windows, goarch: amd64, goamd64: v3, output: amd64 }
- { goos: windows, goarch: amd64, goamd64: v1, output: amd64-v1 }
- { goos: windows, goarch: amd64, goamd64: v2, output: amd64-v2 }
@@ -68,7 +68,7 @@ jobs:
- { goos: windows, goarch: arm64, output: arm64 }
- { goos: freebsd, goarch: '386', output: '386' }
- { goos: freebsd, goarch: amd64, goamd64: v1, output: amd64-compatible }
- { goos: freebsd, goarch: amd64, goamd64: v1, output: amd64-compatible } # old style file name will be removed in next released
- { goos: freebsd, goarch: amd64, goamd64: v3, output: amd64 }
- { goos: freebsd, goarch: amd64, goamd64: v1, output: amd64-v1 }
- { goos: freebsd, goarch: amd64, goamd64: v2, output: amd64-v2 }
+26 -31
View File
@@ -33,49 +33,43 @@ const (
MaxPackageFileSize = 32 * 1024 * 1024
)
var mihomoBaseName string
// CoreUpdater is the mihomo updater.
// modify from https://github.com/AdguardTeam/AdGuardHome/blob/595484e0b3fb4c457f9bb727a6b94faa78a66c5f/internal/updater/updater.go
type CoreUpdater struct {
mu sync.Mutex
}
func init() {
var DefaultCoreUpdater = CoreUpdater{}
func (u *CoreUpdater) CoreBaseName() string {
switch runtime.GOARCH {
case "arm":
// mihomo-linux-armv5
mihomoBaseName = fmt.Sprintf("mihomo-%s-%sv%s", runtime.GOOS, runtime.GOARCH, features.GOARM)
return fmt.Sprintf("mihomo-%s-%sv%s", runtime.GOOS, runtime.GOARCH, features.GOARM)
case "arm64":
if runtime.GOOS == "android" {
// mihomo-android-arm64-v8
mihomoBaseName = fmt.Sprintf("mihomo-%s-%s-v8", runtime.GOOS, runtime.GOARCH)
return fmt.Sprintf("mihomo-%s-%s-v8", runtime.GOOS, runtime.GOARCH)
} else {
// mihomo-linux-arm64
mihomoBaseName = fmt.Sprintf("mihomo-%s-%s", runtime.GOOS, runtime.GOARCH)
return fmt.Sprintf("mihomo-%s-%s", runtime.GOOS, runtime.GOARCH)
}
case "mips", "mipsle":
// mihomo-linux-mips-hardfloat
mihomoBaseName = fmt.Sprintf("mihomo-%s-%s-%s", runtime.GOOS, runtime.GOARCH, features.GOMIPS)
return fmt.Sprintf("mihomo-%s-%s-%s", runtime.GOOS, runtime.GOARCH, features.GOMIPS)
case "amd64":
// mihomo-linux-amd64-v1
mihomoBaseName = fmt.Sprintf("mihomo-%s-%s-%s", runtime.GOOS, runtime.GOARCH, features.GOAMD64)
return fmt.Sprintf("mihomo-%s-%s-%s", runtime.GOOS, runtime.GOARCH, features.GOAMD64)
default:
// mihomo-linux-386
// mihomo-linux-mips64
// mihomo-linux-riscv64
// mihomo-linux-s390x
mihomoBaseName = fmt.Sprintf("mihomo-%s-%s", runtime.GOOS, runtime.GOARCH)
return fmt.Sprintf("mihomo-%s-%s", runtime.GOOS, runtime.GOARCH)
}
}
// CoreUpdater is the mihomo updater.
// modify from https://github.com/AdguardTeam/AdGuardHome/blob/595484e0b3fb4c457f9bb727a6b94faa78a66c5f/internal/updater/updater.go
var CoreUpdater = coreUpdater{}
func UpdateCore(execPath string) (err error) {
return CoreUpdater.Update(execPath)
}
type coreUpdater struct {
mu sync.Mutex
}
func (u *coreUpdater) Update(currentExePath string) (err error) {
func (u *CoreUpdater) Update(currentExePath string) (err error) {
u.mu.Lock()
defer u.mu.Unlock()
@@ -110,6 +104,7 @@ func (u *coreUpdater) Update(currentExePath string) (err error) {
}()
// ---- prepare ----
mihomoBaseName := u.CoreBaseName()
packageName := mihomoBaseName + "-" + latestVersion
if runtime.GOOS == "windows" {
packageName = packageName + ".zip"
@@ -129,7 +124,7 @@ func (u *coreUpdater) Update(currentExePath string) (err error) {
if runtime.GOOS == "windows" {
updateExeName = updateExeName + ".exe"
}
log.Infoln("updateExeName: %s ", updateExeName)
log.Infoln("updateExeName: %s", updateExeName)
updateExePath := filepath.Join(updateDir, updateExeName)
backupExePath := filepath.Join(backupDir, filepath.Base(currentExePath))
@@ -158,7 +153,7 @@ func (u *coreUpdater) Update(currentExePath string) (err error) {
return nil
}
func (u *coreUpdater) getLatestVersion(versionURL string) (version string, err error) {
func (u *CoreUpdater) getLatestVersion(versionURL string) (version string, err error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
resp, err := mihomoHttp.HttpRequest(ctx, versionURL, http.MethodGet, nil, nil)
@@ -181,7 +176,7 @@ func (u *coreUpdater) getLatestVersion(versionURL string) (version string, err e
}
// download package file and save it to disk
func (u *coreUpdater) download(updateDir, packagePath, packageURL string) (err error) {
func (u *CoreUpdater) download(updateDir, packagePath, packageURL string) (err error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*90)
defer cancel()
resp, err := mihomoHttp.HttpRequest(ctx, packageURL, http.MethodGet, nil, nil)
@@ -218,7 +213,7 @@ func (u *coreUpdater) download(updateDir, packagePath, packageURL string) (err e
}
// unpack extracts the files from the downloaded archive.
func (u *coreUpdater) unpack(updateDir, packagePath string) error {
func (u *CoreUpdater) unpack(updateDir, packagePath string) error {
log.Infoln("updater: unpacking package")
if strings.HasSuffix(packagePath, ".zip") {
_, err := u.zipFileUnpack(packagePath, updateDir)
@@ -240,7 +235,7 @@ func (u *coreUpdater) unpack(updateDir, packagePath string) error {
}
// backup makes a backup of the current executable file
func (u *coreUpdater) backup(currentExePath, backupExePath, backupDir string) (err error) {
func (u *CoreUpdater) backup(currentExePath, backupExePath, backupDir string) (err error) {
log.Infoln("updater: backing up current ExecFile:%s to %s", currentExePath, backupExePath)
_ = os.Mkdir(backupDir, 0o755)
@@ -253,7 +248,7 @@ func (u *coreUpdater) backup(currentExePath, backupExePath, backupDir string) (e
}
// replace moves the current executable with the updated one
func (u *coreUpdater) replace(updateExePath, currentExePath string) error {
func (u *CoreUpdater) replace(updateExePath, currentExePath string) error {
var err error
log.Infoln("replacing: %s to %s", updateExePath, currentExePath)
@@ -273,7 +268,7 @@ func (u *coreUpdater) replace(updateExePath, currentExePath string) error {
}
// clean removes the temporary directory itself and all it's contents.
func (u *coreUpdater) clean(updateDir string) {
func (u *CoreUpdater) clean(updateDir string) {
_ = os.RemoveAll(updateDir)
}
@@ -281,7 +276,7 @@ func (u *coreUpdater) clean(updateDir string) {
// Existing files are overwritten
// All files are created inside outDir, subdirectories are not created
// Return the output file name
func (u *coreUpdater) gzFileUnpack(gzfile, outDir string) (string, error) {
func (u *CoreUpdater) gzFileUnpack(gzfile, outDir string) (string, error) {
f, err := os.Open(gzfile)
if err != nil {
return "", fmt.Errorf("os.Open(): %w", err)
@@ -345,7 +340,7 @@ func (u *coreUpdater) gzFileUnpack(gzfile, outDir string) (string, error) {
// Existing files are overwritten
// All files are created inside 'outDir', subdirectories are not created
// Return the output file name
func (u *coreUpdater) zipFileUnpack(zipfile, outDir string) (string, error) {
func (u *CoreUpdater) zipFileUnpack(zipfile, outDir string) (string, error) {
zrc, err := zip.OpenReader(zipfile)
if err != nil {
return "", fmt.Errorf("zip.OpenReader(): %w", err)
@@ -404,7 +399,7 @@ func (u *coreUpdater) zipFileUnpack(zipfile, outDir string) (string, error) {
}
// Copy file on disk
func (u *coreUpdater) copyFile(src, dst string) error {
func (u *CoreUpdater) copyFile(src, dst string) error {
d, e := os.ReadFile(src)
if e != nil {
return e
@@ -5,6 +5,6 @@ import (
"testing"
)
func TestBaseName(t *testing.T) {
fmt.Println("mihomoBaseName =", mihomoBaseName)
func TestCoreBaseName(t *testing.T) {
fmt.Println("Core base name =", DefaultCoreUpdater.CoreBaseName())
}
+1 -1
View File
@@ -32,7 +32,7 @@ func upgradeCore(w http.ResponseWriter, r *http.Request) {
return
}
err = updater.UpdateCore(execPath)
err = updater.DefaultCoreUpdater.Update(execPath)
if err != nil {
log.Warnln("%s", err)
render.Status(r, http.StatusInternalServerError)
@@ -55,12 +55,12 @@
"@csstools/normalize.css": "12.1.1",
"@emotion/babel-plugin": "11.13.5",
"@emotion/react": "11.14.0",
"@iconify/json": "2.2.360",
"@iconify/json": "2.2.362",
"@monaco-editor/react": "4.7.0",
"@tanstack/react-query": "5.83.0",
"@tanstack/react-router": "1.129.2",
"@tanstack/react-router-devtools": "1.129.2",
"@tanstack/router-plugin": "1.129.2",
"@tanstack/react-router": "1.129.8",
"@tanstack/react-router-devtools": "1.129.8",
"@tanstack/router-plugin": "1.129.8",
"@tauri-apps/plugin-clipboard-manager": "2.3.0",
"@tauri-apps/plugin-dialog": "2.3.0",
"@tauri-apps/plugin-fs": "2.4.0",
@@ -87,7 +87,7 @@
"unplugin-auto-import": "19.3.0",
"unplugin-icons": "22.1.0",
"validator": "13.15.15",
"vite": "7.0.5",
"vite": "7.0.6",
"vite-plugin-html": "3.2.2",
"vite-plugin-sass-dts": "1.3.31",
"vite-plugin-svgr": "4.3.0",
+1 -1
View File
@@ -30,7 +30,7 @@
"react-i18next": "15.6.1",
"react-use": "17.6.0",
"tailwindcss": "4.1.11",
"vite": "7.0.5",
"vite": "7.0.6",
"vite-tsconfig-paths": "5.1.4"
},
"devDependencies": {
+2 -2
View File
@@ -2,7 +2,7 @@
"manifest_version": 1,
"latest": {
"mihomo": "v1.19.11",
"mihomo_alpha": "alpha-63ad95e",
"mihomo_alpha": "alpha-dfe6e05",
"clash_rs": "v0.8.1",
"clash_premium": "2023-09-05-gdcc8d87",
"clash_rs_alpha": "0.8.1-alpha+sha.f6fecec"
@@ -69,5 +69,5 @@
"linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf"
}
},
"updated_at": "2025-07-22T22:21:27.047Z"
"updated_at": "2025-07-23T22:21:28.487Z"
}
+106 -96
View File
@@ -247,7 +247,7 @@ importers:
version: 4.1.11
'@tanstack/router-zod-adapter':
specifier: 1.81.5
version: 1.81.5(@tanstack/react-router@1.129.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(zod@4.0.5)
version: 1.81.5(@tanstack/react-router@1.129.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(zod@4.0.5)
'@tauri-apps/api':
specifier: 2.6.0
version: 2.6.0
@@ -337,8 +337,8 @@ importers:
specifier: 11.14.0
version: 11.14.0(@types/react@19.1.8)(react@19.1.0)
'@iconify/json':
specifier: 2.2.360
version: 2.2.360
specifier: 2.2.362
version: 2.2.362
'@monaco-editor/react':
specifier: 4.7.0
version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -346,14 +346,14 @@ importers:
specifier: 5.83.0
version: 5.83.0(react@19.1.0)
'@tanstack/react-router':
specifier: 1.129.2
version: 1.129.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
specifier: 1.129.8
version: 1.129.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@tanstack/react-router-devtools':
specifier: 1.129.2
version: 1.129.2(@tanstack/react-router@1.129.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.129.2)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.5)(tiny-invariant@1.3.3)
specifier: 1.129.8
version: 1.129.8(@tanstack/react-router@1.129.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.129.8)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.5)(tiny-invariant@1.3.3)
'@tanstack/router-plugin':
specifier: 1.129.2
version: 1.129.2(@tanstack/react-router@1.129.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
specifier: 1.129.8
version: 1.129.8(@tanstack/react-router@1.129.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
'@tauri-apps/plugin-clipboard-manager':
specifier: 2.3.0
version: 2.3.0
@@ -389,13 +389,13 @@ importers:
version: 13.15.2
'@vitejs/plugin-legacy':
specifier: 7.1.0
version: 7.1.0(terser@5.36.0)(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
version: 7.1.0(terser@5.36.0)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
'@vitejs/plugin-react':
specifier: 4.7.0
version: 4.7.0(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
version: 4.7.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
'@vitejs/plugin-react-swc':
specifier: 3.11.0
version: 3.11.0(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
version: 3.11.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
change-case:
specifier: 5.4.4
version: 5.4.4
@@ -433,20 +433,20 @@ importers:
specifier: 13.15.15
version: 13.15.15
vite:
specifier: 7.0.5
version: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
specifier: 7.0.6
version: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite-plugin-html:
specifier: 3.2.2
version: 3.2.2(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
version: 3.2.2(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
vite-plugin-sass-dts:
specifier: 1.3.31
version: 1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.89.2)(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
version: 1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.89.2)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
vite-plugin-svgr:
specifier: 4.3.0
version: 4.3.0(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
version: 4.3.0(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
vite-tsconfig-paths:
specifier: 5.1.4
version: 5.1.4(typescript@5.8.3)(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
version: 5.1.4(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
zod:
specifier: 4.0.5
version: 4.0.5
@@ -482,7 +482,7 @@ importers:
version: 19.1.8
'@vitejs/plugin-react':
specifier: 4.7.0
version: 4.7.0(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
version: 4.7.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
ahooks:
specifier: 3.9.0
version: 3.9.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -511,11 +511,11 @@ importers:
specifier: 4.1.11
version: 4.1.11
vite:
specifier: 7.0.5
version: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
specifier: 7.0.6
version: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite-tsconfig-paths:
specifier: 5.1.4
version: 5.1.4(typescript@5.8.3)(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
version: 5.1.4(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
devDependencies:
'@emotion/react':
specifier: 11.14.0
@@ -540,7 +540,7 @@ importers:
version: 5.1.0(typescript@5.8.3)
vite-plugin-dts:
specifier: 4.5.4
version: 4.5.4(@types/node@22.16.5)(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
version: 4.5.4(@types/node@22.16.5)(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
scripts:
dependencies:
@@ -1769,8 +1769,8 @@ packages:
'@vue/compiler-sfc':
optional: true
'@iconify/json@2.2.360':
resolution: {integrity: sha512-N1mmTs7dJd6Ym62fP5DxJG1ZpbXSncD32tC/RJoGGjEPNx52/HzBixEjS9hVPps8CWs2VL7uRr4UKmjiFA/n5Q==}
'@iconify/json@2.2.362':
resolution: {integrity: sha512-Xr0aGINCS453Bp3zKgp30H8FtT2T4lTqB1T9QVHD3ougPgKjfuQM3ij08mY06+4HkVFdllCuReEilo32p7yVlQ==}
'@iconify/types@2.0.0':
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
@@ -2912,8 +2912,8 @@ packages:
'@tailwindcss/postcss@4.1.11':
resolution: {integrity: sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==}
'@tanstack/history@1.121.34':
resolution: {integrity: sha512-YL8dGi5ZU+xvtav2boRlw4zrRghkY6hvdcmHhA0RGSJ/CBgzv+cbADW9eYJLx74XMZvIQ1pp6VMbrpXnnM5gHA==}
'@tanstack/history@1.129.7':
resolution: {integrity: sha512-I3YTkbe4RZQN54Qw4+IUhOjqG2DdbG2+EBWuQfew4MEk0eddLYAQVa50BZVww4/D2eh5I9vEk2Fd1Y0Wty7pug==}
engines: {node: '>=12'}
'@tanstack/match-sorter-utils@8.19.4':
@@ -2928,16 +2928,16 @@ packages:
peerDependencies:
react: ^18 || ^19
'@tanstack/react-router-devtools@1.129.2':
resolution: {integrity: sha512-8ipEnUv5lWcZYQ5ia0L2wOGqt1CJpfU8iSN9xaX7z93U9cRQg0G1IOf0iYkHpjfUe8WxRY6+5siST+qlKbdtJA==}
'@tanstack/react-router-devtools@1.129.8':
resolution: {integrity: sha512-+gVwYRLFAoQ+U4+UGX5/VgxspoJN4dm6/z4vYaZyrOUBVo+UjjH+bpvdz9ZrooBQ9EdkrkORPH8EfZp5qgi5Bg==}
engines: {node: '>=12'}
peerDependencies:
'@tanstack/react-router': ^1.129.2
'@tanstack/react-router': ^1.129.8
react: '>=18.0.0 || >=19.0.0'
react-dom: '>=18.0.0 || >=19.0.0'
'@tanstack/react-router@1.129.2':
resolution: {integrity: sha512-ERGkvtb4qlo1ihrKUMJn2RfiC3T7rE/PpRtsATCmC0Gy0NmaO8S1+XvgriYl2bzdqTnBliwwIzqkKB9A2xPqDQ==}
'@tanstack/react-router@1.129.8':
resolution: {integrity: sha512-d5mfM+67h3wq7aHkLjRKXD1ddbzx1YuxaEbNvW45jjZXMgaikZSVfJrZBiUWXE/nhV1sTdbMQ48JcPagvGPmYQ==}
engines: {node: '>=12'}
peerDependencies:
react: '>=18.0.0 || >=19.0.0'
@@ -2962,15 +2962,15 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
'@tanstack/router-core@1.129.2':
resolution: {integrity: sha512-M7OuzxbSkEFa1WWQoLOg7RtJUHzfaURMiRCLbKLEJWJkw1Cuylj7oBbzbawDAJFTHry9UUDZNPP0MSCfcXypPA==}
'@tanstack/router-core@1.129.8':
resolution: {integrity: sha512-Izqf5q8TzJv0DJURynitJioPJT3dPAefrzHi2wlY/Q5+7nEG41SkjYMotTX2Q9i/Pjl91lW8gERCHpksszRdRw==}
engines: {node: '>=12'}
'@tanstack/router-devtools-core@1.129.2':
resolution: {integrity: sha512-PlGJ5A54P0J8FAe7biiLARN9U6VCDPbnoNjqL9jsvf2A0X/cQw4fgediR+jsMjVuXNoL4kMDprVTpGT5PoVUaQ==}
'@tanstack/router-devtools-core@1.129.8':
resolution: {integrity: sha512-1yiAoWWYV3hWLXoHv92LMU67EjJpavoavo00EYzf7RLCy0TA/a+KyokZBS6PD38sITamHgVeY/jJBGD6hr47rQ==}
engines: {node: '>=12'}
peerDependencies:
'@tanstack/router-core': ^1.129.2
'@tanstack/router-core': ^1.129.8
csstype: ^3.0.10
solid-js: '>=1.9.5'
tiny-invariant: ^1.3.3
@@ -2978,16 +2978,16 @@ packages:
csstype:
optional: true
'@tanstack/router-generator@1.129.2':
resolution: {integrity: sha512-xCZYd4sgPFdlgEten7x+uJx+0y6iUm2d8cnE3cHHzzc5COf5jO+FFh9kVRa9Ouh4h/binv5dpKRBhB33TqPRfw==}
'@tanstack/router-generator@1.129.8':
resolution: {integrity: sha512-i4QTtJeRq3jdRTuUXHKcmPNm6STS0jLJNTKEdeUCIzuVBiiP53oujMOd84e5ARP83k2IB2XcMHekTSzDlWD2fg==}
engines: {node: '>=12'}
'@tanstack/router-plugin@1.129.2':
resolution: {integrity: sha512-uchyp0fMG6MmMJMxydmp4JTyIfW0FHVE4hwGSnP9dgoncQHbqZQt3qNEYbzPIV+JRp6DKjb8Ax5DAUgL7/LVCA==}
'@tanstack/router-plugin@1.129.8':
resolution: {integrity: sha512-DdO6el2slgBO2mIqIGdGyHCzsbQLsTNxsgbNz9ZY9y324iP4G+p3iEYopHWgzLKM2DKinMs9F7AxjLow4V3klQ==}
engines: {node: '>=12'}
peerDependencies:
'@rsbuild/core': '>=1.0.2'
'@tanstack/react-router': ^1.129.2
'@tanstack/react-router': ^1.129.8
vite: '>=5.0.0 || >=6.0.0'
vite-plugin-solid: ^2.11.2
webpack: '>=5.92.0'
@@ -3003,8 +3003,8 @@ packages:
webpack:
optional: true
'@tanstack/router-utils@1.121.21':
resolution: {integrity: sha512-u7ubq1xPBtNiU7Fm+EOWlVWdgFLzuKOa1thhqdscVn8R4dNMUd1VoOjZ6AKmLw201VaUhFtlX+u0pjzI6szX7A==}
'@tanstack/router-utils@1.129.7':
resolution: {integrity: sha512-I2OyQF5U6sxHJApXKCUmCncTHKcpj4681FwyxpYg5QYOatHcn/zVMl7Rj4h36fu8/Lo2ZRLxUMd5kmXgp5Pb/A==}
engines: {node: '>=12'}
'@tanstack/router-zod-adapter@1.81.5':
@@ -3024,8 +3024,8 @@ packages:
'@tanstack/virtual-core@3.13.9':
resolution: {integrity: sha512-3jztt0jpaoJO5TARe2WIHC1UQC3VMLAFUW5mmMo0yrkwtDB2AQP0+sh10BVUpWrnvHjSLvzFizydtEGLCJKFoQ==}
'@tanstack/virtual-file-routes@1.121.21':
resolution: {integrity: sha512-3nuYsTyaq6ZN7jRZ9z6Gj3GXZqBOqOT0yzd/WZ33ZFfv4yVNIvsa5Lw+M1j3sgyEAxKMqGu/FaNi7FCjr3yOdw==}
'@tanstack/virtual-file-routes@1.129.7':
resolution: {integrity: sha512-a+MxoAXG+Sq94Jp67OtveKOp2vQq75AWdVI8DRt6w19B0NEqpfm784FTLbVp/qdR1wmxCOmKAvElGSIiBOx5OQ==}
engines: {node: '>=12'}
'@taplo/core@0.2.0':
@@ -6779,6 +6779,10 @@ packages:
resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
engines: {node: '>=12'}
picomatch@4.0.3:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'}
pidtree@0.6.0:
resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
engines: {node: '>=0.10'}
@@ -8322,8 +8326,8 @@ packages:
vite:
optional: true
vite@7.0.5:
resolution: {integrity: sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==}
vite@7.0.6:
resolution: {integrity: sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
@@ -9971,7 +9975,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@iconify/json@2.2.360':
'@iconify/json@2.2.362':
dependencies:
'@iconify/types': 2.0.0
pathe: 1.1.2
@@ -11063,7 +11067,7 @@ snapshots:
postcss: 8.5.6
tailwindcss: 4.1.11
'@tanstack/history@1.121.34': {}
'@tanstack/history@1.129.7': {}
'@tanstack/match-sorter-utils@8.19.4':
dependencies:
@@ -11076,10 +11080,10 @@ snapshots:
'@tanstack/query-core': 5.83.0
react: 19.1.0
'@tanstack/react-router-devtools@1.129.2(@tanstack/react-router@1.129.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.129.2)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
'@tanstack/react-router-devtools@1.129.8(@tanstack/react-router@1.129.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.129.8)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
dependencies:
'@tanstack/react-router': 1.129.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@tanstack/router-devtools-core': 1.129.2(@tanstack/router-core@1.129.2)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)
'@tanstack/react-router': 1.129.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@tanstack/router-devtools-core': 1.129.8(@tanstack/router-core@1.129.8)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
transitivePeerDependencies:
@@ -11088,11 +11092,11 @@ snapshots:
- solid-js
- tiny-invariant
'@tanstack/react-router@1.129.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
'@tanstack/react-router@1.129.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@tanstack/history': 1.121.34
'@tanstack/history': 1.129.7
'@tanstack/react-store': 0.7.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@tanstack/router-core': 1.129.2
'@tanstack/router-core': 1.129.8
isbot: 5.1.28
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
@@ -11118,9 +11122,9 @@ snapshots:
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
'@tanstack/router-core@1.129.2':
'@tanstack/router-core@1.129.8':
dependencies:
'@tanstack/history': 1.121.34
'@tanstack/history': 1.129.7
'@tanstack/store': 0.7.0
cookie-es: 1.2.2
seroval: 1.3.2
@@ -11128,9 +11132,9 @@ snapshots:
tiny-invariant: 1.3.3
tiny-warning: 1.0.3
'@tanstack/router-devtools-core@1.129.2(@tanstack/router-core@1.129.2)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
'@tanstack/router-devtools-core@1.129.8(@tanstack/router-core@1.129.8)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
dependencies:
'@tanstack/router-core': 1.129.2
'@tanstack/router-core': 1.129.8
clsx: 2.1.1
goober: 2.1.16(csstype@3.1.3)
solid-js: 1.9.5
@@ -11138,11 +11142,11 @@ snapshots:
optionalDependencies:
csstype: 3.1.3
'@tanstack/router-generator@1.129.2':
'@tanstack/router-generator@1.129.8':
dependencies:
'@tanstack/router-core': 1.129.2
'@tanstack/router-utils': 1.121.21
'@tanstack/virtual-file-routes': 1.121.21
'@tanstack/router-core': 1.129.8
'@tanstack/router-utils': 1.129.7
'@tanstack/virtual-file-routes': 1.129.7
prettier: 3.6.2
recast: 0.23.11
source-map: 0.7.4
@@ -11151,7 +11155,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@tanstack/router-plugin@1.129.2(@tanstack/react-router@1.129.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
'@tanstack/router-plugin@1.129.8(@tanstack/react-router@1.129.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
dependencies:
'@babel/core': 7.28.0
'@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0)
@@ -11159,21 +11163,21 @@ snapshots:
'@babel/template': 7.27.2
'@babel/traverse': 7.28.0
'@babel/types': 7.28.1
'@tanstack/router-core': 1.129.2
'@tanstack/router-generator': 1.129.2
'@tanstack/router-utils': 1.121.21
'@tanstack/virtual-file-routes': 1.121.21
'@tanstack/router-core': 1.129.8
'@tanstack/router-generator': 1.129.8
'@tanstack/router-utils': 1.129.7
'@tanstack/virtual-file-routes': 1.129.7
babel-dead-code-elimination: 1.0.10
chokidar: 3.6.0
unplugin: 2.3.5
zod: 3.25.76
optionalDependencies:
'@tanstack/react-router': 1.129.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
vite: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
'@tanstack/react-router': 1.129.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- supports-color
'@tanstack/router-utils@1.121.21':
'@tanstack/router-utils@1.129.7':
dependencies:
'@babel/core': 7.28.0
'@babel/generator': 7.28.0
@@ -11184,9 +11188,9 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.129.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(zod@4.0.5)':
'@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.129.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(zod@4.0.5)':
dependencies:
'@tanstack/react-router': 1.129.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@tanstack/react-router': 1.129.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
zod: 4.0.5
'@tanstack/store@0.7.0': {}
@@ -11195,7 +11199,7 @@ snapshots:
'@tanstack/virtual-core@3.13.9': {}
'@tanstack/virtual-file-routes@1.121.21': {}
'@tanstack/virtual-file-routes@1.129.7': {}
'@taplo/core@0.2.0': {}
@@ -11774,7 +11778,7 @@ snapshots:
'@unrs/resolver-binding-win32-x64-msvc@1.10.1':
optional: true
'@vitejs/plugin-legacy@7.1.0(terser@5.36.0)(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
'@vitejs/plugin-legacy@7.1.0(terser@5.36.0)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
dependencies:
'@babel/core': 7.28.0
'@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0)
@@ -11789,19 +11793,19 @@ snapshots:
regenerator-runtime: 0.14.1
systemjs: 6.15.1
terser: 5.36.0
vite: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-react-swc@3.11.0(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
'@vitejs/plugin-react-swc@3.11.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
dependencies:
'@rolldown/pluginutils': 1.0.0-beta.27
'@swc/core': 1.13.0
vite: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- '@swc/helpers'
'@vitejs/plugin-react@4.7.0(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
'@vitejs/plugin-react@4.7.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
dependencies:
'@babel/core': 7.28.0
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0)
@@ -11809,7 +11813,7 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-beta.27
'@types/babel__core': 7.20.5
react-refresh: 0.17.0
vite: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- supports-color
@@ -13652,6 +13656,10 @@ snapshots:
optionalDependencies:
picomatch: 4.0.2
fdir@6.4.6(picomatch@4.0.3):
optionalDependencies:
picomatch: 4.0.3
fetch-blob@3.2.0:
dependencies:
node-domexception: 1.0.0
@@ -15518,6 +15526,8 @@ snapshots:
picomatch@4.0.2: {}
picomatch@4.0.3: {}
pidtree@0.6.0: {}
pify@2.3.0: {}
@@ -16712,8 +16722,8 @@ snapshots:
tinyglobby@0.2.14:
dependencies:
fdir: 6.4.6(picomatch@4.0.2)
picomatch: 4.0.2
fdir: 6.4.6(picomatch@4.0.3)
picomatch: 4.0.3
tmp@0.2.3: {}
@@ -17139,7 +17149,7 @@ snapshots:
- rollup
- supports-color
vite-plugin-dts@4.5.4(@types/node@22.16.5)(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
vite-plugin-dts@4.5.4(@types/node@22.16.5)(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
'@microsoft/api-extractor': 7.51.0(@types/node@22.16.5)
'@rollup/pluginutils': 5.1.4(rollup@4.40.0)
@@ -17152,13 +17162,13 @@ snapshots:
magic-string: 0.30.17
typescript: 5.8.3
optionalDependencies:
vite: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- '@types/node'
- rollup
- supports-color
vite-plugin-html@3.2.2(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
vite-plugin-html@3.2.2(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
'@rollup/pluginutils': 4.2.1
colorette: 2.0.20
@@ -17172,43 +17182,43 @@ snapshots:
html-minifier-terser: 6.1.0
node-html-parser: 5.4.2
pathe: 0.2.0
vite: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite-plugin-sass-dts@1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.89.2)(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
vite-plugin-sass-dts@1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.89.2)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
postcss: 8.5.6
postcss-js: 4.0.1(postcss@8.5.6)
prettier: 3.6.2
sass-embedded: 1.89.2
vite: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite-plugin-svgr@4.3.0(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
vite-plugin-svgr@4.3.0(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
'@rollup/pluginutils': 5.1.3(rollup@4.40.0)
'@svgr/core': 8.1.0(typescript@5.8.3)
'@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))
vite: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- rollup
- supports-color
- typescript
vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
debug: 4.3.7
globrex: 0.1.2
tsconfck: 3.0.3(typescript@5.8.3)
optionalDependencies:
vite: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- supports-color
- typescript
vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0):
vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0):
dependencies:
esbuild: 0.25.0
fdir: 6.4.6(picomatch@4.0.2)
picomatch: 4.0.2
fdir: 6.4.6(picomatch@4.0.3)
picomatch: 4.0.3
postcss: 8.5.6
rollup: 4.40.0
tinyglobby: 0.2.14
@@ -0,0 +1,20 @@
--- a/src/hsl/phy/hsl_phy.c
+++ b/src/hsl/phy/hsl_phy.c
@@ -762,7 +762,7 @@ hsl_phy_phydev_get(a_uint32_t dev_id, a_
*phydev = miibus->phy_map[phy_addr];
if(*phydev == NULL)
{
- SSDK_ERROR("phy_addr %d phydev is NULL\n", phy_addr);
+ // SSDK_ERROR("phy_addr %d phydev is NULL\n", phy_addr);
return SW_NOT_INITIALIZED;
}
pdev_addr = (*phydev)->addr;
@@ -772,7 +772,7 @@ hsl_phy_phydev_get(a_uint32_t dev_id, a_
*phydev = mdiobus_get_phy(miibus, phy_addr);
if(*phydev == NULL)
{
- SSDK_ERROR("phy_addr %d phydev is NULL\n", phy_addr);
+ // SSDK_ERROR("phy_addr %d phydev is NULL\n", phy_addr);
return SW_NOT_INITIALIZED;
}
pdev_addr = (*phydev)->mdio.addr;
+7 -7
View File
@@ -29,7 +29,7 @@ jobs:
strategy:
matrix:
jobs:
- { goos: darwin, goarch: amd64, goamd64: v1, output: amd64-compatible }
- { goos: darwin, goarch: amd64, goamd64: v1, output: amd64-compatible } # old style file name will be removed in next released
- { goos: darwin, goarch: amd64, goamd64: v3, output: amd64 }
- { goos: darwin, goarch: amd64, goamd64: v1, output: amd64-v1 }
- { goos: darwin, goarch: amd64, goamd64: v2, output: amd64-v2 }
@@ -38,10 +38,10 @@ jobs:
- { goos: linux, goarch: '386', go386: sse2, output: '386', debian: i386, rpm: i386}
- { goos: linux, goarch: '386', go386: softfloat, output: '386-softfloat' }
- { goos: linux, goarch: amd64, goamd64: v1, output: amd64-compatible}
- { goos: linux, goarch: amd64, goamd64: v3, output: amd64}
- { goos: linux, goarch: amd64, goamd64: v1, output: amd64-v1, test: test }
- { goos: linux, goarch: amd64, goamd64: v2, output: amd64-v2 }
- { goos: linux, goarch: amd64, goamd64: v1, output: amd64-compatible} # old style file name will be removed in next released
- { goos: linux, goarch: amd64, goamd64: v3, output: amd64, debian: amd64, rpm: x86_64, pacman: x86_64}
- { goos: linux, goarch: amd64, goamd64: v1, output: amd64-v1, debian: amd64, rpm: x86_64, pacman: x86_64, test: test }
- { goos: linux, goarch: amd64, goamd64: v2, output: amd64-v2, debian: amd64, rpm: x86_64, pacman: x86_64}
- { goos: linux, goarch: amd64, goamd64: v3, output: amd64-v3, debian: amd64, rpm: x86_64, pacman: x86_64}
- { goos: linux, goarch: arm64, output: arm64, debian: arm64, rpm: aarch64, pacman: aarch64}
- { goos: linux, goarch: arm, goarm: '5', output: armv5 }
@@ -60,7 +60,7 @@ jobs:
- { goos: linux, goarch: ppc64le, output: ppc64le, debian: ppc64el, rpm: ppc64le }
- { goos: windows, goarch: '386', output: '386' }
- { goos: windows, goarch: amd64, goamd64: v1, output: amd64-compatible }
- { goos: windows, goarch: amd64, goamd64: v1, output: amd64-compatible } # old style file name will be removed in next released
- { goos: windows, goarch: amd64, goamd64: v3, output: amd64 }
- { goos: windows, goarch: amd64, goamd64: v1, output: amd64-v1 }
- { goos: windows, goarch: amd64, goamd64: v2, output: amd64-v2 }
@@ -68,7 +68,7 @@ jobs:
- { goos: windows, goarch: arm64, output: arm64 }
- { goos: freebsd, goarch: '386', output: '386' }
- { goos: freebsd, goarch: amd64, goamd64: v1, output: amd64-compatible }
- { goos: freebsd, goarch: amd64, goamd64: v1, output: amd64-compatible } # old style file name will be removed in next released
- { goos: freebsd, goarch: amd64, goamd64: v3, output: amd64 }
- { goos: freebsd, goarch: amd64, goamd64: v1, output: amd64-v1 }
- { goos: freebsd, goarch: amd64, goamd64: v2, output: amd64-v2 }
+26 -31
View File
@@ -33,49 +33,43 @@ const (
MaxPackageFileSize = 32 * 1024 * 1024
)
var mihomoBaseName string
// CoreUpdater is the mihomo updater.
// modify from https://github.com/AdguardTeam/AdGuardHome/blob/595484e0b3fb4c457f9bb727a6b94faa78a66c5f/internal/updater/updater.go
type CoreUpdater struct {
mu sync.Mutex
}
func init() {
var DefaultCoreUpdater = CoreUpdater{}
func (u *CoreUpdater) CoreBaseName() string {
switch runtime.GOARCH {
case "arm":
// mihomo-linux-armv5
mihomoBaseName = fmt.Sprintf("mihomo-%s-%sv%s", runtime.GOOS, runtime.GOARCH, features.GOARM)
return fmt.Sprintf("mihomo-%s-%sv%s", runtime.GOOS, runtime.GOARCH, features.GOARM)
case "arm64":
if runtime.GOOS == "android" {
// mihomo-android-arm64-v8
mihomoBaseName = fmt.Sprintf("mihomo-%s-%s-v8", runtime.GOOS, runtime.GOARCH)
return fmt.Sprintf("mihomo-%s-%s-v8", runtime.GOOS, runtime.GOARCH)
} else {
// mihomo-linux-arm64
mihomoBaseName = fmt.Sprintf("mihomo-%s-%s", runtime.GOOS, runtime.GOARCH)
return fmt.Sprintf("mihomo-%s-%s", runtime.GOOS, runtime.GOARCH)
}
case "mips", "mipsle":
// mihomo-linux-mips-hardfloat
mihomoBaseName = fmt.Sprintf("mihomo-%s-%s-%s", runtime.GOOS, runtime.GOARCH, features.GOMIPS)
return fmt.Sprintf("mihomo-%s-%s-%s", runtime.GOOS, runtime.GOARCH, features.GOMIPS)
case "amd64":
// mihomo-linux-amd64-v1
mihomoBaseName = fmt.Sprintf("mihomo-%s-%s-%s", runtime.GOOS, runtime.GOARCH, features.GOAMD64)
return fmt.Sprintf("mihomo-%s-%s-%s", runtime.GOOS, runtime.GOARCH, features.GOAMD64)
default:
// mihomo-linux-386
// mihomo-linux-mips64
// mihomo-linux-riscv64
// mihomo-linux-s390x
mihomoBaseName = fmt.Sprintf("mihomo-%s-%s", runtime.GOOS, runtime.GOARCH)
return fmt.Sprintf("mihomo-%s-%s", runtime.GOOS, runtime.GOARCH)
}
}
// CoreUpdater is the mihomo updater.
// modify from https://github.com/AdguardTeam/AdGuardHome/blob/595484e0b3fb4c457f9bb727a6b94faa78a66c5f/internal/updater/updater.go
var CoreUpdater = coreUpdater{}
func UpdateCore(execPath string) (err error) {
return CoreUpdater.Update(execPath)
}
type coreUpdater struct {
mu sync.Mutex
}
func (u *coreUpdater) Update(currentExePath string) (err error) {
func (u *CoreUpdater) Update(currentExePath string) (err error) {
u.mu.Lock()
defer u.mu.Unlock()
@@ -110,6 +104,7 @@ func (u *coreUpdater) Update(currentExePath string) (err error) {
}()
// ---- prepare ----
mihomoBaseName := u.CoreBaseName()
packageName := mihomoBaseName + "-" + latestVersion
if runtime.GOOS == "windows" {
packageName = packageName + ".zip"
@@ -129,7 +124,7 @@ func (u *coreUpdater) Update(currentExePath string) (err error) {
if runtime.GOOS == "windows" {
updateExeName = updateExeName + ".exe"
}
log.Infoln("updateExeName: %s ", updateExeName)
log.Infoln("updateExeName: %s", updateExeName)
updateExePath := filepath.Join(updateDir, updateExeName)
backupExePath := filepath.Join(backupDir, filepath.Base(currentExePath))
@@ -158,7 +153,7 @@ func (u *coreUpdater) Update(currentExePath string) (err error) {
return nil
}
func (u *coreUpdater) getLatestVersion(versionURL string) (version string, err error) {
func (u *CoreUpdater) getLatestVersion(versionURL string) (version string, err error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
resp, err := mihomoHttp.HttpRequest(ctx, versionURL, http.MethodGet, nil, nil)
@@ -181,7 +176,7 @@ func (u *coreUpdater) getLatestVersion(versionURL string) (version string, err e
}
// download package file and save it to disk
func (u *coreUpdater) download(updateDir, packagePath, packageURL string) (err error) {
func (u *CoreUpdater) download(updateDir, packagePath, packageURL string) (err error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*90)
defer cancel()
resp, err := mihomoHttp.HttpRequest(ctx, packageURL, http.MethodGet, nil, nil)
@@ -218,7 +213,7 @@ func (u *coreUpdater) download(updateDir, packagePath, packageURL string) (err e
}
// unpack extracts the files from the downloaded archive.
func (u *coreUpdater) unpack(updateDir, packagePath string) error {
func (u *CoreUpdater) unpack(updateDir, packagePath string) error {
log.Infoln("updater: unpacking package")
if strings.HasSuffix(packagePath, ".zip") {
_, err := u.zipFileUnpack(packagePath, updateDir)
@@ -240,7 +235,7 @@ func (u *coreUpdater) unpack(updateDir, packagePath string) error {
}
// backup makes a backup of the current executable file
func (u *coreUpdater) backup(currentExePath, backupExePath, backupDir string) (err error) {
func (u *CoreUpdater) backup(currentExePath, backupExePath, backupDir string) (err error) {
log.Infoln("updater: backing up current ExecFile:%s to %s", currentExePath, backupExePath)
_ = os.Mkdir(backupDir, 0o755)
@@ -253,7 +248,7 @@ func (u *coreUpdater) backup(currentExePath, backupExePath, backupDir string) (e
}
// replace moves the current executable with the updated one
func (u *coreUpdater) replace(updateExePath, currentExePath string) error {
func (u *CoreUpdater) replace(updateExePath, currentExePath string) error {
var err error
log.Infoln("replacing: %s to %s", updateExePath, currentExePath)
@@ -273,7 +268,7 @@ func (u *coreUpdater) replace(updateExePath, currentExePath string) error {
}
// clean removes the temporary directory itself and all it's contents.
func (u *coreUpdater) clean(updateDir string) {
func (u *CoreUpdater) clean(updateDir string) {
_ = os.RemoveAll(updateDir)
}
@@ -281,7 +276,7 @@ func (u *coreUpdater) clean(updateDir string) {
// Existing files are overwritten
// All files are created inside outDir, subdirectories are not created
// Return the output file name
func (u *coreUpdater) gzFileUnpack(gzfile, outDir string) (string, error) {
func (u *CoreUpdater) gzFileUnpack(gzfile, outDir string) (string, error) {
f, err := os.Open(gzfile)
if err != nil {
return "", fmt.Errorf("os.Open(): %w", err)
@@ -345,7 +340,7 @@ func (u *coreUpdater) gzFileUnpack(gzfile, outDir string) (string, error) {
// Existing files are overwritten
// All files are created inside 'outDir', subdirectories are not created
// Return the output file name
func (u *coreUpdater) zipFileUnpack(zipfile, outDir string) (string, error) {
func (u *CoreUpdater) zipFileUnpack(zipfile, outDir string) (string, error) {
zrc, err := zip.OpenReader(zipfile)
if err != nil {
return "", fmt.Errorf("zip.OpenReader(): %w", err)
@@ -404,7 +399,7 @@ func (u *coreUpdater) zipFileUnpack(zipfile, outDir string) (string, error) {
}
// Copy file on disk
func (u *coreUpdater) copyFile(src, dst string) error {
func (u *CoreUpdater) copyFile(src, dst string) error {
d, e := os.ReadFile(src)
if e != nil {
return e
+2 -2
View File
@@ -5,6 +5,6 @@ import (
"testing"
)
func TestBaseName(t *testing.T) {
fmt.Println("mihomoBaseName =", mihomoBaseName)
func TestCoreBaseName(t *testing.T) {
fmt.Println("Core base name =", DefaultCoreUpdater.CoreBaseName())
}
+1 -1
View File
@@ -32,7 +32,7 @@ func upgradeCore(w http.ResponseWriter, r *http.Request) {
return
}
err = updater.UpdateCore(execPath)
err = updater.DefaultCoreUpdater.Update(execPath)
if err != nil {
log.Warnln("%s", err)
render.Status(r, http.StatusInternalServerError)
@@ -15,6 +15,7 @@ o.rmempty = false
o = s:option(Value, "music_source", translate("音源接口"))
o:value("default", translate("默认"))
o:value("bilibili", translate("Bilibili音乐"))
o:value("bilivideo", translate("Bilibili音乐(bilivideo"))
o:value("joox", translate("JOOX音乐"))
o:value("kugou", translate("酷狗音乐"))
o:value("kuwo", translate("酷我音乐"))
@@ -3,6 +3,8 @@ local api = require "luci.passwall.api"
-%>
<script type="text/javascript">
//<![CDATA[
var appname = "<%= api.appname %>"
function confirmDeleteNode(remark) {
if (!confirm("<%:Delete the subscribed node%>: " + remark + " ?"))
return false;
@@ -36,7 +38,7 @@ local api = require "luci.passwall.api"
}
function ManualSubscribe(sectionId) {
var urlInput = document.querySelector("#cbid\\.<%= api.appname %>\\." + sectionId + "\\.url input");
var urlInput = document.querySelector("input[name='cbid." + appname + "." + sectionId + ".url']");
var currentUrl = urlInput ? urlInput.value.trim() : "";
if (!currentUrl) {
alert("<%:Subscribe URL cannot be empty.%>");
@@ -61,7 +63,7 @@ local api = require "luci.passwall.api"
var sectionIds = [];
var urls = [];
var table = document.getElementById("cbi-<%= api.appname %>-subscribe_list");
var table = document.getElementById("cbi-" + appname + "-subscribe_list");
var editBtns = table ? table.getElementsByClassName("cbi-button cbi-button-edit") : [];
for (var i = 0; i < editBtns.length; i++) {
@@ -72,7 +74,7 @@ local api = require "luci.passwall.api"
var id = onclickStr.substring(onclickStr.lastIndexOf('/') + 1, onclickStr.length - 1);
if (!id) continue;
var urlInput = document.querySelector("#cbid\\.<%= api.appname %>\\." + id + "\\.url input");
var urlInput = document.querySelector("input[name='cbid." + appname + "." + id + ".url']");
var currentUrl = urlInput ? urlInput.value.trim() : "";
if (!currentUrl) {
alert("<%:Subscribe URL cannot be empty.%>");
@@ -1913,7 +1913,6 @@ local execute = function()
local raw_data = api.trim(stdout)
local old_md5 = value.md5 or ""
local new_md5 = luci.sys.exec("md5sum " .. tmp_file .. " 2>/dev/null | awk '{print $1}'"):gsub("\n", "")
os.remove(tmp_file)
if not manual_sub and old_md5 == new_md5 then
log('订阅:【' .. remark .. '】没有变化,无需更新。')
else
@@ -1924,6 +1923,7 @@ local execute = function()
fail_list[#fail_list + 1] = value
end
end
luci.sys.call("rm -f " .. tmp_file)
allowInsecure_default = nil
filter_keyword_mode_default = uci:get(appname, "@global_subscribe[0]", "filter_keyword_mode") or "0"
filter_keyword_discard_list_default = uci:get(appname, "@global_subscribe[0]", "filter_discard_list") or {}
+1 -1
View File
@@ -2,7 +2,7 @@
icon: material/alert-decagram
---
#### 1.12.0-rc.2
#### 1.12.0-rc.3
* Fixes and improvements
+18 -6
View File
@@ -50,12 +50,24 @@ func (s *TrafficManager) UpdateUsers(users []string) {
newUserTCPSessions := make(map[string]*atomic.Int64)
newUserUDPSessions := make(map[string]*atomic.Int64)
for _, user := range users {
newUserUplink[user] = s.userUplinkPackets[user]
newUserDownlink[user] = s.userDownlinkPackets[user]
newUserUplinkPackets[user] = s.userUplinkPackets[user]
newUserDownlinkPackets[user] = s.userDownlinkPackets[user]
newUserTCPSessions[user] = s.userTCPSessions[user]
newUserUDPSessions[user] = s.userUDPSessions[user]
if counter, loaded := s.userUplink[user]; loaded {
newUserUplink[user] = counter
}
if counter, loaded := s.userDownlink[user]; loaded {
newUserDownlink[user] = counter
}
if counter, loaded := s.userUplinkPackets[user]; loaded {
newUserUplinkPackets[user] = counter
}
if counter, loaded := s.userDownlinkPackets[user]; loaded {
newUserDownlinkPackets[user] = counter
}
if counter, loaded := s.userTCPSessions[user]; loaded {
newUserTCPSessions[user] = counter
}
if counter, loaded := s.userUDPSessions[user]; loaded {
newUserUDPSessions[user] = counter
}
}
s.userUplink = newUserUplink
s.userDownlink = newUserDownlink
+1 -1
View File
@@ -1,6 +1,6 @@
include $(TOPDIR)/rules.mk
PKG_VERSION:=1.23.2
PKG_VERSION:=1.23.3
LUCI_TITLE:=LuCI Support for nikki
LUCI_DEPENDS:=+luci-base +nikki
@@ -502,6 +502,7 @@ return view.extend({
so.value('RULE-SET', _('Rule Set'));
so.value('DOMAIN', _('Domain Name'));
so.value('DOMAIN-SUFFIX', _('Domain Name Suffix'));
so.value('DOMAIN-WILDCARD', _('Domain Name Wildcard'));
so.value('DOMAIN-KEYWORD', _('Domain Name Keyword'));
so.value('DOMAIN-REGEX', _('Domain Name Regex'));
so.value('IP-CIDR', _('Destination IP'));
@@ -99,6 +99,9 @@ return view.extend({
so = o.subsection.option(form.Flag, 'proxy', _('Proxy'));
so.rmempty = false;
so = o.subsection.option(form.Flag, 'dns', _('DNS'));
so.rmempty = false;
s.tab('lan', _('LAN Proxy'));
o = s.taboption('lan', form.Flag, 'lan_proxy', _('Enable'));
+57 -49
View File
@@ -10,12 +10,12 @@ msgid "API Secret"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:69
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:119
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:122
msgid "Access Control"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:169
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:174
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:172
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:177
msgid "All Port"
msgstr ""
@@ -56,15 +56,15 @@ msgstr ""
msgid "Block Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165
msgid "Bypass"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:164
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167
msgid "Bypass China Mainland IP"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:177
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:180
msgid "Bypass DSCP"
msgstr ""
@@ -85,8 +85,8 @@ msgstr ""
msgid "Clear Log"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:170
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:175
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:173
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:178
msgid "Commonly Used Port"
msgstr ""
@@ -114,6 +114,10 @@ msgstr ""
msgid "Cron Expression"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102
msgid "DNS"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:228
msgid "DNS Config"
msgstr ""
@@ -130,23 +134,23 @@ msgstr ""
msgid "Debug Log"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508
msgid "Destination IP"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:512
msgid "Destination IP Geo"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509
msgid "Destination Port"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:170
msgid "Destination TCP Port to Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:172
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:175
msgid "Destination UDP Port to Proxy"
msgstr ""
@@ -175,7 +179,7 @@ msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:360
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:366
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:372
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:38
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:45
msgid "Disable"
@@ -206,15 +210,15 @@ msgstr ""
msgid "Domain Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511
msgid "Domain Name Geo"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506
msgid "Domain Name Keyword"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507
msgid "Domain Name Regex"
msgstr ""
@@ -222,6 +226,10 @@ msgstr ""
msgid "Domain Name Suffix"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505
msgid "Domain Name Wildcard"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:168
msgid "Edit Authentications"
msgstr ""
@@ -289,13 +297,13 @@ msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:399
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:427
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:496
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:560
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:33
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:66
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:77
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:104
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:127
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:107
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:130
msgid "Enable"
msgstr ""
@@ -380,39 +388,39 @@ msgstr ""
msgid "Generate & Download"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:537
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:538
msgid "GeoData Loader"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:531
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:532
msgid "GeoIP Format"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:552
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553
msgid "GeoIP(ASN) Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:549
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550
msgid "GeoIP(DAT) Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:546
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547
msgid "GeoIP(MMDB) Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:543
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544
msgid "GeoSite Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:555
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:556
msgid "GeoX Auto Update"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:529
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:530
msgid "GeoX Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:561
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:562
msgid "GeoX Update Interval"
msgstr ""
@@ -464,11 +472,11 @@ msgstr ""
msgid "Inbound Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:107
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:110
msgid "Inbound Interface"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:105
msgid "LAN Proxy"
msgstr ""
@@ -494,11 +502,11 @@ msgid "Match Process"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:350
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:513
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:514
msgid "Matcher"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:542
msgid "Memory Conservative Loader"
msgstr ""
@@ -510,7 +518,7 @@ msgstr ""
msgid "Mixin Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:565
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:566
msgid "Mixin File Content"
msgstr ""
@@ -536,12 +544,12 @@ msgstr ""
msgid "Nikki"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:524
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:525
msgid "No Resolve"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:447
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:517
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:518
msgid "Node"
msgstr ""
@@ -601,7 +609,7 @@ msgstr ""
msgid "Password"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
msgid "Please go to the editor tab to edit the file for mixin"
msgstr ""
@@ -613,7 +621,7 @@ msgstr ""
msgid "Prefer"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510
msgid "Process Name"
msgstr ""
@@ -631,7 +639,7 @@ msgid "Protocol"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:99
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:159
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162
msgid "Proxy"
msgstr ""
@@ -742,7 +750,7 @@ msgstr ""
msgid "Stack"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541
msgid "Standard Loader"
msgstr ""
@@ -885,14 +893,14 @@ msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:359
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:365
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:371
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:533
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:539
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:557
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:563
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:534
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:545
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:548
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:551
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:554
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:564
msgid "Unmodified"
msgstr ""
+59 -51
View File
@@ -17,12 +17,12 @@ msgid "API Secret"
msgstr "API 密钥"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:69
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:119
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:122
msgid "Access Control"
msgstr "访问控制"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:169
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:174
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:172
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:177
msgid "All Port"
msgstr "全部端口"
@@ -63,15 +63,15 @@ msgstr "行为"
msgid "Block Mode"
msgstr "黑名单模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165
msgid "Bypass"
msgstr "绕过"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:164
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167
msgid "Bypass China Mainland IP"
msgstr "绕过中国大陆 IP"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:177
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:180
msgid "Bypass DSCP"
msgstr "绕过 DSCP"
@@ -92,8 +92,8 @@ msgstr "选择配置文件"
msgid "Clear Log"
msgstr "清空日志"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:170
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:175
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:173
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:178
msgid "Commonly Used Port"
msgstr "常用端口"
@@ -121,6 +121,10 @@ msgstr "核心版本"
msgid "Cron Expression"
msgstr "Cron 表达式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102
msgid "DNS"
msgstr "DNS"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:228
msgid "DNS Config"
msgstr "DNS 配置"
@@ -137,23 +141,23 @@ msgstr "DNS 模式"
msgid "Debug Log"
msgstr "调试日志"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508
msgid "Destination IP"
msgstr "目标 IP"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:512
msgid "Destination IP Geo"
msgstr "目标 IPGeo"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509
msgid "Destination Port"
msgstr "目标端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:170
msgid "Destination TCP Port to Proxy"
msgstr "要代理的 TCP 目标端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:172
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:175
msgid "Destination UDP Port to Proxy"
msgstr "要代理的 UDP 目标端口"
@@ -182,7 +186,7 @@ msgstr "直连模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:360
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:366
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:372
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:38
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:45
msgid "Disable"
@@ -213,15 +217,15 @@ msgstr "DoH 优先 HTTP/3"
msgid "Domain Name"
msgstr "域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511
msgid "Domain Name Geo"
msgstr "域名(Geo"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506
msgid "Domain Name Keyword"
msgstr "域名(关键字)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507
msgid "Domain Name Regex"
msgstr "域名(正则表达式)"
@@ -229,6 +233,10 @@ msgstr "域名(正则表达式)"
msgid "Domain Name Suffix"
msgstr "域名(后缀)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505
msgid "Domain Name Wildcard"
msgstr "域名(通配符)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:168
msgid "Edit Authentications"
msgstr "编辑身份验证"
@@ -296,13 +304,13 @@ msgstr "编辑器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:399
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:427
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:496
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:560
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:33
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:66
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:77
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:104
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:127
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:107
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:130
msgid "Enable"
msgstr "启用"
@@ -387,39 +395,39 @@ msgstr "全局配置"
msgid "Generate & Download"
msgstr "生成并下载"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:537
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:538
msgid "GeoData Loader"
msgstr "GeoData 加载器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:531
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:532
msgid "GeoIP Format"
msgstr "GeoIP 格式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:552
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553
msgid "GeoIP(ASN) Url"
msgstr "GeoIP(ASN) 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:549
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550
msgid "GeoIP(DAT) Url"
msgstr "GeoIP(DAT) 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:546
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547
msgid "GeoIP(MMDB) Url"
msgstr "GeoIP(MMDB) 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:543
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544
msgid "GeoSite Url"
msgstr "GeoSite 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:555
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:556
msgid "GeoX Auto Update"
msgstr "定时更新GeoX文件"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:529
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:530
msgid "GeoX Config"
msgstr "GeoX 配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:561
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:562
msgid "GeoX Update Interval"
msgstr "GeoX 文件更新间隔"
@@ -433,7 +441,7 @@ msgstr "全局模式"
#: applications/luci-app-nikki/root/usr/share/rpcd/acl.d/luci-app-nikki.json:3
msgid "Grant access to nikki procedures"
msgstr ""
msgstr "授予访问 nikki 程序的权限"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:87
msgid "Group"
@@ -471,11 +479,11 @@ msgstr "忽略嗅探的域名"
msgid "Inbound Config"
msgstr "入站配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:107
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:110
msgid "Inbound Interface"
msgstr "入站接口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:105
msgid "LAN Proxy"
msgstr "局域网代理"
@@ -501,11 +509,11 @@ msgid "Match Process"
msgstr "匹配进程"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:350
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:513
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:514
msgid "Matcher"
msgstr "匹配"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:542
msgid "Memory Conservative Loader"
msgstr "为内存受限设备优化的加载器"
@@ -517,7 +525,7 @@ msgstr "混合端口"
msgid "Mixin Config"
msgstr "混入配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:565
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:566
msgid "Mixin File Content"
msgstr "混入文件内容"
@@ -541,14 +549,14 @@ msgstr "DNS 服务器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38
#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:3
msgid "Nikki"
msgstr ""
msgstr "Nikki"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:524
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:525
msgid "No Resolve"
msgstr "不解析"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:447
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:517
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:518
msgid "Node"
msgstr "节点"
@@ -608,7 +616,7 @@ msgstr "覆盖按协议嗅探"
msgid "Password"
msgstr "密码"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
msgid "Please go to the editor tab to edit the file for mixin"
msgstr "请前往编辑器标签编辑用于混入的文件"
@@ -620,7 +628,7 @@ msgstr "端口"
msgid "Prefer"
msgstr "优先"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510
msgid "Process Name"
msgstr "进程名"
@@ -638,7 +646,7 @@ msgid "Protocol"
msgstr "协议"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:99
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:159
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162
msgid "Proxy"
msgstr "代理"
@@ -749,7 +757,7 @@ msgstr "嗅探器配置"
msgid "Stack"
msgstr "栈"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541
msgid "Standard Loader"
msgstr "标准加载器"
@@ -892,14 +900,14 @@ msgstr "统一延迟"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:359
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:365
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:371
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:533
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:539
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:557
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:563
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:534
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:545
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:548
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:551
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:554
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:564
msgid "Unmodified"
msgstr "不修改"
+57 -49
View File
@@ -17,12 +17,12 @@ msgid "API Secret"
msgstr "API 密鑰"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:69
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:119
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:122
msgid "Access Control"
msgstr "存取控制"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:169
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:174
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:172
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:177
msgid "All Port"
msgstr "所有埠"
@@ -63,15 +63,15 @@ msgstr "行為"
msgid "Block Mode"
msgstr "黑名單模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165
msgid "Bypass"
msgstr "繞過"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:164
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167
msgid "Bypass China Mainland IP"
msgstr "繞過中國大陸 IP"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:177
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:180
msgid "Bypass DSCP"
msgstr "繞過 DSCP"
@@ -92,8 +92,8 @@ msgstr "選擇設定檔"
msgid "Clear Log"
msgstr "清空日誌"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:170
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:175
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:173
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:178
msgid "Commonly Used Port"
msgstr "常用埠"
@@ -121,6 +121,10 @@ msgstr "核心版本"
msgid "Cron Expression"
msgstr "Cron 表達式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102
msgid "DNS"
msgstr "DNS"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:228
msgid "DNS Config"
msgstr "DNS 設定"
@@ -137,23 +141,23 @@ msgstr "DNS 模式"
msgid "Debug Log"
msgstr "除錯日誌"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508
msgid "Destination IP"
msgstr "目標 IP"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:512
msgid "Destination IP Geo"
msgstr "目標 IP(地理位置)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509
msgid "Destination Port"
msgstr "目標埠"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:170
msgid "Destination TCP Port to Proxy"
msgstr "要代理的 TCP 目標埠"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:172
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:175
msgid "Destination UDP Port to Proxy"
msgstr "要代理的 UDP 目標埠"
@@ -182,7 +186,7 @@ msgstr "直連模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:360
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:366
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:372
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:38
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:45
msgid "Disable"
@@ -213,15 +217,15 @@ msgstr "DoH 優先使用 HTTP/3"
msgid "Domain Name"
msgstr "網域名稱"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511
msgid "Domain Name Geo"
msgstr "網域名稱(地理位置)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506
msgid "Domain Name Keyword"
msgstr "網域名稱(關鍵字)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507
msgid "Domain Name Regex"
msgstr "網域名稱(正則表達式)"
@@ -229,6 +233,10 @@ msgstr "網域名稱(正則表達式)"
msgid "Domain Name Suffix"
msgstr "網域名稱(後綴)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505
msgid "Domain Name Wildcard"
msgstr "網域名稱(通配符)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:168
msgid "Edit Authentications"
msgstr "編輯身分驗證"
@@ -296,13 +304,13 @@ msgstr "編輯器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:399
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:427
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:496
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:560
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:33
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:66
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:77
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:104
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:127
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:107
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:130
msgid "Enable"
msgstr "啟用"
@@ -387,39 +395,39 @@ msgstr "一般設定"
msgid "Generate & Download"
msgstr "生成並下載"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:537
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:538
msgid "GeoData Loader"
msgstr "GeoData 載入器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:531
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:532
msgid "GeoIP Format"
msgstr "GeoIP 格式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:552
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553
msgid "GeoIP(ASN) Url"
msgstr "GeoIP(ASN) 下載網址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:549
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550
msgid "GeoIP(DAT) Url"
msgstr "GeoIP(DAT) 下載網址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:546
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547
msgid "GeoIP(MMDB) Url"
msgstr "GeoIP(MMDB) 下載網址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:543
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544
msgid "GeoSite Url"
msgstr "GeoSite 下載網址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:555
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:556
msgid "GeoX Auto Update"
msgstr "定時更新 GeoX 檔案"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:529
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:530
msgid "GeoX Config"
msgstr "GeoX 設定"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:561
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:562
msgid "GeoX Update Interval"
msgstr "GeoX 檔案更新間隔"
@@ -471,11 +479,11 @@ msgstr "忽略嗅探的網域名稱"
msgid "Inbound Config"
msgstr "入站設定"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:107
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:110
msgid "Inbound Interface"
msgstr "入站介面"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:105
msgid "LAN Proxy"
msgstr "區域網路代理"
@@ -501,11 +509,11 @@ msgid "Match Process"
msgstr "匹配程序"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:350
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:513
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:514
msgid "Matcher"
msgstr "匹配器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:542
msgid "Memory Conservative Loader"
msgstr "為記憶體受限裝置最佳化的載入器"
@@ -517,7 +525,7 @@ msgstr "混合埠"
msgid "Mixin Config"
msgstr "混入設定"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:565
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:566
msgid "Mixin File Content"
msgstr "混入檔案內容"
@@ -543,12 +551,12 @@ msgstr "DNS 伺服器"
msgid "Nikki"
msgstr "Nikki"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:524
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:525
msgid "No Resolve"
msgstr "不解析"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:447
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:517
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:518
msgid "Node"
msgstr "節點"
@@ -608,7 +616,7 @@ msgstr "覆寫按協定嗅探"
msgid "Password"
msgstr "密碼"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
msgid "Please go to the editor tab to edit the file for mixin"
msgstr "請前往編輯器標籤編輯用於混入的檔案"
@@ -620,7 +628,7 @@ msgstr "埠"
msgid "Prefer"
msgstr "優先"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510
msgid "Process Name"
msgstr "程序名稱"
@@ -638,7 +646,7 @@ msgid "Protocol"
msgstr "協定"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:99
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:159
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162
msgid "Proxy"
msgstr "代理"
@@ -749,7 +757,7 @@ msgstr "嗅探器設定"
msgid "Stack"
msgstr "堆疊"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541
msgid "Standard Loader"
msgstr "標準載入器"
@@ -892,14 +900,14 @@ msgstr "統一延遲"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:359
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:365
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:371
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:533
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:539
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:557
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:563
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:534
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:545
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:548
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:551
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:554
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:564
msgid "Unmodified"
msgstr "不修改"
@@ -84,6 +84,8 @@ function index()
entry({"admin", "services", appname, "update_rules"}, call("update_rules")).leaf = true
entry({"admin", "services", appname, "subscribe_del_node"}, call("subscribe_del_node")).leaf = true
entry({"admin", "services", appname, "subscribe_del_all"}, call("subscribe_del_all")).leaf = true
entry({"admin", "services", appname, "subscribe_manual"}, call("subscribe_manual")).leaf = true
entry({"admin", "services", appname, "subscribe_manual_all"}, call("subscribe_manual_all")).leaf = true
--[[rule_list]]
entry({"admin", "services", appname, "read_rulelist"}, call("read_rulelist")).leaf = true
@@ -721,3 +723,51 @@ function subscribe_del_all()
luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua truncate > /dev/null 2>&1")
http.status(200, "OK")
end
function subscribe_manual()
local section = http.formvalue("section") or ""
local current_url = http.formvalue("url") or ""
if section == "" or current_url == "" then
http_write_json({ success = false, msg = "Missing section or URL, skip." })
return
end
local uci_url = api.sh_uci_get(appname, section, "url")
if not uci_url or uci_url == "" then
http_write_json({ success = false, msg = i18n.translate("Please save and apply before manually subscribing.") })
return
end
if uci_url ~= current_url then
api.sh_uci_set(appname, section, "url", current_url, true)
end
luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua start " .. section .. " manual >/dev/null 2>&1 &")
http_write_json({ success = true, msg = "Subscribe triggered." })
end
function subscribe_manual_all()
local sections = http.formvalue("sections") or ""
local urls = http.formvalue("urls") or ""
if sections == "" or urls == "" then
http_write_json({ success = false, msg = "Missing section or URL, skip." })
return
end
local section_list = util.split(sections, ",")
local url_list = util.split(urls, ",")
-- 检查是否存在未保存配置
for i, section in ipairs(section_list) do
local uci_url = api.sh_uci_get(appname, section, "url")
if not uci_url or uci_url == "" then
http_write_json({ success = false, msg = i18n.translate("Please save and apply before manually subscribing.") })
return
end
end
-- 保存有变动的url
for i, section in ipairs(section_list) do
local current_url = url_list[i] or ""
local uci_url = api.sh_uci_get(appname, section, "url")
if current_url ~= "" and uci_url ~= current_url then
api.sh_uci_set(appname, section, "url", current_url, true)
end
end
luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua start all manual >/dev/null 2>&1 &")
http_write_json({ success = true, msg = "Subscribe triggered." })
end
@@ -147,15 +147,15 @@ function o.cfgvalue(self, section)
translate("Delete All Subscribe Node"))
end
o = s:option(Button, "_update", translate("Manual subscription All"))
o.inputstyle = "apply"
function o.write(t, n)
luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua start all manual > /dev/null 2>&1 &")
m.no_commit = true
luci.http.redirect(api.url("log"))
o = s:option(DummyValue, "_update", translate("Manual subscription All"))
o.rawhtml = true
o.cfgvalue = function(self, section)
return string.format([[
<button type="button" class="cbi-button cbi-button-apply" onclick="ManualSubscribeAll()">%s</button>]],
translate("Manual subscription All"))
end
s = m:section(TypedSection, "subscribe_list", "", "<font color='red'>" .. translate("Please input the subscription url first, save and submit before manual subscription.") .. "</font>")
s = m:section(TypedSection, "subscribe_list", "", "<font color='red'>" .. translate("When adding a new subscription, please save and apply before manually subscribing. If you only change the subscription URL, you can subscribe manually, and the system will save it automatically.") .. "</font>")
s.addremove = true
s.anonymous = true
s.sortable = true
@@ -217,12 +217,12 @@ function o.cfgvalue(self, section)
remark, translate("Delete the subscribed node"))
end
o = s:option(Button, "_update", translate("Manual subscription"))
o.inputstyle = "apply"
function o.write(t, n)
luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua start " .. n .. " manual > /dev/null 2>&1 &")
m.no_commit = true
luci.http.redirect(api.url("log"))
o = s:option(DummyValue, "_update", translate("Manual subscription"))
o.rawhtml = true
o.cfgvalue = function(self, section)
return string.format([[
<button type="button" class="cbi-button cbi-button-apply" onclick="ManualSubscribe('%s')">%s</button>]],
section, translate("Manual subscription"))
end
s:append(Template(appname .. "/node_subscribe/js"))
@@ -126,7 +126,8 @@ function uci_save(cursor, config, commit, apply)
end
function sh_uci_get(config, section, option)
exec_call(string.format("uci -q get %s.%s.%s", config, section, option))
local _, val = exec_call(string.format("uci -q get %s.%s.%s", config, section, option))
return val
end
function sh_uci_set(config, section, option, val, commit)
@@ -3,6 +3,8 @@ local api = require "luci.passwall.api"
-%>
<script type="text/javascript">
//<![CDATA[
var appname = "<%= api.appname %>"
function confirmDeleteNode(remark) {
if (!confirm("<%:Delete the subscribed node%>: " + remark + " ?"))
return false;
@@ -34,5 +36,78 @@ local api = require "luci.passwall.api"
});
return false;
}
function ManualSubscribe(sectionId) {
var selector = "input#cbid\\." + appname + "\\." + sectionId + "\\.url, input#widget\\.cbid\\." + appname + "\\." + sectionId + "\\.url";
var urlInput = document.querySelector(selector);
var currentUrl = urlInput ? urlInput.value.trim() : "";
if (!currentUrl) {
alert("<%:Subscribe URL cannot be empty.%>");
return;
}
fetch('<%= api.url("subscribe_manual") %>?section='
+ encodeURIComponent(sectionId)
+ '&url='
+ encodeURIComponent(currentUrl))
.then(response => response.json())
.then(data => {
if (!data.success) {
alert(data.msg || "Operation failed");
} else {
window.location.href = '<%= api.url("log") %>'
}
});
}
function ManualSubscribeAll() {
var sectionIds = [];
var urls = [];
var table = document.getElementById("cbi-" + appname + "-subscribe_list");
var editBtns = table ? table.getElementsByClassName("cbi-button cbi-button-edit") : [];
for (var i = 0; i < editBtns.length; i++) {
var btn = editBtns[i];
var onclickStr = btn.getAttribute("onclick");
if (!onclickStr) continue;
var id = onclickStr.substring(onclickStr.lastIndexOf('/') + 1, onclickStr.length - 1);
if (!id) continue;
var selector = "input#cbid\\." + appname + "\\." + id + "\\.url, input#widget\\.cbid\\." + appname + "\\." + id + "\\.url";
var urlInput = document.querySelector(selector);
var currentUrl = urlInput ? urlInput.value.trim() : "";
if (!currentUrl) {
alert("<%:Subscribe URL cannot be empty.%>");
return;
}
sectionIds.push(id);
urls.push(currentUrl);
}
if (sectionIds.length === 0) {
//alert("No subscriptions found.");
return;
}
var params = new URLSearchParams();
params.append("sections", sectionIds.join(","));
params.append("urls", urls.join(","));
fetch('<%= api.url("subscribe_manual_all") %>', {
method: 'POST',
body: params
})
.then(response => response.json())
.then(data => {
if (!data.success) {
alert(data.msg || "Operation failed");
} else {
window.location.href = '<%= api.url("log") %>'
}
});
}
//]]>
</script>
+8 -2
View File
@@ -1072,8 +1072,14 @@ msgstr "订阅网址"
msgid "Subscribe URL Access Method"
msgstr "订阅网址访问方式"
msgid "Please input the subscription url first, save and submit before manual subscription."
msgstr "请输入订阅网址保存应用后再手动订阅。"
msgid "When adding a new subscription, please save and apply before manually subscribing. If you only change the subscription URL, you can subscribe manually, and the system will save it automatically."
msgstr "新增订阅请先保存应用后再手动订阅;如仅修改订阅地址,可直接手动订阅,系统将自动保存。"
msgid "Please save and apply before manually subscribing."
msgstr "请先保存并应用后再手动订阅。"
msgid "Subscribe URL cannot be empty."
msgstr "订阅网址不能为空。"
msgid "Subscribe via proxy"
msgstr "通过代理订阅"
@@ -1913,7 +1913,6 @@ local execute = function()
local raw_data = api.trim(stdout)
local old_md5 = value.md5 or ""
local new_md5 = luci.sys.exec("md5sum " .. tmp_file .. " 2>/dev/null | awk '{print $1}'"):gsub("\n", "")
os.remove(tmp_file)
if not manual_sub and old_md5 == new_md5 then
log('订阅:【' .. remark .. '】没有变化,无需更新。')
else
@@ -1924,6 +1923,7 @@ local execute = function()
fail_list[#fail_list + 1] = value
end
end
luci.sys.call("rm -f " .. tmp_file)
allowInsecure_default = nil
filter_keyword_mode_default = uci:get(appname, "@global_subscribe[0]", "filter_keyword_mode") or "0"
filter_keyword_discard_list_default = uci:get(appname, "@global_subscribe[0]", "filter_discard_list") or {}
+1 -1
View File
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=nikki
PKG_VERSION:=2025.06.25
PKG_RELEASE:=1
PKG_RELEASE:=2
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+24 -11
View File
@@ -40,18 +40,18 @@ proxy_transparent_proxy=$(uci -q get nikki.proxy.transparent_proxy); [ -n "$prox
uci add nikki router_access_control
uci set nikki.@router_access_control[-1].enabled=1
proxy_bypass_user=$(uci -q get nikki.proxy.bypass_user); [ -n "$proxy_bypass_user" ] && {
for user in $proxy_bypass_user; do
uci add_list nikki.@router_access_control[-1].user="$user"
for router_access_control_user in $proxy_bypass_user; do
uci add_list nikki.@router_access_control[-1].user="$router_access_control_user"
done
}
proxy_bypass_group=$(uci -q get nikki.proxy.bypass_group); [ -n "$proxy_bypass_group" ] && {
for group in $proxy_bypass_group; do
uci add_list nikki.@router_access_control[-1].group="$group"
for router_access_control_group in $proxy_bypass_group; do
uci add_list nikki.@router_access_control[-1].group="$router_access_control_group"
done
}
proxy_bypass_cgroup=$(uci -q get nikki.proxy.bypass_cgroup); [ -n "$proxy_bypass_cgroup" ] && {
for cgroup in $proxy_bypass_cgroup; do
uci add_list nikki.@router_access_control[-1].cgroup="$cgroup"
for router_access_control_cgroup in $proxy_bypass_cgroup; do
uci add_list nikki.@router_access_control[-1].cgroup="$router_access_control_cgroup"
done
}
uci set nikki.@router_access_control[-1].proxy=0
@@ -129,11 +129,11 @@ proxy_tun_interval=$(uci -q get nikki.proxy.tun_interval); [ -z "$proxy_tun_inte
# since v1.23.1
uci show nikki | grep -o -E 'nikki.@router_access_control\[[[:digit:]]+\]=router_access_control' | cut -d '=' -f 1 | while read -r router_access_control; do
for cgroup in $(uci -q get "$router_access_control.cgroup"); do
[ -d "/sys/fs/cgroup/$cgroup" ] && continue
[ -d "/sys/fs/cgroup/services/$cgroup" ] && {
uci del_list "$router_access_control.cgroup=$cgroup"
uci add_list "$router_access_control.cgroup=services/$cgroup"
for router_access_control_cgroup in $(uci -q get "$router_access_control.cgroup"); do
[ -d "/sys/fs/cgroup/$router_access_control_cgroup" ] && continue
[ -d "/sys/fs/cgroup/services/$router_access_control_cgroup" ] && {
uci del_list "$router_access_control.cgroup=$router_access_control_cgroup"
uci add_list "$router_access_control.cgroup=services/$router_access_control_cgroup"
}
done
done
@@ -143,6 +143,19 @@ env_disable_safe_path_check=$(uci -q get nikki.env.disable_safe_path_check); [ -
env_skip_system_ipv6_check=$(uci -q get nikki.env.skip_system_ipv6_check); [ -z "$env_skip_system_ipv6_check" ] && uci set nikki.env.skip_system_ipv6_check=0
# since v1.23.3
uci show nikki | grep -o -E 'nikki.@router_access_control\[[[:digit:]]+\]=router_access_control' | cut -d '=' -f 1 | while read -r router_access_control; do
router_access_control_proxy=$(uci -q get "$router_access_control.proxy")
router_access_control_dns=$(uci -q get "$router_access_control.dns")
[ -z "$router_access_control_dns" ] && uci set "$router_access_control.dns=$router_access_control_proxy"
done
uci show nikki | grep -o -E 'nikki.@lan_access_control\[[[:digit:]]+\]=lan_access_control' | cut -d '=' -f 1 | while read -r lan_access_control; do
lan_access_control_proxy=$(uci -q get "$lan_access_control.proxy")
lan_access_control_dns=$(uci -q get "$lan_access_control.dns")
[ -z "$lan_access_control_dns" ] && uci set "$lan_access_control.dns=$lan_access_control_proxy"
done
# commit
uci commit nikki
+10 -8
View File
@@ -43,6 +43,7 @@
access_control['group'] = filter(uci_array(access_control['group']), (x) => index(groups, x) >= 0);
access_control['cgroup'] = filter(uci_array(access_control['cgroup']), (x) => index(cgroups, x) >= 0);
access_control['proxy'] = uci_bool(access_control['proxy']);
access_control['dns'] = uci_bool(access_control['dns']);
push(router_access_control, access_control);
});
@@ -63,6 +64,7 @@
access_control['ip6'] = uci_array(access_control['ip6']);
access_control['mac'] = uci_array(access_control['mac']);
access_control['proxy'] = uci_bool(access_control['proxy']);
access_control['dns'] = uci_bool(access_control['dns']);
push(lan_access_control, access_control);
});
@@ -182,20 +184,20 @@ table inet nikki {
{% for (let access_control in router_access_control): %}
{% if (access_control['enabled']): %}
{% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}
meta l4proto { tcp, udp } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
meta l4proto { tcp, udp } th dport 53 counter {% if (access_control.dns == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% else %}
{% if (length(access_control['user']) > 0): %}
meta l4proto { tcp, udp } meta skuid { {{ join(', ', access_control['user']) }} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
meta l4proto { tcp, udp } meta skuid { {{ join(', ', access_control['user']) }} } th dport 53 counter {% if (access_control.dns == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% if (length(access_control['group']) > 0): %}
meta l4proto { tcp, udp } meta skgid { {{ join(', ', access_control['group']) }} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
meta l4proto { tcp, udp } meta skgid { {{ join(', ', access_control['group']) }} } th dport 53 counter {% if (access_control.dns == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% if (cgroups_version == 2 && length(access_control['cgroup']) > 0): %}
{% for (let cgroup in access_control['cgroup']): %}
meta l4proto { tcp, udp } socket cgroupv2 level {{ length(split(cgroup, '/')) }} "{{ cgroup }}" th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
meta l4proto { tcp, udp } socket cgroupv2 level {{ length(split(cgroup, '/')) }} "{{ cgroup }}" th dport 53 counter {% if (access_control.dns == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endfor %}
{% endif %}
@@ -288,19 +290,19 @@ table inet nikki {
{% for (let access_control in lan_access_control): %}
{% if (access_control['enabled']): %}
{% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}
meta l4proto { tcp, udp } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
meta l4proto { tcp, udp } th dport 53 counter {% if (access_control.dns == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% else %}
{% if (length(access_control['ip']) > 0): %}
meta l4proto { tcp, udp } ip saddr { {{ join(', ', access_control['ip']) }} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
meta l4proto { tcp, udp } ip saddr { {{ join(', ', access_control['ip']) }} } th dport 53 counter {% if (access_control.dns == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% if (length(access_control['ip6']) > 0): %}
meta l4proto { tcp, udp } ip6 saddr { {{ join(', ', access_control['ip6']) }} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
meta l4proto { tcp, udp } ip6 saddr { {{ join(', ', access_control['ip6']) }} } th dport 53 counter {% if (access_control.dns == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% if (length(access_control['mac']) > 0): %}
meta l4proto { tcp, udp } ether saddr { {{ join(', ', access_control['mac']) }} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
meta l4proto { tcp, udp } ether saddr { {{ join(', ', access_control['mac']) }} } th dport 53 counter {% if (access_control.dns == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% endif %}
+1 -3
View File
@@ -56,10 +56,8 @@ jobs:
- name: Update and commit changes
if: env.needs_update == 'true'
run: |
go get -u
go get golang.org/x/mobile@latest
go get github.com/xtls/xray-core@${{ env.LATEST_TAG_SHA }}
go get gvisor.dev/gvisor@go
go get github.com/OmarTariq612/goech@v0.0.0-20240405204721-8e2e1dafd3a0
go mod tidy -v
git diff
+15 -17
View File
@@ -3,8 +3,8 @@ module github.com/2dust/AndroidLibXrayLite
go 1.24.3
require (
github.com/xtls/xray-core v1.250516.1-0.20250608135303-fbae89d017ae
golang.org/x/mobile v0.0.0-20250606033058-a2a15c67f36f
github.com/xtls/xray-core v1.250608.1-0.20250724021908-4f45c5faa5f1
golang.org/x/mobile v0.0.0-20250711185624-d5bb5ecc55c0
)
require (
@@ -13,42 +13,40 @@ require (
github.com/cloudflare/circl v1.6.1 // indirect
github.com/dgryski/go-metro v0.0.0-20250106013310-edb8663e5e33 // indirect
github.com/ghodss/yaml v1.0.1-0.20220118164431-d8423dcdf344 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/google/btree v1.1.3 // indirect
github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/juju/ratelimit v1.0.2 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
github.com/onsi/ginkgo/v2 v2.23.4 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pires/go-proxyproto v0.8.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/quic-go/quic-go v0.52.0 // indirect
github.com/refraction-networking/utls v1.7.3 // indirect
github.com/quic-go/quic-go v0.54.0 // indirect
github.com/refraction-networking/utls v1.8.0 // indirect
github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/sagernet/sing v0.6.11 // indirect
github.com/sagernet/sing-shadowsocks v0.2.8 // indirect
github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771 // indirect
github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e // indirect
github.com/vishvananda/netlink v1.3.1 // indirect
github.com/vishvananda/netns v0.0.5 // indirect
github.com/xtls/reality v0.0.0-20250608132114-50752aec6bfb // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
github.com/xtls/reality v0.0.0-20250723121014-c6320729d93b // indirect
go.uber.org/mock v0.5.2 // indirect
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
golang.org/x/crypto v0.39.0 // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.41.0 // indirect
golang.org/x/sync v0.15.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.26.0 // indirect
golang.org/x/crypto v0.40.0 // indirect
golang.org/x/mod v0.26.0 // indirect
golang.org/x/net v0.42.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.34.0 // indirect
golang.org/x/text v0.27.0 // indirect
golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.34.0 // indirect
golang.org/x/tools v0.35.0 // indirect
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect
golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/grpc v1.73.0 // indirect
google.golang.org/grpc v1.74.2 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gvisor.dev/gvisor v0.0.0-20250606001031-fa4c4dd86b43 // indirect
+47 -56
View File
@@ -4,6 +4,7 @@ github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7X
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -12,12 +13,10 @@ github.com/dgryski/go-metro v0.0.0-20250106013310-edb8663e5e33 h1:ucRHb6/lvW/+mT
github.com/dgryski/go-metro v0.0.0-20250106013310-edb8663e5e33/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw=
github.com/ghodss/yaml v1.0.1-0.20220118164431-d8423dcdf344 h1:Arcl6UOIS/kgO2nW3A65HN+7CMjSDP/gofXL4CZt1V4=
github.com/ghodss/yaml v1.0.1-0.20220118164431-d8423dcdf344/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U=
github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
@@ -26,8 +25,6 @@ github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18=
github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
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/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
@@ -38,32 +35,28 @@ github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zt
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE=
github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE=
github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU=
github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
github.com/miekg/dns v1.1.67/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/pires/go-proxyproto v0.8.1 h1:9KEixbdJfhrbtjpz/ZwCdWDD2Xem0NZ38qMYaASJgp0=
github.com/pires/go-proxyproto v0.8.1/go.mod h1:ZKAAyp3cgy5Y5Mo4n9AlScrkCZwUy0g3Jf+slqQVcuU=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
github.com/quic-go/quic-go v0.52.0 h1:/SlHrCRElyaU6MaEPKqKr9z83sBg2v4FLLvWM+Z47pA=
github.com/quic-go/quic-go v0.52.0/go.mod h1:MFlGGpcpJqRAfmYi6NC2cptDPSxRWTOGNuP4wqrWmzQ=
github.com/refraction-networking/utls v1.7.3 h1:L0WRhHY7Oq1T0zkdzVZMR6zWZv+sXbHB9zcuvsAEqCo=
github.com/refraction-networking/utls v1.7.3/go.mod h1:TUhh27RHMGtQvjQq+RyO11P6ZNQNBb3N0v7wsEjKAIQ=
github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
github.com/refraction-networking/utls v1.8.0 h1:L38krhiTAyj9EeiQQa2sg+hYb4qwLCqdMcpZrRfbONE=
github.com/refraction-networking/utls v1.8.0/go.mod h1:jkSOEkLqn+S/jtpEHPOsVv/4V4EVnelwbMQl4vCWXAM=
github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg=
github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3/go.mod h1:HgjTstvQsPGkxUsCd2KWxErBblirPizecHcpD3ffK+s=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/sagernet/sing v0.6.11 h1:BXYwLYw2srH1Kdp1vlZgrK+1lAan5i2UdZ4lPWqEgUU=
github.com/sagernet/sing v0.6.11/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
github.com/sagernet/sing-shadowsocks v0.2.8 h1:PURj5PRoAkqeHh2ZW205RWzN9E9RtKCVCzByXruQWfE=
@@ -80,63 +73,61 @@ github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW
github.com/vishvananda/netlink v1.3.1/go.mod h1:ARtKouGSTGchR8aMwmkzC0qiNPrrWO5JS/XMVl45+b4=
github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY=
github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
github.com/xtls/reality v0.0.0-20250608132114-50752aec6bfb h1:X6ziJCMsFF8Ac/0F3W7+UbFdHZTu+r5nZ/smksHVxNQ=
github.com/xtls/reality v0.0.0-20250608132114-50752aec6bfb/go.mod h1:yD47RN65bDLZgyHWMfFDiqlzrq4usDMt/Xzsk6tMbhw=
github.com/xtls/xray-core v1.250516.1-0.20250608135303-fbae89d017ae h1:Be9MicJQI+Iup03zNG7QMEidpbJj3b4//IM8jIAnLKY=
github.com/xtls/xray-core v1.250516.1-0.20250608135303-fbae89d017ae/go.mod h1:MkfIs2WZ5VLtZHAwDKosSS05Kx5zFFOzvly7Hy6pfPs=
github.com/xtls/reality v0.0.0-20250723121014-c6320729d93b h1:HOOsQYu7/EzvpegY7uHiaeI9H/6OsHAOkREnJthdUW8=
github.com/xtls/reality v0.0.0-20250723121014-c6320729d93b/go.mod h1:XxvnCCgBee4WWE0bc4E+a7wbk8gkJ/rS0vNVNtC5qp0=
github.com/xtls/xray-core v1.250608.1-0.20250724021908-4f45c5faa5f1 h1:5YFdWAwmW/pB7aMltnUmsRC8QY37817Q2m9WqVUVxPU=
github.com/xtls/xray-core v1.250608.1-0.20250724021908-4f45c5faa5f1/go.mod h1:dqSs+9mmzvOZRFxTaS0ktkQYG8TD9naApQPdnp/MUzA=
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o=
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M=
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
golang.org/x/mobile v0.0.0-20250606033058-a2a15c67f36f h1:/n+PL2HlfqeSiDCuhdBbRNlGS/g2fM4OHufalHaTVG8=
golang.org/x/mobile v0.0.0-20250606033058-a2a15c67f36f/go.mod h1:ESkJ836Z6LpG6mTVAhA48LpfW/8fNR0ifStlH2axyfg=
golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/mobile v0.0.0-20250711185624-d5bb5ecc55c0 h1:Z6EFcPz8e1cx0ge5jWCwqafndPjdsDQf8fk4Kw3pJoI=
golang.org/x/mobile v0.0.0-20250711185624-d5bb5ecc55c0/go.mod h1:kqVs191xxTTCd39tk8zK1UD3jyCS1SPrMHTpJ9ujxZg=
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg=
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI=
golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb h1:whnFRlWMcXI9d+ZbWg+4sHnLp52d5yiIPUxMBSt4X9A=
golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb/go.mod h1:rpwXGsirqLqN2L0JDJQlwOboGHmptD5ZD6T2VmcqhTw=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+2 -2
View File
@@ -12,8 +12,8 @@ android {
applicationId = "com.v2ray.ang"
minSdk = 21
targetSdk = 35
versionCode = 659
versionName = "1.10.9"
versionCode = 660
versionName = "1.10.10"
multiDexEnabled = true
val abiFilterList = (properties["ABI_FILTERS"] as? String)?.split(';')
@@ -887,6 +887,24 @@ object V2rayConfigManager {
)
)
}
if (v2rayConfig.routing.domainStrategy == "IPIfNonMatch") {
v2rayConfig.routing.rules.add(
RulesBean(
ip = arrayListOf("0.0.0.0/0", "::/0"),
balancerTag = "proxy-round",
type = "field"
)
)
} else {
v2rayConfig.routing.rules.add(
RulesBean(
network = "tcp,udp",
balancerTag = "proxy-round",
type = "field"
)
)
}
} catch (e: Exception) {
Log.e(AppConfig.TAG, "Failed to configure balance", e)
}
+1 -1
View File
@@ -21,7 +21,7 @@ toasty = "1.5.2"
editorkit = "2.9.0"
core = "3.5.3"
workRuntimeKtx = "2.10.2"
lifecycleViewmodelKtx = "2.9.1"
lifecycleViewmodelKtx = "2.9.2"
multidex = "2.0.1"
mockitoMockitoInline = "5.2.0"
flexbox = "3.0.0"
+16
View File
@@ -27,6 +27,22 @@
- 国际化多语言
- 批量生成多个头像
## 深度了解项目
想要深入了解项目架构、代码组织和技术实现?
🔍 **[访问 DeepWiki 智能文档](https://deepwiki.com/Codennnn/vue-color-avatar)**
DeepWiki 使用 AI 技术自动分析了整个项目,提供:
- 📋 项目架构概览
- 🔍 代码结构分析
- 💡 核心功能解读
- 🗺️ 组件依赖关系图
- 🚀 实现细节与最佳实践
_非常适合新手快速上手和贡献者深入理解项目_
## 设计资源
- 设计师:[@Micah](https://www.figma.com/@Micah) on Figma
+16
View File
@@ -27,6 +27,22 @@ Features you might be interested in:
- i18n
- Generate multiple avatars in batch
## Project Documentation
Want to dive deeper into the project architecture, code organization, and technical implementation?
🔍 **[Explore DeepWiki AI Documentation](https://deepwiki.com/Codennnn/vue-color-avatar)**
DeepWiki uses AI technology to automatically analyze the entire project, providing:
- 📋 Project architecture overview
- 🔍 Code structure analysis
- 💡 Core functionality insights
- 🗺️ Component dependency diagrams
- 🚀 Implementation details and best practices
_Perfect for newcomers to get started quickly and contributors to understand the project deeply_
## Assets
> **Note**
+3 -2
View File
@@ -11,8 +11,9 @@
## Donation & NFTs
- **ETH/USDT/USDC: `0xDc3Fe44F0f25D13CACb1C4896CD0D321df3146Ee`**
- **Project X NFT: [Announcement of NFTs by Project X](https://github.com/XTLS/Xray-core/discussions/3633)**
- **REALITY NFT: [XHTTP: Beyond REALITY](https://github.com/XTLS/Xray-core/discussions/4113)**
- **Project X NFT: https://opensea.io/item/ethereum/0x5ee362866001613093361eb8569d59c4141b76d1/1**
- **REALITY NFT: https://opensea.io/item/ethereum/0x5ee362866001613093361eb8569d59c4141b76d1/2**
- **Related links: https://opensea.io/collection/xtls, [Announcement of NFTs by Project X](https://github.com/XTLS/Xray-core/discussions/3633), [XHTTP: Beyond REALITY](https://github.com/XTLS/Xray-core/discussions/4113)**
## License
+1 -1
View File
@@ -19,7 +19,7 @@ import (
var (
Version_x byte = 25
Version_y byte = 7
Version_z byte = 23
Version_z byte = 24
)
var (
+8 -8
View File
@@ -11,7 +11,6 @@ import (
"strings"
"syscall"
"github.com/cloudflare/circl/sign/mldsa/mldsa65"
"github.com/xtls/xray-core/common/errors"
"github.com/xtls/xray-core/common/net"
"github.com/xtls/xray-core/common/platform/filesystem"
@@ -613,11 +612,10 @@ func (c *REALITYConfig) Build() (proto.Message, error) {
config.ServerNames = c.ServerNames
config.MaxTimeDiff = c.MaxTimeDiff
if mldsa65Seed, err := base64.RawURLEncoding.DecodeString(c.Mldsa65Seed); err != nil || len(mldsa65Seed) != 32 {
return nil, errors.New(`invalid "mldsa65Seed": `, c.Mldsa65Seed)
} else {
_, key := mldsa65.NewKeyFromSeed((*[32]byte)(mldsa65Seed))
config.Mldsa65Key = key.Bytes()
if c.Mldsa65Seed != "" {
if config.Mldsa65Seed, err = base64.RawURLEncoding.DecodeString(c.Mldsa65Seed); err != nil || len(config.Mldsa65Seed) != 32 {
return nil, errors.New(`invalid "mldsa65Seed": `, c.Mldsa65Seed)
}
}
config.LimitFallbackUpload = new(reality.LimitFallback)
@@ -655,8 +653,10 @@ func (c *REALITYConfig) Build() (proto.Message, error) {
if _, err = hex.Decode(config.ShortId, []byte(c.ShortId)); err != nil {
return nil, errors.New(`invalid "shortId": `, c.ShortId)
}
if config.Mldsa65Verify, err = base64.RawURLEncoding.DecodeString(c.Mldsa65Verify); err != nil || len(config.Mldsa65Verify) != 1952 {
return nil, errors.New(`invalid "mldsa65Verify": `, c.Mldsa65Verify)
if c.Mldsa65Verify != "" {
if config.Mldsa65Verify, err = base64.RawURLEncoding.DecodeString(c.Mldsa65Verify); err != nil || len(config.Mldsa65Verify) != 1952 {
return nil, errors.New(`invalid "mldsa65Verify": `, c.Mldsa65Verify)
}
}
if c.SpiderX == "" {
c.SpiderX = "/"
@@ -7,6 +7,7 @@ import (
"os"
"time"
"github.com/cloudflare/circl/sign/mldsa/mldsa65"
"github.com/xtls/reality"
"github.com/xtls/xray-core/common/errors"
"github.com/xtls/xray-core/transport/internet"
@@ -27,13 +28,15 @@ func (c *Config) GetREALITYConfig() *reality.Config {
MaxClientVer: c.MaxClientVer,
MaxTimeDiff: time.Duration(c.MaxTimeDiff) * time.Millisecond,
Mldsa65Key: c.Mldsa65Key,
NextProtos: nil, // should be nil
SessionTicketsDisabled: true,
KeyLogWriter: KeyLogWriterFromConfig(c),
}
if c.Mldsa65Seed != nil {
_, key := mldsa65.NewKeyFromSeed((*[32]byte)(c.Mldsa65Seed))
config.Mldsa65Key = key.Bytes()
}
if c.LimitFallbackUpload != nil {
config.LimitFallbackUpload.AfterBytes = c.LimitFallbackUpload.AfterBytes
config.LimitFallbackUpload.BytesPerSec = c.LimitFallbackUpload.BytesPerSec
@@ -35,7 +35,7 @@ type Config struct {
MaxClientVer []byte `protobuf:"bytes,8,opt,name=max_client_ver,json=maxClientVer,proto3" json:"max_client_ver,omitempty"`
MaxTimeDiff uint64 `protobuf:"varint,9,opt,name=max_time_diff,json=maxTimeDiff,proto3" json:"max_time_diff,omitempty"`
ShortIds [][]byte `protobuf:"bytes,10,rep,name=short_ids,json=shortIds,proto3" json:"short_ids,omitempty"`
Mldsa65Key []byte `protobuf:"bytes,11,opt,name=mldsa65_key,json=mldsa65Key,proto3" json:"mldsa65_key,omitempty"`
Mldsa65Seed []byte `protobuf:"bytes,11,opt,name=mldsa65_seed,json=mldsa65Seed,proto3" json:"mldsa65_seed,omitempty"`
LimitFallbackUpload *LimitFallback `protobuf:"bytes,12,opt,name=limit_fallback_upload,json=limitFallbackUpload,proto3" json:"limit_fallback_upload,omitempty"`
LimitFallbackDownload *LimitFallback `protobuf:"bytes,13,opt,name=limit_fallback_download,json=limitFallbackDownload,proto3" json:"limit_fallback_download,omitempty"`
Fingerprint string `protobuf:"bytes,21,opt,name=Fingerprint,proto3" json:"Fingerprint,omitempty"`
@@ -148,9 +148,9 @@ func (x *Config) GetShortIds() [][]byte {
return nil
}
func (x *Config) GetMldsa65Key() []byte {
func (x *Config) GetMldsa65Seed() []byte {
if x != nil {
return x.Mldsa65Key
return x.Mldsa65Seed
}
return nil
}
@@ -293,7 +293,7 @@ var file_transport_internet_reality_config_proto_rawDesc = []byte{
0x72, 0x6e, 0x65, 0x74, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x2f, 0x63, 0x6f, 0x6e,
0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1f, 0x78, 0x72, 0x61, 0x79, 0x2e,
0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
0x65, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x96, 0x06, 0x0a, 0x06, 0x43,
0x65, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x98, 0x06, 0x0a, 0x06, 0x43,
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x01, 0x20,
0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73,
0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a,
@@ -312,55 +312,55 @@ var file_transport_internet_reality_config_proto_rawDesc = []byte{
0x65, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61,
0x78, 0x54, 0x69, 0x6d, 0x65, 0x44, 0x69, 0x66, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x6f,
0x72, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x68,
0x6f, 0x72, 0x74, 0x49, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x6c, 0x64, 0x73, 0x61, 0x36,
0x35, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x6c, 0x64,
0x73, 0x61, 0x36, 0x35, 0x4b, 0x65, 0x79, 0x12, 0x62, 0x0a, 0x15, 0x6c, 0x69, 0x6d, 0x69, 0x74,
0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64,
0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x74, 0x72,
0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
0x2e, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x61,
0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x61, 0x6c,
0x6c, 0x62, 0x61, 0x63, 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x66, 0x0a, 0x17, 0x6c,
0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x6f,
0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x78,
0x72, 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e,
0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x4c,
0x69, 0x6d, 0x69, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x15, 0x6c, 0x69,
0x6d, 0x69, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c,
0x6f, 0x61, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69,
0x6e, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72,
0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f,
0x6e, 0x61, 0x6d, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76,
0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63,
0x5f, 0x6b, 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c,
0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x69,
0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x64,
0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x6c, 0x64, 0x73, 0x61, 0x36, 0x35, 0x5f, 0x76, 0x65, 0x72, 0x69,
0x66, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6d, 0x6c, 0x64, 0x73, 0x61, 0x36,
0x35, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x69, 0x64, 0x65,
0x72, 0x5f, 0x78, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x69, 0x64, 0x65,
0x72, 0x58, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x79, 0x18, 0x1b,
0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x73, 0x70, 0x69, 0x64, 0x65, 0x72, 0x59, 0x12, 0x24, 0x0a,
0x0e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x6f, 0x67, 0x18,
0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x4b, 0x65, 0x79,
0x4c, 0x6f, 0x67, 0x22, 0x83, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x61, 0x6c,
0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x62,
0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x66, 0x74, 0x65,
0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f,
0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62,
0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x12, 0x2d, 0x0a, 0x13, 0x62, 0x75,
0x72, 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65,
0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x62, 0x75, 0x72, 0x73, 0x74, 0x42, 0x79,
0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x42, 0x7f, 0x0a, 0x23, 0x63, 0x6f, 0x6d,
0x6f, 0x72, 0x74, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x6c, 0x64, 0x73, 0x61, 0x36,
0x35, 0x5f, 0x73, 0x65, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6d, 0x6c,
0x64, 0x73, 0x61, 0x36, 0x35, 0x53, 0x65, 0x65, 0x64, 0x12, 0x62, 0x0a, 0x15, 0x6c, 0x69, 0x6d,
0x69, 0x74, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x75, 0x70, 0x6c, 0x6f,
0x61, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e,
0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
0x65, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74,
0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x46,
0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x66, 0x0a,
0x17, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f,
0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e,
0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e,
0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79,
0x50, 0x01, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78,
0x74, 0x6c, 0x73, 0x2f, 0x78, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72,
0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
0x2f, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79, 0xaa, 0x02, 0x1f, 0x58, 0x72, 0x61, 0x79, 0x2e,
0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,
0x65, 0x74, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x33,
0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x15,
0x6c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x44, 0x6f, 0x77,
0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70,
0x72, 0x69, 0x6e, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x46, 0x69, 0x6e, 0x67,
0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65,
0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65,
0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c,
0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75,
0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74,
0x5f, 0x69, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x72, 0x74,
0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x6c, 0x64, 0x73, 0x61, 0x36, 0x35, 0x5f, 0x76, 0x65,
0x72, 0x69, 0x66, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6d, 0x6c, 0x64, 0x73,
0x61, 0x36, 0x35, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x69,
0x64, 0x65, 0x72, 0x5f, 0x78, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x69,
0x64, 0x65, 0x72, 0x58, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x79,
0x18, 0x1b, 0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x73, 0x70, 0x69, 0x64, 0x65, 0x72, 0x59, 0x12,
0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x6f,
0x67, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x4b,
0x65, 0x79, 0x4c, 0x6f, 0x67, 0x22, 0x83, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46,
0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x66, 0x74, 0x65, 0x72,
0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x66,
0x74, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x62, 0x79, 0x74, 0x65,
0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52,
0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x12, 0x2d, 0x0a, 0x13,
0x62, 0x75, 0x72, 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f,
0x73, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x62, 0x75, 0x72, 0x73, 0x74,
0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x42, 0x7f, 0x0a, 0x23, 0x63,
0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x69,
0x74, 0x79, 0x50, 0x01, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
0x2f, 0x78, 0x74, 0x6c, 0x73, 0x2f, 0x78, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f,
0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
0x65, 0x74, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79, 0xaa, 0x02, 0x1f, 0x58, 0x72, 0x61,
0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65,
0x72, 0x6e, 0x65, 0x74, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x62, 0x06, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -18,7 +18,7 @@ message Config {
uint64 max_time_diff = 9;
repeated bytes short_ids = 10;
bytes mldsa65_key = 11;
bytes mldsa65_seed = 11;
LimitFallback limit_fallback_upload = 12;
LimitFallback limit_fallback_download = 13;
+1 -1
View File
@@ -1902,7 +1902,7 @@ The following extractors use this feature:
* `backend`: Backend API to use for extraction - one of `streaks` (default) or `brightcove` (deprecated)
#### vimeo
* `client`: Client to extract video data from. The currently available clients are `android`, `ios`, and `web`. Only one client can be used. The `android` client is used by default. If account cookies or credentials are used for authentication, then the `web` client is used by default. The `web` client only works with authentication. The `ios` client only works with previously cached OAuth tokens
* `client`: Client to extract video data from. The currently available clients are `android`, `ios`, and `web`. Only one client can be used. The `web` client is used by default. The `web` client only works with account cookies or login credentials. The `android` and `ios` clients only work with previously cached OAuth tokens
* `original_format_policy`: Policy for when to try extracting original formats. One of `always`, `never`, or `auto`. The default `auto` policy tries to avoid exceeding the web client's API rate-limit by only making an extra request when Vimeo publicizes the video's downloadability
**Note**: These options may be changed/removed in the future without concern for backward compatibility
+41 -18
View File
@@ -49,7 +49,7 @@ class VimeoBaseInfoExtractor(InfoExtractor):
'Cannot download embed-only video without embedding URL. Please call yt-dlp '
'with the URL of the page that embeds this video.')
_DEFAULT_CLIENT = 'android'
_DEFAULT_CLIENT = 'web'
_DEFAULT_AUTHED_CLIENT = 'web'
_CLIENT_HEADERS = {
'Accept': 'application/vnd.vimeo.*+json; version=3.4.10',
@@ -58,7 +58,7 @@ class VimeoBaseInfoExtractor(InfoExtractor):
_CLIENT_CONFIGS = {
'android': {
'CACHE_KEY': 'oauth-token-android',
'CACHE_ONLY': False,
'CACHE_ONLY': True,
'VIEWER_JWT': False,
'REQUIRES_AUTH': False,
'AUTH': 'NzRmYTg5YjgxMWExY2JiNzUwZDg1MjhkMTYzZjQ4YWYyOGEyZGJlMTp4OGx2NFd3QnNvY1lkamI2UVZsdjdDYlNwSDUrdm50YzdNNThvWDcwN1JrenJGZC9tR1lReUNlRjRSVklZeWhYZVpRS0tBcU9YYzRoTGY2Z1dlVkJFYkdJc0dMRHpoZWFZbU0reDRqZ1dkZ1diZmdIdGUrNUM5RVBySlM0VG1qcw==',
@@ -88,6 +88,7 @@ class VimeoBaseInfoExtractor(InfoExtractor):
),
},
'web': {
'CACHE_ONLY': False,
'VIEWER_JWT': True,
'REQUIRES_AUTH': True,
'USER_AGENT': None,
@@ -142,7 +143,6 @@ class VimeoBaseInfoExtractor(InfoExtractor):
'service': 'vimeo',
'token': viewer['xsrft'],
}
self._set_vimeo_cookie('vuid', viewer['vuid'])
try:
self._download_webpage(
self._LOGIN_URL, None, 'Logging in',
@@ -151,16 +151,40 @@ class VimeoBaseInfoExtractor(InfoExtractor):
'Referer': self._LOGIN_URL,
})
except ExtractorError as e:
if isinstance(e.cause, HTTPError) and e.cause.status == 418:
if isinstance(e.cause, HTTPError) and e.cause.status in (405, 418):
raise ExtractorError(
'Unable to log in: bad username or password',
expected=True)
raise ExtractorError('Unable to log in')
# Clear unauthenticated viewer info
self._viewer_info = None
def _real_initialize(self):
if self._LOGIN_REQUIRED and not self._is_logged_in:
if self._is_logged_in:
return
if self._LOGIN_REQUIRED:
self.raise_login_required()
if self._DEFAULT_CLIENT != 'web':
return
for client_name, client_config in self._CLIENT_CONFIGS.items():
if not client_config['CACHE_ONLY']:
continue
cache_key = client_config['CACHE_KEY']
if cache_key not in self._oauth_tokens:
if token := self.cache.load(self._NETRC_MACHINE, cache_key):
self._oauth_tokens[cache_key] = token
if self._oauth_tokens.get(cache_key):
self._DEFAULT_CLIENT = client_name
self.write_debug(
f'Found cached {client_name} token; using {client_name} as default API client')
return
def _get_video_password(self):
password = self.get_param('videopassword')
if password is None:
@@ -200,9 +224,6 @@ class VimeoBaseInfoExtractor(InfoExtractor):
if vimeo_config:
return self._parse_json(vimeo_config, video_id)
def _set_vimeo_cookie(self, name, value):
self._set_cookie('vimeo.com', name, value)
def _parse_config(self, config, video_id):
video_data = config['video']
video_title = video_data.get('title')
@@ -363,22 +384,26 @@ class VimeoBaseInfoExtractor(InfoExtractor):
return f'Bearer {self._oauth_tokens[cache_key]}'
def _get_requested_client(self):
default_client = self._DEFAULT_AUTHED_CLIENT if self._is_logged_in else self._DEFAULT_CLIENT
if client := self._configuration_arg('client', [None], ie_key=VimeoIE)[0]:
if client not in self._CLIENT_CONFIGS:
raise ExtractorError(
f'Unsupported API client "{client}" requested. '
f'Supported clients are: {", ".join(self._CLIENT_CONFIGS)}', expected=True)
self.write_debug(
f'Using {client} API client as specified by extractor argument', only_once=True)
return client
client = self._configuration_arg('client', [default_client], ie_key=VimeoIE)[0]
if client not in self._CLIENT_CONFIGS:
raise ExtractorError(
f'Unsupported API client "{client}" requested. '
f'Supported clients are: {", ".join(self._CLIENT_CONFIGS)}', expected=True)
if self._is_logged_in:
return self._DEFAULT_AUTHED_CLIENT
return client
return self._DEFAULT_CLIENT
def _call_videos_api(self, video_id, unlisted_hash=None, path=None, *, force_client=None, query=None, **kwargs):
client = force_client or self._get_requested_client()
client_config = self._CLIENT_CONFIGS[client]
if client_config['REQUIRES_AUTH'] and not self._is_logged_in:
self.raise_login_required(f'The {client} client requires authentication')
self.raise_login_required(f'The {client} client only works when logged-in')
return self._download_json(
join_nonempty(
@@ -1192,7 +1217,6 @@ class VimeoIE(VimeoBaseInfoExtractor):
raise ExtractorError(
'This album is protected by a password, use the --video-password option',
expected=True)
self._set_vimeo_cookie('vuid', viewer['vuid'])
try:
self._download_json(
f'https://vimeo.com/showcase/{album_id}/auth',
@@ -1589,7 +1613,6 @@ class VimeoAlbumIE(VimeoBaseInfoExtractor):
raise ExtractorError(
'This album is protected by a password, use the --video-password option',
expected=True)
self._set_vimeo_cookie('vuid', viewer['vuid'])
try:
hashed_pass = self._download_json(
f'https://vimeo.com/showcase/{album_id}/auth',