Files
seanime-docker/seanime-2.9.10/internal/torrents/seadex/seadex.go
2025-09-20 14:08:38 +01:00

110 lines
2.4 KiB
Go

package seadex
import (
"fmt"
"net/http"
"seanime/internal/extension"
"seanime/internal/util"
"strings"
"github.com/goccy/go-json"
"github.com/rs/zerolog"
)
type (
SeaDex struct {
logger *zerolog.Logger
uri string
}
Torrent struct {
Name string `json:"name"`
Date string `json:"date"`
Size int64 `json:"size"`
Link string `json:"link"`
InfoHash string `json:"infoHash"`
ReleaseGroup string `json:"releaseGroup,omitempty"`
}
)
func New(logger *zerolog.Logger) *SeaDex {
return &SeaDex{
logger: logger,
uri: util.Decode("aHR0cHM6Ly9yZWxlYXNlcy5tb2UvYXBpL2NvbGxlY3Rpb25zL2VudHJpZXMvcmVjb3Jkcw=="),
}
}
func (s *SeaDex) SetSavedUserConfig(savedConfig *extension.SavedUserConfig) {
url, _ := savedConfig.Values["apiUrl"]
if url != "" {
s.uri = url
}
}
func (s *SeaDex) FetchTorrents(mediaId int, title string) (ret []*Torrent, err error) {
ret = make([]*Torrent, 0)
records, err := s.fetchRecords(mediaId)
if err != nil {
return nil, err
}
if len(records) == 0 {
return ret, nil
}
if len(records[0].Expand.Trs) == 0 {
return ret, nil
}
for _, tr := range records[0].Expand.Trs {
if tr.InfoHash == "" || tr.InfoHash == "<redacted>" || tr.Tracker != "Nyaa" || !strings.Contains(tr.URL, "nyaa.si") {
continue
}
ret = append(ret, &Torrent{
Name: fmt.Sprintf("[%s] %s%s", tr.ReleaseGroup, title, map[bool]string{true: " [Dual-Audio]", false: ""}[tr.DualAudio]),
Date: tr.Created,
Size: int64(s.getTorrentSize(tr.Files)),
Link: tr.URL,
InfoHash: tr.InfoHash,
ReleaseGroup: tr.ReleaseGroup,
})
}
return ret, nil
}
func (s *SeaDex) fetchRecords(mediaId int) (ret []*RecordItem, err error) {
uri := fmt.Sprintf("%s?page=1&perPage=1&filter=alID%%3D%%22%d%%22&skipTotal=1&expand=trs", s.uri, mediaId)
resp, err := http.Get(uri)
if err != nil {
s.logger.Error().Err(err).Msgf("seadex: error getting media records: %v", mediaId)
return nil, err
}
defer resp.Body.Close()
var res RecordsResponse
if err = json.NewDecoder(resp.Body).Decode(&res); err != nil {
s.logger.Error().Err(err).Msgf("seadex: error decoding response: %v", mediaId)
return nil, err
}
return res.Items, nil
}
func (s *SeaDex) getTorrentSize(fls []*TrFile) int {
if fls == nil || len(fls) == 0 {
return 0
}
var size int
for _, f := range fls {
size += f.Length
}
return size
}