This commit is contained in:
yourok
2018-08-29 12:33:14 +03:00
commit 0ca43a2c4d
54 changed files with 5669 additions and 0 deletions

View 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
}

View 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
}

View 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
}

View 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
}

View 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]
}