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.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"),
+21 -16
View File
@@ -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))
}
}
}
+1
View File
@@ -16,6 +16,7 @@ type Options struct {
OutputDir string
Quality string
Timeout time.Duration
BPM bool
}
func (o *Options) Validate(appDir string) error {