mirror of
https://github.com/Ernous/TorrServerJellyfin.git
synced 2025-12-19 21:46:11 +05:00
initial
This commit is contained in:
42
src/server/web/helpers/Buffer.go
Normal file
42
src/server/web/helpers/Buffer.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package helpers
|
||||
|
||||
import "bytes"
|
||||
|
||||
type SeekingBuffer struct {
|
||||
str string
|
||||
buffer *bytes.Buffer
|
||||
offset int64
|
||||
size int64
|
||||
}
|
||||
|
||||
func NewSeekingBuffer(str string) *SeekingBuffer {
|
||||
return &SeekingBuffer{
|
||||
str: str,
|
||||
buffer: bytes.NewBufferString(str),
|
||||
offset: 0,
|
||||
}
|
||||
}
|
||||
|
||||
func (fb *SeekingBuffer) Read(p []byte) (n int, err error) {
|
||||
n, err = fb.buffer.Read(p)
|
||||
fb.offset += int64(n)
|
||||
return n, err
|
||||
}
|
||||
|
||||
func (fb *SeekingBuffer) Seek(offset int64, whence int) (ret int64, err error) {
|
||||
var newoffset int64
|
||||
switch whence {
|
||||
case 0:
|
||||
newoffset = offset
|
||||
case 1:
|
||||
newoffset = fb.offset + offset
|
||||
case 2:
|
||||
newoffset = int64(len(fb.str)) - offset
|
||||
}
|
||||
if newoffset == fb.offset {
|
||||
return newoffset, nil
|
||||
}
|
||||
fb.buffer = bytes.NewBufferString(fb.str[newoffset:])
|
||||
fb.offset = newoffset
|
||||
return fb.offset, nil
|
||||
}
|
||||
33
src/server/web/helpers/M3u.go
Normal file
33
src/server/web/helpers/M3u.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package helpers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/url"
|
||||
|
||||
"server/settings"
|
||||
"server/torr"
|
||||
"server/utils"
|
||||
)
|
||||
|
||||
func MakeM3ULists(torrents []*settings.Torrent, host string) string {
|
||||
m3u := "#EXTM3U\n"
|
||||
|
||||
for _, t := range torrents {
|
||||
m3u += "#EXTINF:0," + t.Name + "\n"
|
||||
m3u += host + "/torrent/play?link=" + url.QueryEscape(t.Magnet) + "&m3u=true&fname=" + utils.CleanFName(t.Name+".m3u") + "\n\n"
|
||||
}
|
||||
return m3u
|
||||
}
|
||||
|
||||
func MakeM3UPlayList(tor torr.TorrentStats, magnet string, host string) string {
|
||||
m3u := "#EXTM3U\n"
|
||||
|
||||
for _, f := range tor.FileStats {
|
||||
if GetMimeType(f.Path) != "*/*" {
|
||||
m3u += "#EXTINF:-1," + f.Path + "\n"
|
||||
mag := url.QueryEscape(magnet)
|
||||
m3u += host + "/torrent/play?link=" + mag + "&file=" + fmt.Sprint(f.Id) + "\n\n"
|
||||
}
|
||||
}
|
||||
return m3u
|
||||
}
|
||||
86
src/server/web/helpers/Magnet.go
Normal file
86
src/server/web/helpers/Magnet.go
Normal file
@@ -0,0 +1,86 @@
|
||||
package helpers
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/anacrolix/torrent/metainfo"
|
||||
)
|
||||
|
||||
func GetMagnet(link string) (*metainfo.Magnet, error) {
|
||||
url, err := url.Parse(link)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var mag *metainfo.Magnet
|
||||
switch strings.ToLower(url.Scheme) {
|
||||
case "magnet":
|
||||
mag, err = getMag(url.String())
|
||||
case "http", "https":
|
||||
mag, err = getMagFromHttp(url.String())
|
||||
case "":
|
||||
mag, err = getMag("magnet:?xt=urn:btih:" + url.Path)
|
||||
default:
|
||||
mag, err = getMagFromFile(url.Path)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return mag, nil
|
||||
}
|
||||
|
||||
func getMag(link string) (*metainfo.Magnet, error) {
|
||||
mag, err := metainfo.ParseMagnetURI(link)
|
||||
return &mag, err
|
||||
}
|
||||
|
||||
func getMagFromHttp(url string) (*metainfo.Magnet, error) {
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
client := new(http.Client)
|
||||
client.Timeout = time.Duration(time.Second * 30)
|
||||
req.Header.Set("User-Agent", "DWL/1.1.1 (Torrent)")
|
||||
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if resp.StatusCode != 200 {
|
||||
return nil, errors.New(resp.Status)
|
||||
}
|
||||
|
||||
minfo, err := metainfo.Load(resp.Body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
info, err := minfo.UnmarshalInfo()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mag := minfo.Magnet(info.Name, minfo.HashInfoBytes())
|
||||
return &mag, nil
|
||||
}
|
||||
|
||||
func getMagFromFile(path string) (*metainfo.Magnet, error) {
|
||||
|
||||
minfo, err := metainfo.LoadFromFile(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
info, err := minfo.UnmarshalInfo()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
mag := minfo.Magnet(info.Name, minfo.HashInfoBytes())
|
||||
return &mag, nil
|
||||
}
|
||||
89
src/server/web/helpers/Mime.go
Normal file
89
src/server/web/helpers/Mime.go
Normal file
@@ -0,0 +1,89 @@
|
||||
package helpers
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
|
||||
"server/torr"
|
||||
)
|
||||
|
||||
var extVideo = map[string]interface{}{
|
||||
".3g2": nil,
|
||||
".3gp": nil,
|
||||
".aaf": nil,
|
||||
".asf": nil,
|
||||
".avchd": nil,
|
||||
".avi": nil,
|
||||
".drc": nil,
|
||||
".flv": nil,
|
||||
".m2ts": nil,
|
||||
".ts": nil,
|
||||
".m2v": nil,
|
||||
".m4p": nil,
|
||||
".m4v": nil,
|
||||
".mkv": nil,
|
||||
".mng": nil,
|
||||
".mov": nil,
|
||||
".mp2": nil,
|
||||
".mp4": nil,
|
||||
".mpe": nil,
|
||||
".mpeg": nil,
|
||||
".mpg": nil,
|
||||
".mpv": nil,
|
||||
".mxf": nil,
|
||||
".nsv": nil,
|
||||
".ogg": nil,
|
||||
".ogv": nil,
|
||||
".qt": nil,
|
||||
".rm": nil,
|
||||
".rmvb": nil,
|
||||
".roq": nil,
|
||||
".svi": nil,
|
||||
".vob": nil,
|
||||
".webm": nil,
|
||||
".wmv": nil,
|
||||
".yuv": nil,
|
||||
}
|
||||
|
||||
var extAudio = map[string]interface{}{
|
||||
".aac": nil,
|
||||
".aiff": nil,
|
||||
".ape": nil,
|
||||
".au": nil,
|
||||
".flac": nil,
|
||||
".gsm": nil,
|
||||
".it": nil,
|
||||
".m3u": nil,
|
||||
".m4a": nil,
|
||||
".mid": nil,
|
||||
".mod": nil,
|
||||
".mp3": nil,
|
||||
".mpa": nil,
|
||||
".pls": nil,
|
||||
".ra": nil,
|
||||
".s3m": nil,
|
||||
".sid": nil,
|
||||
".wav": nil,
|
||||
".wma": nil,
|
||||
".xm": nil,
|
||||
}
|
||||
|
||||
func GetMimeType(filename string) string {
|
||||
ext := filepath.Ext(filename)
|
||||
if _, ok := extVideo[ext]; ok {
|
||||
return "video/*"
|
||||
}
|
||||
if _, ok := extAudio[ext]; ok {
|
||||
return "audio/*"
|
||||
}
|
||||
return "*/*"
|
||||
}
|
||||
|
||||
func GetPlayableFiles(st torr.TorrentStats) []torr.TorrentFileStat {
|
||||
files := make([]torr.TorrentFileStat, 0)
|
||||
for _, f := range st.FileStats {
|
||||
if GetMimeType(f.Path) != "*/*" {
|
||||
files = append(files, f)
|
||||
}
|
||||
}
|
||||
return files
|
||||
}
|
||||
66
src/server/web/helpers/Torrent.go
Normal file
66
src/server/web/helpers/Torrent.go
Normal file
@@ -0,0 +1,66 @@
|
||||
package helpers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"server/settings"
|
||||
"server/torr"
|
||||
"server/utils"
|
||||
|
||||
"github.com/anacrolix/torrent"
|
||||
"github.com/anacrolix/torrent/metainfo"
|
||||
)
|
||||
|
||||
func Add(bts *torr.BTServer, magnet metainfo.Magnet, save bool) error {
|
||||
fmt.Println("Adding torrent", magnet.String())
|
||||
_, err := bts.AddTorrent(magnet, func(torr *torr.Torrent) {
|
||||
torDb := new(settings.Torrent)
|
||||
torDb.Name = torr.Name()
|
||||
torDb.Hash = torr.Hash().HexString()
|
||||
torDb.Size = torr.Length()
|
||||
torDb.Magnet = magnet.String()
|
||||
torDb.Timestamp = time.Now().Unix()
|
||||
files := torr.Files()
|
||||
sort.Slice(files, func(i, j int) bool {
|
||||
return files[i].Path() < files[j].Path()
|
||||
})
|
||||
for _, f := range files {
|
||||
ff := settings.File{
|
||||
f.Path(),
|
||||
f.Length(),
|
||||
false,
|
||||
}
|
||||
torDb.Files = append(torDb.Files, ff)
|
||||
}
|
||||
|
||||
if save {
|
||||
err := settings.SaveTorrentDB(torDb)
|
||||
if err != nil {
|
||||
fmt.Println("Error add torrent to db:", err)
|
||||
}
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func FindFileLink(fileLink string, torr *torrent.Torrent) *torrent.File {
|
||||
for _, f := range torr.Files() {
|
||||
if utils.CleanFName(f.Path()) == fileLink {
|
||||
return f
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func FindFile(fileInd int, tor *torr.Torrent) *torrent.File {
|
||||
files := tor.Files()
|
||||
if len(files) == 0 || fileInd < 0 || fileInd >= len(files) {
|
||||
return nil
|
||||
}
|
||||
return files[fileInd]
|
||||
}
|
||||
Reference in New Issue
Block a user