@@ -7,14 +7,20 @@ import (
7
7
"github.com/faiface/beep"
8
8
"github.com/faiface/beep/speaker"
9
9
"github.com/gdamore/tcell"
10
+ "strconv"
10
11
"strings"
11
12
"time"
12
13
"unicode"
13
14
)
14
15
15
- var topics = map [string ]string {
16
- "55483ddee4b03ccbae843925" : "晚安电台" ,
17
- "5a1ccf936e6e7c0011037480" : "即友在听什么歌" ,
16
+ type Topic struct {
17
+ id string
18
+ name string
19
+ }
20
+
21
+ var topics = []Topic {
22
+ {id : "55483ddee4b03ccbae843925" , name : "晚安电台" },
23
+ {id : "5a1ccf936e6e7c0011037480" , name : "即友在听什么歌" },
18
24
}
19
25
20
26
var CurrentSession * jike.Session
@@ -29,26 +35,50 @@ type JikeFm struct {
29
35
playlist []jike.Message
30
36
player * Player
31
37
currentMusic Music
32
- currentTopic string
38
+ currentTopicIndex int
33
39
nextMusicIndex int
34
40
skip string
41
+ more chan bool
35
42
}
36
43
37
44
func newFm () * JikeFm {
38
45
p := & JikeFm {
39
- currentTopic :"55483ddee4b03ccbae843925" ,
46
+ currentTopicIndex : 0 ,
47
+ more : make (chan bool , 1 ),
40
48
}
41
49
p .player = newPlayer (p .iter )
42
50
p .nextMusicIndex = 0
51
+ go p .fetchMore ()
43
52
return p
44
53
}
45
54
46
- func (p * JikeFm ) feed () {
47
- res , next , _ := jike .FetchMoreSelectedFM (CurrentSession , p .currentTopic , p .skip )
48
- for _ , msg := range res {
49
- p .playlist = append (p .playlist , msg )
55
+ func (p * JikeFm ) fetchMore () {
56
+ for {
57
+ <- p .more
58
+ msgs := p .feed ()
59
+
60
+ UI .app .QueueUpdateDraw (func () {
61
+ currentLen := len (p .playlist )
62
+ p .addToPlaylist (msgs )
63
+ updateTotalSong (len (p .playlist ))
64
+ if p .nextMusicIndex == 0 {
65
+ p .nextMusicIndex = currentLen
66
+ }
67
+ })
50
68
}
69
+ }
70
+
71
+ func (p * JikeFm ) feed () []jike.Message {
72
+ res , next , _ := jike .FetchMoreSelectedFM (CurrentSession , topics [p .currentTopicIndex ].id , p .skip )
51
73
p .skip = next
74
+ return res
75
+ }
76
+
77
+ func (p * JikeFm ) addToPlaylist (messages []jike.Message ) {
78
+ for _ , msg := range messages {
79
+ p .playlist = append (p .playlist , msg )
80
+ UI .side .AddItem (normalText (len (p .playlist ), msg .GetTitle ()), "" , 0 , nil )
81
+ }
52
82
}
53
83
54
84
func (p * JikeFm ) play () {
@@ -82,6 +112,9 @@ func (p *JikeFm) onSelectChange(index int, _ string, _ string, _ rune) {
82
112
if index >= len (p .playlist ) {
83
113
i = index - len (p .playlist )
84
114
}
115
+ if index == len (p .playlist ) - 1 {
116
+ p .queueMore ()
117
+ }
85
118
msg := p .playlist [i ]
86
119
UI .main .SetText (msg .Content )
87
120
UI .mainAuthor .SetText ("[green]@" + msg .User .ScreenName )
@@ -104,24 +137,34 @@ func (p *JikeFm) changeSong(from int, target int) {
104
137
if from >= 0 {
105
138
UI .side .SetItemText (
106
139
from ,
107
- normalText (from , p .playlist [from ].GetTitle ()),
140
+ normalText (from + 1 , p .playlist [from ].GetTitle ()),
108
141
"" ,
109
142
)
110
143
}
111
144
UI .side .SetItemText (
112
145
target ,
113
- playingText (target , p .playlist [target ].GetTitle ()),
146
+ playingText (target + 1 , p .playlist [target ].GetTitle ()),
114
147
"" ,
115
148
)
116
149
}
117
150
151
+ func (p * JikeFm ) queueMore () {
152
+ select {
153
+ case p .more <- true :
154
+ default :
155
+ }
156
+ }
157
+
118
158
func (p * JikeFm ) iter () beep.Streamer {
119
159
if len (p .playlist ) == 0 {
120
160
return nil
121
161
}
122
162
stream := p .playIndex (p .nextMusicIndex )
123
- var next int
124
- if next = p .nextMusicIndex + 1 ; next >= len (p .playlist ) {
163
+ next := p .nextMusicIndex + 1
164
+ if next > len (p .playlist ) - 1 {
165
+ p .queueMore ()
166
+ }
167
+ if next >= len (p .playlist ) {
125
168
next = 0
126
169
}
127
170
p .nextMusicIndex = next
@@ -133,10 +176,17 @@ func (p *JikeFm) handle(event *tcell.EventKey) *tcell.EventKey {
133
176
switch event .Key () {
134
177
case tcell .KeyESC :
135
178
UI .app .Stop ()
179
+ case tcell .KeyCtrlN :
180
+ return nil
181
+ case tcell .KeyCtrlP :
182
+ return nil
183
+ case tcell .KeyTab :
184
+ return nil
136
185
case tcell .KeyRune :
137
186
switch unicode .ToLower (event .Rune ()) {
138
187
case ' ' :
139
188
p .player .togglePlay ()
189
+ return nil
140
190
}
141
191
}
142
192
return event
@@ -148,30 +198,23 @@ func main() {
148
198
149
199
defer fm .player .close ()
150
200
151
- for {
152
- fm .feed ()
153
- if len (fm .playlist ) > 20 {
154
- break
155
- }
156
- }
201
+ fm .addToPlaylist (fm .feed ())
202
+ updateTotalSong (len (fm .playlist ))
157
203
158
204
fm .onSelectChange (0 , "" , "" , 0 )
159
205
160
- for index , msg := range fm .playlist {
161
- UI .side .AddItem (normalText (index , msg .GetTitle ()), "" , 0 , nil )
162
- }
163
-
164
206
UI .side .
165
207
SetChangedFunc (fm .onSelectChange ).
166
208
SetSelectedFunc (fm .onEnterPlay ).
167
209
ShowSecondaryText (false )
168
210
UI .app .SetInputCapture (fm .handle )
169
211
170
212
var s []string
171
- for id , topicName := range topics {
172
- s = append (s , fmt .Sprintf (`["%s "]%s[""]` , id , topicName ))
213
+ for index , topic := range topics {
214
+ s = append (s , fmt .Sprintf (`["%d "]%s[""]` , index , topic . name ))
173
215
}
174
216
UI .footerTopic .SetText ("| " + strings .Join (s , " | " ) + " |" )
217
+ UI .footerTopic .Highlight (strconv .Itoa (fm .currentTopicIndex ))
175
218
176
219
fm .play ()
177
220
0 commit comments