mirror of
https://github.com/Ernous/TorrServerJellyfin.git
synced 2025-12-19 21:46:11 +05:00
Merge branch 'master' into old-engine
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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')
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -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 },
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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": "Ничего не делать",
|
||||||
|
|||||||
@@ -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": "Нічого не робити",
|
||||||
|
|||||||
179
web/src/locales/zh/translation.json
Normal file
179
web/src/locales/zh/translation.json
Normal 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 - 65535,0 - 自动",
|
||||||
|
"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": "查看"
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user