mirror of
https://git.sr.ht/~phw/scotty
synced 2025-04-16 10:09:28 +02:00
JSPF: Listen import
This commit is contained in:
parent
cac88f316b
commit
409acccebe
2 changed files with 63 additions and 24 deletions
|
@ -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{
|
||||
|
|
|
@ -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"`
|
||||
|
|
Loading…
Add table
Reference in a new issue