package scrobbler import ( "database/sql" "log" "golang.fcuny.net/mpd-stats/internal/mpd" ) type Scrobbler struct { player *mpd.Player db *sql.DB } func NewScrobbler(net string, addr string, dbpath string) (*Scrobbler, error) { p, err := mpd.NewPlayer(net, addr) if err != nil { return nil, err } db, err := opendatabase(dbpath) if err != nil { return nil, err } s := Scrobbler{ player: p, db: db, } return &s, nil } func (s *Scrobbler) Close() error { return s.player.Close() } func (s *Scrobbler) Run() error { var ( currentRecord *Record previousRecord *Record ) for { e := <-s.player.Watcher.Event if e != "" { attrs, err := s.player.Client.CurrentSong() if err != nil { log.Fatalf("could not get current song: %v", err) } if currentRecord == nil { currentRecord, err = NewRecord(attrs) if err != nil { log.Fatalf("could not create a log: %v", err) } log.Printf("we're playing %s/%s/%s [%s]\n", currentRecord.Artist, currentRecord.Album, currentRecord.Title, currentRecord.Duration) previousRecord = currentRecord s.save(currentRecord) continue } if currentRecord.Title != attrs["Title"] || currentRecord.Artist != attrs["Artist"] || currentRecord.Album != attrs["Album"] { currentRecord, err = NewRecord(attrs) if err != nil { log.Fatalf("could not create a log: %v", err) } } if currentRecord.Id != previousRecord.Id { log.Printf("we're playing %s/%s/%s [%s]\n", currentRecord.Artist, currentRecord.Album, currentRecord.Title, currentRecord.Duration) previousRecord = currentRecord s.save(currentRecord) } } } } func (s *Scrobbler) save(record *Record) error { _, err := s.db.Exec("insert into records(id, title, artist, album, duration, time) values(?, ?, ?, ?, ?, ?)", record.Id, record.Title, record.Artist, record.Album, int(record.Duration.Seconds()), record.Timestamp, ) return err }