-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
110 lines (102 loc) · 2.8 KB
/
main.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
package main
import (
"./lastfmclient"
"./mpdclient"
"flag"
"log"
"time"
)
var (
currentSong *mpdclient.Song
mpdClient *mpdclient.Client
lastfmClient *lastfmclient.Client
In = make(chan CurrentTrack, 100)
NowPlaying = make(chan mpdclient.Song, 1)
mpdPassword = flag.String("mpd_password", "", "MPD password")
lastfmUsername = flag.String("lastfm_username", "username", "Last.fm username")
lastfmPassword = flag.String("lastfm_password", "password", "Last.fm password")
mpdAddress = flag.String("mpd_address", "localhost:6600", "MPD service address")
)
type CurrentTrack struct {
Song mpdclient.Song
StartTime int64
}
func listen() {
check := time.NewTicker(time.Second)
for {
select {
case <-check.C:
playedLongEnough()
case track := <-In:
scrobbles, err := lastfmClient.ScrobbleTrack(track.Song, track.StartTime)
if err != nil {
log.Print(err)
In <- track
}
for _, scrobble := range scrobbles {
if scrobble.IgnoredMessage == "" {
log.Printf("%s from %s by %s scrobbled\n", scrobble.Track, scrobble.Album, scrobble.Artist)
} else {
log.Printf("%s from %s by %s ignored: %s\n", scrobble.Track, scrobble.Album, scrobble.Artist, scrobble.IgnoredMessage)
}
}
case song := <-NowPlaying:
scrobble, err := lastfmClient.UpdateNowPlaying(song)
if err != nil {
log.Print(err)
}
if scrobble.IgnoredMessage == "" {
log.Printf("Now playing %s from %s by %s", scrobble.Track, scrobble.Album, scrobble.Artist)
} else {
log.Printf("Ignored now playing %s from %s by %s: %s", scrobble.Track, scrobble.Album, scrobble.Artist, scrobble.IgnoredMessage)
}
}
}
}
func playedLongEnough() {
status, err := mpdClient.Status()
if err != nil {
log.Print(err)
}
if status.ElapsedTime > 240 || (status.TotalTime > 30 && status.ElapsedTime > status.TotalTime/2) {
song, err := mpdClient.CurrentSong()
if err != nil {
log.Print(err)
} else {
if currentSong.Title != song.Title && currentSong.Artist != song.Artist {
currentSong = song
currentTrack := new(CurrentTrack)
now := time.Now()
currentTrack.Song = *song
currentTrack.StartTime = now.Unix() - int64(status.ElapsedTime)
In <- *currentTrack
}
if status.ElapsedTime == status.TotalTime {
currentSong.Album = ""
currentSong.Artist = ""
currentSong.Title = ""
}
}
}
if status.ElapsedTime == 0 {
song, err := mpdClient.CurrentSong()
if err != nil {
log.Print(err)
} else if song.Artist != "" && song.Title != "" {
NowPlaying <- *song
}
}
}
func init() {
flag.Parse()
var err error
mpdClient, err = mpdclient.Dial(*mpdAddress, *mpdPassword)
if err != nil {
log.Fatal(err)
}
currentSong = new(mpdclient.Song)
lastfmClient = lastfmclient.NewClient(*lastfmUsername, *lastfmPassword)
}
func main() {
listen()
}