diff --git a/backends/jspf/jspf.go b/backends/jspf/jspf.go index 99cb59a..608396a 100644 --- a/backends/jspf/jspf.go +++ b/backends/jspf/jspf.go @@ -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{ diff --git a/backends/jspf/models.go b/backends/jspf/models.go index 067c874..94d3600 100644 --- a/backends/jspf/models.go +++ b/backends/jspf/models.go @@ -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"`