mirror of
https://git.sr.ht/~phw/scotty
synced 2025-04-18 19:19: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
|
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) {
|
func (b *JspfBackend) ImportLoves(export models.LovesResult, importResult models.ImportResult, progress chan models.Progress) (models.ImportResult, error) {
|
||||||
for _, love := range export.Loves {
|
for _, love := range export.Loves {
|
||||||
track := loveAsTrack(love)
|
track := loveAsTrack(love)
|
||||||
|
@ -63,31 +75,26 @@ func (b *JspfBackend) ImportLoves(export models.LovesResult, importResult models
|
||||||
return importResult, nil
|
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 {
|
func loveAsTrack(love models.Love) Track {
|
||||||
extension := MusicBrainzTrackExtension{
|
track := trackAsTrack(love.Track)
|
||||||
AddedAt: love.Created,
|
extension := makeMusicBrainzExtension(love.Track)
|
||||||
AddedBy: love.UserName,
|
extension.AddedAt = love.Created
|
||||||
AdditionalMetadata: love.AdditionalInfo,
|
extension.AddedBy = love.UserName
|
||||||
ArtistIdentifiers: make([]string, len(love.ArtistMbids)),
|
track.Extension[MusicBrainzTrackExtensionId] = extension
|
||||||
}
|
|
||||||
|
|
||||||
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,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
if love.RecordingMbid != "" {
|
if love.RecordingMbid != "" {
|
||||||
track.Identifier = append(track.Identifier, "https://musicbrainz.org/recording/"+string(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
|
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 {
|
func (b JspfBackend) writeJspf(tracks []Track) error {
|
||||||
playlist := Jspf{
|
playlist := Jspf{
|
||||||
Playlist: Playlist{
|
Playlist: Playlist{
|
||||||
|
|
|
@ -19,6 +19,7 @@ package jspf
|
||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
|
// See https://xspf.org/jspf
|
||||||
type Jspf struct {
|
type Jspf struct {
|
||||||
Playlist Playlist `json:"playlist"`
|
Playlist Playlist `json:"playlist"`
|
||||||
}
|
}
|
||||||
|
@ -63,6 +64,8 @@ type Meta map[string]string
|
||||||
|
|
||||||
// Extension for "https://musicbrainz.org/doc/jspf#track"
|
// Extension for "https://musicbrainz.org/doc/jspf#track"
|
||||||
// as used by ListenBrainz.
|
// as used by ListenBrainz.
|
||||||
|
const MusicBrainzTrackExtensionId = "https://musicbrainz.org/doc/jspf#track"
|
||||||
|
|
||||||
type MusicBrainzTrackExtension struct {
|
type MusicBrainzTrackExtension struct {
|
||||||
AddedAt time.Time `json:"added_at,omitempty"`
|
AddedAt time.Time `json:"added_at,omitempty"`
|
||||||
AddedBy string `json:"added_by,omitempty"`
|
AddedBy string `json:"added_by,omitempty"`
|
||||||
|
|
Loading…
Add table
Reference in a new issue