fix: reset mbid for artists when native importing

pull/37/head v0.0.12
Gabe Farrell 6 months ago
parent b32c5d3735
commit 5537b6fb89

@ -13,6 +13,7 @@ import (
"github.com/gabehf/koito/internal/db"
"github.com/gabehf/koito/internal/logger"
"github.com/gabehf/koito/internal/mbz"
"github.com/gabehf/koito/internal/utils"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@ -260,3 +261,80 @@ func TestImportListenBrainz_MbzDisabled(t *testing.T) {
truncateTestData(t)
}
func TestImportKoito(t *testing.T) {
src := path.Join("..", "test_assets", "koito_export_test.json")
destDir := filepath.Join(cfg.ConfigDir(), "import")
dest := filepath.Join(destDir, "koito_export_test.json")
ctx := context.Background()
// 4 every wave to ever rise, 3 i can't feel you, 5 giri giri, 1 nijinoiroyo
giriReleaseMBID := uuid.MustParse("ac1f8da0-21d7-426e-83b0-befff06f0871")
suzukiMBID := uuid.MustParse("30f851bb-dba3-4e9b-811c-5f27f595c86a")
nijinoTrackMBID := uuid.MustParse("a4f26836-3894-46c1-acac-227808308687")
input, err := os.ReadFile(src)
require.NoError(t, err)
require.NoError(t, os.WriteFile(dest, input, os.ModePerm))
engine.RunImporter(logger.Get(), store, &mbz.MbzErrorCaller{})
// ensure all artists are saved
_, err = store.GetArtist(ctx, db.GetArtistOpts{Name: "American Football"})
require.NoError(t, err)
_, err = store.GetArtist(ctx, db.GetArtistOpts{Name: "Rachel Goswell"})
require.NoError(t, err)
_, err = store.GetArtist(ctx, db.GetArtistOpts{Name: "Elizabeth Powell"})
require.NoError(t, err)
// ensure artist aliases are saved
artist, err := store.GetArtist(ctx, db.GetArtistOpts{MusicBrainzID: suzukiMBID})
require.NoError(t, err)
assert.Equal(t, "鈴木雅之", artist.Name)
assert.Contains(t, artist.Aliases, "Masayuki Suzuki")
_, err = store.GetArtist(ctx, db.GetArtistOpts{Name: "すぅ"})
require.NoError(t, err)
// ensure albums are saved
album, err := store.GetAlbum(ctx, db.GetAlbumOpts{MusicBrainzID: giriReleaseMBID})
require.NoError(t, err)
assert.Equal(t, "GIRI GIRI", album.Title)
// ensure album aliases are saved
artist, err = store.GetArtist(ctx, db.GetArtistOpts{Name: "NELKE"})
require.NoError(t, err)
album, err = store.GetAlbum(ctx, db.GetAlbumOpts{Title: "虹の色よ鮮やかであれ (NELKE ver.)", ArtistID: artist.ID})
require.NoError(t, err)
aliases, err := store.GetAllAlbumAliases(ctx, album.ID)
require.NoError(t, err)
assert.Contains(t, utils.FlattenAliases(aliases), "Nijinoiroyo Azayakadeare (NELKE ver.)")
// ensure all tracks are saved
track, err := store.GetTrack(ctx, db.GetTrackOpts{MusicBrainzID: nijinoTrackMBID})
require.NoError(t, err)
assert.Equal(t, "虹の色よ鮮やかであれ (NELKE ver.)", track.Title)
aliases, err = store.GetAllTrackAliases(ctx, track.ID)
require.NoError(t, err)
assert.Contains(t, utils.FlattenAliases(aliases), "Nijinoiroyo Azayakadeare (NELKE ver.)")
// ensure track duration is saved
assert.EqualValues(t, 218, track.Duration)
artist, err = store.GetArtist(ctx, db.GetArtistOpts{MusicBrainzID: suzukiMBID})
require.NoError(t, err)
_, err = store.GetTrack(ctx, db.GetTrackOpts{Title: "GIRI GIRI", ArtistIDs: []int32{artist.ID}})
require.NoError(t, err)
count, err := store.CountTracks(ctx, db.PeriodAllTime)
require.NoError(t, err)
assert.EqualValues(t, 4, count)
count, err = store.CountAlbums(ctx, db.PeriodAllTime)
require.NoError(t, err)
assert.EqualValues(t, 3, count)
count, err = store.CountArtists(ctx, db.PeriodAllTime)
require.NoError(t, err)
assert.EqualValues(t, 6, count)
truncateTestData(t)
}

@ -139,6 +139,11 @@ func (d *Psql) SaveAlbum(ctx context.Context, opts db.SaveAlbumOpts) (*models.Al
return nil, fmt.Errorf("SaveAlbum: Commit: %w", err)
}
err = d.SaveAlbumAliases(ctx, r.ID, opts.Aliases, "MusicBrainz")
if err != nil {
l.Err(err).Msgf("Failed to save aliases for album %s", opts.Title)
}
return &models.Album{
ID: r.ID,
MbzID: r.MusicBrainzID,

@ -43,10 +43,11 @@ func ImportKoitoFile(ctx context.Context, store db.DB, filename string) error {
for i := range data.Listens {
// use this for save/get mbid for all artist/album/track
mbid := uuid.Nil
var mbid uuid.UUID
artistIds := make([]int32, 0)
for _, ia := range data.Listens[i].Artists {
mbid = uuid.Nil
if ia.MBID != nil {
mbid = *ia.MBID
}
@ -81,6 +82,7 @@ func ImportKoitoFile(ctx context.Context, store db.DB, filename string) error {
}
// call associate album
albumId := int32(0)
mbid = uuid.Nil
if data.Listens[i].Album.MBID != nil {
mbid = *data.Listens[i].Album.MBID
}
@ -117,6 +119,7 @@ func ImportKoitoFile(ctx context.Context, store db.DB, filename string) error {
}
// call associate track
mbid = uuid.Nil
if data.Listens[i].Track.MBID != nil {
mbid = *data.Listens[i].Track.MBID
}

@ -0,0 +1,706 @@
{
"version": "1",
"exported_at": "2025-06-18T12:56:53Z",
"user": "koito",
"listens": [
{
"listened_at": "2022-01-08T22:32:08Z",
"track": {
"mbid": null,
"duration": 354,
"aliases": [
{
"alias": "Every Wave To Ever Rise (feat. Elizabeth Powell)",
"source": "Canonical",
"is_primary": true
}
]
},
"album": {
"image_url": "https://cdn-images.dzcdn.net/images/cover/1f54d600d0ce5c88a6b2fd75659ec796/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"aliases": [
{
"alias": "American Football (LP3)",
"source": "Canonical",
"is_primary": true
}
],
"various_artists": false
},
"artists": [
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/ac81a9567a9ae0963274563370eff015/1000x1000-000000-80-0-0.jpg",
"mbid": "4ebb5ad3-9018-407d-8c24-c03011ab9ac6",
"is_primary": false,
"aliases": [
{
"alias": "American Football",
"source": "Canonical",
"is_primary": true
}
]
},
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/4aaff116fd21b5c1bdafd55fbf843053/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"is_primary": false,
"aliases": [
{
"alias": "Elizabeth Powell",
"source": "Canonical",
"is_primary": true
}
]
}
]
},
{
"listened_at": "2022-01-16T00:43:25Z",
"track": {
"mbid": null,
"duration": 354,
"aliases": [
{
"alias": "Every Wave To Ever Rise (feat. Elizabeth Powell)",
"source": "Canonical",
"is_primary": true
}
]
},
"album": {
"image_url": "https://cdn-images.dzcdn.net/images/cover/1f54d600d0ce5c88a6b2fd75659ec796/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"aliases": [
{
"alias": "American Football (LP3)",
"source": "Canonical",
"is_primary": true
}
],
"various_artists": false
},
"artists": [
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/ac81a9567a9ae0963274563370eff015/1000x1000-000000-80-0-0.jpg",
"mbid": "4ebb5ad3-9018-407d-8c24-c03011ab9ac6",
"is_primary": false,
"aliases": [
{
"alias": "American Football",
"source": "Canonical",
"is_primary": true
}
]
},
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/4aaff116fd21b5c1bdafd55fbf843053/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"is_primary": false,
"aliases": [
{
"alias": "Elizabeth Powell",
"source": "Canonical",
"is_primary": true
}
]
}
]
},
{
"listened_at": "2022-01-16T04:47:43Z",
"track": {
"mbid": null,
"duration": 354,
"aliases": [
{
"alias": "Every Wave To Ever Rise (feat. Elizabeth Powell)",
"source": "Canonical",
"is_primary": true
}
]
},
"album": {
"image_url": "https://cdn-images.dzcdn.net/images/cover/1f54d600d0ce5c88a6b2fd75659ec796/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"aliases": [
{
"alias": "American Football (LP3)",
"source": "Canonical",
"is_primary": true
}
],
"various_artists": false
},
"artists": [
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/ac81a9567a9ae0963274563370eff015/1000x1000-000000-80-0-0.jpg",
"mbid": "4ebb5ad3-9018-407d-8c24-c03011ab9ac6",
"is_primary": false,
"aliases": [
{
"alias": "American Football",
"source": "Canonical",
"is_primary": true
}
]
},
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/4aaff116fd21b5c1bdafd55fbf843053/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"is_primary": false,
"aliases": [
{
"alias": "Elizabeth Powell",
"source": "Canonical",
"is_primary": true
}
]
}
]
},
{
"listened_at": "2022-01-18T18:36:21Z",
"track": {
"mbid": null,
"duration": 354,
"aliases": [
{
"alias": "Every Wave To Ever Rise (feat. Elizabeth Powell)",
"source": "Canonical",
"is_primary": true
}
]
},
"album": {
"image_url": "https://cdn-images.dzcdn.net/images/cover/1f54d600d0ce5c88a6b2fd75659ec796/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"aliases": [
{
"alias": "American Football (LP3)",
"source": "Canonical",
"is_primary": true
}
],
"various_artists": false
},
"artists": [
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/ac81a9567a9ae0963274563370eff015/1000x1000-000000-80-0-0.jpg",
"mbid": "4ebb5ad3-9018-407d-8c24-c03011ab9ac6",
"is_primary": false,
"aliases": [
{
"alias": "American Football",
"source": "Canonical",
"is_primary": true
}
]
},
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/4aaff116fd21b5c1bdafd55fbf843053/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"is_primary": false,
"aliases": [
{
"alias": "Elizabeth Powell",
"source": "Canonical",
"is_primary": true
}
]
}
]
},
{
"listened_at": "2022-01-16T05:28:11Z",
"track": {
"mbid": null,
"duration": 287,
"aliases": [
{
"alias": "I Can't Feel You (feat. Rachel Goswell)",
"source": "Canonical",
"is_primary": true
}
]
},
"album": {
"image_url": "https://cdn-images.dzcdn.net/images/cover/1f54d600d0ce5c88a6b2fd75659ec796/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"aliases": [
{
"alias": "American Football (LP3)",
"source": "Canonical",
"is_primary": true
}
],
"various_artists": false
},
"artists": [
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/ac81a9567a9ae0963274563370eff015/1000x1000-000000-80-0-0.jpg",
"mbid": "4ebb5ad3-9018-407d-8c24-c03011ab9ac6",
"is_primary": false,
"aliases": [
{
"alias": "American Football",
"source": "Canonical",
"is_primary": true
}
]
},
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/36120901230ef2799610483fbfe5402e/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"is_primary": false,
"aliases": [
{
"alias": "Rachel Goswell",
"source": "Canonical",
"is_primary": true
}
]
}
]
},
{
"listened_at": "2022-01-18T18:59:01Z",
"track": {
"mbid": null,
"duration": 287,
"aliases": [
{
"alias": "I Can't Feel You (feat. Rachel Goswell)",
"source": "Canonical",
"is_primary": true
}
]
},
"album": {
"image_url": "https://cdn-images.dzcdn.net/images/cover/1f54d600d0ce5c88a6b2fd75659ec796/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"aliases": [
{
"alias": "American Football (LP3)",
"source": "Canonical",
"is_primary": true
}
],
"various_artists": false
},
"artists": [
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/ac81a9567a9ae0963274563370eff015/1000x1000-000000-80-0-0.jpg",
"mbid": "4ebb5ad3-9018-407d-8c24-c03011ab9ac6",
"is_primary": false,
"aliases": [
{
"alias": "American Football",
"source": "Canonical",
"is_primary": true
}
]
},
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/36120901230ef2799610483fbfe5402e/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"is_primary": false,
"aliases": [
{
"alias": "Rachel Goswell",
"source": "Canonical",
"is_primary": true
}
]
}
]
},
{
"listened_at": "2022-01-19T01:31:22Z",
"track": {
"mbid": null,
"duration": 287,
"aliases": [
{
"alias": "I Can't Feel You (feat. Rachel Goswell)",
"source": "Canonical",
"is_primary": true
}
]
},
"album": {
"image_url": "https://cdn-images.dzcdn.net/images/cover/1f54d600d0ce5c88a6b2fd75659ec796/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"aliases": [
{
"alias": "American Football (LP3)",
"source": "Canonical",
"is_primary": true
}
],
"various_artists": false
},
"artists": [
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/ac81a9567a9ae0963274563370eff015/1000x1000-000000-80-0-0.jpg",
"mbid": "4ebb5ad3-9018-407d-8c24-c03011ab9ac6",
"is_primary": false,
"aliases": [
{
"alias": "American Football",
"source": "Canonical",
"is_primary": true
}
]
},
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/36120901230ef2799610483fbfe5402e/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"is_primary": false,
"aliases": [
{
"alias": "Rachel Goswell",
"source": "Canonical",
"is_primary": true
}
]
}
]
},
{
"listened_at": "2025-03-17T03:16:50Z",
"track": {
"mbid": null,
"duration": 0,
"aliases": [
{
"alias": "GIRI GIRI",
"source": "Canonical",
"is_primary": true
}
]
},
"album": {
"image_url": "https://coverartarchive.org/release/ac1f8da0-21d7-426e-83b0-befff06f0871/front",
"mbid": "ac1f8da0-21d7-426e-83b0-befff06f0871",
"aliases": [
{
"alias": "GIRI GIRI",
"source": "Canonical",
"is_primary": true
}
],
"various_artists": false
},
"artists": [
{
"image_url": "https://yt3.googleusercontent.com/DKlRZNy1yaOkBvIH5vaA3RHdLtylEqaoRsnQIfJlSeo8y_Ov1_3fZRebFtm3NgpsB6tvJQzzcQ=s900-c-k-c0x00ffffff-no-rj",
"mbid": "30f851bb-dba3-4e9b-811c-5f27f595c86a",
"is_primary": false,
"aliases": [
{
"alias": "鈴木雅之",
"source": "Canonical",
"is_primary": true
},
{
"alias": "Masayuki Suzuki",
"source": "MusicBrainz",
"is_primary": false
}
]
},
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/827131318ca82724744bc9c2c4b43a6c/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"is_primary": false,
"aliases": [
{
"alias": "すぅ",
"source": "Canonical",
"is_primary": true
}
]
}
]
},
{
"listened_at": "2025-03-17T22:17:42Z",
"track": {
"mbid": null,
"duration": 0,
"aliases": [
{
"alias": "GIRI GIRI",
"source": "Canonical",
"is_primary": true
}
]
},
"album": {
"image_url": "https://coverartarchive.org/release/ac1f8da0-21d7-426e-83b0-befff06f0871/front",
"mbid": "ac1f8da0-21d7-426e-83b0-befff06f0871",
"aliases": [
{
"alias": "GIRI GIRI",
"source": "Canonical",
"is_primary": true
}
],
"various_artists": false
},
"artists": [
{
"image_url": "https://yt3.googleusercontent.com/DKlRZNy1yaOkBvIH5vaA3RHdLtylEqaoRsnQIfJlSeo8y_Ov1_3fZRebFtm3NgpsB6tvJQzzcQ=s900-c-k-c0x00ffffff-no-rj",
"mbid": "30f851bb-dba3-4e9b-811c-5f27f595c86a",
"is_primary": false,
"aliases": [
{
"alias": "鈴木雅之",
"source": "Canonical",
"is_primary": true
},
{
"alias": "Masayuki Suzuki",
"source": "MusicBrainz",
"is_primary": false
}
]
},
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/827131318ca82724744bc9c2c4b43a6c/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"is_primary": false,
"aliases": [
{
"alias": "すぅ",
"source": "Canonical",
"is_primary": true
}
]
}
]
},
{
"listened_at": "2025-03-18T20:46:02Z",
"track": {
"mbid": null,
"duration": 0,
"aliases": [
{
"alias": "GIRI GIRI",
"source": "Canonical",
"is_primary": true
}
]
},
"album": {
"image_url": "https://coverartarchive.org/release/ac1f8da0-21d7-426e-83b0-befff06f0871/front",
"mbid": "ac1f8da0-21d7-426e-83b0-befff06f0871",
"aliases": [
{
"alias": "GIRI GIRI",
"source": "Canonical",
"is_primary": true
}
],
"various_artists": false
},
"artists": [
{
"image_url": "https://yt3.googleusercontent.com/DKlRZNy1yaOkBvIH5vaA3RHdLtylEqaoRsnQIfJlSeo8y_Ov1_3fZRebFtm3NgpsB6tvJQzzcQ=s900-c-k-c0x00ffffff-no-rj",
"mbid": "30f851bb-dba3-4e9b-811c-5f27f595c86a",
"is_primary": false,
"aliases": [
{
"alias": "鈴木雅之",
"source": "Canonical",
"is_primary": true
},
{
"alias": "Masayuki Suzuki",
"source": "MusicBrainz",
"is_primary": false
}
]
},
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/827131318ca82724744bc9c2c4b43a6c/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"is_primary": false,
"aliases": [
{
"alias": "すぅ",
"source": "Canonical",
"is_primary": true
}
]
}
]
},
{
"listened_at": "2025-03-19T14:15:35Z",
"track": {
"mbid": null,
"duration": 0,
"aliases": [
{
"alias": "GIRI GIRI",
"source": "Canonical",
"is_primary": true
}
]
},
"album": {
"image_url": "https://coverartarchive.org/release/ac1f8da0-21d7-426e-83b0-befff06f0871/front",
"mbid": "ac1f8da0-21d7-426e-83b0-befff06f0871",
"aliases": [
{
"alias": "GIRI GIRI",
"source": "Canonical",
"is_primary": true
}
],
"various_artists": false
},
"artists": [
{
"image_url": "https://yt3.googleusercontent.com/DKlRZNy1yaOkBvIH5vaA3RHdLtylEqaoRsnQIfJlSeo8y_Ov1_3fZRebFtm3NgpsB6tvJQzzcQ=s900-c-k-c0x00ffffff-no-rj",
"mbid": "30f851bb-dba3-4e9b-811c-5f27f595c86a",
"is_primary": false,
"aliases": [
{
"alias": "鈴木雅之",
"source": "Canonical",
"is_primary": true
},
{
"alias": "Masayuki Suzuki",
"source": "MusicBrainz",
"is_primary": false
}
]
},
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/827131318ca82724744bc9c2c4b43a6c/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"is_primary": false,
"aliases": [
{
"alias": "すぅ",
"source": "Canonical",
"is_primary": true
}
]
}
]
},
{
"listened_at": "2025-03-20T00:36:12Z",
"track": {
"mbid": null,
"duration": 0,
"aliases": [
{
"alias": "GIRI GIRI",
"source": "Canonical",
"is_primary": true
}
]
},
"album": {
"image_url": "https://coverartarchive.org/release/ac1f8da0-21d7-426e-83b0-befff06f0871/front",
"mbid": "ac1f8da0-21d7-426e-83b0-befff06f0871",
"aliases": [
{
"alias": "GIRI GIRI",
"source": "Canonical",
"is_primary": true
}
],
"various_artists": false
},
"artists": [
{
"image_url": "https://yt3.googleusercontent.com/DKlRZNy1yaOkBvIH5vaA3RHdLtylEqaoRsnQIfJlSeo8y_Ov1_3fZRebFtm3NgpsB6tvJQzzcQ=s900-c-k-c0x00ffffff-no-rj",
"mbid": "30f851bb-dba3-4e9b-811c-5f27f595c86a",
"is_primary": false,
"aliases": [
{
"alias": "鈴木雅之",
"source": "Canonical",
"is_primary": true
},
{
"alias": "Masayuki Suzuki",
"source": "MusicBrainz",
"is_primary": false
}
]
},
{
"image_url": "https://cdn-images.dzcdn.net/images/artist/827131318ca82724744bc9c2c4b43a6c/1000x1000-000000-80-0-0.jpg",
"mbid": null,
"is_primary": false,
"aliases": [
{
"alias": "すぅ",
"source": "Canonical",
"is_primary": true
}
]
}
]
},
{
"listened_at": "2025-03-23T17:22:03Z",
"track": {
"mbid": "a4f26836-3894-46c1-acac-227808308687",
"duration": 218,
"aliases": [
{
"alias": "Nijinoiroyo Azayakadeare (NELKE ver.)",
"source": "Manual",
"is_primary": false
},
{
"alias": "虹の色よ鮮やかであれ (NELKE ver.)",
"source": "Canonical",
"is_primary": true
}
]
},
"album": {
"image_url": "https://coverartarchive.org/release/7114f07c-c1f7-4423-a9c3-585444bef51b/front",
"mbid": "7114f07c-c1f7-4423-a9c3-585444bef51b",
"aliases": [
{
"alias": "Nijinoiroyo Azayakadeare (NELKE ver.)",
"source": "MusicBrainz",
"is_primary": false
},
{
"alias": "虹の色よ鮮やかであれ (NELKE ver.)",
"source": "Canonical",
"is_primary": true
}
],
"various_artists": false
},
"artists": [
{
"image_url": "User Upload",
"mbid": "3d202d36-1219-4e31-bfb9-d73355c66a83",
"is_primary": false,
"aliases": [
{
"alias": "NELKE",
"source": "Canonical",
"is_primary": true
}
]
}
]
}
]
}
Loading…
Cancel
Save