Funkwhale: Implemented LovesExport

This commit is contained in:
Philipp Wolfer 2023-11-12 15:57:18 +01:00
parent 48c8843f91
commit 9316838d59
No known key found for this signature in database
GPG key ID: 8FDF744D4919943B
6 changed files with 446 additions and 13 deletions

View file

@ -49,7 +49,7 @@ func (b FunkwhaleApiBackend) ExportListens(oldestTimestamp time.Time) ([]models.
page := 1
perPage := MaxItemsPerGet
listens := make([]models.Listen, 0)
listens := make([]models.Listen, 0, 2*MaxItemsPerGet)
out:
for {
@ -64,7 +64,7 @@ out:
}
for _, fwListen := range result.Results {
listen := ListenFromFunkwhale(fwListen)
listen := fwListen.ToListen()
if listen.ListenedAt.Unix() > oldestTimestamp.Unix() {
listens = append(listens, listen)
} else {
@ -84,10 +84,49 @@ out:
return listens, nil
}
func ListenFromFunkwhale(fwListen Listening) models.Listen {
track := fwListen.Track
func (b FunkwhaleApiBackend) ExportLoves(oldestTimestamp time.Time) ([]models.Love, error) {
page := 1
perPage := MaxItemsPerGet
loves := make([]models.Love, 0, 2*MaxItemsPerGet)
out:
for {
result, err := b.client.GetFavoriteTracks(page, perPage)
if err != nil {
return nil, err
}
count := len(result.Results)
if count == 0 {
break out
}
for _, favorite := range result.Results {
love := favorite.ToLove()
if love.Created.Unix() > oldestTimestamp.Unix() {
loves = append(loves, love)
} else {
break out
}
}
if result.Next == "" {
// No further results
break out
}
page += 1
}
slices.Reverse(loves)
return loves, nil
}
func (l Listening) ToListen() models.Listen {
track := l.Track
listen := models.Listen{
UserName: fwListen.User.UserName,
UserName: l.User.UserName,
Track: models.Track{
TrackName: track.Title,
ReleaseName: track.Album.Title,
@ -103,7 +142,7 @@ func ListenFromFunkwhale(fwListen Listening) models.Listen {
},
}
listenedAt, err := time.Parse(time.RFC3339, fwListen.CreationDate)
listenedAt, err := time.Parse(time.RFC3339, l.CreationDate)
if err == nil {
listen.ListenedAt = listenedAt
}
@ -114,3 +153,36 @@ func ListenFromFunkwhale(fwListen Listening) models.Listen {
return listen
}
func (f FavoriteTrack) ToLove() models.Love {
track := f.Track
recordingMbid := models.MBID(track.RecordingMbid)
love := models.Love{
UserName: f.User.UserName,
RecordingMbid: recordingMbid,
Track: models.Track{
TrackName: track.Title,
ReleaseName: track.Album.Title,
ArtistNames: []string{track.Artist.Name},
TrackNumber: track.Position,
RecordingMbid: recordingMbid,
ReleaseMbid: models.MBID(track.Album.ReleaseMbid),
ArtistMbids: []models.MBID{models.MBID(track.Artist.ArtistMbid)},
Tags: track.Tags,
AdditionalInfo: map[string]any{
"media_player": FunkwhaleClientName,
},
},
}
created, err := time.Parse(time.RFC3339, f.CreationDate)
if err == nil {
love.Created = created
}
if len(track.Uploads) > 0 {
love.Track.Duration = time.Duration(track.Uploads[0].Duration * int(time.Second))
}
return love
}