feat(cli): add bpm flag to enable BPM and key tagging

This commit is contained in:
Mathis Maquenne
2025-05-19 14:24:22 +02:00
parent adfd71204d
commit 674eb99ffd
3 changed files with 23 additions and 16 deletions
+1
View File
@@ -23,6 +23,7 @@ func init() {
downloadCmd.PersistentFlags().StringVarP(&opts.OutputDir, "output", "o", "", "output directory (default $HOME/Music/GoDeez)") 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().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().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( downloadCmd.AddCommand(
newDownloadCmd("album"), newDownloadCmd("album"),
+9 -4
View File
@@ -161,11 +161,13 @@ func (c *Client) downloadSong(ctx context.Context, resource deezer.Resource, son
return warnings, SkipError{Path: path} return warnings, SkipError{Path: path}
} }
metricsChan := make(chan *bpm.Metrics, 1) var metricsChan chan *bpm.Metrics
errChan := make(chan error, 1) var errChan chan error
if opts.BPM {
metricsChan = make(chan *bpm.Metrics, 1)
errChan = make(chan error, 1)
go func() { go func() {
metrics, err := bpm.FetchMetrics(ctx, c.deezerClient.Session.HttpClient, song.Artist, song.GetTitle(), song.Duration) metrics, err := bpm.FetchMetrics(ctx, c.deezerClient.Session.HttpClient, song.Artist, song.Title, song.Duration)
if err != nil { if err != nil {
errChan <- err errChan <- err
return return
@@ -173,6 +175,7 @@ func (c *Client) downloadSong(ctx context.Context, resource deezer.Resource, son
metricsChan <- metrics metricsChan <- metrics
}() }()
}
stream, err := c.deezerClient.GetMediaStream(ctx, media, song.ID) stream, err := c.deezerClient.GetMediaStream(ctx, media, song.ID)
if err != nil { if err != nil {
@@ -190,6 +193,7 @@ func (c *Client) downloadSong(ctx context.Context, resource deezer.Resource, son
} }
metrics := &bpm.Metrics{} metrics := &bpm.Metrics{}
if opts.BPM {
select { select {
case metrics = <-metricsChan: case metrics = <-metricsChan:
case err := <-errChan: case err := <-errChan:
@@ -197,6 +201,7 @@ func (c *Client) downloadSong(ctx context.Context, resource deezer.Resource, son
warnings = append(warnings, fmt.Sprintf("failed to fetch BPM and key: %v", err)) warnings = append(warnings, fmt.Sprintf("failed to fetch BPM and key: %v", err))
} }
} }
}
cover, err := c.deezerClient.FetchCoverImage(ctx, song) cover, err := c.deezerClient.FetchCoverImage(ctx, song)
if err != nil && !errors.Is(err, context.Canceled) { if err != nil && !errors.Is(err, context.Canceled) {
+1
View File
@@ -16,6 +16,7 @@ type Options struct {
OutputDir string OutputDir string
Quality string Quality string
Timeout time.Duration Timeout time.Duration
BPM bool
} }
func (o *Options) Validate(appDir string) error { func (o *Options) Validate(appDir string) error {