feat(cli): add bpm flag to enable BPM and key tagging
This commit is contained in:
@@ -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"),
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user