add monitor sync jobs and duplicate-safe qobuz updates
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
@@ -39,6 +40,8 @@ type Track struct {
|
||||
Album string
|
||||
}
|
||||
|
||||
var ErrDuplicateTracks = errors.New("qobuz duplicate tracks")
|
||||
|
||||
func NewClient(appID, appSecret string) *Client {
|
||||
return &Client{
|
||||
httpClient: &http.Client{Timeout: 30 * time.Second},
|
||||
@@ -197,6 +200,7 @@ func (c *Client) AddTracksToPlaylist(ctx context.Context, playlistID int64, trac
|
||||
if len(trackIDs) == 0 {
|
||||
return nil
|
||||
}
|
||||
hadDuplicate := false
|
||||
chunks := chunk(trackIDs, 100)
|
||||
for _, ch := range chunks {
|
||||
ids := make([]string, 0, len(ch))
|
||||
@@ -210,9 +214,16 @@ func (c *Client) AddTracksToPlaylist(ctx context.Context, playlistID int64, trac
|
||||
|
||||
var out map[string]any
|
||||
if err := c.postFormSigned(ctx, "/playlist/addTracks", form, &out); err != nil {
|
||||
if isDuplicateConflictErr(err) {
|
||||
hadDuplicate = true
|
||||
continue
|
||||
}
|
||||
return err
|
||||
}
|
||||
}
|
||||
if hadDuplicate {
|
||||
return ErrDuplicateTracks
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -366,6 +377,17 @@ func isSigError(err error) bool {
|
||||
return strings.Contains(msg, "signature") || strings.Contains(msg, "request_sig")
|
||||
}
|
||||
|
||||
func isDuplicateConflictErr(err error) bool {
|
||||
if err == nil {
|
||||
return false
|
||||
}
|
||||
msg := strings.ToLower(err.Error())
|
||||
if !strings.Contains(msg, "duplicate track") {
|
||||
return false
|
||||
}
|
||||
return strings.Contains(msg, "(409)") || strings.Contains(msg, `"code":409`) || strings.Contains(msg, "code: 409")
|
||||
}
|
||||
|
||||
func md5Hex(s string) string {
|
||||
h := md5.Sum([]byte(s))
|
||||
return hex.EncodeToString(h[:])
|
||||
|
||||
Reference in New Issue
Block a user