diff --git a/README.md b/README.md index e2aa4d8..e5fb1c8 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,13 @@ **Go library to interact with APIs in all the Starr apps.** -- [Lidarr](http://lidarr.audio) ([over 70 methods](https://pkg.go.dev/golift.io/starr@main/lidarr)) -- [Prowlarr](https://prowlarr.com) ([over 20 methods](https://pkg.go.dev/golift.io/starr@main/prowlarr)) -- [Radarr](http://radarr.video) ([over 90 methods](https://pkg.go.dev/golift.io/starr@main/radarr)) -- [Readarr](http://readarr.com) ([over 60 methods](https://pkg.go.dev/golift.io/starr@main/readarr)) -- [Sonarr](http://sonarr.tv) ([over 100 methods](https://pkg.go.dev/golift.io/starr@main/sonarr)) +- [Lidarr](http://lidarr.audio) ([over 80 methods](https://pkg.go.dev/golift.io/starr@main/lidarr)) +- [Prowlarr](https://prowlarr.com) ([over 20 methods](https://pkg.go.dev/golift.io/starr@main/prowlarr)) +- [Radarr](http://radarr.video) ([over 100 methods](https://pkg.go.dev/golift.io/starr@main/radarr)) +- [Readarr](http://readarr.com) ([over 70 methods](https://pkg.go.dev/golift.io/starr@main/readarr)) +- [Sonarr](http://sonarr.tv) ([over 100 methods](https://pkg.go.dev/golift.io/starr@main/sonarr)) -[Custom Scripts support](https://wiki.servarr.com/radarr/custom-scripts) is also included. +[Custom Scripts support](https://wiki.servarr.com/radarr/custom-scripts) is also included. [Check out the types and methods](https://pkg.go.dev/golift.io/starr@main/starrcmd) to get that data. ## One 🌟 To Rule Them All diff --git a/lidarr/album.go b/lidarr/album.go index f91e7de..aa48e00 100644 --- a/lidarr/album.go +++ b/lidarr/album.go @@ -221,3 +221,23 @@ func (l *Lidarr) LookupContext(ctx context.Context, term string) ([]*Album, erro return output, nil } + +// DeleteAlbum removes an album from the database. +// Setting deleteFiles true will delete all content for the album. +func (l *Lidarr) DeleteAlbum(albumID int64, deleteFiles, addImportExclusion bool) error { + return l.DeleteAlbumContext(context.Background(), albumID, deleteFiles, addImportExclusion) +} + +// DeleteAlbumContext removes an album from the database. +// Setting deleteFiles true will delete all content for the album. +func (l *Lidarr) DeleteAlbumContext(ctx context.Context, albumID int64, deleteFiles, addImportExclusion bool) error { + req := starr.Request{URI: path.Join(bpAlbum, fmt.Sprint(albumID)), Query: make(url.Values)} + req.Query.Set("deleteFiles", fmt.Sprint(deleteFiles)) + req.Query.Set("addImportListExclusion", fmt.Sprint(addImportExclusion)) + + if err := l.DeleteAny(ctx, req); err != nil { + return fmt.Errorf("api.Delete(%s): %w", &req, err) + } + + return nil +} diff --git a/lidarr/artist.go b/lidarr/artist.go index 2295136..ffb40d7 100644 --- a/lidarr/artist.go +++ b/lidarr/artist.go @@ -108,10 +108,8 @@ func (l *Lidarr) AddArtistContext(ctx context.Context, artist *Artist) (*Artist, } req := starr.Request{URI: bpArtist, Query: make(url.Values), Body: &body} - req.Query.Add("moveFiles", "true") var output Artist - if err := l.PostInto(ctx, req, &output); err != nil { return nil, fmt.Errorf("api.Post(%s): %w", &req, err) } @@ -120,25 +118,44 @@ func (l *Lidarr) AddArtistContext(ctx context.Context, artist *Artist) (*Artist, } // UpdateArtist updates an artist in place. -func (l *Lidarr) UpdateArtist(artist *Artist) (*Artist, error) { - return l.UpdateArtistContext(context.Background(), artist) +func (l *Lidarr) UpdateArtist(artist *Artist, moveFiles bool) (*Artist, error) { + return l.UpdateArtistContext(context.Background(), artist, moveFiles) } // UpdateArtistContext updates an artist in place. -func (l *Lidarr) UpdateArtistContext(ctx context.Context, artist *Artist) (*Artist, error) { +func (l *Lidarr) UpdateArtistContext(ctx context.Context, artist *Artist, moveFiles bool) (*Artist, error) { var body bytes.Buffer if err := json.NewEncoder(&body).Encode(artist); err != nil { return nil, fmt.Errorf("json.Marshal(%s): %w", bpArtist, err) } req := starr.Request{URI: path.Join(bpArtist, fmt.Sprint(artist.ID)), Query: make(url.Values), Body: &body} - req.Query.Add("moveFiles", "true") + req.Query.Add("moveFiles", fmt.Sprint(moveFiles)) var output Artist - if err := l.PutInto(ctx, req, &output); err != nil { return nil, fmt.Errorf("api.Put(%s): %w", &req, err) } return &output, nil } + +// DeleteArtist removes an artist from the database. +// Setting deleteFiles true will delete all content for the artist. +func (l *Lidarr) DeleteArtist(artistID int64, deleteFiles, addImportExclusion bool) error { + return l.DeleteArtistContext(context.Background(), artistID, deleteFiles, addImportExclusion) +} + +// DeleteArtistContext removes an artist from the database. +// Setting deleteFiles true will delete all content for the artist. +func (l *Lidarr) DeleteArtistContext(ctx context.Context, artistID int64, deleteFiles, addImportExclusion bool) error { + req := starr.Request{URI: path.Join(bpArtist, fmt.Sprint(artistID)), Query: make(url.Values)} + req.Query.Set("deleteFiles", fmt.Sprint(deleteFiles)) + req.Query.Set("addImportListExclusion", fmt.Sprint(addImportExclusion)) + + if err := l.DeleteAny(ctx, req); err != nil { + return fmt.Errorf("api.Delete(%s): %w", &req, err) + } + + return nil +} diff --git a/lidarr/history.go b/lidarr/history.go index a0c7b50..8f38b28 100644 --- a/lidarr/history.go +++ b/lidarr/history.go @@ -59,7 +59,6 @@ type HistoryRecord struct { } // GetHistory returns the Lidarr History (grabs/failures/completed). -// WARNING: 12/30/2021 - this method changed. // If you need control over the page, use lidarr.GetHistoryPage(). // This function simply returns the number of history records desired, // up to the number of records present in the application. diff --git a/lidarr/queue.go b/lidarr/queue.go index 2825b0a..04caec8 100644 --- a/lidarr/queue.go +++ b/lidarr/queue.go @@ -45,7 +45,6 @@ type QueueRecord struct { } // GetQueue returns a single page from the Lidarr Queue (processing, but not yet imported). -// WARNING: 12/30/2021 - this method changed. // If you need control over the page, use lidarr.GetQueuePage(). // This function simply returns the number of queue records desired, // up to the number of records present in the application. diff --git a/radarr/blocklist.go b/radarr/blocklist.go index f1922f2..6c72156 100644 --- a/radarr/blocklist.go +++ b/radarr/blocklist.go @@ -26,17 +26,17 @@ type BlockList struct { // BlockListRecord represents a single block list item. type BlockListRecord struct { - Movie *Movie `json:"movie"` - Quality *starr.Quality `json:"quality"` - Languages []*starr.Value `json:"languages"` - CustomFormats []interface{} `json:"customFormats"` - MovieID int64 `json:"movieId"` - ID int64 `json:"id"` - Date time.Time `json:"date"` - SourceTitle string `json:"sourceTitle"` - Protocol string `json:"protocol"` - Indexer string `json:"indexer"` - Message string `json:"message"` + Movie *Movie `json:"movie"` + Quality *starr.Quality `json:"quality"` + Languages []*starr.Value `json:"languages"` + CustomFormats []*CustomFormatOutput `json:"customFormats"` + MovieID int64 `json:"movieId"` + ID int64 `json:"id"` + Date time.Time `json:"date"` + SourceTitle string `json:"sourceTitle"` + Protocol string `json:"protocol"` + Indexer string `json:"indexer"` + Message string `json:"message"` } // GetBlockList returns the count of block list items requested. diff --git a/radarr/downloadclient.go b/radarr/downloadclient.go index e8b10de..857b690 100644 --- a/radarr/downloadclient.go +++ b/radarr/downloadclient.go @@ -111,7 +111,7 @@ func (r *Radarr) TestDownloadClient(client *DownloadClientInput) error { // TestDownloadClientContext tests a download client. func (r *Radarr) TestDownloadClientContext(ctx context.Context, client *DownloadClientInput) error { - var output interface{} + var output interface{} // any ok var body bytes.Buffer if err := json.NewEncoder(&body).Encode(client); err != nil { diff --git a/radarr/exclusions.go b/radarr/exclusions.go index 8422dca..b632cb2 100644 --- a/radarr/exclusions.go +++ b/radarr/exclusions.go @@ -98,7 +98,7 @@ func (r *Radarr) AddExclusionsContext(ctx context.Context, exclusions []*Exclusi return fmt.Errorf("json.Marshal(%s): %w", bpExclusions, err) } - var output interface{} + var output interface{} // any ok req := starr.Request{URI: path.Join(bpExclusions, "bulk"), Body: &body} if err := r.PostInto(ctx, req, &output); err != nil { diff --git a/radarr/history.go b/radarr/history.go index 04e4f7a..1bbc915 100644 --- a/radarr/history.go +++ b/radarr/history.go @@ -24,16 +24,16 @@ type History struct { // HistoryRecord is part of the History data. // Not all items have all Data members. Check EventType for what you need. type HistoryRecord struct { - ID int64 `json:"id"` - MovieID int64 `json:"movieId"` - SourceTitle string `json:"sourceTitle"` - Languages []*starr.Value `json:"languages"` - Quality *starr.Quality `json:"quality"` - CustomFormats []interface{} `json:"customFormats"` - QualityCutoffNotMet bool `json:"qualityCutoffNotMet"` - Date time.Time `json:"date"` - DownloadID string `json:"downloadId"` - EventType string `json:"eventType"` + ID int64 `json:"id"` + MovieID int64 `json:"movieId"` + SourceTitle string `json:"sourceTitle"` + Languages []*starr.Value `json:"languages"` + Quality *starr.Quality `json:"quality"` + CustomFormats []*CustomFormatOutput `json:"customFormats"` + QualityCutoffNotMet bool `json:"qualityCutoffNotMet"` + Date time.Time `json:"date"` + DownloadID string `json:"downloadId"` + EventType string `json:"eventType"` Data struct { Age string `json:"age"` AgeHours string `json:"ageHours"` @@ -61,13 +61,11 @@ type HistoryRecord struct { } // GetHistory returns the Radarr History (grabs/failures/completed). -// WARNING: 12/30/2021 - this method changed. The second argument no longer -// controls which page is returned, but instead adjusts the pagination size. // If you need control over the page, use radarr.GetHistoryPage(). // This function simply returns the number of history records desired, // up to the number of records present in the application. // It grabs records in (paginated) batches of perPage, and concatenates -// them into one list. Passing zero for records will return all of them. +// them into one list. Passing zero for records will return all of them. func (r *Radarr) GetHistory(records, perPage int) (*History, error) { return r.GetHistoryContext(context.Background(), records, perPage) } @@ -131,7 +129,7 @@ func (r *Radarr) FailContext(ctx context.Context, historyID int64) error { return fmt.Errorf("%w: invalid history ID: %d", starr.ErrRequestError, historyID) } - var output interface{} + var output interface{} // any ok // Strangely uses a POST without a payload. req := starr.Request{URI: path.Join(bpHistory, "failed", fmt.Sprint(historyID))} diff --git a/radarr/importlist.go b/radarr/importlist.go index 62950ab..b212e77 100644 --- a/radarr/importlist.go +++ b/radarr/importlist.go @@ -126,7 +126,7 @@ func (r *Radarr) TestImportList(list *ImportListInput) error { // TestImportListContextt tests an import list. func (r *Radarr) TestImportListContextt(ctx context.Context, list *ImportListInput) error { - var output interface{} + var output interface{} // any ok var body bytes.Buffer if err := json.NewEncoder(&body).Encode(list); err != nil { diff --git a/radarr/indexer.go b/radarr/indexer.go index 47f4a81..e99bfcd 100644 --- a/radarr/indexer.go +++ b/radarr/indexer.go @@ -90,7 +90,7 @@ func (r *Radarr) TestIndexer(indexer *IndexerInput) error { // TestIndexerContext tests an indexer. func (r *Radarr) TestIndexerContext(ctx context.Context, indexer *IndexerInput) error { - var output interface{} + var output interface{} // any ok var body bytes.Buffer if err := json.NewEncoder(&body).Encode(indexer); err != nil { diff --git a/radarr/queue.go b/radarr/queue.go index 6ebe91e..513ed39 100644 --- a/radarr/queue.go +++ b/radarr/queue.go @@ -26,7 +26,7 @@ type QueueRecord struct { MovieID int64 `json:"movieId"` Languages []*starr.Value `json:"languages"` Quality *starr.Quality `json:"quality"` - CustomFormats []interface{} `json:"customFormats"` // probably []int64 + CustomFormats []*CustomFormatOutput `json:"customFormats"` Size float64 `json:"size"` Title string `json:"title"` Sizeleft float64 `json:"sizeleft"` @@ -46,8 +46,6 @@ type QueueRecord struct { } // GetQueue returns a single page from the Radarr Queue (processing, but not yet imported). -// WARNING: 12/30/2021 - this method changed. The second argument no longer -// controls which page is returned, but instead adjusts the pagination size. // If you need control over the page, use radarr.GetQueuePage(). // This function simply returns the number of queue records desired, // up to the number of records present in the application. diff --git a/readarr/author.go b/readarr/author.go index 04a6b01..f368027 100644 --- a/readarr/author.go +++ b/readarr/author.go @@ -96,28 +96,48 @@ func (r *Readarr) GetAuthorByIDContext(ctx context.Context, authorID int64) (*Au } // UpdateAuthor updates an author in place. -func (r *Readarr) UpdateAuthor(authorID int64, author *Author) error { - return r.UpdateAuthorContext(context.Background(), authorID, author) +func (r *Readarr) UpdateAuthor(author *Author, moveFiles bool) (*Author, error) { + return r.UpdateAuthorContext(context.Background(), author, moveFiles) } // UpdateAuthorContext updates an author in place. -func (r *Readarr) UpdateAuthorContext(ctx context.Context, authorID int64, author *Author) error { +func (r *Readarr) UpdateAuthorContext(ctx context.Context, author *Author, moveFiles bool) (*Author, error) { var body bytes.Buffer if err := json.NewEncoder(&body).Encode(author); err != nil { - return fmt.Errorf("json.Marshal(%s): %w", bpAuthor, err) + return nil, fmt.Errorf("json.Marshal(%s): %w", bpAuthor, err) } - var output interface{} // not sure what this looks like. + var output Author req := starr.Request{ - URI: path.Join(bpAuthor, fmt.Sprint(authorID)), + URI: path.Join(bpAuthor, fmt.Sprint(author.ID)), Query: make(url.Values), Body: &body, } - req.Query.Add("moveFiles", "true") + req.Query.Add("moveFiles", fmt.Sprint(moveFiles)) if err := r.PutInto(ctx, req, &output); err != nil { - return fmt.Errorf("api.Put(%s): %w", &req, err) + return nil, fmt.Errorf("api.Put(%s): %w", &req, err) + } + + return &output, nil +} + +// DeleteAuthor removes an Author from the database. +// Setting deleteFiles true will delete all content for the Author. +func (r *Readarr) DeleteAuthor(authorID int64, deleteFiles, addImportExclusion bool) error { + return r.DeleteAuthorContext(context.Background(), authorID, deleteFiles, addImportExclusion) +} + +// DeleteAuthorContext removes na Author from the database. +// Setting deleteFiles true will delete all content for the Author. +func (r *Readarr) DeleteAuthorContext(ctx context.Context, authorID int64, deleteFiles, addImportExclusion bool) error { + req := starr.Request{URI: path.Join(bpAuthor, fmt.Sprint(authorID)), Query: make(url.Values)} + req.Query.Set("deleteFiles", fmt.Sprint(deleteFiles)) + req.Query.Set("addImportListExclusion", fmt.Sprint(addImportExclusion)) + + if err := r.DeleteAny(ctx, req); err != nil { + return fmt.Errorf("api.Delete(%s): %w", &req, err) } return nil diff --git a/readarr/book.go b/readarr/book.go index 2e75eba..9eb7ee9 100644 --- a/readarr/book.go +++ b/readarr/book.go @@ -222,3 +222,23 @@ func (r *Readarr) LookupContext(ctx context.Context, term string) ([]*Book, erro return output, nil } + +// DeleteBook removes a Book from the database. +// Setting deleteFiles true will delete all content for the Book. +func (r *Readarr) DeleteBook(bookID int64, deleteFiles, addImportExclusion bool) error { + return r.DeleteBookContext(context.Background(), bookID, deleteFiles, addImportExclusion) +} + +// DeleteBookContext removes a Book from the database. +// Setting deleteFiles true will delete all content for the Book. +func (r *Readarr) DeleteBookContext(ctx context.Context, bookID int64, deleteFiles, addImportExclusion bool) error { + req := starr.Request{URI: path.Join(bpBook, fmt.Sprint(bookID)), Query: make(url.Values)} + req.Query.Set("deleteFiles", fmt.Sprint(deleteFiles)) + req.Query.Set("addImportListExclusion", fmt.Sprint(addImportExclusion)) + + if err := r.DeleteAny(ctx, req); err != nil { + return fmt.Errorf("api.Delete(%s): %w", &req, err) + } + + return nil +} diff --git a/readarr/history.go b/readarr/history.go index bec6fbb..5bab2d1 100644 --- a/readarr/history.go +++ b/readarr/history.go @@ -58,7 +58,6 @@ type HistoryRecord struct { } // GetHistory returns the Readarr History (grabs/failures/completed). -// WARNING: 12/30/2021 - this method changed. // If you need control over the page, use readarr.GetHistoryPage(). // This function simply returns the number of history records desired, // up to the number of records present in the application. diff --git a/readarr/queue.go b/readarr/queue.go index 3ab5aae..690cf12 100644 --- a/readarr/queue.go +++ b/readarr/queue.go @@ -46,7 +46,6 @@ type QueueRecord struct { } // GetQueue returns a single page from the Readarr Queue (processing, but not yet imported). -// WARNING: 12/30/2021 - this method changed. // If you need control over the page, use readarr.GetQueuePage(). // This function simply returns the number of queue records desired, // up to the number of records present in the application. diff --git a/shared.go b/shared.go index a2f51df..31567b6 100644 --- a/shared.go +++ b/shared.go @@ -204,6 +204,7 @@ type BackupFile struct { // QueueDeleteOpts are the extra inputs when deleting an item from the Activity Queue. // Set these appropriately for your expectations. All inputs are the same in all apps. +// Providing this input to the QueueDelete methods is optional; nil sets the defaults shown. type QueueDeleteOpts struct { // Default True, use starr.False() to change it. RemoveFromClient *bool diff --git a/sonarr/blocklist.go b/sonarr/blocklist.go index 749e039..2190e0d 100644 --- a/sonarr/blocklist.go +++ b/sonarr/blocklist.go @@ -26,18 +26,18 @@ type BlockList struct { // BlockListRecord represents a single block list item. type BlockListRecord struct { - Series *Series `json:"series"` - Quality *starr.Quality `json:"quality"` - Languages []*starr.Value `json:"languages"` - CustomFormats []interface{} `json:"customFormats"` - EpisodeIDs []int64 `json:"episodeIds"` - ID int64 `json:"id"` - SeriesID int64 `json:"seriesId"` - Date time.Time `json:"date"` - SourceTitle string `json:"sourceTitle"` - Protocol string `json:"protocol"` - Indexer string `json:"indexer"` - Message string `json:"message"` + Series *Series `json:"series"` + Quality *starr.Quality `json:"quality"` + Languages []*starr.Value `json:"languages"` + CustomFormats []*CustomFormatOutput `json:"customFormats"` + EpisodeIDs []int64 `json:"episodeIds"` + ID int64 `json:"id"` + SeriesID int64 `json:"seriesId"` + Date time.Time `json:"date"` + SourceTitle string `json:"sourceTitle"` + Protocol string `json:"protocol"` + Indexer string `json:"indexer"` + Message string `json:"message"` } // GetBlockList returns the count of block list items requested. diff --git a/sonarr/downloadclient.go b/sonarr/downloadclient.go index ce6cc05..7f6f502 100644 --- a/sonarr/downloadclient.go +++ b/sonarr/downloadclient.go @@ -111,7 +111,7 @@ func (s *Sonarr) TestDownloadClient(client *DownloadClientInput) error { // TestDownloadClientContext tests a download client. func (s *Sonarr) TestDownloadClientContext(ctx context.Context, client *DownloadClientInput) error { - var output interface{} + var output interface{} // any ok var body bytes.Buffer if err := json.NewEncoder(&body).Encode(client); err != nil { diff --git a/sonarr/history.go b/sonarr/history.go index f368ac6..0f940ad 100644 --- a/sonarr/history.go +++ b/sonarr/history.go @@ -62,7 +62,6 @@ type HistoryRecord struct { } // GetHistory returns the Sonarr History (grabs/failures/completed). -// WARNING: 12/30/2021 - this method changed. // If you need control over the page, use sonarr.GetHistoryPage(). // This function simply returns the number of history records desired, // up to the number of records present in the application. @@ -72,6 +71,7 @@ func (s *Sonarr) GetHistory(records, perPage int) (*History, error) { return s.GetHistoryContext(context.Background(), records, perPage) } +// GetHistoryContext returns the Sonarr History (grabs/failures/completed). See GetHistory for more. func (s *Sonarr) GetHistoryContext(ctx context.Context, records, perPage int) (*History, error) { hist := &History{Records: []*HistoryRecord{}} perPage = starr.SetPerPage(records, perPage) @@ -107,6 +107,8 @@ func (s *Sonarr) GetHistoryPage(params *starr.PageReq) (*History, error) { return s.GetHistoryPageContext(context.Background(), params) } +// GetHistoryPageContext returns a single page from the Sonarr History (grabs/failures/completed). +// The page size and number is configurable with the input request parameters. func (s *Sonarr) GetHistoryPageContext(ctx context.Context, params *starr.PageReq) (*History, error) { var output History @@ -129,7 +131,7 @@ func (s *Sonarr) FailContext(ctx context.Context, historyID int64) error { return fmt.Errorf("%w: invalid history ID: %d", starr.ErrRequestError, historyID) } - var output interface{} // do not know what this looks like. + var output interface{} // any ok // Strangely uses a POST without a payload. req := starr.Request{URI: path.Join(bpHistory, "failed", fmt.Sprint(historyID))} diff --git a/sonarr/importlist.go b/sonarr/importlist.go index f47c0c6..7bde3a8 100644 --- a/sonarr/importlist.go +++ b/sonarr/importlist.go @@ -118,7 +118,7 @@ func (s *Sonarr) TestImportList(list *ImportListInput) error { // TestImportListContextt tests an import list. func (s *Sonarr) TestImportListContextt(ctx context.Context, list *ImportListInput) error { - var output interface{} + var output interface{} // any ok var body bytes.Buffer if err := json.NewEncoder(&body).Encode(list); err != nil { diff --git a/sonarr/indexer.go b/sonarr/indexer.go index 0d28471..3f322ea 100644 --- a/sonarr/indexer.go +++ b/sonarr/indexer.go @@ -90,7 +90,7 @@ func (s *Sonarr) TestIndexer(indexer *IndexerInput) error { // TestIndexerContext tests an indexer. func (s *Sonarr) TestIndexerContext(ctx context.Context, indexer *IndexerInput) error { - var output interface{} + var output interface{} // any ok var body bytes.Buffer if err := json.NewEncoder(&body).Encode(indexer); err != nil { diff --git a/sonarr/queue.go b/sonarr/queue.go index f8ef9e9..cc393be 100644 --- a/sonarr/queue.go +++ b/sonarr/queue.go @@ -46,7 +46,6 @@ type QueueRecord struct { } // GetQueue returns a single page from the Sonarr Queue (processing, but not yet imported). -// WARNING: 12/30/2021 - this method changed. // If you need control over the page, use sonarr.GetQueuePage(). // This function simply returns the number of queue records desired, // up to the number of records present in the application. diff --git a/sonarr/seasonpass.go b/sonarr/seasonpass.go index 6eb5581..8453832 100644 --- a/sonarr/seasonpass.go +++ b/sonarr/seasonpass.go @@ -43,7 +43,7 @@ func (s *Sonarr) UpdateSeasonPassContext(ctx context.Context, seasonPass *Season return fmt.Errorf("json.Marshal(%s): %w", bpSeasonPass, err) } - var output interface{} // not sure what this looks like + var output interface{} // any ok req := starr.Request{URI: bpSeasonPass, Body: &body} if err := s.PostInto(ctx, req, &output); err != nil {