diff --git a/cmd/download.go b/cmd/download.go index ff05bd1..fc119c6 100644 --- a/cmd/download.go +++ b/cmd/download.go @@ -3,6 +3,7 @@ package cmd import ( "fmt" "os" + "path" "github.com/mathismqn/godeez/internal/deezer" "github.com/spf13/cobra" @@ -16,6 +17,8 @@ var downloadCmd = &cobra.Command{ cmd.Help() return } + + output, _ := cmd.Flags().GetString("output") nAlbums := len(args) for i, id := range args { @@ -26,6 +29,15 @@ var downloadCmd = &cobra.Command{ continue } fmt.Println(" done") + + output = path.Join(output, fmt.Sprintf("%s - %s", album.Data.ArtistName, album.Data.Name)) + if _, err := os.Stat(output); os.IsNotExist(err) { + if err := os.MkdirAll(output, 0755); err != nil { + fmt.Fprintf(os.Stderr, " could not create output directory: %v\n", err) + continue + } + } + fmt.Printf("Starting download of %s", album.Data.Name) for _, song := range album.Songs.Data { @@ -44,8 +56,8 @@ var downloadCmd = &cobra.Command{ songTitle = fmt.Sprintf("%s %s", song.Title, song.Version) } - filename := fmt.Sprintf("%s - %s.flac", song.ArtistName, songTitle) - err = media.Download(filename, song.ID) + path := path.Join(output, fmt.Sprintf("%s - %s.flac", song.ArtistName, songTitle)) + err = media.Download(path, song.ID) if err != nil { fmt.Fprintf(os.Stderr, " could not download song: %v\n", err) continue @@ -58,4 +70,5 @@ var downloadCmd = &cobra.Command{ func init() { rootCmd.AddCommand(downloadCmd) + downloadCmd.Flags().StringP("output", "o", "", "output directory (default is current directory)") } diff --git a/internal/deezer/media.go b/internal/deezer/media.go index 8473b7a..74cc841 100644 --- a/internal/deezer/media.go +++ b/internal/deezer/media.go @@ -36,7 +36,7 @@ type Source struct { const ChunkSize = 2048 -func (m *Media) Download(filename, songID string) error { +func (m *Media) Download(path, songID string) error { url := m.Data[0].Media[0].Sources[0].URL resp, err := http.Get(url) @@ -49,7 +49,7 @@ func (m *Media) Download(filename, songID string) error { return fmt.Errorf("unexpected status code: %d", resp.StatusCode) } - file, err := os.Create(filename) + file, err := os.Create(path) if err != nil { return err }