feat(macros): add IndexerName (#1511)

* feat(macros): add IndexerName

* fix: tests

* fix: tests
This commit is contained in:
ze0s 2024-04-16 17:35:17 +02:00 committed by GitHub
parent c43e2c76d6
commit 3c3b47fa10
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
37 changed files with 310 additions and 235 deletions

View file

@ -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"`

View file

@ -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"`

View file

@ -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)",

View file

@ -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,

View file

@ -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) {

View file

@ -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

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