-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplaylist.go
113 lines (89 loc) · 2.33 KB
/
playlist.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
"github.com/itchyny/gojq"
)
type Track struct {
Title string
Artist string
ID string
}
// main playlist slice
var playlist []Track
// current position in playlist
var playlistIndex int = -1
func downloadPlaylist() {
req, err := http.NewRequest("GET", fmt.Sprintf("https://www.last.fm/player/station/user/%s/mix", config.Username), nil)
if err != nil {
log.Fatal(err)
}
params := req.URL.Query()
req.URL.RawQuery = params.Encode()
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
mixJSON, err := io.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
err = os.WriteFile(playlistFile, mixJSON, 0744)
if err != nil {
log.Fatal(err)
}
}
// read playlist JSON and return a slice of tracks
// TODO: replace with call to get new playlist
func readPlaylist() []Track {
playlistTracksJSON, err := os.ReadFile(playlistFile)
if err != nil {
log.Fatal(err)
}
// unpack playlist JSON into map
var playlistTracksMap map[string]any
json.Unmarshal(playlistTracksJSON, &playlistTracksMap)
// query to parse JSON into tracks
playlistQuery, err := gojq.Parse(".playlist[]")
if err != nil {
log.Fatalln(err)
}
var playlistSlice []Track
// run the query on JSON, iterate through tracks and add to slice
iter := playlistQuery.Run(playlistTracksMap)
for trackMap, ok := iter.Next(); ok; trackMap, ok = iter.Next() {
trackTitleQuery, _ := gojq.Parse(".name")
trackTitle, _ := trackTitleQuery.Run(trackMap).Next()
trackArtistQuery, _ := gojq.Parse(".artists[0].name")
trackArtist, _ := trackArtistQuery.Run(trackMap).Next()
trackIDQuery, _ := gojq.Parse(".playlinks[0].id")
trackID, _ := trackIDQuery.Run(trackMap).Next()
newTrack := Track{Title: trackTitle.(string), Artist: trackArtist.(string), ID: trackID.(string)}
playlistSlice = append(playlistSlice, newTrack)
}
return playlistSlice
}
func refreshPlaylist() {
deleteDownloadedTracks()
downloadPlaylist()
playlist = readPlaylist()
setPlaylistIndex(-1)
playlistList.Refresh()
}
func expandPlaylist() {
downloadPlaylist()
playlist = append(playlist, readPlaylist()...)
playlistList.Refresh()
}
func playlistFileExists() bool {
_, err := os.Stat(playlistFile)
return err == nil
}
func playlistSelect(idx int) {
playChannel <- idx
}