@@ -7,17 +7,57 @@ import (
77 "os/exec"
88 "strings"
99
10+ "github.com/kkdai/youtube/v2"
1011 "github.com/spf13/cobra"
1112)
1213
14+ var (
15+ errNotID = fmt .Errorf ("cannot detect ID in given input" )
16+ )
17+
1318// downloadCmd represents the download command
1419var downloadCmd = & cobra.Command {
1520 Use : "download" ,
16- Short : "Downloads a video from youtube" ,
21+ Short : "Downloads a video or a playlist from youtube" ,
1722 Example : `youtubedr -o "Campaign Diary".mp4 https://www.youtube.com/watch\?v\=XbNghLqsVwU` ,
1823 Args : cobra .ExactArgs (1 ),
1924 Run : func (cmd * cobra.Command , args []string ) {
20- exitOnError (download (args [0 ]))
25+ if playlistID , err := youtube .ExtractPlaylistID (args [0 ]); err != nil {
26+ if videoID , err := youtube .ExtractVideoID (args [0 ]); err != nil {
27+ exitOnError (errNotID )
28+ } else {
29+ log .Printf (
30+ "download video %s to directory %s\n " ,
31+ videoID ,
32+ outputDir ,
33+ )
34+ exitOnError (download (videoID ))
35+ }
36+ } else {
37+ if playlist , err := getDownloader ().GetPlaylist (playlistID ); err != nil {
38+ exitOnError (err )
39+ } else {
40+ log .Printf (
41+ "download %d videos from playlist %s to directory %s\n " ,
42+ len (playlist .Videos ),
43+ playlist .ID ,
44+ outputDir ,
45+ )
46+ var errors []error
47+ outputFileOrigin := outputFile
48+ for i , v := range playlist .Videos {
49+ if len (outputFileOrigin ) != 0 {
50+ outputFile = fmt .Sprintf ("%s-%d" , outputFile , i )
51+ }
52+ if err := download (v .ID ); err != nil {
53+ errors = append (errors , err )
54+ }
55+ }
56+ if len (errors ) > 0 {
57+ exitOnErrors (errors )
58+ }
59+ }
60+ }
2161 },
2262}
2363
3070func init () {
3171 rootCmd .AddCommand (downloadCmd )
3272
33- downloadCmd .Flags ().StringVarP (& outputFile , "filename" , "o" , "" , "The output file, the default is genated by the video title." )
73+ downloadCmd .Flags ().StringVarP (& outputFile , "filename" , "o" , "" , "The output file, the default is generated from the video title." )
3474 downloadCmd .Flags ().StringVarP (& outputDir , "directory" , "d" , "." , "The output directory." )
3575 addQualityFlag (downloadCmd .Flags ())
3676 addMimeTypeFlag (downloadCmd .Flags ())
@@ -42,8 +82,6 @@ func download(id string) error {
4282 return err
4383 }
4484
45- log .Println ("download to directory" , outputDir )
46-
4785 if strings .HasPrefix (outputQuality , "hd" ) {
4886 if err := checkFFMPEG (); err != nil {
4987 return err
0 commit comments