Skip to content

Commit 55fba98

Browse files
committed
feat: show menu for playlist items
1 parent 62c21fb commit 55fba98

File tree

3 files changed

+64
-46
lines changed

3 files changed

+64
-46
lines changed

cmd/ytgo/playlist.go

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import (
66
"log"
77
"os"
88
"strings"
9-
10-
"github.com/ergochat/readline"
119
)
1210

1311
type Playlist string
@@ -21,15 +19,7 @@ func (p Playlist) Create() error {
2119
defer playlist.Close()
2220
w := bufio.NewWriter(playlist)
2321

24-
// create line reader for search
25-
rl, err := readline.NewFromConfig(&readline.Config{
26-
Prompt: fmt.Sprintf("%sSearch:%s ", C_CYAN, C_RESET),
27-
VimMode: true,
28-
})
29-
if err != nil {
30-
return err
31-
}
32-
defer rl.Close()
22+
rl := GetReadline()
3323

3424
// keep adding until user quits
3525
for {
@@ -47,7 +37,11 @@ func (p Playlist) Create() error {
4737
if query == "" {
4838
continue
4939
}
50-
v, err := GetVideoFromMenu(query)
40+
vs, err := GetSearchResults(query)
41+
if err != nil {
42+
return err
43+
}
44+
v, err := GetVideoFromMenu(vs)
5145
if err != nil {
5246
return err
5347
}
@@ -61,24 +55,48 @@ func (p Playlist) Create() error {
6155

6256
func (p Playlist) Play(m bool) error {
6357
f := string(p)
58+
prev := BACK_FLAG
59+
for {
60+
vs, err := getPlaylistVideos(f)
61+
if err != nil {
62+
return err
63+
}
64+
v, err := GetVideoFromMenu(vs)
65+
if err != nil {
66+
return err
67+
}
68+
switch v {
69+
case nil:
70+
return nil
71+
case BACK_FLAG:
72+
if prev == BACK_FLAG {
73+
return nil
74+
}
75+
v = prev
76+
}
77+
v.Play(m)
78+
prev = v
79+
}
80+
}
81+
82+
func getPlaylistVideos(f string) (*[]Video, error) {
6483
playlist, err := os.ReadFile(f)
6584
if err != nil {
66-
return err
85+
return nil, err
6786
}
6887
lines := strings.Split(string(playlist), "\n")
88+
var vs []Video
6989
for i := 0; i < len(lines)-1; i++ {
7090
id := lines[i]
7191
if len(id) == 11 {
72-
v := Video{Id: VID(id)}
73-
v.Play(m)
92+
v, err := GetVideoFromURL(VID(id).URL())
93+
if err != nil {
94+
return nil, err
95+
}
96+
vs = append(vs, *v)
7497
} else {
75-
log.Printf("%s[WARN]%s Skipped invalid Video ID: %s\n", C_YELLOW, C_RESET, id)
76-
}
77-
playlist, err := os.ReadFile(f)
78-
if err != nil {
79-
return err
98+
log.Printf("%s[WARN]%s Skipped invalid Video ID on line %d: %s\n", C_YELLOW, C_RESET, i+1, id)
8099
}
81-
lines = strings.Split(string(playlist), "\n")
82100
}
83-
return nil
101+
return &vs, nil
84102
}

cmd/ytgo/ui.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@ import (
55
"github.com/rivo/tview"
66
)
77

8-
func GetVideoFromMenu(query string) (*Video, error) {
9-
vs, err := GetSearchResults(query)
10-
if err != nil {
11-
return nil, err
12-
}
8+
func GetVideoFromMenu(vs *[]Video) (*Video, error) {
139
tview.Styles.PrimitiveBackgroundColor = tcell.ColorDefault
1410
app := tview.NewApplication()
1511
return getVideoFromList(app, vs)

cmd/ytgo/yt.go

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,7 @@ func main() {
6868

6969
// get search query
7070
if p {
71-
home, _ := os.UserHomeDir()
72-
73-
// create line reader for search
74-
rl, err = readline.NewFromConfig(&readline.Config{
75-
Prompt: fmt.Sprintf("%sSearch:%s ", C_CYAN, C_RESET),
76-
HistoryFile: fmt.Sprintf("%s/%s", home, ".ytgo_history"),
77-
HistoryLimit: 48,
78-
HistorySearchFold: true,
79-
VimMode: true,
80-
})
81-
rl.SetVimMode(true)
82-
if err != nil {
83-
log.Fatalln(err)
84-
}
85-
defer rl.Close()
86-
71+
rl = GetReadline()
8772
goto prompt
8873
}
8974
query = strings.Join(flag.Args(), " ")
@@ -103,9 +88,12 @@ entrypoint:
10388
if u {
10489
v, err = GetVideoFromURL(query)
10590
} else if i {
106-
v, err = GetVideoFromMenu(query)
107-
if v == BACK_FLAG {
108-
goto prompt
91+
vs, err := GetSearchResults(query)
92+
if err == nil {
93+
v, err = GetVideoFromMenu(vs)
94+
if v == BACK_FLAG {
95+
goto prompt
96+
}
10997
}
11098
} else {
11199
v, err = GetVideoFromSearch(query, n)
@@ -133,3 +121,19 @@ prompt:
133121
goto entrypoint
134122
}
135123
}
124+
125+
func GetReadline() *readline.Instance {
126+
home, _ := os.UserHomeDir()
127+
rl, err := readline.NewFromConfig(&readline.Config{
128+
Prompt: fmt.Sprintf("%sSearch:%s ", C_CYAN, C_RESET),
129+
HistoryFile: fmt.Sprintf("%s/%s", home, ".ytgo_history"),
130+
HistoryLimit: 48,
131+
HistorySearchFold: true,
132+
VimMode: true,
133+
})
134+
if err != nil {
135+
log.Fatalln(err)
136+
}
137+
defer rl.Close()
138+
return rl
139+
}

0 commit comments

Comments
 (0)