diff --git a/src/backend/common/vendor/ListenbrainzApiClient.ts b/src/backend/common/vendor/ListenbrainzApiClient.ts index d3fe80d6..a3e7ae0a 100644 --- a/src/backend/common/vendor/ListenbrainzApiClient.ts +++ b/src/backend/common/vendor/ListenbrainzApiClient.ts @@ -259,17 +259,29 @@ export class ListenbrainzApiClient extends AbstractApiClient { duration, track_mbid, artist_mbids, + artist_names = [], release_mbid, - release_group_mbid + release_group_mbid, + release_artist_name, + release_artist_names = [] } = {} } = {}, } = payload; + let albumArtists: string[]; + if(release_artist_name !== undefined) { + albumArtists = [release_artist_name]; + } + if(release_artist_names.length > 0) { + albumArtists = unique([...(albumArtists ?? []), ...release_artist_names]) + } + return { data: { playDate: typeof listened_at === 'number' ? dayjs.unix(listened_at) : dayjs(listened_at), track: track_name, - artists: [artist_name], + artists: unique([artist_name, ...artist_names]), + albumArtists, album: release_name, duration, meta: { diff --git a/src/backend/tests/listenbrainz/listenbrainz.test.ts b/src/backend/tests/listenbrainz/listenbrainz.test.ts index c2021fd6..c062493b 100644 --- a/src/backend/tests/listenbrainz/listenbrainz.test.ts +++ b/src/backend/tests/listenbrainz/listenbrainz.test.ts @@ -1,12 +1,12 @@ import { loggerTest } from "@foxxmd/logging"; -import { assert } from 'chai'; +import { assert, expect } from 'chai'; import dayjs from "dayjs"; import { describe, it } from 'mocha'; import { http, HttpResponse } from "msw"; import { PlayObject } from "../../../core/Atomic.js"; import { UpstreamError } from "../../common/errors/UpstreamError.js"; -import { ListenbrainzApiClient } from "../../common/vendor/ListenbrainzApiClient.js"; +import { ListenbrainzApiClient, playToListenPayload } from "../../common/vendor/ListenbrainzApiClient.js"; import { ListenResponse } from '../../common/vendor/listenbrainz/interfaces.js'; import { ExpectedResults } from "../utils/interfaces.js"; import { withRequestInterception } from "../utils/networking.js"; @@ -22,6 +22,7 @@ import slightlyDifferentNames from './correctlyMapped/trackNameSlightlyDifferent // incorrect mappings import incorrectMultiArtistsTrackName from './incorrectlyMapped/multiArtistsInTrackName.json' with { type: "json" }; import veryWrong from './incorrectlyMapped/veryWrong.json' with { type: "json" }; +import { generatePlay } from "../utils/PlayTestUtils.js"; interface LZTestFixture { data: ListenResponse @@ -151,3 +152,37 @@ describe('Listenbrainz Response Behavior', function() { } )); }); + +describe('Listenbrainz Endpoint Behavior', function() { + + it('Should combine artist and artist_names', function() { + + const play = generatePlay({artists: ['Artist A'], albumArtists: []}); + const submitPayload = playToListenPayload(play); + + const additionalArtists = [...submitPayload.track_metadata.additional_info.artist_names, 'Artist B']; + + submitPayload.track_metadata.additional_info.artist_names = additionalArtists; + + const playFromPayload = ListenbrainzApiClient.listenPayloadToPlay(submitPayload); + + expect(playFromPayload.data.artists).to.be.eql(additionalArtists) + + }); + + it('Should combine artist and artist_names into a unique array', function() { + + const play = generatePlay({artists: ['Artist A'], albumArtists: []}); + const submitPayload = playToListenPayload(play); + + const additionalArtists = ['Artist A', 'Artist B']; + + submitPayload.track_metadata.additional_info.artist_names = additionalArtists; + + const playFromPayload = ListenbrainzApiClient.listenPayloadToPlay(submitPayload); + + expect(playFromPayload.data.artists).to.be.eql(['Artist A', 'Artist B']) + + }); + +});