Skip to content

Commit b7fea21

Browse files
committed
feat: add playlist feature
1 parent fd3f1c0 commit b7fea21

File tree

1 file changed

+76
-1
lines changed

1 file changed

+76
-1
lines changed

cmd/ytgo/yt.go

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package main
22

33
import (
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

1517
const (
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

Comments
 (0)