-
Notifications
You must be signed in to change notification settings - Fork 4
/
mpd_playlist.go
141 lines (126 loc) · 3.03 KB
/
mpd_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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package player
// Implement playlist functions for MPD backand
import (
"errors"
"log"
"github.com/werkshy/pickup/model"
)
/**
* Implement playlist interface via mpd
*/
func (player MpdPlayer) List() (results []PlaylistTrack, err error) {
results = []PlaylistTrack{} // initialize to empty array otherwise it gets marshalled to null.
info, err := player.conn.PlaylistInfo(-1, -1)
if err != nil {
log.Printf("Failed to get playlist info from mpd\n")
return nil, err
}
for _, entry := range info {
//log.Printf("%q\n", entry)
track := PlaylistTrack{
entry["Pos"],
entry["Title"],
entry["Artist"],
entry["Album"],
entry["Path"],
"mpd"}
track.cleanUp(entry["file"])
results = append(results, track)
}
return results, nil
}
func (player MpdPlayer) AddAlbum(album *model.Album) (err error) {
log.Printf("Adding album %s - %s (%s)\n", album.Artist, album.Name,
album.Path)
return player.conn.Add(album.Path)
}
func (player MpdPlayer) AddTrack(track *model.Track) (err error) {
log.Printf("Adding track %v\n", track)
return player.conn.Add(track.Path)
}
func (player MpdPlayer) AddTracks(tracks []*model.Track) (err error) {
for _, track := range tracks {
log.Printf("Adding track %s\n", track)
err := player.AddTrack(track)
if err != nil {
return err
}
}
return nil
}
func (player MpdPlayer) Clear() (err error) {
log.Println("Clearing playlist")
player.conn.Clear()
return nil
}
func (t *PlaylistTrack) cleanUp(file string) {
if t.Name != "" {
return
}
_, artist, album, track, err := model.PathToParts(file)
if err != nil {
track = "unknown"
artist = "unknown"
album = "unknown"
}
if t.Name == "" {
t.Name = track
}
if t.Artist == "" {
t.Artist = artist
}
if t.Album == "" {
t.Album = album
}
}
func (player *MpdPlayer) doPlaylistCommand(cmd *PlaylistCommand, music model.Collection) (err error) {
switch cmd.Command {
case "add":
err = player.doAddCommand(cmd, music)
case "clear":
err = player.Clear()
}
return err
}
func (player *MpdPlayer) doAddCommand(cmd *PlaylistCommand, music model.Collection) (err error) {
if cmd.Album == "" {
log.Printf("Don't play artists (or nulls)\n")
return errors.New("Playing artists is not implemented")
}
log.Printf("Trying to add %s/%s/%s/%s to playlist (%v)\n",
cmd.Category, cmd.Artist, cmd.Album, cmd.Track, cmd.Immediate)
var album *model.Album = nil
var track *model.Track = nil
if cmd.Track == "" {
album, err = model.GetAlbum(&music, cmd.Category, cmd.Artist,
cmd.Album)
} else {
track, err = model.GetTrack(&music, cmd.Category, cmd.Artist,
cmd.Album, cmd.Track)
}
if err != nil {
log.Printf("Album not found.")
return err
}
if cmd.Immediate {
err = player.Clear()
if err != nil {
log.Printf("Error clearing playlist")
return err
}
}
if track != nil {
err = player.AddTrack(track)
}
if album != nil {
err = player.AddAlbum(album)
}
if err != nil {
log.Printf("Error adding album or track %s/%s", cmd.Album, cmd.Track)
return err
}
if cmd.Immediate {
err = player.Play()
}
return err
}