Merge pull request #240 from Fratt/fix-spotify-album-artists

fix(spotify): Album artists no longer missing
This commit is contained in:
Matt Foxx
2024-12-16 09:34:29 -05:00
committed by GitHub
3 changed files with 527 additions and 2 deletions
+1 -2
View File
@@ -160,9 +160,8 @@ export default class SpotifySource extends MemoryPositionalSource {
images = []
} = album || {};
const trackArtistIds = artists.map(x => x.id);
let actualAlbumArtists: ArtistObjectSimplified[] = [];
if(albumArtists.filter(x => !trackArtistIds.includes(x.id)).length > 0) {
if ((artists.length !== albumArtists.length) || !artists.every(artist => albumArtists.some(albumArtist => artist.id === albumArtist.id))) {
// only include album artists if they are not the EXACT same as the track artists
// ...if they aren't the exact same then include all artists, even if they are duplicates of track artists
actualAlbumArtists = albumArtists;
@@ -0,0 +1,491 @@
{
"device": {
"id": "10ef8b79eb62f6fe99b53988c7bb3a84b358e88b",
"is_active": true,
"is_private_session": false,
"is_restricted": false,
"name": "foxx-arch",
"supports_volume": true,
"type": "Computer",
"volume_percent": 59
},
"shuffle_state": false,
"smart_shuffle": false,
"repeat_state": "off",
"timestamp": 1734358194901,
"context": {
"external_urls": {
"spotify": "https://open.spotify.com/album/4r9HEszOAbfhRfT1n1QPLF"
},
"href": "https://api.spotify.com/v1/albums/4r9HEszOAbfhRfT1n1QPLF",
"type": "album",
"uri": "spotify:album:4r9HEszOAbfhRfT1n1QPLF"
},
"progress_ms": 78823,
"item": {
"album": {
"album_type": "album",
"artists": [
{
"external_urls": {
"spotify": "https://open.spotify.com/artist/4D2G48IdJKhcdZ5c1dqp5Z"
},
"href": "https://api.spotify.com/v1/artists/4D2G48IdJKhcdZ5c1dqp5Z",
"id": "4D2G48IdJKhcdZ5c1dqp5Z",
"name": "Dubmood",
"type": "artist",
"uri": "spotify:artist:4D2G48IdJKhcdZ5c1dqp5Z"
}
],
"available_markets": [
"AR",
"AU",
"AT",
"BE",
"BO",
"BR",
"BG",
"CA",
"CL",
"CO",
"CR",
"CY",
"CZ",
"DK",
"DO",
"DE",
"EC",
"EE",
"SV",
"FI",
"FR",
"GR",
"GT",
"HN",
"HK",
"HU",
"IS",
"IE",
"IT",
"LV",
"LT",
"LU",
"MY",
"MT",
"MX",
"NL",
"NZ",
"NI",
"NO",
"PA",
"PY",
"PE",
"PH",
"PL",
"PT",
"SG",
"SK",
"ES",
"SE",
"CH",
"TW",
"TR",
"UY",
"US",
"GB",
"AD",
"LI",
"MC",
"ID",
"JP",
"TH",
"VN",
"RO",
"IL",
"ZA",
"SA",
"AE",
"BH",
"QA",
"OM",
"KW",
"EG",
"MA",
"DZ",
"TN",
"LB",
"JO",
"PS",
"IN",
"BY",
"KZ",
"MD",
"UA",
"AL",
"BA",
"HR",
"ME",
"MK",
"RS",
"SI",
"KR",
"BD",
"PK",
"LK",
"GH",
"KE",
"NG",
"TZ",
"UG",
"AG",
"AM",
"BS",
"BB",
"BZ",
"BT",
"BW",
"BF",
"CV",
"CW",
"DM",
"FJ",
"GM",
"GE",
"GD",
"GW",
"GY",
"HT",
"JM",
"KI",
"LS",
"LR",
"MW",
"MV",
"ML",
"MH",
"FM",
"NA",
"NR",
"NE",
"PW",
"PG",
"PR",
"WS",
"SM",
"ST",
"SN",
"SC",
"SL",
"SB",
"KN",
"LC",
"VC",
"SR",
"TL",
"TO",
"TT",
"TV",
"VU",
"AZ",
"BN",
"BI",
"KH",
"CM",
"TD",
"KM",
"GQ",
"SZ",
"GA",
"GN",
"KG",
"LA",
"MO",
"MR",
"MN",
"NP",
"RW",
"TG",
"UZ",
"ZW",
"BJ",
"MG",
"MU",
"MZ",
"AO",
"CI",
"DJ",
"ZM",
"CD",
"CG",
"IQ",
"LY",
"TJ",
"VE",
"ET",
"XK"
],
"external_urls": {
"spotify": "https://open.spotify.com/album/4r9HEszOAbfhRfT1n1QPLF"
},
"href": "https://api.spotify.com/v1/albums/4r9HEszOAbfhRfT1n1QPLF",
"id": "4r9HEszOAbfhRfT1n1QPLF",
"images": [
{
"height": 640,
"url": "https://i.scdn.co/image/ab67616d0000b273ba89e34c27a792ffe9c8dcb2",
"width": 640
},
{
"height": 300,
"url": "https://i.scdn.co/image/ab67616d00001e02ba89e34c27a792ffe9c8dcb2",
"width": 300
},
{
"height": 64,
"url": "https://i.scdn.co/image/ab67616d00004851ba89e34c27a792ffe9c8dcb2",
"width": 64
}
],
"name": "Bloodbags And Downtube Shifters",
"release_date": "2020-08-28",
"release_date_precision": "day",
"total_tracks": 13,
"type": "album",
"uri": "spotify:album:4r9HEszOAbfhRfT1n1QPLF"
},
"artists": [
{
"external_urls": {
"spotify": "https://open.spotify.com/artist/4D2G48IdJKhcdZ5c1dqp5Z"
},
"href": "https://api.spotify.com/v1/artists/4D2G48IdJKhcdZ5c1dqp5Z",
"id": "4D2G48IdJKhcdZ5c1dqp5Z",
"name": "Dubmood",
"type": "artist",
"uri": "spotify:artist:4D2G48IdJKhcdZ5c1dqp5Z"
},
{
"external_urls": {
"spotify": "https://open.spotify.com/artist/77s5NAGQbxu8oLstaqSwHE"
},
"href": "https://api.spotify.com/v1/artists/77s5NAGQbxu8oLstaqSwHE",
"id": "77s5NAGQbxu8oLstaqSwHE",
"name": "MASTER BOOT RECORD",
"type": "artist",
"uri": "spotify:artist:77s5NAGQbxu8oLstaqSwHE"
}
],
"available_markets": [
"AR",
"AU",
"AT",
"BE",
"BO",
"BR",
"BG",
"CA",
"CL",
"CO",
"CR",
"CY",
"CZ",
"DK",
"DO",
"DE",
"EC",
"EE",
"SV",
"FI",
"FR",
"GR",
"GT",
"HN",
"HK",
"HU",
"IS",
"IE",
"IT",
"LV",
"LT",
"LU",
"MY",
"MT",
"MX",
"NL",
"NZ",
"NI",
"NO",
"PA",
"PY",
"PE",
"PH",
"PL",
"PT",
"SG",
"SK",
"ES",
"SE",
"CH",
"TW",
"TR",
"UY",
"US",
"GB",
"AD",
"LI",
"MC",
"ID",
"JP",
"TH",
"VN",
"RO",
"IL",
"ZA",
"SA",
"AE",
"BH",
"QA",
"OM",
"KW",
"EG",
"MA",
"DZ",
"TN",
"LB",
"JO",
"PS",
"IN",
"BY",
"KZ",
"MD",
"UA",
"AL",
"BA",
"HR",
"ME",
"MK",
"RS",
"SI",
"KR",
"BD",
"PK",
"LK",
"GH",
"KE",
"NG",
"TZ",
"UG",
"AG",
"AM",
"BS",
"BB",
"BZ",
"BT",
"BW",
"BF",
"CV",
"CW",
"DM",
"FJ",
"GM",
"GE",
"GD",
"GW",
"GY",
"HT",
"JM",
"KI",
"LS",
"LR",
"MW",
"MV",
"ML",
"MH",
"FM",
"NA",
"NR",
"NE",
"PW",
"PG",
"PR",
"WS",
"SM",
"ST",
"SN",
"SC",
"SL",
"SB",
"KN",
"LC",
"VC",
"SR",
"TL",
"TO",
"TT",
"TV",
"VU",
"AZ",
"BN",
"BI",
"KH",
"CM",
"TD",
"KM",
"GQ",
"SZ",
"GA",
"GN",
"KG",
"LA",
"MO",
"MR",
"MN",
"NP",
"RW",
"TG",
"UZ",
"ZW",
"BJ",
"MG",
"MU",
"MZ",
"AO",
"CI",
"DJ",
"ZM",
"CD",
"CG",
"IQ",
"LY",
"TJ",
"VE",
"ET",
"XK"
],
"disc_number": 1,
"duration_ms": 213539,
"explicit": false,
"external_ids": {
"isrc": "FR9W12915571"
},
"external_urls": {
"spotify": "https://open.spotify.com/track/0dYovyBKizxbMla12ofzBr"
},
"href": "https://api.spotify.com/v1/tracks/0dYovyBKizxbMla12ofzBr",
"id": "0dYovyBKizxbMla12ofzBr",
"is_local": false,
"name": "The Sandpits Of Zonhoven",
"popularity": 15,
"preview_url": null,
"track_number": 5,
"type": "track",
"uri": "spotify:track:0dYovyBKizxbMla12ofzBr"
},
"currently_playing_type": "track",
"actions": {
"disallows": {
"resuming": true
}
},
"is_playing": true
}
+35
View File
@@ -4,9 +4,12 @@ import asPromised from 'chai-as-promised';
import EventEmitter from "events";
import { after, before, describe, it } from 'mocha';
import pEvent from "p-event";
import clone from 'clone';
import { PlayObject } from "../../../core/Atomic.js";
import { generatePlay } from "../utils/PlayTestUtils.js";
import { TestSource } from "./TestSource.js";
import spotifyPayload from '../plays/spotifyCurrentPlaybackState.json';
import SpotifySource from "../../sources/SpotifySource.js";
chai.use(asPromised);
@@ -125,3 +128,35 @@ describe('Sources use transform plays correctly', function () {
expect(source.discover([newScrobble]).length).is.eq(1);
});
})
describe('Sources correctly parse incoming payloads', function () {
it('Spotify parses payload with no album artists correctly', function() {
const noAAPayload = clone(spotifyPayload)
noAAPayload.item.album.artists = [];
const play = SpotifySource.formatPlayObj(noAAPayload as SpotifyApi.CurrentPlaybackResponse);
expect(play.data.track).eq('The Sandpits Of Zonhoven');
expect(play.data.album).eq('Bloodbags And Downtube Shifters');
expect(play.data.artists).eql(['Dubmood', 'MASTER BOOT RECORD']);
expect(play.data.albumArtists).to.be.empty;
});
it('Spotify parses payload with different album artists correctly', function() {
const play = SpotifySource.formatPlayObj(spotifyPayload as SpotifyApi.CurrentPlaybackResponse);
expect(play.data.track).eq('The Sandpits Of Zonhoven');
expect(play.data.album).eq('Bloodbags And Downtube Shifters');
expect(play.data.artists).eql(['Dubmood', 'MASTER BOOT RECORD']);
expect(play.data.albumArtists).eql(['Dubmood']);
});
it('Spotify parses payload with identical album artists correctly', function() {
const identicalArtistsPayload = clone(spotifyPayload)
identicalArtistsPayload.item.album.artists = identicalArtistsPayload.item.artists;
const identicalArtistsPlay = SpotifySource.formatPlayObj(identicalArtistsPayload as SpotifyApi.CurrentPlaybackResponse);
expect(identicalArtistsPlay.data.track).eq('The Sandpits Of Zonhoven');
expect(identicalArtistsPlay.data.album).eq('Bloodbags And Downtube Shifters');
expect(identicalArtistsPlay.data.artists).eql(['Dubmood', 'MASTER BOOT RECORD']);
expect(identicalArtistsPlay.data.albumArtists).to.be.empty;
});
});