GoScrobble/internal/goscrobble/ingress_multiscrobbler.go
Daniel Mason 48a99b31fd
0.0.26
- Make email required
- Add basic navidrome/subsonic connection
- Tidy up request/response structure in backend
- Tidy Settings page
2021-04-10 09:49:32 +12:00

69 lines
1.6 KiB
Go

package goscrobble
import (
"database/sql"
"errors"
"fmt"
"log"
"net"
"time"
)
type MultiScrobblerRequest struct {
Artists []string `json:"artists"`
Album string `json:"album"`
Track string `json:"track"`
PlayedAt time.Time `json:"playDate"`
Duration int `json:"duration"`
}
// ParseMultiScrobblerInput - Transform API data
func ParseMultiScrobblerInput(userUUID string, data MultiScrobblerRequest, ip net.IP, tx *sql.Tx) error {
// Cache key
json := fmt.Sprintf("%s:%s:%s", data.PlayedAt, data.Track, userUUID)
redisKey := getMd5(json)
if getRedisKeyExists(redisKey) {
return nil
}
artists := make([]string, 0)
albumartists := make([]string, 0)
// Insert track artists
for _, artist := range data.Artists {
artist, err := insertArtist(artist, "", "", "", tx)
if err != nil {
log.Printf("%+v", err)
return errors.New("Failed to map artist: " + artist.Name)
}
artists = append(artists, artist.UUID)
}
// Insert album if not exist
album, err := insertAlbum(data.Album, "", "", albumartists, "", tx)
if err != nil {
log.Printf("%+v", err)
return errors.New("Failed to map album")
}
// Insert track if not exist
track, err := insertTrack(data.Track, data.Duration, "", "", album.UUID, artists, tx)
if err != nil {
log.Printf("%+v", err)
return errors.New("Failed to map track")
}
// Insert scrobble if not exist
err = insertScrobble(userUUID, track.UUID, "multiscrobbler", data.PlayedAt, ip, tx)
if err != nil {
log.Printf("%+v", err)
return errors.New("Failed to map track")
}
ttl := time.Duration(24) * time.Hour
setRedisValTtl(redisKey, "1", ttl)
return nil
}