JSPF: Listen import

This commit is contained in:
Philipp Wolfer 2023-11-22 18:11:21 +01:00
parent cac88f316b
commit 409acccebe
No known key found for this signature in database
GPG key ID: 8FDF744D4919943B
2 changed files with 63 additions and 24 deletions

View file

@ -51,6 +51,18 @@ func (b *JspfBackend) FinishImport() error {
return err
}
func (b *JspfBackend) ImportListens(export models.ListensResult, importResult models.ImportResult, progress chan models.Progress) (models.ImportResult, error) {
for _, listen := range export.Listens {
track := listenAsTrack(listen)
b.tracks = append(b.tracks, track)
importResult.ImportCount += 1
importResult.UpdateTimestamp(listen.ListenedAt)
}
progress <- models.Progress{}.FromImportResult(importResult)
return importResult, nil
}
func (b *JspfBackend) ImportLoves(export models.LovesResult, importResult models.ImportResult, progress chan models.Progress) (models.ImportResult, error) {
for _, love := range export.Loves {
track := loveAsTrack(love)
@ -63,31 +75,26 @@ func (b *JspfBackend) ImportLoves(export models.LovesResult, importResult models
return importResult, nil
}
func listenAsTrack(listen models.Listen) Track {
track := trackAsTrack(listen.Track)
extension := makeMusicBrainzExtension(listen.Track)
extension.AddedAt = listen.ListenedAt
extension.AddedBy = listen.UserName
track.Extension[MusicBrainzTrackExtensionId] = extension
if listen.RecordingMbid != "" {
track.Identifier = append(track.Identifier, "https://musicbrainz.org/recording/"+string(listen.RecordingMbid))
}
return track
}
func loveAsTrack(love models.Love) Track {
extension := MusicBrainzTrackExtension{
AddedAt: love.Created,
AddedBy: love.UserName,
AdditionalMetadata: love.AdditionalInfo,
ArtistIdentifiers: make([]string, len(love.ArtistMbids)),
}
for i, mbid := range love.ArtistMbids {
extension.ArtistIdentifiers[i] = "https://musicbrainz.org/artist/" + string(mbid)
}
if love.ReleaseMbid != "" {
extension.ReleaseIdentifier = "https://musicbrainz.org/release/" + string(love.ReleaseMbid)
}
track := Track{
Title: love.TrackName,
Album: love.ReleaseName,
Creator: love.ArtistName(),
TrackNum: love.TrackNumber,
Extension: map[string]any{
"https://musicbrainz.org/doc/jspf#track": extension,
},
}
track := trackAsTrack(love.Track)
extension := makeMusicBrainzExtension(love.Track)
extension.AddedAt = love.Created
extension.AddedBy = love.UserName
track.Extension[MusicBrainzTrackExtensionId] = extension
if love.RecordingMbid != "" {
track.Identifier = append(track.Identifier, "https://musicbrainz.org/recording/"+string(love.RecordingMbid))
@ -96,6 +103,35 @@ func loveAsTrack(love models.Love) Track {
return track
}
func trackAsTrack(t models.Track) Track {
track := Track{
Title: t.TrackName,
Album: t.ReleaseName,
Creator: t.ArtistName(),
TrackNum: t.TrackNumber,
Extension: map[string]any{},
}
return track
}
func makeMusicBrainzExtension(t models.Track) MusicBrainzTrackExtension {
extension := MusicBrainzTrackExtension{
AdditionalMetadata: t.AdditionalInfo,
ArtistIdentifiers: make([]string, len(t.ArtistMbids)),
}
for i, mbid := range t.ArtistMbids {
extension.ArtistIdentifiers[i] = "https://musicbrainz.org/artist/" + string(mbid)
}
if t.ReleaseMbid != "" {
extension.ReleaseIdentifier = "https://musicbrainz.org/release/" + string(t.ReleaseMbid)
}
return extension
}
func (b JspfBackend) writeJspf(tracks []Track) error {
playlist := Jspf{
Playlist: Playlist{

View file

@ -19,6 +19,7 @@ package jspf
import "time"
// See https://xspf.org/jspf
type Jspf struct {
Playlist Playlist `json:"playlist"`
}
@ -63,6 +64,8 @@ type Meta map[string]string
// Extension for "https://musicbrainz.org/doc/jspf#track"
// as used by ListenBrainz.
const MusicBrainzTrackExtensionId = "https://musicbrainz.org/doc/jspf#track"
type MusicBrainzTrackExtension struct {
AddedAt time.Time `json:"added_at,omitempty"`
AddedBy string `json:"added_by,omitempty"`