Merge branch 'master' into old-engine

This commit is contained in:
nikk gitanes
2023-08-23 18:15:48 +03:00
22 changed files with 257 additions and 61 deletions

View File

@@ -10,6 +10,7 @@ On linux systems you may need to set the environment variable before run \
#### macOS install / configure / uninstall script #### macOS install / configure / uninstall script
Just run in Terminal: `curl -s https://raw.githubusercontent.com/YouROK/TorrServer/master/installTorrServerMac.sh -o installTorrserverMac.sh && chmod 755 installTorrServerMac.sh && sudo ./installTorrServerMac.sh` Just run in Terminal: `curl -s https://raw.githubusercontent.com/YouROK/TorrServer/master/installTorrServerMac.sh -o installTorrserverMac.sh && chmod 755 installTorrServerMac.sh && sudo ./installTorrServerMac.sh`
Alternative install script for Intel Macs: https://github.com/dancheskus/TorrServerMacInstaller
#### Linux on VPS install / configure / uninstall script #### Linux on VPS install / configure / uninstall script
Just run in console: `curl -s https://raw.githubusercontent.com/YouROK/TorrServer/master/installTorrServerLinux.sh | sudo bash` Just run in console: `curl -s https://raw.githubusercontent.com/YouROK/TorrServer/master/installTorrServerLinux.sh | sudo bash`
@@ -54,7 +55,7 @@ TorrServer-darwin-arm64 [--port PORT] [--path PATH] [--logpath LOGPATH] [--weblo
* --torrentsdir TORRENTSDIR, -t TORRENTSDIR * --torrentsdir TORRENTSDIR, -t TORRENTSDIR
* autoload torrents from dir * autoload torrents from dir
* --torrentaddr TORRENTADDR * --torrentaddr TORRENTADDR
* Torrent client address, default :32000 * Torrent client address (format [IP]:PORT, ex. :32000, 127.0.0.1:32768 etc)
* --pubipv4 PUBIPV4, -4 PUBIPV4 * --pubipv4 PUBIPV4, -4 PUBIPV4
* set public IPv4 addr * set public IPv4 addr
* --pubipv6 PUBIPV6, -6 PUBIPV6 * --pubipv6 PUBIPV6, -6 PUBIPV6

View File

@@ -50,12 +50,13 @@ OUTPUT="${ROOT}/dist/TorrServer"
#### Build web #### Build web
echo "Build web" echo "Build web"
export NODE_OPTIONS=--openssl-legacy-provider
$GOBIN run gen_web.go $GOBIN run gen_web.go
#### Build server #### Build server
echo "Build server" echo "Build server"
cd "${ROOT}/server" || exit 1 cd "${ROOT}/server" || exit 1
$GOBIN clean -i -r -cache #--modcache $GOBIN clean -i -r -cache --modcache
$GOBIN mod tidy $GOBIN mod tidy
BUILD_FLAGS="-ldflags=${LDFLAGS} -tags=nosqlite" BUILD_FLAGS="-ldflags=${LDFLAGS} -tags=nosqlite"
@@ -92,7 +93,8 @@ declare -a COMPILERS=(
export NDK_VERSION="25.2.9519653" # 25.1.8937393 export NDK_VERSION="25.2.9519653" # 25.1.8937393
#export NDK_TOOLCHAIN=${ANDROID_HOME}/ndk/${NDK_VERSION}/toolchains/llvm/prebuilt/darwin-x86_64 #export NDK_TOOLCHAIN=${ANDROID_HOME}/ndk/${NDK_VERSION}/toolchains/llvm/prebuilt/darwin-x86_64
export NDK_TOOLCHAIN="${PWD}/../android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64" #export NDK_TOOLCHAIN="${PWD}/../android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64"
export NDK_TOOLCHAIN=/Users/yourok/Projects/AndroidNDK
GOOS=android GOOS=android
for V in "${COMPILERS[@]}"; do for V in "${COMPILERS[@]}"; do

View File

@@ -448,6 +448,9 @@ case $1 in
isRdb=0 isRdb=0
isLog=0 isLog=0
installTorrServer installTorrServer
else
systemctl stop $serviceName.service
systemctl start $serviceName.service
fi fi
exit exit
;; ;;

View File

@@ -3,7 +3,6 @@ package main
import ( import (
"context" "context"
"fmt" "fmt"
"io/ioutil"
"net" "net"
"os" "os"
"path/filepath" "path/filepath"
@@ -127,7 +126,7 @@ func watchTDir(dir string) {
path = dir path = dir
} }
for { for {
files, err := ioutil.ReadDir(path) files, err := os.ReadDir(path)
if err == nil { if err == nil {
for _, file := range files { for _, file := range files {
filename := filepath.Join(path, file.Name()) filename := filepath.Join(path, file.Name())

View File

@@ -3,7 +3,7 @@ package log
import ( import (
"bytes" "bytes"
"fmt" "fmt"
"io/ioutil" "io"
"log" "log"
"os" "os"
"strings" "strings"
@@ -93,8 +93,8 @@ func WebLogger() gin.HandlerFunc {
body := "" body := ""
// save body if not form or file // save body if not form or file
if !strings.HasPrefix(c.Request.Header.Get("Content-Type"), "multipart/form-data") { if !strings.HasPrefix(c.Request.Header.Get("Content-Type"), "multipart/form-data") {
body, _ := ioutil.ReadAll(c.Request.Body) body, _ := io.ReadAll(c.Request.Body)
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body)) c.Request.Body = io.NopCloser(bytes.NewBuffer(body))
} else { } else {
body = "body hidden, too large" body = "body hidden, too large"
} }

View File

@@ -1,7 +1,6 @@
package server package server
import ( import (
"io/ioutil"
"net" "net"
"os" "os"
"path/filepath" "path/filepath"
@@ -36,7 +35,7 @@ func cleanCache() {
return return
} }
dirs, err := ioutil.ReadDir(settings.BTsets.TorrentsSavePath) dirs, err := os.ReadDir(settings.BTsets.TorrentsSavePath)
if err != nil { if err != nil {
return return
} }
@@ -68,7 +67,7 @@ func cleanCache() {
} }
func removeAllFiles(path string) { func removeAllFiles(path string) {
files, err := ioutil.ReadDir(path) files, err := os.ReadDir(path)
if err != nil { if err != nil {
return return
} }

View File

@@ -2,7 +2,6 @@ package torr
import ( import (
"io" "io"
"io/ioutil"
"os" "os"
"path/filepath" "path/filepath"
"sort" "sort"
@@ -143,7 +142,7 @@ func RemTorrent(hashHex string) {
hash := metainfo.NewHashFromHex(hashHex) hash := metainfo.NewHashFromHex(hashHex)
if sets.BTsets.UseDisk && hashHex != "" && hashHex != "/" { if sets.BTsets.UseDisk && hashHex != "" && hashHex != "/" {
name := filepath.Join(sets.BTsets.TorrentsSavePath, hashHex) name := filepath.Join(sets.BTsets.TorrentsSavePath, hashHex)
ff, _ := ioutil.ReadDir(name) ff, _ := os.ReadDir(name)
for _, f := range ff { for _, f := range ff {
os.Remove(filepath.Join(name, f.Name())) os.Remove(filepath.Join(name, f.Name()))
} }

View File

@@ -5,7 +5,6 @@ import (
"fmt" "fmt"
"log" "log"
"net" "net"
"strconv"
"sync" "sync"
"github.com/anacrolix/publicip" "github.com/anacrolix/publicip"
@@ -131,20 +130,21 @@ func (bt *BTServer) configure(ctx context.Context) {
log.Println("Set listen port", settings.BTsets.PeersListenPort) log.Println("Set listen port", settings.BTsets.PeersListenPort)
bt.config.ListenPort = settings.BTsets.PeersListenPort bt.config.ListenPort = settings.BTsets.PeersListenPort
} else { } else {
lport := 32000 // lport := 32000
for { // for {
log.Println("Check listen port", lport) // log.Println("Check listen port", lport)
l, err := net.Listen("tcp", ":"+strconv.Itoa(lport)) // l, err := net.Listen("tcp", ":"+strconv.Itoa(lport))
if l != nil { // if l != nil {
l.Close() // l.Close()
} // }
if err == nil { // if err == nil {
break // break
} // }
lport++ // lport++
} // }
log.Println("Set listen port", lport) // log.Println("Set listen port", lport)
bt.config.ListenPort = lport log.Println("Set listen port to random autoselect (0)")
bt.config.ListenPort = 0 // lport
} }
} }

View File

@@ -2,7 +2,7 @@ package utils
import ( import (
"bufio" "bufio"
"io/ioutil" "os"
"path/filepath" "path/filepath"
"strings" "strings"
@@ -12,7 +12,7 @@ import (
) )
func ReadBlockedIP() (ranger iplist.Ranger, err error) { func ReadBlockedIP() (ranger iplist.Ranger, err error) {
buf, err := ioutil.ReadFile(filepath.Join(settings.Path, "blocklist")) buf, err := os.ReadFile(filepath.Join(settings.Path, "blocklist"))
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -2,9 +2,10 @@ package utils
import ( import (
"encoding/base32" "encoding/base32"
"io/ioutil" "io"
"math/rand" "math/rand"
"net/http" "net/http"
"os"
"path/filepath" "path/filepath"
"strings" "strings"
@@ -14,7 +15,7 @@ import (
) )
var defTrackers = []string{ var defTrackers = []string{
"http://retracker.local", "http://retracker.local/announce",
"http://bt4.t-ru.org/ann?magnet", "http://bt4.t-ru.org/ann?magnet",
"http://retracker.mgts.by:80/announce", "http://retracker.mgts.by:80/announce",
"http://tracker.city9x.com:2710/announce", "http://tracker.city9x.com:2710/announce",
@@ -34,7 +35,7 @@ var loadedTrackers []string
func GetTrackerFromFile() []string { func GetTrackerFromFile() []string {
name := filepath.Join(settings.Path, "trackers.txt") name := filepath.Join(settings.Path, "trackers.txt")
buf, err := ioutil.ReadFile(name) buf, err := os.ReadFile(name)
if err == nil { if err == nil {
list := strings.Split(string(buf), "\n") list := strings.Split(string(buf), "\n")
var ret []string var ret []string
@@ -62,7 +63,7 @@ func loadNewTracker() {
} }
resp, err := http.Get("https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best_ip.txt") resp, err := http.Get("https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best_ip.txt")
if err == nil { if err == nil {
buf, err := ioutil.ReadAll(resp.Body) buf, err := io.ReadAll(resp.Body)
if err == nil { if err == nil {
arr := strings.Split(string(buf), "\n") arr := strings.Split(string(buf), "\n")
var ret []string var ret []string

View File

@@ -6,7 +6,7 @@ import (
// "github.com/anacrolix/torrent" // "github.com/anacrolix/torrent"
) )
const Version = "MatriX.124.OE" const Version = "MatriX.125.OE"
func GetTorrentVersion() string { func GetTorrentVersion() string {
// _ = torrent.NewDefaultClientConfig() // _ = torrent.NewDefaultClientConfig()

View File

@@ -3,8 +3,8 @@ package auth
import ( import (
"encoding/base64" "encoding/base64"
"encoding/json" "encoding/json"
"io/ioutil"
"net/http" "net/http"
"os"
"path/filepath" "path/filepath"
"reflect" "reflect"
"strings" "strings"
@@ -28,7 +28,7 @@ func SetupAuth(engine *gin.Engine) *gin.RouterGroup {
} }
func getAccounts() gin.Accounts { func getAccounts() gin.Accounts {
buf, err := ioutil.ReadFile(filepath.Join(settings.Path, "accs.db")) buf, err := os.ReadFile(filepath.Join(settings.Path, "accs.db"))
if err != nil { if err != nil {
return nil return nil
} }

View File

@@ -4,9 +4,9 @@ import (
"bufio" "bufio"
"bytes" "bytes"
"errors" "errors"
"io/ioutil"
"net" "net"
"net/http" "net/http"
"os"
"path/filepath" "path/filepath"
"strings" "strings"
@@ -22,11 +22,11 @@ func Blocker() gin.HandlerFunc {
} }
name := filepath.Join(settings.Path, "bip.txt") name := filepath.Join(settings.Path, "bip.txt")
buf, _ := ioutil.ReadFile(name) buf, _ := os.ReadFile(name)
blackIpList := scanBuf(buf) blackIpList := scanBuf(buf)
name = filepath.Join(settings.Path, "wip.txt") name = filepath.Join(settings.Path, "wip.txt")
buf, _ = ioutil.ReadFile(name) buf, _ = os.ReadFile(name)
whiteIpList := scanBuf(buf) whiteIpList := scanBuf(buf)
if blackIpList.NumRanges() == 0 && whiteIpList.NumRanges() == 0 { if blackIpList.NumRanges() == 0 && whiteIpList.NumRanges() == 0 {

View File

@@ -2,6 +2,7 @@ package web
import ( import (
"net" "net"
"os"
"sort" "sort"
"server/rutor" "server/rutor"
@@ -36,8 +37,8 @@ func Start(port string) {
} }
err := BTS.Connect() err := BTS.Connect()
if err != nil { if err != nil {
waitChan <- err log.TLogln("BTS.Connect() error!", err) // waitChan <- err
return os.Exit(1) // return
} }
rutor.Start() rutor.Start()

View File

@@ -69,6 +69,7 @@ export default function AboutDialog() {
<div> <div>
<LinkComponent name={t('ProjectSource')} link='https://github.com/YouROK/TorrServer' /> <LinkComponent name={t('ProjectSource')} link='https://github.com/YouROK/TorrServer' />
<LinkComponent name={t('Releases')} link='https://github.com/YouROK/TorrServer/releases' /> <LinkComponent name={t('Releases')} link='https://github.com/YouROK/TorrServer/releases' />
<LinkComponent name={t('NasReleases')} link='https://github.com/vladlenas' />
</div> </div>
</Section> </Section>
@@ -82,6 +83,10 @@ export default function AboutDialog() {
<LinkComponent name='kolsys' link='https://github.com/kolsys' /> <LinkComponent name='kolsys' link='https://github.com/kolsys' />
<LinkComponent name='tw1cker' link='https://github.com/Nemiroff' /> <LinkComponent name='tw1cker' link='https://github.com/Nemiroff' />
<LinkComponent name='SpAwN_LMG' link='https://github.com/spawnlmg' /> <LinkComponent name='SpAwN_LMG' link='https://github.com/spawnlmg' />
<LinkComponent name='damiva' link='https://github.com/damiva' />
<LinkComponent name='Anton Potekhin' link='https://github.com/Anton111111' />
<LinkComponent name='FaintGhost' link='https://github.com/FaintGhost' />
<LinkComponent name='vladlenas' link='https://github.com/vladlenas' />
</div> </div>
</Section> </Section>
</div> </div>

View File

@@ -109,6 +109,8 @@ export default function App() {
? changeLang('ru') ? changeLang('ru')
: currentLang === 'ru' : currentLang === 'ru'
? changeLang('ua') ? changeLang('ua')
: currentLang === 'ua'
? changeLang('zh')
: changeLang('en') : changeLang('en')
} }
> >

View File

@@ -4,6 +4,7 @@ import LanguageDetector from 'i18next-browser-languagedetector'
import translationEN from 'locales/en/translation.json' import translationEN from 'locales/en/translation.json'
import translationRU from 'locales/ru/translation.json' import translationRU from 'locales/ru/translation.json'
import translationUA from 'locales/ua/translation.json' import translationUA from 'locales/ua/translation.json'
import translationZH from 'locales/zh/translation.json'
i18n i18n
.use(LanguageDetector) .use(LanguageDetector)
@@ -15,6 +16,7 @@ i18n
en: { translation: translationEN }, en: { translation: translationEN },
ru: { translation: translationRU }, ru: { translation: translationRU },
ua: { translation: translationUA }, ua: { translation: translationUA },
zh: { translation: translationZH },
}, },
}) })

View File

@@ -76,6 +76,7 @@
"Playlist": "Playlist", "Playlist": "Playlist",
"Preload": "Preload", "Preload": "Preload",
"ProjectSource": "Project GitHub", "ProjectSource": "Project GitHub",
"NasReleases": "NAS Releases GitHub",
"PWAGuide": { "PWAGuide": {
"Header": "Install application", "Header": "Install application",
"Description": "Install the app on your device to easily access it anytime. No app store. No download.", "Description": "Install the app on your device to easily access it anytime. No app store. No download.",
@@ -112,7 +113,7 @@
"DisablePEXHint": "Better leave enabled", "DisablePEXHint": "Better leave enabled",
"DisableTCPHint": "Don't disable without μTP enabled", "DisableTCPHint": "Don't disable without μTP enabled",
"DisableUPNPHint": "Auto-open port on router", "DisableUPNPHint": "Auto-open port on router",
"DisableUTPHint": "Not recommended to enable on weak devices", "DisableUTPHint": "Recommended to disable in Windows OS",
"Disk": "Disk", "Disk": "Disk",
"DLNA": "DLNA Media Server", "DLNA": "DLNA Media Server",
"DontAddRetrackers": "Don`t add retrackers", "DontAddRetrackers": "Don`t add retrackers",
@@ -126,7 +127,7 @@
"EnableRutorSearch": "Turn on torrents search by RuTor", "EnableRutorSearch": "Turn on torrents search by RuTor",
"EnableRutorSearchHint": "You can search torrents by RuTor, even if the RuTor is not available. NOTE: The database takes about 500 MB of RAM.", "EnableRutorSearchHint": "You can search torrents by RuTor, even if the RuTor is not available. NOTE: The database takes about 500 MB of RAM.",
"PeersListenPort": "Peers Listen Port", "PeersListenPort": "Peers Listen Port",
"PeersListenPortHint": "1024 - 65535, 0 - auto", "PeersListenPortHint": "1024 - 65535, 0 - random",
"PreloadCache": "Preload Cache Before Play", "PreloadCache": "Preload Cache Before Play",
"ProMode": "PRO mode", "ProMode": "PRO mode",
"RAM": "RAM", "RAM": "RAM",

View File

@@ -76,6 +76,7 @@
"Playlist": "Плейлист", "Playlist": "Плейлист",
"Preload": "Предзагр.", "Preload": "Предзагр.",
"ProjectSource": "GitHub проекта", "ProjectSource": "GitHub проекта",
"NasReleases": "Релизы для NAS GitHub",
"PWAGuide": { "PWAGuide": {
"Header": "Установить приложение", "Header": "Установить приложение",
"Description": "Установите приложение на ваше устройство для быстрого доступа в любой момент. Без AppStore. Без загрузки.", "Description": "Установите приложение на ваше устройство для быстрого доступа в любой момент. Без AppStore. Без загрузки.",
@@ -112,7 +113,7 @@
"DisablePEXHint": "Обмен списками участников - не рекомендуется отключать", "DisablePEXHint": "Обмен списками участников - не рекомендуется отключать",
"DisableTCPHint": "Не отключайте без включенного μTP", "DisableTCPHint": "Не отключайте без включенного μTP",
"DisableUPNPHint": "Автоматическая настройка порта на роутере", "DisableUPNPHint": "Автоматическая настройка порта на роутере",
"DisableUTPHint": "Не рекомендуется включать на слабых устройствах", "DisableUTPHint": "Рекомендуется отключить в ОС Windows",
"Disk": "ПЗУ / Накопитель", "Disk": "ПЗУ / Накопитель",
"DLNA": "DLNA-медиасервер", "DLNA": "DLNA-медиасервер",
"DontAddRetrackers": "Ничего не делать", "DontAddRetrackers": "Ничего не делать",

View File

@@ -76,6 +76,7 @@
"Playlist": "Плейлист", "Playlist": "Плейлист",
"Preload": "Передзав.", "Preload": "Передзав.",
"ProjectSource": "Сайт проекту", "ProjectSource": "Сайт проекту",
"NasReleases": "Релізи для NAS GitHub",
"PWAGuide": { "PWAGuide": {
"Header": "Встановити додаток", "Header": "Встановити додаток",
"Description": "Встановіть програму на свій пристрій, щоб легко отримати до неї доступ у будь-який час. Немає магазину додатків. Немає завантаження.", "Description": "Встановіть програму на свій пристрій, щоб легко отримати до неї доступ у будь-який час. Немає магазину додатків. Немає завантаження.",
@@ -112,7 +113,7 @@
"DisablePEXHint": "Не рекомендується відключати", "DisablePEXHint": "Не рекомендується відключати",
"DisableTCPHint": "Не вимикайте без включеного μTP", "DisableTCPHint": "Не вимикайте без включеного μTP",
"DisableUPNPHint": "Автовідкриття порту на роутері", "DisableUPNPHint": "Автовідкриття порту на роутері",
"DisableUTPHint": "Не рекомендується на слабких пристроях", "DisableUTPHint": "Рекомендується відключити в ОС Windows",
"Disk": "ПЗП / Носій", "Disk": "ПЗП / Носій",
"DLNA": "DLNA-медиасервер", "DLNA": "DLNA-медиасервер",
"DontAddRetrackers": "Нічого не робити", "DontAddRetrackers": "Нічого не робити",

View File

@@ -0,0 +1,179 @@
{
"About": "关于",
"Actions": "操作",
"Add": "添加",
"AddDialog": {
"AddPosterLinkInput": "海报链接",
"AddTorrentSourceNotification": "先添加你的种子",
"AppendFile": {
"Or": "或",
"ClickOrDrag": "点击/拖放上传 (.torrent)"
},
"CustomTorrentTitle": "自定义标题(可选)",
"CustomTorrentTitleHelperText": "编写自定义标题以查找海报",
"HashExists": "这个种子已经在数据库中",
"OriginalTorrentTitle": "原始种子标题",
"TitleBlank": "标题",
"TitleBlankHelperText": "留空则使用种子原始标题",
"TorrentSourceLink": "种子地址",
"TorrentSourceOptions": "magnet / hash / .torrent文件链接",
"WrongTorrentSource": "错误的种子来源"
},
"AddFromLink": "添加种子",
"AddNewTorrent": "添加新种子",
"B": "B",
"bps": "bps",
"Buffer": "预加载缓冲区/缓存",
"BufferNote": "在设置中将播放前预加载缓存设置为大于 32 MB 以更改预加载大小",
"Cache": "缓存",
"Cancel": "取消",
"Clear": "清除",
"Close": "关闭",
"CloseServer?": "你想关闭服务器吗?",
"CloseServer": "关闭",
"CopyHash": "复制哈希",
"CopyLink": "复制链接",
"Data": "数据",
"DebugMode": "优先级标记",
"Delete": "删除",
"DeleteTorrent?": "删除种子?",
"DeleteTorrents?": "删除所有种子?",
"DetailedCacheView": {
"button": "查看缓存详情",
"header": "$t(DetailedCacheView.button)"
},
"Details": "详细信息",
"Donate?": "想要捐赠?",
"Donate": "捐赠",
"DownloadPlaylist": "下载播放列表",
"DownloadSpeed": "下载速度",
"Drop": "停止",
"DropTorrent": "停止种子",
"Edit": "编辑",
"EditTorrent": "编辑种子",
"Episode": "剧集",
"FromLatestFile": "来自最新文件",
"Full": "全部",
"GB": "GB",
"Gbps": "Gbps",
"Host": "主机",
"Info": "信息",
"KB": "KB",
"kbps": "kbps",
"Kilobytes": "千字节",
"LatestFilePlayed": "最近播放的文件:",
"Links": "链接",
"MB": "MB",
"Mbps": "Mbps",
"Name": "名称",
"NoTorrentsAdded": "没有添加种子",
"Offline": "离线",
"OK": "确定",
"OpenLink": "打开链接",
"Peers": "Peers",
"PiecesCount": "块数量",
"PiecesLength": "块长度",
"Playlist": "播放列表",
"Preload": "预加载",
"ProjectSource": "项目GitHub",
"NasReleases": "NAS GitHub 版本",
"PWAGuide": {
"Header": "安装应用程序",
"Description": "将应用程序安装到您的设备上,以便随时方便地访问。无需应用商店、无需下载。",
"VLC": "添加VLC按钮以在手机上立即打开视频",
"FirstStep": "点击",
"SecondStep": {
"Select": "选择",
"AddToHomeScreen":"添加到主屏幕"
}
},
"Releases": "TorrServer发行版",
"RemoveAll": "全部删除",
"RemoveViews": "移除视图状态",
"Resolution": "分辨率",
"Save": "保存",
"ScrollDown": "向下滚动",
"Season": "季",
"Sec": "秒",
"Seconds": "秒",
"SelectSeason": "选择季",
"SettingsDialog": {
"AddRetrackers": "添加retrackers",
"AdditionalSettings": "附加设置",
"MobileAppSettings": "移动APP设置",
"CacheBeforeReaderDesc": "在播放帧前面的缓存",
"CacheAfterReaderDesc": "在播放帧后面的缓存",
"CacheSize": "缓存大小",
"CacheSettings": "缓存设置",
"CacheStorageLocation": "缓存存储位置",
"ConnectionsLimit": "连接限制",
"ConnectionsLimitHint": "推荐20-25",
"DHT": "DHT分布式哈希表",
"DisableDHTHint": "启动服务器后无网络时禁用",
"DisablePEXHint": "最好保持启用状态",
"DisableTCPHint": "在未启用μTP的情况下不要禁用",
"DisableUPNPHint": "在路由器上自动打开端口",
"DisableUTPHint": "建议在 Windows 操作系统上禁用",
"Disk": "磁盘",
"DLNA": "DLNA媒体服务器",
"DontAddRetrackers": "不加retrackers",
"DownloadRateLimit": "下载速度限制",
"EnableDebug": "启用调试服务器日志",
"EnableIPv6Hint": "仅在ISP支持时启用",
"ForceEncrypt": "强制加密标头",
"ForceEncryptHint": "可以防止运营商阻止种子",
"FriendlyName": "DLNA服务器名称",
"FriendlyNameHint": "留空使用默认值",
"EnableRutorSearch": "打开RuTor种子搜索",
"EnableRutorSearchHint": "您可以通过RuTor搜索种子即使RuTor不可用。注意数据库占用大约500 MB的存储。",
"PeersListenPort": "Peers监听端口",
"PeersListenPortHint": "1024 - 655350 - 自动",
"PreloadCache": "播放前预加载缓存",
"ProMode": "专业模式",
"RAM": "内存",
"ReaderReadAHead": "预读缓存 (5-100%, rec. 95%)",
"RemoveCacheOnDrop": "删除已停用种子在磁盘上的缓存",
"RemoveCacheOnDropDesc": "如果禁用,缓存会在删除种子时移除。",
"RemoveRetrackers": "删除retrackers",
"ReplaceRetrackers": "替换retrackers",
"RetrackersMode": "Retrackers模式",
"ResetToDefault": "重置为默认值",
"Settings": "设置",
"TorrentDisconnectTimeout": "种子断开超时",
"TorrentsSavePath": "种子缓存保存路径",
"Upload": "上传",
"UploadHint": "不建议禁用",
"UploadRateLimit": "上传速度限制",
"UseDiskDesc": "最好使用内存或固态存储作为缓存",
"Tabs": {
"Main": "主要",
"Additional": "附加",
"AdditionalDisabled": "(启用专业模式)",
"App": "App"
},
"UseVLC": "提示在VLC中打开视频",
"UseVLCHint": "将VLC播放器按钮添加到种子内容列表"
},
"Size": "大小",
"SpecialThanks": "特别感谢",
"Speed": "速度",
"Support": "支持",
"TB": "TB",
"Tbps": "Tbps",
"ThanksToEveryone": "感谢所有测试和帮助的人。",
"TorrentAdded": "已添加",
"TorrentClosed": "已关闭",
"TorrentContent": "种子内容",
"TorrentDetails": "种子详情",
"TorrentGettingInfo": "获取信息",
"TorrentInDb": "在数据库中",
"TorrentPreload": "预加载",
"TorrentSize": "种子大小",
"TorrentState": "控制",
"TorrentStatus": "种子状态",
"TorrentWorking": "活跃",
"TurnOff": "关闭",
"UploadFile": "上传文件",
"UploadSpeed": "上传速度",
"Viewed": "查看"
}

View File

@@ -11279,9 +11279,9 @@ semver-greatest-satisfied-range@^1.1.0:
sver-compat "^1.5.0" sver-compat "^1.5.0"
"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
version "5.7.1" version "5.7.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
semver@7.3.2: semver@7.3.2:
version "7.3.2" version "7.3.2"
@@ -11289,14 +11289,14 @@ semver@7.3.2:
integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
version "6.3.0" version "6.3.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: semver@^7.2.1, semver@^7.3.2, semver@^7.3.5:
version "7.3.7" version "7.5.4"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
dependencies: dependencies:
lru-cache "^6.0.0" lru-cache "^6.0.0"
@@ -12342,9 +12342,9 @@ toidentifier@1.0.1:
integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
tough-cookie@^4.0.0: tough-cookie@^4.0.0:
version "4.1.2" version "4.1.3"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf"
integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==
dependencies: dependencies:
psl "^1.1.33" psl "^1.1.33"
punycode "^2.1.1" punycode "^2.1.1"
@@ -13092,9 +13092,9 @@ which@^2.0.1, which@^2.0.2:
isexe "^2.0.0" isexe "^2.0.0"
word-wrap@^1.2.3, word-wrap@~1.2.3: word-wrap@^1.2.3, word-wrap@~1.2.3:
version "1.2.3" version "1.2.4"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==
workbox-background-sync@^5.1.4: workbox-background-sync@^5.1.4:
version "5.1.4" version "5.1.4"