11package main
22
33import (
4+ "bufio"
5+ "errors"
46 "flag"
57 "fmt"
68 "log"
@@ -10,7 +12,7 @@ import (
1012 "github.com/ergochat/readline"
1113)
1214
13- const VERSION string = "v3.2 .0"
15+ const VERSION string = "v3.3 .0"
1416
1517const (
1618 C_RED string = "\x1b [31m"
@@ -24,6 +26,7 @@ func main() {
2426 // command-line args
2527 d , i , m , p , u , ver bool
2628 n int
29+ f string
2730 // declare vars
2831 err error
2932 query string
@@ -38,6 +41,7 @@ func main() {
3841 flag .BoolVar (& m , "m" , false , "Play music only" )
3942 flag .BoolVar (& p , "p" , false , "Prompt mode" )
4043 flag .BoolVar (& u , "u" , false , "Play from URL" )
44+ flag .StringVar (& f , "f" , "" , "Play from playlist file" )
4145 flag .IntVar (& n , "n" , 1 , "Play nth media" )
4246 flag .Parse ()
4347
@@ -47,6 +51,77 @@ func main() {
4751 return
4852 }
4953
54+ // playlist functionality
55+ if f != "" {
56+ _ , err := os .Stat (f ) // check if file exists
57+ if errors .Is (err , os .ErrNotExist ) { // create mode
58+ playlist , err := os .Create (f )
59+ if err != nil {
60+ log .Fatalln (err )
61+ }
62+ defer playlist .Close ()
63+ w := bufio .NewWriter (playlist )
64+
65+ // create line reader for search
66+ rl , err = readline .NewFromConfig (& readline.Config {
67+ Prompt : fmt .Sprintf ("%sSearch:%s " , C_CYAN , C_RESET ),
68+ VimMode : true ,
69+ })
70+ if err != nil {
71+ log .Fatalln (err )
72+ }
73+ defer rl .Close ()
74+
75+ // keep adding until user quits
76+ for {
77+ query , err = rl .ReadLine ()
78+ if err != nil {
79+ info , err := playlist .Stat ()
80+ if err != nil {
81+ log .Fatalln (err )
82+ }
83+ if info .Size () == 0 {
84+ os .Remove (f )
85+ }
86+ return // exit on EOF/SIGINT
87+ }
88+ if query == "" {
89+ continue
90+ }
91+ v , err = GetVideoFromMenu (query )
92+ if err != nil {
93+ log .Fatalln (err )
94+ }
95+ _ , err := fmt .Fprintln (w , v .Id )
96+ if err != nil {
97+ log .Fatalln (err )
98+ }
99+ w .Flush ()
100+ }
101+ } else { // play mode
102+ playlist , err := os .ReadFile (f )
103+ if err != nil {
104+ log .Fatalln (err )
105+ }
106+ lines := strings .Split (string (playlist ), "\n " )
107+ for i := 0 ; i < len (lines )- 1 ; i ++ {
108+ id := lines [i ]
109+ if len (id ) == 11 {
110+ v := Video {Id : VID (id )}
111+ v .Play (m )
112+ } else {
113+ log .Println ("[WARN] Skipped invalid Video ID:" , id )
114+ }
115+ playlist , err := os .ReadFile (f )
116+ if err != nil {
117+ log .Fatalln (err )
118+ }
119+ lines = strings .Split (string (playlist ), "\n " )
120+ }
121+ }
122+ return
123+ }
124+
50125 // get search query
51126 if p {
52127 home , _ := os .UserHomeDir ()
0 commit comments