mirror of
https://github.com/Ernous/TorrServerJellyfin.git
synced 2025-12-19 13:36:09 +05:00
migrate
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -25,3 +25,4 @@ dist/
|
|||||||
toolchains/
|
toolchains/
|
||||||
/src/crawshaw.io/
|
/src/crawshaw.io/
|
||||||
/src/go.etcd.io/
|
/src/go.etcd.io/
|
||||||
|
/src/google.golang.org/
|
||||||
|
|||||||
@@ -26,15 +26,16 @@ export GOPATH="${PWD}"
|
|||||||
GOBIN="/usr/local/go/bin/go"
|
GOBIN="/usr/local/go/bin/go"
|
||||||
|
|
||||||
[ -d src/github.com/alexflint/go-arg ] && go get -v github.com/alexflint/go-arg
|
[ -d src/github.com/alexflint/go-arg ] && go get -v github.com/alexflint/go-arg
|
||||||
|
|
||||||
[ -d src/github.com/anacrolix/dht ] && go get -v github.com/anacrolix/dht
|
[ -d src/github.com/anacrolix/dht ] && go get -v github.com/anacrolix/dht
|
||||||
[ -d src/github.com/anacrolix/missinggo/httptoo ] && go get -v github.com/anacrolix/missinggo/httptoo
|
[ -d src/github.com/anacrolix/missinggo/httptoo ] && go get -v github.com/anacrolix/missinggo/httptoo
|
||||||
[ -d src/github.com/anacrolix/torrent ] && go get -v github.com/anacrolix/torrent
|
[ -d src/github.com/anacrolix/torrent ] && go get -v github.com/anacrolix/torrent
|
||||||
[ -d src/github.com/anacrolix/torrent/iplist ] && go get -v github.com/anacrolix/torrent/iplist
|
[ -d src/github.com/anacrolix/torrent/iplist ] && go get -v github.com/anacrolix/torrent/iplist
|
||||||
[ -d src/github.com/anacrolix/torrent/metainfo ] && go get -v github.com/anacrolix/torrent/metainfo
|
[ -d src/github.com/anacrolix/torrent/metainfo ] && go get -v github.com/anacrolix/torrent/metainfo
|
||||||
[ -d src/github.com/anacrolix/utp ] && go get -v github.com/anacrolix/utp
|
[ -d src/github.com/anacrolix/utp ] && go get -v github.com/anacrolix/utp
|
||||||
[ -d src/github.com/labstack/echo ] && go get -v github.com/labstack/echo
|
|
||||||
[ -d src/github.com/labstack/echo/middleware ] && go get -v github.com/labstack/echo/middleware
|
[ -d src/github.com/gin-gonic/gin ] && go get -u github.com/gin-gonic/gin
|
||||||
[ -d src/github.com/labstack/gommon/bytes ] && go get -v github.com/labstack/gommon/bytes
|
|
||||||
[ -d src/github.com/pion/webrtc/v2 ] && go get -v github.com/pion/webrtc/v2
|
[ -d src/github.com/pion/webrtc/v2 ] && go get -v github.com/pion/webrtc/v2
|
||||||
[ -d src/go.etcd.io/bbolt ] && go get -v go.etcd.io/bbolt
|
[ -d src/go.etcd.io/bbolt ] && go get -v go.etcd.io/bbolt
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import (
|
|||||||
|
|
||||||
"github.com/alexflint/go-arg"
|
"github.com/alexflint/go-arg"
|
||||||
"server"
|
"server"
|
||||||
"server/settings"
|
|
||||||
"server/version"
|
"server/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -45,12 +44,7 @@ func main() {
|
|||||||
|
|
||||||
Preconfig(params.Kill)
|
Preconfig(params.Kill)
|
||||||
|
|
||||||
server.Start(params.Path, params.Port)
|
server.Start(params.Path, params.Port, params.RDB)
|
||||||
if (params.RDB) {
|
|
||||||
settings.SetRDB()
|
|
||||||
} else {
|
|
||||||
settings.SaveSettings()
|
|
||||||
}
|
|
||||||
fmt.Println(server.WaitServer())
|
fmt.Println(server.WaitServer())
|
||||||
time.Sleep(time.Second * 3)
|
time.Sleep(time.Second * 3)
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
|
|||||||
@@ -9,25 +9,29 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
|
"server"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Preconfig(kill bool) {
|
func Preconfig(kill bool) {
|
||||||
if kill {
|
sigc := make(chan os.Signal, 1)
|
||||||
sigc := make(chan os.Signal, 1)
|
signal.Notify(sigc,
|
||||||
signal.Notify(sigc,
|
syscall.SIGHUP,
|
||||||
syscall.SIGHUP,
|
syscall.SIGINT,
|
||||||
syscall.SIGINT,
|
syscall.SIGSTOP,
|
||||||
syscall.SIGSTOP,
|
syscall.SIGPIPE,
|
||||||
syscall.SIGPIPE,
|
syscall.SIGTERM,
|
||||||
syscall.SIGTERM,
|
syscall.SIGQUIT)
|
||||||
syscall.SIGQUIT)
|
go func() {
|
||||||
go func() {
|
for s := range sigc {
|
||||||
for s := range sigc {
|
if kill {
|
||||||
fmt.Println("Signal catched:", s)
|
fmt.Println("Signal catched:", s)
|
||||||
fmt.Println("For stop server, close in web")
|
fmt.Println("For stop server, close in web")
|
||||||
|
} else {
|
||||||
|
server.Stop()
|
||||||
}
|
}
|
||||||
}()
|
}
|
||||||
}
|
}()
|
||||||
|
|
||||||
//dns resover
|
//dns resover
|
||||||
addrs, err := net.LookupHost("www.themoviedb.org")
|
addrs, err := net.LookupHost("www.themoviedb.org")
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"server/settings"
|
"server/settings"
|
||||||
|
"server/web"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Start(settingsPath, port string, roSets bool) {
|
func Start(settingsPath, port string, roSets bool) {
|
||||||
@@ -9,18 +10,18 @@ func Start(settingsPath, port string, roSets bool) {
|
|||||||
if port == "" {
|
if port == "" {
|
||||||
port = "8090"
|
port = "8090"
|
||||||
}
|
}
|
||||||
//server.Start(port)
|
web.Start(port)
|
||||||
}
|
}
|
||||||
|
|
||||||
func WaitServer() string {
|
func WaitServer() string {
|
||||||
//err := server.Wait()
|
err := web.Wait()
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// return err.Error()
|
return err.Error()
|
||||||
// }
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func Stop() {
|
func Stop() {
|
||||||
// go server.Stop()
|
web.Stop()
|
||||||
settings.CloseDB()
|
settings.CloseDB()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ func (v *BTSets) String() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
BTsets = loadBTSets()
|
BTsets *BTSets
|
||||||
)
|
)
|
||||||
|
|
||||||
func SetBTSets(sets *BTSets) {
|
func SetBTSets(sets *BTSets) {
|
||||||
@@ -54,12 +54,12 @@ func SetBTSets(sets *BTSets) {
|
|||||||
tdb.Set("Settings", "BitTorr", buf)
|
tdb.Set("Settings", "BitTorr", buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadBTSets() *BTSets {
|
func loadBTSets() {
|
||||||
buf := tdb.Get("Settings", "BitTorr")
|
buf := tdb.Get("Settings", "BitTorr")
|
||||||
if len(buf) > 0 {
|
if len(buf) > 0 {
|
||||||
err := json.Unmarshal(buf, &BTsets)
|
err := json.Unmarshal(buf, &BTsets)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return BTsets
|
return
|
||||||
}
|
}
|
||||||
log.TLogln("Error unmarshal btsets", err)
|
log.TLogln("Error unmarshal btsets", err)
|
||||||
}
|
}
|
||||||
@@ -73,5 +73,5 @@ func loadBTSets() *BTSets {
|
|||||||
sets.DhtConnectionLimit = 500
|
sets.DhtConnectionLimit = 500
|
||||||
sets.RetrackersMode = 1
|
sets.RetrackersMode = 1
|
||||||
sets.TorrentDisconnectTimeout = 30
|
sets.TorrentDisconnectTimeout = 30
|
||||||
return sets
|
BTsets = sets
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
package reader
|
package torr
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anacrolix/torrent"
|
|
||||||
"server/torr"
|
|
||||||
|
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
|
"github.com/anacrolix/torrent"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Reader struct {
|
type Reader struct {
|
||||||
@@ -14,7 +13,7 @@ type Reader struct {
|
|||||||
file *torrent.File
|
file *torrent.File
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewReader(torr *torr.Torrent, file *torrent.File, readahead int64) *Reader {
|
func NewReader(torr *Torrent, file *torrent.File, readahead int64) *Reader {
|
||||||
r := new(Reader)
|
r := new(Reader)
|
||||||
r.file = file
|
r.file = file
|
||||||
r.Reader = file.NewReader()
|
r.Reader = file.NewReader()
|
||||||
@@ -5,8 +5,8 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/anacrolix/torrent"
|
||||||
"server/settings"
|
"server/settings"
|
||||||
"server/torr/reader"
|
|
||||||
"server/torr/utils"
|
"server/torr/utils"
|
||||||
|
|
||||||
"github.com/anacrolix/torrent/metainfo"
|
"github.com/anacrolix/torrent/metainfo"
|
||||||
@@ -36,7 +36,7 @@ type Cache struct {
|
|||||||
|
|
||||||
prcLoaded int
|
prcLoaded int
|
||||||
|
|
||||||
readers map[*reader.Reader]struct{}
|
readers map[torrent.Reader]struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCache(capacity int64, storage *Storage) *Cache {
|
func NewCache(capacity int64, storage *Storage) *Cache {
|
||||||
@@ -45,7 +45,7 @@ func NewCache(capacity int64, storage *Storage) *Cache {
|
|||||||
filled: 0,
|
filled: 0,
|
||||||
pieces: make(map[int]*Piece),
|
pieces: make(map[int]*Piece),
|
||||||
s: storage,
|
s: storage,
|
||||||
readers: make(map[*reader.Reader]struct{}),
|
readers: make(map[torrent.Reader]struct{}),
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
@@ -173,13 +173,13 @@ func prc(val, of int) int {
|
|||||||
return int(float64(val) * 100.0 / float64(of))
|
return int(float64(val) * 100.0 / float64(of))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cache) AddReader(r *reader.Reader) {
|
func (c *Cache) AddReader(r torrent.Reader) {
|
||||||
c.muReader.Lock()
|
c.muReader.Lock()
|
||||||
defer c.muReader.Unlock()
|
defer c.muReader.Unlock()
|
||||||
c.readers[r] = struct{}{}
|
c.readers[r] = struct{}{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cache) RemReader(r *reader.Reader) {
|
func (c *Cache) RemReader(r torrent.Reader) {
|
||||||
c.muReader.Lock()
|
c.muReader.Lock()
|
||||||
defer c.muReader.Unlock()
|
defer c.muReader.Unlock()
|
||||||
delete(c.readers, r)
|
delete(c.readers, r)
|
||||||
|
|||||||
@@ -10,12 +10,10 @@ import (
|
|||||||
"server/torr/utils"
|
"server/torr/utils"
|
||||||
utils2 "server/utils"
|
utils2 "server/utils"
|
||||||
|
|
||||||
"server/torr/reader"
|
|
||||||
"server/torr/storage/torrstor"
|
"server/torr/storage/torrstor"
|
||||||
|
|
||||||
"github.com/anacrolix/torrent"
|
"github.com/anacrolix/torrent"
|
||||||
"github.com/anacrolix/torrent/metainfo"
|
"github.com/anacrolix/torrent/metainfo"
|
||||||
"github.com/labstack/gommon/bytes"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type TorrentStatus int
|
type TorrentStatus int
|
||||||
@@ -227,15 +225,15 @@ func (t *Torrent) Length() int64 {
|
|||||||
return t.Torrent.Length()
|
return t.Torrent.Length()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Torrent) NewReader(file *torrent.File, readahead int64) *reader.Reader {
|
func (t *Torrent) NewReader(file *torrent.File, readahead int64) *Reader {
|
||||||
if t.status == TorrentClosed {
|
if t.status == TorrentClosed {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
reader := reader.NewReader(t, file, readahead)
|
reader := NewReader(t, file, readahead)
|
||||||
return reader
|
return reader
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Torrent) CloseReader(reader *reader.Reader) {
|
func (t *Torrent) CloseReader(reader *Reader) {
|
||||||
reader.Close()
|
reader.Close()
|
||||||
t.cache.RemReader(reader)
|
t.cache.RemReader(reader)
|
||||||
t.expiredTime = time.Now().Add(time.Second * time.Duration(settings.BTsets.TorrentDisconnectTimeout))
|
t.expiredTime = time.Now().Add(time.Second * time.Duration(settings.BTsets.TorrentDisconnectTimeout))
|
||||||
@@ -317,7 +315,7 @@ func (t *Torrent) Preload(file *torrent.File, size int64) {
|
|||||||
for t.status == TorrentPreload {
|
for t.status == TorrentPreload {
|
||||||
t.expiredTime = time.Now().Add(time.Minute * 5)
|
t.expiredTime = time.Now().Add(time.Minute * 5)
|
||||||
t.PreloadedBytes = t.Torrent.BytesCompleted()
|
t.PreloadedBytes = t.Torrent.BytesCompleted()
|
||||||
log.Println("Preload:", file.Torrent().InfoHash().HexString(), bytes.Format(t.PreloadedBytes), "/", bytes.Format(t.PreloadSize), "Speed:", utils2.Format(t.DownloadSpeed), "Peers:[", t.Torrent.Stats().ConnectedSeeders, "]", t.Torrent.Stats().ActivePeers, "/", t.Torrent.Stats().TotalPeers)
|
log.Println("Preload:", file.Torrent().InfoHash().HexString(), utils2.Format(float64(t.PreloadedBytes)), "/", utils2.Format(float64(t.PreloadSize)), "Speed:", utils2.Format(t.DownloadSpeed), "Peers:[", t.Torrent.Stats().ConnectedSeeders, "]", t.Torrent.Stats().ActivePeers, "/", t.Torrent.Stats().TotalPeers)
|
||||||
if t.PreloadedBytes >= t.PreloadSize {
|
if t.PreloadedBytes >= t.PreloadSize {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,20 +2,9 @@ package utils
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func CleanFName(file string) string {
|
|
||||||
re := regexp.MustCompile(`[ !*'();:@&=+$,/?#\[\]~"{}]`)
|
|
||||||
ret := re.ReplaceAllString(file, `_`)
|
|
||||||
ret = strings.Replace(ret, "__", "_", -1)
|
|
||||||
ret = strings.Replace(ret, "._", "_", -1)
|
|
||||||
ret = strings.Replace(ret, "_.", ".", -1)
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
_ = 1.0 << (10 * iota) // ignore first value by assigning to blank identifier
|
_ = 1.0 << (10 * iota) // ignore first value by assigning to blank identifier
|
||||||
KB
|
KB
|
||||||
|
|||||||
36
src/server/web/server.go
Normal file
36
src/server/web/server.go
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
package web
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"server/torr"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
BTS = torr.NewBTS()
|
||||||
|
waitChan = make(chan error)
|
||||||
|
)
|
||||||
|
|
||||||
|
func Start(port string) {
|
||||||
|
|
||||||
|
BTS.Connect()
|
||||||
|
|
||||||
|
route := gin.New()
|
||||||
|
route.Use(gin.Logger(), gin.Recovery())
|
||||||
|
|
||||||
|
route.GET("/ping", func(c *gin.Context) {
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"message": "pong",
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
waitChan <- route.Run(":" + port)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Wait() error {
|
||||||
|
return <-waitChan
|
||||||
|
}
|
||||||
|
|
||||||
|
func Stop() {
|
||||||
|
BTS.Disconnect()
|
||||||
|
waitChan <- nil
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user