diff --git a/internal/deezer/album.go b/internal/deezer/album.go index d860c15..b4e87ec 100644 --- a/internal/deezer/album.go +++ b/internal/deezer/album.go @@ -26,11 +26,11 @@ type Album struct { } `json:"results"` } -func (a *Album) GetTitle() string { +func (a *Album) Title() string { return a.Results.Data.Title } -func (a *Album) GetTracks() []*Track { +func (a *Album) Tracks() []*Track { return a.Results.Tracks.Data } @@ -38,12 +38,12 @@ func (a *Album) SetTracks(t []*Track) { 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, _ = filenamify.Filenamify(base, filenamify.Options{}) return path.Join(outputDir, base) } -func (a *Album) Unmarshal(data []byte) error { +func (a *Album) decode(data []byte) error { return json.Unmarshal(data, a) } diff --git a/internal/deezer/artist.go b/internal/deezer/artist.go index 52b17f0..bee54f6 100644 --- a/internal/deezer/artist.go +++ b/internal/deezer/artist.go @@ -18,11 +18,11 @@ type Artist struct { } `json:"results"` } -func (a *Artist) GetTitle() string { +func (a *Artist) Title() string { return a.Results.Data.Name } -func (a *Artist) GetTracks() []*Track { +func (a *Artist) Tracks() []*Track { return a.Results.Tracks.Data } @@ -30,11 +30,11 @@ func (a *Artist) SetTracks(t []*Track) { 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{}) return path.Join(outputDir, base) } -func (a *Artist) Unmarshal(data []byte) error { +func (a *Artist) decode(data []byte) error { return json.Unmarshal(data, a) } diff --git a/internal/deezer/client.go b/internal/deezer/client.go index 484e1e2..80364fa 100644 --- a/internal/deezer/client.go +++ b/internal/deezer/client.go @@ -83,7 +83,7 @@ func (c *Client) FetchResource(ctx context.Context, kind Kind, id string) (Resou return nil, err } - resp, err := c.Session.HttpClient.Do(req) + resp, err := c.Session.HTTPClient.Do(req) if err != nil { 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") } - if err := resource.Unmarshal(body); err != nil { + if err := resource.decode(body); err != nil { return nil, err } @@ -137,7 +137,7 @@ func (c *Client) FetchMedia(ctx context.Context, track *Track, quality string) ( return nil, err } - resp, err := c.Session.HttpClient.Do(req) + resp, err := c.Session.HTTPClient.Do(req) if err != nil { return nil, err } @@ -185,7 +185,7 @@ func (c *Client) FetchCoverImage(ctx context.Context, track *Track) ([]byte, err return nil, err } - resp, err := c.Session.HttpClient.Do(req) + resp, err := c.Session.HTTPClient.Do(req) if err != nil { return nil, err } @@ -198,13 +198,13 @@ func (c *Client) FetchCoverImage(ctx context.Context, track *Track) ([]byte, err return io.ReadAll(resp.Body) } -func (c *Client) GetMediaStream(ctx context.Context, media *Media) (io.ReadCloser, error) { - req, err := http.NewRequestWithContext(ctx, "GET", media.GetURL(), nil) +func (c *Client) MediaStream(ctx context.Context, media *Media) (io.ReadCloser, error) { + req, err := http.NewRequestWithContext(ctx, "GET", media.URL(), nil) if err != nil { return nil, err } - streamingClient := *c.Session.HttpClient + streamingClient := *c.Session.HTTPClient streamingClient.Timeout = 0 resp, err := streamingClient.Do(req) diff --git a/internal/deezer/media.go b/internal/deezer/media.go index 9347339..8128c57 100644 --- a/internal/deezer/media.go +++ b/internal/deezer/media.go @@ -18,10 +18,10 @@ type mediaError struct { Message string `json:"message"` } -func (m *Media) GetURL() string { +func (m *Media) URL() string { 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 } diff --git a/internal/deezer/playlist.go b/internal/deezer/playlist.go index 7b532d1..326e061 100644 --- a/internal/deezer/playlist.go +++ b/internal/deezer/playlist.go @@ -20,11 +20,11 @@ type Playlist struct { } `json:"results"` } -func (p *Playlist) GetTitle() string { +func (p *Playlist) Title() string { return p.Results.Data.Title } -func (p *Playlist) GetTracks() []*Track { +func (p *Playlist) Tracks() []*Track { return p.Results.Tracks.Data } @@ -32,11 +32,11 @@ func (p *Playlist) SetTracks(t []*Track) { 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{}) return path.Join(outputDir, base) } -func (p *Playlist) Unmarshal(data []byte) error { +func (p *Playlist) decode(data []byte) error { return json.Unmarshal(data, p) } diff --git a/internal/deezer/resource.go b/internal/deezer/resource.go index 3efefa2..e07b963 100644 --- a/internal/deezer/resource.go +++ b/internal/deezer/resource.go @@ -1,9 +1,9 @@ package deezer type Resource interface { - GetTitle() string - GetTracks() []*Track + Title() string + Tracks() []*Track SetTracks(tracks []*Track) - GetOutputDir(outputDir string) string - Unmarshal(data []byte) error + OutputDir(outputDir string) string + decode(data []byte) error } diff --git a/internal/deezer/session.go b/internal/deezer/session.go index e00c86e..8d13067 100644 --- a/internal/deezer/session.go +++ b/internal/deezer/session.go @@ -13,7 +13,7 @@ import ( type Session struct { APIToken string LicenseToken string - HttpClient *http.Client + HTTPClient *http.Client Premium bool } @@ -78,7 +78,7 @@ func authenticate(ctx context.Context, arlCookie string) (*Session, error) { return &Session{ APIToken: res.Results.APIToken, LicenseToken: opts.LicenseToken, - HttpClient: client, + HTTPClient: client, Premium: opts.MobileOffline || opts.WebOffline, }, nil } diff --git a/internal/deezer/single.go b/internal/deezer/single.go index b5fa71b..4f8578e 100644 --- a/internal/deezer/single.go +++ b/internal/deezer/single.go @@ -11,14 +11,14 @@ type Single struct { } `json:"results"` } -func (s *Single) GetTitle() string { +func (s *Single) Title() string { if s.Results.Data == nil { 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 { return nil } @@ -27,10 +27,10 @@ func (s *Single) GetTracks() []*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") } -func (s *Single) Unmarshal(data []byte) error { +func (s *Single) decode(data []byte) error { return json.Unmarshal(data, s) } diff --git a/internal/deezer/track.go b/internal/deezer/track.go index 79098c2..7707b9e 100644 --- a/internal/deezer/track.go +++ b/internal/deezer/track.go @@ -40,7 +40,7 @@ type Track struct { TrackToken string `json:"TRACK_TOKEN"` } -func (t *Track) GetTitle() string { +func (t *Track) FullTitle() string { if 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}) return fileName } diff --git a/internal/download/download.go b/internal/download/download.go index c5a0e6e..a97339c 100644 --- a/internal/download/download.go +++ b/internal/download/download.go @@ -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) } - tracks := resource.GetTracks() + tracks := resource.Tracks() if len(tracks) == 0 { if d.kind == deezer.KindTrack { 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]) } - outputDir := resource.GetOutputDir(d.appConfig.OutputDir) + outputDir := resource.OutputDir(d.appConfig.OutputDir) if err := fsutil.EnsureDir(outputDir); err != nil { 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 { - tracks := resource.GetTracks() + tracks := resource.Tracks() startTime := time.Now() if d.kind != deezer.KindTrack { diff --git a/internal/download/info.go b/internal/download/info.go index ec40bdb..da9037d 100644 --- a/internal/download/info.go +++ b/internal/download/info.go @@ -81,7 +81,7 @@ func artistInfo(a *deezer.Artist) string { fmt.Fprintf(&b, "Top %d most popular tracks:\n", limit) for i := 0; i < limit; 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") @@ -104,7 +104,7 @@ Title: %s Artist: %s Duration: %s ==================================================`, - s.Results.Data.GetTitle(), + s.Results.Data.FullTitle(), s.Results.Data.Artist, time.Duration(duration)*time.Second, ) diff --git a/internal/download/metadata.go b/internal/download/metadata.go index f910b4f..699b866 100644 --- a/internal/download/metadata.go +++ b/internal/download/metadata.go @@ -46,7 +46,7 @@ func fetchMetadata(httpClient *http.Client, ctx context.Context, track *deezer.T if opts.Genre { 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} }() } diff --git a/internal/download/progress.go b/internal/download/progress.go index 60e765d..efd2a3a 100644 --- a/internal/download/progress.go +++ b/internal/download/progress.go @@ -43,7 +43,7 @@ func (pt *progressTracker) startDownload(index int, track *deezer.Track) *spinne sp := spinner.New(spinner.CharSets[14], 100*time.Millisecond) sp.Writer = os.Stdout 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() 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) { trackProgress := fmt.Sprintf("[%d/%d]", index+1, pt.totalTracks) - trackTitle := track.GetTitle() + trackTitle := track.FullTitle() if result.skipped { pt.stats.skipped++ diff --git a/internal/download/tagmeta.go b/internal/download/tagmeta.go index 95827d8..80a3513 100644 --- a/internal/download/tagmeta.go +++ b/internal/download/tagmeta.go @@ -9,7 +9,7 @@ import ( func buildTagMetadata(resource deezer.Resource, track *deezer.Track, cover []byte, bpm bpmKey, genre string) tag.Metadata { m := tag.Metadata{ - Title: track.GetTitle(), + Title: track.FullTitle(), Artists: strings.Join(track.Contributors.MainArtists, ", "), Composers: strings.Join(track.Contributors.Composers, ", "), Lyricists: strings.Join(track.Contributors.Authors, ", "), diff --git a/internal/download/track.go b/internal/download/track.go index cf47b14..deba0de 100644 --- a/internal/download/track.go +++ b/internal/download/track.go @@ -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)} } - mediaFormat := media.GetFormat() + mediaFormat := media.Format() if opts.Strict && strings.ToLower(mediaFormat) != 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) 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 { return downloadResult{err: fmt.Errorf("failed to get media stream: %w", err)} } diff --git a/internal/update/updater.go b/internal/update/update.go similarity index 100% rename from internal/update/updater.go rename to internal/update/update.go