70 lines
2.0 KiB
Go
70 lines
2.0 KiB
Go
package lidarr
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// del is the shared DELETE helper. Mirrors get()/post() in client.go: builds
|
|
// the URL inline, sets the API key, maps status codes to typed errors. The
|
|
// caller is responsible for closing the returned body.
|
|
func (c *Client) del(ctx context.Context, path string, q url.Values) (*http.Response, error) {
|
|
u, err := url.Parse(c.BaseURL)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%w: %v", ErrUnreachable, err)
|
|
}
|
|
u.Path = strings.TrimRight(u.Path, "/") + path
|
|
if q != nil {
|
|
u.RawQuery = q.Encode()
|
|
}
|
|
req, err := http.NewRequestWithContext(ctx, http.MethodDelete, u.String(), nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
req.Header.Set("X-Api-Key", c.APIKey)
|
|
|
|
resp, err := c.HTTP.Do(req)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%w: %v", ErrUnreachable, err)
|
|
}
|
|
if resp.StatusCode == http.StatusUnauthorized || resp.StatusCode == http.StatusForbidden {
|
|
_ = resp.Body.Close()
|
|
return nil, ErrAuthFailed
|
|
}
|
|
if resp.StatusCode >= 500 {
|
|
_ = resp.Body.Close()
|
|
return nil, ErrServerError
|
|
}
|
|
if resp.StatusCode >= 400 {
|
|
_ = resp.Body.Close()
|
|
return nil, ErrLookupFailed
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
// DeleteAlbum removes an album from Lidarr's library.
|
|
// - deleteFiles=true also removes the audio files from disk.
|
|
// - addImportListExclusion=true tells Lidarr to never re-add this album
|
|
// via import-list scans.
|
|
//
|
|
// M5b's admin "delete via Lidarr" action always passes both `true`.
|
|
func (c *Client) DeleteAlbum(ctx context.Context, lidarrAlbumID int, deleteFiles, addImportListExclusion bool) error {
|
|
if lidarrAlbumID == 0 {
|
|
return fmt.Errorf("lidarr: zero album id")
|
|
}
|
|
q := url.Values{
|
|
"deleteFiles": []string{strconv.FormatBool(deleteFiles)},
|
|
"addImportListExclusion": []string{strconv.FormatBool(addImportListExclusion)},
|
|
}
|
|
resp, err := c.del(ctx, "/api/v1/album/"+strconv.Itoa(lidarrAlbumID), q)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
resp.Body.Close()
|
|
return nil
|
|
}
|