style: rename accessors to idiomatic names
This commit is contained in:
@@ -26,11 +26,11 @@ type Album struct {
|
|||||||
} `json:"results"`
|
} `json:"results"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Album) GetTitle() string {
|
func (a *Album) Title() string {
|
||||||
return a.Results.Data.Title
|
return a.Results.Data.Title
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Album) GetTracks() []*Track {
|
func (a *Album) Tracks() []*Track {
|
||||||
return a.Results.Tracks.Data
|
return a.Results.Tracks.Data
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,12 +38,12 @@ func (a *Album) SetTracks(t []*Track) {
|
|||||||
a.Results.Tracks.Data = t
|
a.Results.Tracks.Data = t
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Album) GetOutputDir(outputDir string) string {
|
func (a *Album) OutputDir(outputDir string) string {
|
||||||
base := fmt.Sprintf("%s - %s", a.Results.Data.Artist, a.Results.Data.Title)
|
base := fmt.Sprintf("%s - %s", a.Results.Data.Artist, a.Results.Data.Title)
|
||||||
base, _ = filenamify.Filenamify(base, filenamify.Options{})
|
base, _ = filenamify.Filenamify(base, filenamify.Options{})
|
||||||
return path.Join(outputDir, base)
|
return path.Join(outputDir, base)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Album) Unmarshal(data []byte) error {
|
func (a *Album) decode(data []byte) error {
|
||||||
return json.Unmarshal(data, a)
|
return json.Unmarshal(data, a)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,11 +18,11 @@ type Artist struct {
|
|||||||
} `json:"results"`
|
} `json:"results"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Artist) GetTitle() string {
|
func (a *Artist) Title() string {
|
||||||
return a.Results.Data.Name
|
return a.Results.Data.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Artist) GetTracks() []*Track {
|
func (a *Artist) Tracks() []*Track {
|
||||||
return a.Results.Tracks.Data
|
return a.Results.Tracks.Data
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,11 +30,11 @@ func (a *Artist) SetTracks(t []*Track) {
|
|||||||
a.Results.Tracks.Data = t
|
a.Results.Tracks.Data = t
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Artist) GetOutputDir(outputDir string) string {
|
func (a *Artist) OutputDir(outputDir string) string {
|
||||||
base, _ := filenamify.Filenamify(a.Results.Data.Name, filenamify.Options{})
|
base, _ := filenamify.Filenamify(a.Results.Data.Name, filenamify.Options{})
|
||||||
return path.Join(outputDir, base)
|
return path.Join(outputDir, base)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Artist) Unmarshal(data []byte) error {
|
func (a *Artist) decode(data []byte) error {
|
||||||
return json.Unmarshal(data, a)
|
return json.Unmarshal(data, a)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ func (c *Client) FetchResource(ctx context.Context, kind Kind, id string) (Resou
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := c.Session.HttpClient.Do(req)
|
resp, err := c.Session.HTTPClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -117,7 +117,7 @@ func (c *Client) FetchResource(ctx context.Context, kind Kind, id string) (Resou
|
|||||||
return nil, fmt.Errorf("unexpected response")
|
return nil, fmt.Errorf("unexpected response")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := resource.Unmarshal(body); err != nil {
|
if err := resource.decode(body); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,7 +137,7 @@ func (c *Client) FetchMedia(ctx context.Context, track *Track, quality string) (
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := c.Session.HttpClient.Do(req)
|
resp, err := c.Session.HTTPClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -185,7 +185,7 @@ func (c *Client) FetchCoverImage(ctx context.Context, track *Track) ([]byte, err
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := c.Session.HttpClient.Do(req)
|
resp, err := c.Session.HTTPClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -198,13 +198,13 @@ func (c *Client) FetchCoverImage(ctx context.Context, track *Track) ([]byte, err
|
|||||||
return io.ReadAll(resp.Body)
|
return io.ReadAll(resp.Body)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) GetMediaStream(ctx context.Context, media *Media) (io.ReadCloser, error) {
|
func (c *Client) MediaStream(ctx context.Context, media *Media) (io.ReadCloser, error) {
|
||||||
req, err := http.NewRequestWithContext(ctx, "GET", media.GetURL(), nil)
|
req, err := http.NewRequestWithContext(ctx, "GET", media.URL(), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
streamingClient := *c.Session.HttpClient
|
streamingClient := *c.Session.HTTPClient
|
||||||
streamingClient.Timeout = 0
|
streamingClient.Timeout = 0
|
||||||
|
|
||||||
resp, err := streamingClient.Do(req)
|
resp, err := streamingClient.Do(req)
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ type mediaError struct {
|
|||||||
Message string `json:"message"`
|
Message string `json:"message"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Media) GetURL() string {
|
func (m *Media) URL() string {
|
||||||
return m.Data[0].Media[0].Sources[0].URL
|
return m.Data[0].Media[0].Sources[0].URL
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Media) GetFormat() string {
|
func (m *Media) Format() string {
|
||||||
return m.Data[0].Media[0].Format
|
return m.Data[0].Media[0].Format
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,11 +20,11 @@ type Playlist struct {
|
|||||||
} `json:"results"`
|
} `json:"results"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Playlist) GetTitle() string {
|
func (p *Playlist) Title() string {
|
||||||
return p.Results.Data.Title
|
return p.Results.Data.Title
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Playlist) GetTracks() []*Track {
|
func (p *Playlist) Tracks() []*Track {
|
||||||
return p.Results.Tracks.Data
|
return p.Results.Tracks.Data
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,11 +32,11 @@ func (p *Playlist) SetTracks(t []*Track) {
|
|||||||
p.Results.Tracks.Data = t
|
p.Results.Tracks.Data = t
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Playlist) GetOutputDir(outputDir string) string {
|
func (p *Playlist) OutputDir(outputDir string) string {
|
||||||
base, _ := filenamify.Filenamify(p.Results.Data.Title, filenamify.Options{})
|
base, _ := filenamify.Filenamify(p.Results.Data.Title, filenamify.Options{})
|
||||||
return path.Join(outputDir, base)
|
return path.Join(outputDir, base)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Playlist) Unmarshal(data []byte) error {
|
func (p *Playlist) decode(data []byte) error {
|
||||||
return json.Unmarshal(data, p)
|
return json.Unmarshal(data, p)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package deezer
|
package deezer
|
||||||
|
|
||||||
type Resource interface {
|
type Resource interface {
|
||||||
GetTitle() string
|
Title() string
|
||||||
GetTracks() []*Track
|
Tracks() []*Track
|
||||||
SetTracks(tracks []*Track)
|
SetTracks(tracks []*Track)
|
||||||
GetOutputDir(outputDir string) string
|
OutputDir(outputDir string) string
|
||||||
Unmarshal(data []byte) error
|
decode(data []byte) error
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import (
|
|||||||
type Session struct {
|
type Session struct {
|
||||||
APIToken string
|
APIToken string
|
||||||
LicenseToken string
|
LicenseToken string
|
||||||
HttpClient *http.Client
|
HTTPClient *http.Client
|
||||||
Premium bool
|
Premium bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ func authenticate(ctx context.Context, arlCookie string) (*Session, error) {
|
|||||||
return &Session{
|
return &Session{
|
||||||
APIToken: res.Results.APIToken,
|
APIToken: res.Results.APIToken,
|
||||||
LicenseToken: opts.LicenseToken,
|
LicenseToken: opts.LicenseToken,
|
||||||
HttpClient: client,
|
HTTPClient: client,
|
||||||
Premium: opts.MobileOffline || opts.WebOffline,
|
Premium: opts.MobileOffline || opts.WebOffline,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,14 +11,14 @@ type Single struct {
|
|||||||
} `json:"results"`
|
} `json:"results"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Single) GetTitle() string {
|
func (s *Single) Title() string {
|
||||||
if s.Results.Data == nil {
|
if s.Results.Data == nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
return s.Results.Data.GetTitle()
|
return s.Results.Data.FullTitle()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Single) GetTracks() []*Track {
|
func (s *Single) Tracks() []*Track {
|
||||||
if s.Results.Data == nil {
|
if s.Results.Data == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -27,10 +27,10 @@ func (s *Single) GetTracks() []*Track {
|
|||||||
|
|
||||||
func (s *Single) SetTracks(tracks []*Track) {}
|
func (s *Single) SetTracks(tracks []*Track) {}
|
||||||
|
|
||||||
func (s *Single) GetOutputDir(outputDir string) string {
|
func (s *Single) OutputDir(outputDir string) string {
|
||||||
return path.Join(outputDir, "Singles")
|
return path.Join(outputDir, "Singles")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Single) Unmarshal(data []byte) error {
|
func (s *Single) decode(data []byte) error {
|
||||||
return json.Unmarshal(data, s)
|
return json.Unmarshal(data, s)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ type Track struct {
|
|||||||
TrackToken string `json:"TRACK_TOKEN"`
|
TrackToken string `json:"TRACK_TOKEN"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Track) GetTitle() string {
|
func (t *Track) FullTitle() string {
|
||||||
if t.Version != "" {
|
if t.Version != "" {
|
||||||
return t.Title + " " + t.Version
|
return t.Title + " " + t.Version
|
||||||
}
|
}
|
||||||
@@ -62,7 +62,7 @@ func (t *Track) Filename(kind Kind, mediaFormat string) string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fileName := fmt.Sprintf("%s%s - %s.%s", prefix, t.Artist, t.GetTitle(), ext)
|
fileName := fmt.Sprintf("%s%s - %s.%s", prefix, t.Artist, t.FullTitle(), ext)
|
||||||
fileName, _ = filenamify.Filenamify(fileName, filenamify.Options{MaxLength: 255})
|
fileName, _ = filenamify.Filenamify(fileName, filenamify.Options{MaxLength: 255})
|
||||||
return fileName
|
return fileName
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ func (d *Downloader) prepareResource(ctx context.Context, id string, opts Option
|
|||||||
return nil, "", fmt.Errorf("failed to fetch resource: %w", err)
|
return nil, "", fmt.Errorf("failed to fetch resource: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tracks := resource.GetTracks()
|
tracks := resource.Tracks()
|
||||||
if len(tracks) == 0 {
|
if len(tracks) == 0 {
|
||||||
if d.kind == deezer.KindTrack {
|
if d.kind == deezer.KindTrack {
|
||||||
return nil, "", fmt.Errorf("track with ID %s not found", id)
|
return nil, "", fmt.Errorf("track with ID %s not found", id)
|
||||||
@@ -77,7 +77,7 @@ func (d *Downloader) prepareResource(ctx context.Context, id string, opts Option
|
|||||||
resource.SetTracks(tracks[:opts.Limit])
|
resource.SetTracks(tracks[:opts.Limit])
|
||||||
}
|
}
|
||||||
|
|
||||||
outputDir := resource.GetOutputDir(d.appConfig.OutputDir)
|
outputDir := resource.OutputDir(d.appConfig.OutputDir)
|
||||||
if err := fsutil.EnsureDir(outputDir); err != nil {
|
if err := fsutil.EnsureDir(outputDir); err != nil {
|
||||||
return nil, "", fmt.Errorf("failed to create output directory: %w", err)
|
return nil, "", fmt.Errorf("failed to create output directory: %w", err)
|
||||||
}
|
}
|
||||||
@@ -86,7 +86,7 @@ func (d *Downloader) prepareResource(ctx context.Context, id string, opts Option
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *Downloader) downloadAllTracks(ctx context.Context, resource deezer.Resource, opts Options, outputDir string) error {
|
func (d *Downloader) downloadAllTracks(ctx context.Context, resource deezer.Resource, opts Options, outputDir string) error {
|
||||||
tracks := resource.GetTracks()
|
tracks := resource.Tracks()
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
|
|
||||||
if d.kind != deezer.KindTrack {
|
if d.kind != deezer.KindTrack {
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ func artistInfo(a *deezer.Artist) string {
|
|||||||
fmt.Fprintf(&b, "Top %d most popular tracks:\n", limit)
|
fmt.Fprintf(&b, "Top %d most popular tracks:\n", limit)
|
||||||
for i := 0; i < limit; i++ {
|
for i := 0; i < limit; i++ {
|
||||||
t := tracks[i]
|
t := tracks[i]
|
||||||
fmt.Fprintf(&b, " %2d. %s – %s\n", i+1, t.Artist, t.GetTitle())
|
fmt.Fprintf(&b, " %2d. %s – %s\n", i+1, t.Artist, t.FullTitle())
|
||||||
}
|
}
|
||||||
fmt.Fprintf(&b, "===========================================\n")
|
fmt.Fprintf(&b, "===========================================\n")
|
||||||
|
|
||||||
@@ -104,7 +104,7 @@ Title: %s
|
|||||||
Artist: %s
|
Artist: %s
|
||||||
Duration: %s
|
Duration: %s
|
||||||
==================================================`,
|
==================================================`,
|
||||||
s.Results.Data.GetTitle(),
|
s.Results.Data.FullTitle(),
|
||||||
s.Results.Data.Artist,
|
s.Results.Data.Artist,
|
||||||
time.Duration(duration)*time.Second,
|
time.Duration(duration)*time.Second,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ func fetchMetadata(httpClient *http.Client, ctx context.Context, track *deezer.T
|
|||||||
|
|
||||||
if opts.Genre {
|
if opts.Genre {
|
||||||
go func() {
|
go func() {
|
||||||
genre, err := fetchGenre(ctx, httpClient, track.Artist, track.GetTitle())
|
genre, err := fetchGenre(ctx, httpClient, track.Artist, track.FullTitle())
|
||||||
genreChan <- genreResult{value: genre, err: err}
|
genreChan <- genreResult{value: genre, err: err}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ func (pt *progressTracker) startDownload(index int, track *deezer.Track) *spinne
|
|||||||
sp := spinner.New(spinner.CharSets[14], 100*time.Millisecond)
|
sp := spinner.New(spinner.CharSets[14], 100*time.Millisecond)
|
||||||
sp.Writer = os.Stdout
|
sp.Writer = os.Stdout
|
||||||
sp.Prefix = trackProgress + " "
|
sp.Prefix = trackProgress + " "
|
||||||
sp.Suffix = fmt.Sprintf(" Downloading: %s - %s", track.Artist, track.GetTitle())
|
sp.Suffix = fmt.Sprintf(" Downloading: %s - %s", track.Artist, track.FullTitle())
|
||||||
sp.Start()
|
sp.Start()
|
||||||
|
|
||||||
return sp
|
return sp
|
||||||
@@ -51,7 +51,7 @@ func (pt *progressTracker) startDownload(index int, track *deezer.Track) *spinne
|
|||||||
|
|
||||||
func (pt *progressTracker) handleResult(index int, track *deezer.Track, result downloadResult) {
|
func (pt *progressTracker) handleResult(index int, track *deezer.Track, result downloadResult) {
|
||||||
trackProgress := fmt.Sprintf("[%d/%d]", index+1, pt.totalTracks)
|
trackProgress := fmt.Sprintf("[%d/%d]", index+1, pt.totalTracks)
|
||||||
trackTitle := track.GetTitle()
|
trackTitle := track.FullTitle()
|
||||||
|
|
||||||
if result.skipped {
|
if result.skipped {
|
||||||
pt.stats.skipped++
|
pt.stats.skipped++
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
|
|
||||||
func buildTagMetadata(resource deezer.Resource, track *deezer.Track, cover []byte, bpm bpmKey, genre string) tag.Metadata {
|
func buildTagMetadata(resource deezer.Resource, track *deezer.Track, cover []byte, bpm bpmKey, genre string) tag.Metadata {
|
||||||
m := tag.Metadata{
|
m := tag.Metadata{
|
||||||
Title: track.GetTitle(),
|
Title: track.FullTitle(),
|
||||||
Artists: strings.Join(track.Contributors.MainArtists, ", "),
|
Artists: strings.Join(track.Contributors.MainArtists, ", "),
|
||||||
Composers: strings.Join(track.Contributors.Composers, ", "),
|
Composers: strings.Join(track.Contributors.Composers, ", "),
|
||||||
Lyricists: strings.Join(track.Contributors.Authors, ", "),
|
Lyricists: strings.Join(track.Contributors.Authors, ", "),
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ func (d *Downloader) downloadTrack(ctx context.Context, resource deezer.Resource
|
|||||||
return downloadResult{err: fmt.Errorf("failed to fetch media: %w", err)}
|
return downloadResult{err: fmt.Errorf("failed to fetch media: %w", err)}
|
||||||
}
|
}
|
||||||
|
|
||||||
mediaFormat := media.GetFormat()
|
mediaFormat := media.Format()
|
||||||
if opts.Strict && strings.ToLower(mediaFormat) != opts.Quality {
|
if opts.Strict && strings.ToLower(mediaFormat) != opts.Quality {
|
||||||
return downloadResult{err: fmt.Errorf("requested quality '%s' not available", opts.Quality)}
|
return downloadResult{err: fmt.Errorf("requested quality '%s' not available", opts.Quality)}
|
||||||
}
|
}
|
||||||
@@ -31,10 +31,10 @@ func (d *Downloader) downloadTrack(ctx context.Context, resource deezer.Resource
|
|||||||
|
|
||||||
metadataChan := make(chan metadataResult, 1)
|
metadataChan := make(chan metadataResult, 1)
|
||||||
go func() {
|
go func() {
|
||||||
metadataChan <- fetchMetadata(d.deezerClient.Session.HttpClient, ctx, track, opts)
|
metadataChan <- fetchMetadata(d.deezerClient.Session.HTTPClient, ctx, track, opts)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
stream, err := d.deezerClient.GetMediaStream(ctx, media)
|
stream, err := d.deezerClient.MediaStream(ctx, media)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return downloadResult{err: fmt.Errorf("failed to get media stream: %w", err)}
|
return downloadResult{err: fmt.Errorf("failed to get media stream: %w", err)}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user