diff --git a/internal/deezer/client.go b/internal/deezer/client.go index ff443d8..74e3db3 100644 --- a/internal/deezer/client.go +++ b/internal/deezer/client.go @@ -9,6 +9,7 @@ import ( "net/http" "strings" + "github.com/mathismqn/godeez/internal/auth" "github.com/mathismqn/godeez/internal/config" ) @@ -18,7 +19,7 @@ type Client struct { } func NewClient(ctx context.Context, appConfig *config.Config) (*Client, error) { - session, err := Authenticate(ctx, appConfig.ArlCookie) + session, err := resolveSession(ctx, appConfig) if err != nil { return nil, fmt.Errorf("failed to authenticate: %w", err) } @@ -29,6 +30,37 @@ func NewClient(ctx context.Context, appConfig *config.Config) (*Client, error) { }, nil } +func resolveSession(ctx context.Context, appConfig *config.Config) (*Session, error) { + if appConfig.ArlCookie != "" { + return Authenticate(ctx, appConfig.ArlCookie) + } + + var session *Session + validate := func(ctx context.Context, arl string) error { + s, err := Authenticate(ctx, arl) + if err != nil { + return err + } + session = s + + return nil + } + + arl, err := auth.Resolve(ctx, validate) + if err != nil { + return nil, err + } + + if session == nil { + session, err = Authenticate(ctx, arl) + if err != nil { + return nil, err + } + } + + return session, nil +} + func (c *Client) FetchResource(ctx context.Context, resource Resource, id string) error { payload := map[string]interface{}{ "nb": 10000, diff --git a/internal/deezer/session.go b/internal/deezer/session.go index c4c1d60..c404428 100644 --- a/internal/deezer/session.go +++ b/internal/deezer/session.go @@ -71,7 +71,7 @@ func Authenticate(ctx context.Context, arlCookie string) (*Session, error) { } if res.Results.User.ID == 0 { - return nil, fmt.Errorf("invalid arl cookie") + return nil, fmt.Errorf("invalid or expired arl cookie") } opts := res.Results.User.Options