node build fixed
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
package transmission
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"runtime"
|
||||
"seanime/internal/util"
|
||||
"time"
|
||||
)
|
||||
|
||||
func (c *Transmission) getExecutableName() string {
|
||||
switch runtime.GOOS {
|
||||
case "windows":
|
||||
return "transmission-qt.exe"
|
||||
default:
|
||||
return "transmission-qt"
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Transmission) getExecutablePath() string {
|
||||
|
||||
if len(c.Path) > 0 {
|
||||
return c.Path
|
||||
}
|
||||
|
||||
switch runtime.GOOS {
|
||||
case "windows":
|
||||
return "C:/Program Files/Transmission/transmission-qt.exe"
|
||||
case "linux":
|
||||
return "/usr/bin/transmission-qt" // Default path for Transmission on most Linux distributions
|
||||
case "darwin":
|
||||
return "/Applications/Transmission.app/Contents/MacOS/transmission-qt"
|
||||
// Default path for Transmission on macOS
|
||||
default:
|
||||
return "C:/Program Files/Transmission/transmission-qt.exe"
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Transmission) Start() error {
|
||||
|
||||
// If the path is empty, do not check if Transmission is running
|
||||
if c.Path == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
name := c.getExecutableName()
|
||||
if util.ProgramIsRunning(name) {
|
||||
return nil
|
||||
}
|
||||
|
||||
exe := c.getExecutablePath()
|
||||
cmd := util.NewCmd(exe)
|
||||
err := cmd.Start()
|
||||
if err != nil {
|
||||
return errors.New("failed to start Transmission")
|
||||
}
|
||||
|
||||
time.Sleep(1 * time.Second)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Transmission) CheckStart() bool {
|
||||
if c == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
// If the path is empty, assume it's running
|
||||
if c.Path == "" {
|
||||
return true
|
||||
}
|
||||
|
||||
_, _, _, err := c.Client.RPCVersion(context.Background())
|
||||
if err == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
err = c.Start()
|
||||
timeout := time.After(30 * time.Second)
|
||||
ticker := time.Tick(1 * time.Second)
|
||||
for {
|
||||
select {
|
||||
case <-ticker:
|
||||
_, _, _, err := c.Client.RPCVersion(context.Background())
|
||||
if err == nil {
|
||||
return true
|
||||
}
|
||||
case <-timeout:
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package transmission
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/hekmon/transmissionrpc/v3"
|
||||
"github.com/rs/zerolog"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type (
|
||||
Transmission struct {
|
||||
Client *transmissionrpc.Client
|
||||
Path string
|
||||
Logger *zerolog.Logger
|
||||
}
|
||||
|
||||
NewTransmissionOptions struct {
|
||||
Path string
|
||||
Logger *zerolog.Logger
|
||||
Username string
|
||||
Password string
|
||||
Host string // Default: 127.0.0.1
|
||||
Port int
|
||||
}
|
||||
)
|
||||
|
||||
func New(options *NewTransmissionOptions) (*Transmission, error) {
|
||||
// Set default host
|
||||
if options.Host == "" {
|
||||
options.Host = "127.0.0.1"
|
||||
}
|
||||
|
||||
baseUrl := fmt.Sprintf("http://%s:%s@%s:%d/transmission/rpc",
|
||||
options.Username,
|
||||
url.QueryEscape(options.Password),
|
||||
options.Host,
|
||||
options.Port,
|
||||
)
|
||||
|
||||
if strings.HasPrefix(options.Host, "https://") {
|
||||
options.Host = strings.TrimPrefix(options.Host, "https://")
|
||||
baseUrl = fmt.Sprintf("https://%s:%s@%s:%d/transmission/rpc",
|
||||
options.Username,
|
||||
url.QueryEscape(options.Password),
|
||||
options.Host,
|
||||
options.Port,
|
||||
)
|
||||
}
|
||||
|
||||
_url, err := url.Parse(baseUrl)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
client, _ := transmissionrpc.New(_url, nil)
|
||||
return &Transmission{
|
||||
Client: client,
|
||||
Path: options.Path,
|
||||
Logger: options.Logger,
|
||||
}, nil
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
package transmission
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/davecgh/go-spew/spew"
|
||||
"github.com/hekmon/transmissionrpc/v3"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"seanime/internal/test_utils"
|
||||
"seanime/internal/util"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
//func TestGetActiveTorrents(t *testing.T) {
|
||||
// t.Skip("Provide magnets")
|
||||
// test_utils.InitTestProvider(t, test_utils.TorrentClient())
|
||||
//
|
||||
// trans, err := New(&NewTransmissionOptions{
|
||||
// Host: test_utils.ConfigData.Provider.TransmissionHost,
|
||||
// Path: test_utils.ConfigData.Provider.TransmissionPath,
|
||||
// Port: test_utils.ConfigData.Provider.TransmissionPort,
|
||||
// Username: test_utils.ConfigData.Provider.TransmissionUsername,
|
||||
// Password: test_utils.ConfigData.Provider.TransmissionPassword,
|
||||
// Logger: util.NewLogger(),
|
||||
// })
|
||||
// if err != nil {
|
||||
// t.Fatal(err)
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
||||
func TestGetFiles(t *testing.T) {
|
||||
t.Skip("Provide magnets")
|
||||
test_utils.InitTestProvider(t, test_utils.TorrentClient())
|
||||
|
||||
tempDir := t.TempDir()
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
url string
|
||||
magnet string
|
||||
mediaId int
|
||||
expectedNbFiles int
|
||||
}{
|
||||
{
|
||||
name: "[EMBER] Demon Slayer (2023) (Season 3)",
|
||||
url: "https://animetosho.org/view/ember-demon-slayer-2023-season-3-bdrip-1080p.n1778316",
|
||||
magnet: "",
|
||||
mediaId: 145139,
|
||||
expectedNbFiles: 11,
|
||||
},
|
||||
{
|
||||
name: "[Tenrai-Sensei] Kakegurui (Season 1-2 + OVAs)",
|
||||
url: "https://nyaa.si/view/1553978",
|
||||
magnet: "",
|
||||
mediaId: 98314,
|
||||
expectedNbFiles: 27,
|
||||
},
|
||||
}
|
||||
|
||||
trans, err := New(&NewTransmissionOptions{
|
||||
Host: test_utils.ConfigData.Provider.TransmissionHost,
|
||||
Path: test_utils.ConfigData.Provider.TransmissionPath,
|
||||
Port: test_utils.ConfigData.Provider.TransmissionPort,
|
||||
Username: test_utils.ConfigData.Provider.TransmissionUsername,
|
||||
Password: test_utils.ConfigData.Provider.TransmissionPassword,
|
||||
Logger: util.NewLogger(),
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
|
||||
to, err := trans.Client.TorrentAdd(context.Background(), transmissionrpc.TorrentAddPayload{
|
||||
Filename: &tt.magnet,
|
||||
DownloadDir: &tempDir,
|
||||
})
|
||||
|
||||
if assert.NoError(t, err) {
|
||||
|
||||
time.Sleep(20 * time.Second)
|
||||
|
||||
// Get files
|
||||
torrents, err := trans.Client.TorrentGetAllFor(context.Background(), []int64{*to.ID})
|
||||
to = torrents[0]
|
||||
|
||||
spew.Dump(to.Files)
|
||||
|
||||
// Remove torrent
|
||||
err = trans.Client.TorrentRemove(context.Background(), transmissionrpc.TorrentRemovePayload{
|
||||
IDs: []int64{*to.ID},
|
||||
DeleteLocalData: true,
|
||||
})
|
||||
|
||||
assert.NoError(t, err)
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user