diff --git a/cmd/download.go b/cmd/download.go index 87edd23..ce97f77 100644 --- a/cmd/download.go +++ b/cmd/download.go @@ -23,6 +23,7 @@ func init() { downloadCmd.PersistentFlags().StringVarP(&opts.OutputDir, "output", "o", "", "output directory (default $HOME/Music/GoDeez)") downloadCmd.PersistentFlags().StringVarP(&opts.Quality, "quality", "q", "best", "download quality [mp3_128, mp3_320, flac, best]") downloadCmd.PersistentFlags().DurationVarP(&opts.Timeout, "timeout", "t", 2*time.Minute, "timeout for each download (e.g. 10s, 1m, 2m30s)") + downloadCmd.PersistentFlags().BoolVar(&opts.BPM, "bpm", false, "fetch BPM/key and add to file tags") downloadCmd.AddCommand( newDownloadCmd("album"), diff --git a/internal/downloader/client.go b/internal/downloader/client.go index 9905393..b023dab 100644 --- a/internal/downloader/client.go +++ b/internal/downloader/client.go @@ -161,18 +161,21 @@ func (c *Client) downloadSong(ctx context.Context, resource deezer.Resource, son return warnings, SkipError{Path: path} } - metricsChan := make(chan *bpm.Metrics, 1) - errChan := make(chan error, 1) + var metricsChan chan *bpm.Metrics + var errChan chan error + if opts.BPM { + metricsChan = make(chan *bpm.Metrics, 1) + errChan = make(chan error, 1) + go func() { + metrics, err := bpm.FetchMetrics(ctx, c.deezerClient.Session.HttpClient, song.Artist, song.Title, song.Duration) + if err != nil { + errChan <- err + return + } - go func() { - metrics, err := bpm.FetchMetrics(ctx, c.deezerClient.Session.HttpClient, song.Artist, song.GetTitle(), song.Duration) - if err != nil { - errChan <- err - return - } - - metricsChan <- metrics - }() + metricsChan <- metrics + }() + } stream, err := c.deezerClient.GetMediaStream(ctx, media, song.ID) if err != nil { @@ -190,11 +193,13 @@ func (c *Client) downloadSong(ctx context.Context, resource deezer.Resource, son } metrics := &bpm.Metrics{} - select { - case metrics = <-metricsChan: - case err := <-errChan: - if !errors.Is(err, context.Canceled) { - warnings = append(warnings, fmt.Sprintf("failed to fetch BPM and key: %v", err)) + if opts.BPM { + select { + case metrics = <-metricsChan: + case err := <-errChan: + if !errors.Is(err, context.Canceled) { + warnings = append(warnings, fmt.Sprintf("failed to fetch BPM and key: %v", err)) + } } } diff --git a/internal/downloader/options.go b/internal/downloader/options.go index 9a5550c..0c9227d 100644 --- a/internal/downloader/options.go +++ b/internal/downloader/options.go @@ -16,6 +16,7 @@ type Options struct { OutputDir string Quality string Timeout time.Duration + BPM bool } func (o *Options) Validate(appDir string) error {