diff --git a/patches/musicbrainz-api+0.27.0.patch b/patches/musicbrainz-api+0.27.1.patch similarity index 91% rename from patches/musicbrainz-api+0.27.0.patch rename to patches/musicbrainz-api+0.27.1.patch index 5a8c57c2..234e3b9f 100644 --- a/patches/musicbrainz-api+0.27.0.patch +++ b/patches/musicbrainz-api+0.27.1.patch @@ -115,3 +115,17 @@ index 72fb15d..f6bdfe5 100644 }); return response.json(); } +diff --git a/node_modules/musicbrainz-api/lib/musicbrainz.types.d.ts b/node_modules/musicbrainz-api/lib/musicbrainz.types.d.ts +index 1ebc7b2..e004b9b 100644 +--- a/node_modules/musicbrainz-api/lib/musicbrainz.types.d.ts ++++ b/node_modules/musicbrainz-api/lib/musicbrainz.types.d.ts +@@ -156,7 +156,8 @@ export interface IMedium { + title: string; + format?: string; + 'format-id': string; +- tracks: ITrack[]; ++ tracks?: ITrack[]; ++ track?: ITrack[] + 'track-count': number; + 'track-offset': number; + position: number; diff --git a/src/backend/common/transforms/MusicbrainzTransformer.ts b/src/backend/common/transforms/MusicbrainzTransformer.ts index f2bcc440..ee47d028 100644 --- a/src/backend/common/transforms/MusicbrainzTransformer.ts +++ b/src/backend/common/transforms/MusicbrainzTransformer.ts @@ -863,7 +863,15 @@ export const filterByExplicitTrackMbid = (list: IRecordingMatch[], play: PlayObj break; } for (const rel of rec.releases) { - if (rel.media.some(x => x.tracks.some(y => y.id === play.data.meta.brainz.track))) { + if (rel.media.some(x => { + if(x.tracks !== undefined) { + return x.tracks.some(y => y.id === play.data.meta.brainz.track); + } + if(x.track !== undefined) { + return x.track.some(y => y.id === play.data.meta.brainz.track); + } + return false; + })) { releaseMatchId = rel.id; recMatch = rec; break; diff --git a/src/backend/tests/musicbrainz/musicbrainz.test.ts b/src/backend/tests/musicbrainz/musicbrainz.test.ts index b2ecfa34..aa1164b2 100644 --- a/src/backend/tests/musicbrainz/musicbrainz.test.ts +++ b/src/backend/tests/musicbrainz/musicbrainz.test.ts @@ -16,6 +16,7 @@ import { generatePlay, withBrainz } from '../../../core/tests/utils/PlayTestUtil import { intersect, missingMbidTypes } from '../../utils.ts'; import { CoverArtApiClient, type CoverArtApiConfig } from '../../common/vendor/musicbrainz/CoverArtApiClient.ts'; import { artistNamesToCredits, artistNameToCredit } from '../../../core/StringUtils.ts'; +import dayjs from 'dayjs'; chai.use(asPromised); @@ -424,6 +425,76 @@ describe('Musicbrainz API', function () { }), "All search prerequisites failed") }); + it('does not fail on media tracks', async function () { + this.timeout(35000); + + await mbTransformer.initialize(); + + const play: PlayObject = { + "data": { + "artists": [ + { + "name": "Au5", + "mbid": "3569c2ed-2315-40d9-b041-3c48dae1be43" + } + ], + "albumArtists": [], + "album": "Inverse", + "track": "Scission", + "duration": 214.125, + "meta": { + "brainz": { + "track": "c63b7e96-928c-48dd-b558-a181cb245cb6", + "album": "cbc89dff-3555-498c-bb1e-2ff983b13e59", + "artist": [ + "3569c2ed-2315-40d9-b041-3c48dae1be43" + ], + "albumArtist": [ + "3569c2ed-2315-40d9-b041-3c48dae1be43" + ] + } + }, + "playDate": dayjs(), + "listenedFor": 209.601, + "listenRanges": [], + "repeat": false + }, + "meta": { + "seenAt": dayjs(), + "trackId": "plex://track/6a5ee492569fa956516b9b1a", + "mediaType": "track", + "source": "Plex", + "library": "Music", + "deviceId": "sonos-0116-Plex for Sonos", + "sessionId": "106", + "trackProgressPosition": 214.125, + "art": { + "track": "/api/source/art?name=PlexBox&type=plex&data=84389" + } + }, + }; + + try { + const res = await mbTransformer.getTransformerData(play, { + type: "musicbrainz", + searchWhenMissing: DEFAULT_MISSING_TYPES, + searchOrder: ["isrc", "mbidrecording", "basicorids", "basic"], + }); + + expect(res.recordings).to.exist; + expect(res.recordings).to.not.be.empty; + const chosenPlay = await mbTransformer.handlePostFetch(play, res, { + type: "musicbrainz", + searchWhenMissing: DEFAULT_MISSING_TYPES, + searchOrder: ["isrc", "mbidrecording", "basicorids", "basic"], + }); + expect(chosenPlay).to.exist; + } catch (e) { + throw e; + } + + }); + }); describe('Multiple Endpoints', function () {