mirror of
https://github.com/idanoo/autobrr
synced 2025-07-23 08:49:13 +00:00
feat(macros): add IndexerName
(#1511)
* feat(macros): add IndexerName * fix: tests * fix: tests
This commit is contained in:
parent
c43e2c76d6
commit
3c3b47fa10
37 changed files with 310 additions and 235 deletions
|
@ -36,7 +36,7 @@ type FeedRepo interface {
|
|||
type Feed struct {
|
||||
ID int `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Indexer string `json:"indexer"`
|
||||
Indexer IndexerMinimal `json:"indexer"`
|
||||
Type string `json:"type"`
|
||||
Enabled bool `json:"enabled"`
|
||||
URL string `json:"url"`
|
||||
|
@ -50,7 +50,6 @@ type Feed struct {
|
|||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
IndexerID int `json:"indexer_id,omitempty"`
|
||||
Indexerr FeedIndexer `json:"-"`
|
||||
LastRun time.Time `json:"last_run"`
|
||||
LastRunData string `json:"last_run_data"`
|
||||
NextRun time.Time `json:"next_run"`
|
||||
|
|
|
@ -35,6 +35,12 @@ type Indexer struct {
|
|||
Settings map[string]string `json:"settings,omitempty"`
|
||||
}
|
||||
|
||||
type IndexerMinimal struct {
|
||||
ID int `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Identifier string `json:"identifier"`
|
||||
}
|
||||
|
||||
type IndexerDefinition struct {
|
||||
ID int `json:"id,omitempty"`
|
||||
Name string `json:"name"`
|
||||
|
|
|
@ -254,7 +254,7 @@ func TestIRCParserGazelleGames_Parse(t *testing.T) {
|
|||
{
|
||||
name: "",
|
||||
args: args{
|
||||
rls: NewRelease("ggn"),
|
||||
rls: NewRelease(IndexerMinimal{0, "GazelleGames", "ggn"}),
|
||||
vars: map[string]string{
|
||||
"torrentName": "Trouble.in.Paradise-GROUP in Trouble in Paradise",
|
||||
},
|
||||
|
@ -267,7 +267,7 @@ func TestIRCParserGazelleGames_Parse(t *testing.T) {
|
|||
{
|
||||
name: "",
|
||||
args: args{
|
||||
rls: NewRelease("ggn"),
|
||||
rls: NewRelease(IndexerMinimal{0, "GazelleGames", "ggn"}),
|
||||
vars: map[string]string{
|
||||
"torrentName": "F.I.L.F. Game Walkthrough v.0.18 in F.I.L.F.",
|
||||
},
|
||||
|
@ -280,7 +280,7 @@ func TestIRCParserGazelleGames_Parse(t *testing.T) {
|
|||
{
|
||||
name: "",
|
||||
args: args{
|
||||
rls: NewRelease("ggn"),
|
||||
rls: NewRelease(IndexerMinimal{0, "GazelleGames", "ggn"}),
|
||||
vars: map[string]string{
|
||||
"torrentName": "Ni no Kuni: Dominion of the Dark Djinn in Ni no Kuni: Dominion of the Dark Djinn",
|
||||
},
|
||||
|
@ -293,7 +293,7 @@ func TestIRCParserGazelleGames_Parse(t *testing.T) {
|
|||
{
|
||||
name: "",
|
||||
args: args{
|
||||
rls: NewRelease("ggn"),
|
||||
rls: NewRelease(IndexerMinimal{0, "GazelleGames", "ggn"}),
|
||||
vars: map[string]string{
|
||||
"torrentName": "Year 2 Remastered by Insaneintherainmusic",
|
||||
"category": "OST",
|
||||
|
@ -332,7 +332,7 @@ func TestIRCParserOrpheus_Parse(t *testing.T) {
|
|||
{
|
||||
name: "",
|
||||
args: args{
|
||||
rls: NewRelease("ops"),
|
||||
rls: NewRelease(IndexerMinimal{0, "Orpheus", "ops"}),
|
||||
vars: map[string]string{
|
||||
"torrentName": "Busta Rhymes – BEACH BALL (feat. BIA) – [2023] [Single] WEB/FLAC/24bit Lossless",
|
||||
"title": "Busta Rhymes – BEACH BALL (feat. BIA)",
|
||||
|
@ -348,7 +348,7 @@ func TestIRCParserOrpheus_Parse(t *testing.T) {
|
|||
{
|
||||
name: "",
|
||||
args: args{
|
||||
rls: NewRelease("ops"),
|
||||
rls: NewRelease(IndexerMinimal{0, "Orpheus", "ops"}),
|
||||
vars: map[string]string{
|
||||
"torrentName": "Busta Rhymes – BEACH BALL (feat. BIA) – [2023] [Single] CD/FLAC/Lossless",
|
||||
"title": "Busta Rhymes – BEACH BALL (feat. BIA)",
|
||||
|
|
|
@ -28,6 +28,8 @@ type Macro struct {
|
|||
DownloadUrl string
|
||||
InfoUrl string
|
||||
Indexer string
|
||||
IndexerName string
|
||||
IndexerIdentifier string
|
||||
Title string
|
||||
Type string
|
||||
Category string
|
||||
|
@ -67,7 +69,9 @@ func NewMacro(release Release) Macro {
|
|||
GroupID: release.GroupID,
|
||||
InfoUrl: release.InfoURL,
|
||||
DownloadUrl: release.DownloadURL,
|
||||
Indexer: release.Indexer,
|
||||
Indexer: release.Indexer.Identifier,
|
||||
IndexerName: release.Indexer.Name,
|
||||
IndexerIdentifier: release.Indexer.Identifier,
|
||||
Title: release.Title,
|
||||
Type: release.Type,
|
||||
Category: release.Category,
|
||||
|
|
|
@ -36,7 +36,7 @@ func TestMacros_Parse(t *testing.T) {
|
|||
release: Release{
|
||||
TorrentName: "This movie 2021",
|
||||
TorrentTmpFile: "/tmp/a-temporary-file.torrent",
|
||||
Indexer: "mock1",
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
},
|
||||
args: args{text: "Print mee {{.TorrentPathName}}"},
|
||||
want: "Print mee /tmp/a-temporary-file.torrent",
|
||||
|
@ -47,7 +47,7 @@ func TestMacros_Parse(t *testing.T) {
|
|||
release: Release{
|
||||
TorrentName: "This movie 2021",
|
||||
TorrentTmpFile: "/tmp/a-temporary-file.torrent",
|
||||
Indexer: "mock1",
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
},
|
||||
args: args{text: "Print mee {{TorrentPathName}}"},
|
||||
want: "",
|
||||
|
@ -58,7 +58,7 @@ func TestMacros_Parse(t *testing.T) {
|
|||
release: Release{
|
||||
TorrentName: "This movie 2021",
|
||||
TorrentTmpFile: "/tmp/a-temporary-file.torrent",
|
||||
Indexer: "mock1",
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
},
|
||||
args: args{text: "add {{.TorrentPathName}} --category test"},
|
||||
want: "add /tmp/a-temporary-file.torrent --category test",
|
||||
|
@ -68,7 +68,7 @@ func TestMacros_Parse(t *testing.T) {
|
|||
name: "test_program_arg_bad",
|
||||
release: Release{
|
||||
TorrentTmpFile: "/tmp/a-temporary-file.torrent",
|
||||
Indexer: "mock1",
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
},
|
||||
args: args{text: "add {{.TorrenttPathName}} --category test"},
|
||||
want: "",
|
||||
|
@ -79,7 +79,7 @@ func TestMacros_Parse(t *testing.T) {
|
|||
release: Release{
|
||||
TorrentName: "This movie 2021",
|
||||
TorrentTmpFile: "/tmp/a-temporary-file.torrent",
|
||||
Indexer: "mock1",
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
},
|
||||
args: args{text: "add {{.TorrentPathName}} --category test --other {{.TorrentName}}"},
|
||||
want: "add /tmp/a-temporary-file.torrent --category test --other This movie 2021",
|
||||
|
@ -90,7 +90,7 @@ func TestMacros_Parse(t *testing.T) {
|
|||
release: Release{
|
||||
TorrentName: "This movie 2021",
|
||||
DownloadURL: "https://some.site/download/fakeid",
|
||||
Indexer: "mock1",
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
},
|
||||
args: args{text: "{{.TorrentName}} {{.TorrentUrl}} SOME_LONG_TOKEN"},
|
||||
want: "This movie 2021 https://some.site/download/fakeid SOME_LONG_TOKEN",
|
||||
|
@ -101,7 +101,7 @@ func TestMacros_Parse(t *testing.T) {
|
|||
release: Release{
|
||||
TorrentName: "This movie 2021",
|
||||
DownloadURL: "https://some.site/download/fakeid",
|
||||
Indexer: "mock1",
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
},
|
||||
args: args{text: "{{.Indexer}} {{.TorrentName}} {{.TorrentUrl}} SOME_LONG_TOKEN"},
|
||||
want: "mock1 This movie 2021 https://some.site/download/fakeid SOME_LONG_TOKEN",
|
||||
|
@ -112,7 +112,7 @@ func TestMacros_Parse(t *testing.T) {
|
|||
release: Release{
|
||||
TorrentName: "This movie 2021",
|
||||
DownloadURL: "https://some.site/download/fakeid",
|
||||
Indexer: "mock1",
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
},
|
||||
args: args{text: "{{.Indexer}}-race"},
|
||||
want: "mock1-race",
|
||||
|
@ -123,7 +123,7 @@ func TestMacros_Parse(t *testing.T) {
|
|||
release: Release{
|
||||
TorrentName: "This movie 2021",
|
||||
DownloadURL: "https://some.site/download/fakeid",
|
||||
Indexer: "mock1",
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
},
|
||||
args: args{text: "{{.Indexer}}-{{.CurrentYear}}-race"},
|
||||
want: fmt.Sprintf("mock1-%v-race", currentTime.Year()),
|
||||
|
@ -134,7 +134,7 @@ func TestMacros_Parse(t *testing.T) {
|
|||
release: Release{
|
||||
TorrentName: "This movie 2021",
|
||||
DownloadURL: "https://some.site/download/fakeid",
|
||||
Indexer: "mock1",
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
Resolution: "2160p",
|
||||
HDR: []string{"DV"},
|
||||
},
|
||||
|
@ -147,7 +147,7 @@ func TestMacros_Parse(t *testing.T) {
|
|||
release: Release{
|
||||
TorrentName: "This movie 2021",
|
||||
DownloadURL: "https://some.site/download/fakeid",
|
||||
Indexer: "mock1",
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
Resolution: "2160p",
|
||||
HDR: []string{"HDR"},
|
||||
},
|
||||
|
@ -160,7 +160,7 @@ func TestMacros_Parse(t *testing.T) {
|
|||
release: Release{
|
||||
TorrentName: "This movie 2021",
|
||||
DownloadURL: "https://some.site/download/fakeid",
|
||||
Indexer: "mock1",
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
Resolution: "2160p",
|
||||
HDR: []string{"HDR"},
|
||||
Year: 2021,
|
||||
|
@ -220,7 +220,7 @@ func TestMacros_Parse(t *testing.T) {
|
|||
TorrentName: "This movie 2021",
|
||||
DownloadURL: "https://some.site/download/fakeid",
|
||||
Group: "thisgrp",
|
||||
Indexer: "mock1",
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
Year: 2021,
|
||||
},
|
||||
args: args{text: "movies-{{.Group}}"},
|
||||
|
@ -263,6 +263,15 @@ func TestMacros_Parse(t *testing.T) {
|
|||
want: "Artists: Jon Boy",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "test_args_indexer",
|
||||
release: Release{
|
||||
Indexer: IndexerMinimal{0, "Mock Indexer", "mock1"},
|
||||
},
|
||||
args: args{text: "indexer={{.IndexerName}}"},
|
||||
want: fmt.Sprintf("indexer=Mock Indexer"),
|
||||
wantErr: false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
|
|
|
@ -45,7 +45,7 @@ type Release struct {
|
|||
ID int64 `json:"id"`
|
||||
FilterStatus ReleaseFilterStatus `json:"filter_status"`
|
||||
Rejections []string `json:"rejections"`
|
||||
Indexer string `json:"indexer"`
|
||||
Indexer IndexerMinimal `json:"indexer"`
|
||||
FilterName string `json:"filter"`
|
||||
Protocol ReleaseProtocol `json:"protocol"`
|
||||
Implementation ReleaseImplementation `json:"implementation"` // irc, rss, api
|
||||
|
@ -284,7 +284,7 @@ type GetReleaseActionStatusRequest struct {
|
|||
Id int
|
||||
}
|
||||
|
||||
func NewRelease(indexer string) *Release {
|
||||
func NewRelease(indexer IndexerMinimal) *Release {
|
||||
r := &Release{
|
||||
Indexer: indexer,
|
||||
FilterStatus: ReleaseStatusFilterPending,
|
||||
|
@ -493,25 +493,24 @@ func (r *Release) downloadTorrentFile(ctx context.Context) error {
|
|||
// Continue processing the response
|
||||
//case http.StatusMovedPermanently, http.StatusFound, http.StatusSeeOther, http.StatusTemporaryRedirect, http.StatusPermanentRedirect:
|
||||
// // Handle redirect
|
||||
// return retry.Unrecoverable(errors.New("redirect encountered for torrent (%s) file (%s) - status code: %d - check indexer keys for %s", r.TorrentName, r.DownloadURL, resp.StatusCode, r.Indexer))
|
||||
// return retry.Unrecoverable(errors.New("redirect encountered for torrent (%s) file (%s) - status code: %d - check indexer keys for %s", r.TorrentName, r.DownloadURL, resp.StatusCode, r.Indexer.Name))
|
||||
|
||||
case http.StatusUnauthorized, http.StatusForbidden:
|
||||
return retry.Unrecoverable(errors.New("unrecoverable error downloading torrent (%s) file (%s) - status code: %d - check indexer keys for %s", r.TorrentName, r.DownloadURL, resp.StatusCode, r.Indexer))
|
||||
return retry.Unrecoverable(errors.New("unrecoverable error downloading torrent (%s) file (%s) - status code: %d - check indexer keys for %s", r.TorrentName, r.DownloadURL, resp.StatusCode, r.Indexer.Name))
|
||||
|
||||
case http.StatusMethodNotAllowed:
|
||||
return retry.Unrecoverable(errors.New("unrecoverable error downloading torrent (%s) file (%s) from '%s' - status code: %d. Check if the request method is correct", r.TorrentName, r.DownloadURL, r.Indexer, resp.StatusCode))
|
||||
|
||||
return retry.Unrecoverable(errors.New("unrecoverable error downloading torrent (%s) file (%s) from '%s' - status code: %d. Check if the request method is correct", r.TorrentName, r.DownloadURL, r.Indexer.Name, resp.StatusCode))
|
||||
case http.StatusNotFound:
|
||||
return errors.New("torrent %s not found on %s (%d) - retrying", r.TorrentName, r.Indexer, resp.StatusCode)
|
||||
return errors.New("torrent %s not found on %s (%d) - retrying", r.TorrentName, r.Indexer.Name, resp.StatusCode)
|
||||
|
||||
case http.StatusBadGateway, http.StatusServiceUnavailable, http.StatusGatewayTimeout:
|
||||
return errors.New("server error (%d) encountered while downloading torrent (%s) file (%s) from '%s' - retrying", resp.StatusCode, r.TorrentName, r.DownloadURL, r.Indexer)
|
||||
return errors.New("server error (%d) encountered while downloading torrent (%s) file (%s) from '%s' - retrying", resp.StatusCode, r.TorrentName, r.DownloadURL, r.Indexer.Name)
|
||||
|
||||
case http.StatusInternalServerError:
|
||||
return errors.New("server error (%d) encountered while downloading torrent (%s) file (%s) - check indexer keys for %s", resp.StatusCode, r.TorrentName, r.DownloadURL, r.Indexer)
|
||||
return errors.New("server error (%d) encountered while downloading torrent (%s) file (%s) - check indexer keys for %s", resp.StatusCode, r.TorrentName, r.DownloadURL, r.Indexer.Name)
|
||||
|
||||
default:
|
||||
return retry.Unrecoverable(errors.New("unexpected status code %d: check indexer keys for %s", resp.StatusCode, r.Indexer))
|
||||
return retry.Unrecoverable(errors.New("unexpected status code %d: check indexer keys for %s", resp.StatusCode, r.Indexer.Name))
|
||||
}
|
||||
|
||||
resetTmpFile := func() {
|
||||
|
@ -537,10 +536,10 @@ func (r *Release) downloadTorrentFile(ctx context.Context) error {
|
|||
var bse *bencode.SyntaxError
|
||||
if errors.As(err, &bse) {
|
||||
// regular error so we can retry if we receive html first run
|
||||
return errors.Wrap(err, "metainfo unexpected content type, got HTML expected a bencoded torrent. check indexer keys for %s - %s", r.Indexer, r.TorrentName)
|
||||
return errors.Wrap(err, "metainfo unexpected content type, got HTML expected a bencoded torrent. check indexer keys for %s - %s", r.Indexer.Name, r.TorrentName)
|
||||
}
|
||||
|
||||
return retry.Unrecoverable(errors.Wrap(err, "metainfo unexpected content type. check indexer keys for %s - %s", r.Indexer, r.TorrentName))
|
||||
return retry.Unrecoverable(errors.Wrap(err, "metainfo unexpected content type. check indexer keys for %s - %s", r.Indexer.Name, r.TorrentName))
|
||||
}
|
||||
|
||||
// Write the body to file
|
||||
|
|
|
@ -93,7 +93,7 @@ func TestRelease_DownloadTorrentFile(t *testing.T) {
|
|||
ID int64
|
||||
FilterStatus ReleaseFilterStatus
|
||||
Rejections []string
|
||||
Indexer string
|
||||
Indexer IndexerMinimal
|
||||
FilterName string
|
||||
Protocol ReleaseProtocol
|
||||
Implementation ReleaseImplementation
|
||||
|
@ -151,7 +151,11 @@ func TestRelease_DownloadTorrentFile(t *testing.T) {
|
|||
{
|
||||
name: "401",
|
||||
fields: fields{
|
||||
Indexer: "mock-indexer",
|
||||
Indexer: IndexerMinimal{
|
||||
ID: 0,
|
||||
Name: "Mock Indexer",
|
||||
Identifier: "mock-indexer",
|
||||
},
|
||||
TorrentName: "Test.Release-GROUP",
|
||||
DownloadURL: fmt.Sprintf("%s/%d", ts.URL, 401),
|
||||
Protocol: ReleaseProtocolTorrent,
|
||||
|
@ -161,7 +165,11 @@ func TestRelease_DownloadTorrentFile(t *testing.T) {
|
|||
{
|
||||
name: "403",
|
||||
fields: fields{
|
||||
Indexer: "mock-indexer",
|
||||
Indexer: IndexerMinimal{
|
||||
ID: 0,
|
||||
Name: "Mock Indexer",
|
||||
Identifier: "mock-indexer",
|
||||
},
|
||||
TorrentName: "Test.Release-GROUP",
|
||||
DownloadURL: fmt.Sprintf("%s/%d", ts.URL, 403),
|
||||
Protocol: ReleaseProtocolTorrent,
|
||||
|
@ -171,7 +179,11 @@ func TestRelease_DownloadTorrentFile(t *testing.T) {
|
|||
{
|
||||
name: "500",
|
||||
fields: fields{
|
||||
Indexer: "mock-indexer",
|
||||
Indexer: IndexerMinimal{
|
||||
ID: 0,
|
||||
Name: "Mock Indexer",
|
||||
Identifier: "mock-indexer",
|
||||
},
|
||||
TorrentName: "Test.Release-GROUP",
|
||||
DownloadURL: fmt.Sprintf("%s/%d", ts.URL, 500),
|
||||
Protocol: ReleaseProtocolTorrent,
|
||||
|
@ -181,7 +193,11 @@ func TestRelease_DownloadTorrentFile(t *testing.T) {
|
|||
{
|
||||
name: "ok",
|
||||
fields: fields{
|
||||
Indexer: "mock-indexer",
|
||||
Indexer: IndexerMinimal{
|
||||
ID: 0,
|
||||
Name: "Mock Indexer",
|
||||
Identifier: "mock-indexer",
|
||||
},
|
||||
TorrentName: "Test.Release-GROUP",
|
||||
DownloadURL: fmt.Sprintf("%s/%s", ts.URL, "file.torrent"),
|
||||
Protocol: ReleaseProtocolTorrent,
|
||||
|
@ -191,7 +207,11 @@ func TestRelease_DownloadTorrentFile(t *testing.T) {
|
|||
{
|
||||
name: "valid_torrent_with_text-html_header",
|
||||
fields: fields{
|
||||
Indexer: "mock-indexer",
|
||||
Indexer: IndexerMinimal{
|
||||
ID: 0,
|
||||
Name: "Mock Indexer",
|
||||
Identifier: "mock-indexer",
|
||||
},
|
||||
TorrentName: "Test.Release-GROUP",
|
||||
DownloadURL: fmt.Sprintf("%s/files/%s", ts.URL, "valid_torrent_as_html"),
|
||||
Protocol: ReleaseProtocolTorrent,
|
||||
|
@ -201,7 +221,11 @@ func TestRelease_DownloadTorrentFile(t *testing.T) {
|
|||
{
|
||||
name: "invalid_torrent_with_text-html_header",
|
||||
fields: fields{
|
||||
Indexer: "mock-indexer",
|
||||
Indexer: IndexerMinimal{
|
||||
ID: 0,
|
||||
Name: "Mock Indexer",
|
||||
Identifier: "mock-indexer",
|
||||
},
|
||||
TorrentName: "Test.Release-GROUP",
|
||||
DownloadURL: fmt.Sprintf("%s/files/%s", ts.URL, "invalid_torrent_as_html"),
|
||||
Protocol: ReleaseProtocolTorrent,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue