mirror of
https://github.com/simon-ding/polaris.git
synced 2026-02-25 21:20:53 +08:00
102 lines
2.6 KiB
Go
102 lines
2.6 KiB
Go
package server
|
|
|
|
import (
|
|
"fmt"
|
|
"polaris/db"
|
|
"polaris/log"
|
|
"polaris/pkg/torznab"
|
|
"polaris/pkg/transmission"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
func (s *Server) searchTvWithTorznab(name string, season, episode int) []torznab.Result {
|
|
q := fmt.Sprintf("%s S%02dE%02d", name, season, episode)
|
|
|
|
var res []torznab.Result
|
|
allTorznab := s.db.GetAllTorznabInfo()
|
|
for name, setting := range allTorznab {
|
|
resp, err := torznab.Search(setting.URL, setting.ApiKey, q)
|
|
if err != nil {
|
|
log.Errorf("search %s error: %v", name, err)
|
|
continue
|
|
}
|
|
res = append(res, resp...)
|
|
}
|
|
return res
|
|
}
|
|
|
|
type addTorznabIn struct {
|
|
Name string `json:"name"`
|
|
URL string `json:"url"`
|
|
ApiKey string `json:"api_key"`
|
|
}
|
|
|
|
func (s *Server) AddTorznabInfo(c *gin.Context) (interface{}, error) {
|
|
var in addTorznabIn
|
|
if err := c.ShouldBindJSON(&in); err != nil {
|
|
return nil, errors.Wrap(err, "bind json")
|
|
}
|
|
err := s.db.SaveTorznabInfo(in.Name, db.TorznabSetting{
|
|
URL: in.URL,
|
|
ApiKey: in.ApiKey,
|
|
})
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "add ")
|
|
}
|
|
return nil, nil
|
|
}
|
|
|
|
type searchAndDownloadIn struct {
|
|
Title string `json:"title"`
|
|
Season int `json:"season"`
|
|
Episode int `json:"episode"`
|
|
}
|
|
|
|
func (s *Server) SearchAndDownload(c *gin.Context) (interface{}, error) {
|
|
var in searchAndDownloadIn
|
|
if err := c.ShouldBindJSON(&in); err != nil {
|
|
return nil, errors.Wrap(err, "bind json")
|
|
}
|
|
tr := s.db.GetTransmission()
|
|
trc, err := transmission.NewClient(tr.URL, tr.User, tr.Password)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "connect transmission")
|
|
}
|
|
|
|
res := s.searchTvWithTorznab(in.Title, in.Season, in.Episode)
|
|
r1 := res[0]
|
|
log.Infof("found resource to download: %v", r1)
|
|
torrent, err := trc.Download(r1.Magnet)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "downloading")
|
|
}
|
|
s.tasks[r1.Name] = torrent
|
|
// t, err := downloader.DownloadByMagnet(r1.Magnet, "~")
|
|
// if err != nil {
|
|
// return nil, errors.Wrap(err, "download torrent")
|
|
// }
|
|
log.Errorf("success add %s to download task", r1.Name)
|
|
return nil, nil
|
|
}
|
|
|
|
type downloadClientIn struct {
|
|
Name string `json:"name"`
|
|
URL string `json:"url"`
|
|
User string `json:"user"`
|
|
Password string `json:"password"`
|
|
Implementation string `json:"implementation"`
|
|
}
|
|
|
|
func (s *Server) AddDownloadClient(c *gin.Context) (interface{}, error) {
|
|
var in downloadClientIn
|
|
if err := c.ShouldBindJSON(&in); err != nil {
|
|
return nil, errors.Wrap(err, "bind json")
|
|
}
|
|
if err := s.db.SaveTransmission(in.Name, in.URL, in.User, in.Password); err != nil {
|
|
return nil, errors.Wrap(err, "save transmission")
|
|
}
|
|
return nil, nil
|
|
}
|