Skip to content

Commit 9fe5b9b

Browse files
authored
Merge pull request #312 from FoxxMD/lzEnrich
feat: Enrich Listenbrainz submit payload
2 parents 35d62c9 + 720c07b commit 9fe5b9b

File tree

4 files changed

+82
-6
lines changed

4 files changed

+82
-6
lines changed

.vscode/launch.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,25 @@
1616
"${workspaceFolder}/node_modules/**",
1717
],
1818
},
19+
{
20+
"name": "dev (ENV Only)",
21+
"type": "node",
22+
"request": "launch",
23+
// Debug app in VSCode
24+
"program": "${workspaceFolder}/src/backend/index.ts",
25+
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/tsx",
26+
"console": "integratedTerminal",
27+
"envFile": "${workspaceFolder}/.env",
28+
"env": {
29+
"CONFIG_DIR": "./not-real"
30+
},
31+
"internalConsoleOptions": "neverOpen",
32+
"skipFiles": [
33+
"<node_internals>/**",
34+
// Ignore all dependencies (optional)
35+
"${workspaceFolder}/node_modules/**",
36+
],
37+
},
1938
{
2039
"name": "tsx",
2140
"type": "node",

src/backend/common/vendor/ListenbrainzApiClient.ts

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,21 @@ export interface AdditionalTrackInfoResponse extends AdditionalTrackInfo {
7474
recording_msid?: string
7575
}
7676

77+
// using submit-listens example from openapi https://rain0r.github.io/listenbrainz-openapi/index.html#/lbCore/submitListens
78+
// which is documented in official docs https://listenbrainz.readthedocs.io/en/latest/users/api/index.html#openapi-specification
79+
// and based on this LZ developer comment https://github.com/lyarenei/jellyfin-plugin-listenbrainz/issues/10#issuecomment-1253867941
80+
export interface SubmitListenAdditionalTrackInfo extends AdditionalTrackInfo {
81+
artist_names?: string[]
82+
release_artist_name?: string
83+
release_artist_names?: string[]
84+
spotify_album_id?: string
85+
spotify_album_artist_ids?: string[]
86+
spotify_artist_ids?: string[]
87+
albumartist?: string
88+
}
89+
7790
export interface TrackPayload extends MinimumTrack {
78-
additional_info?: AdditionalTrackInfo
91+
additional_info?: SubmitListenAdditionalTrackInfo
7992
}
8093

8194
export interface ListenPayload {
@@ -339,22 +352,49 @@ export class ListenbrainzApiClient extends AbstractApiClient {
339352
track,
340353
duration,
341354
meta: {
342-
brainz = {}
355+
brainz = {},
356+
spotify = {}
343357
} = {}
344358
}
345359
} = play;
360+
// using submit-listens exmaple from openapi https://rain0r.github.io/listenbrainz-openapi/index.html#/lbCore/submitListens
361+
// which is documented in official docs https://listenbrainz.readthedocs.io/en/latest/users/api/index.html#openapi-specification
362+
// and based on this LZ developer comment https://github.com/lyarenei/jellyfin-plugin-listenbrainz/issues/10#issuecomment-1253867941
363+
364+
const addInfo: SubmitListenAdditionalTrackInfo = {
365+
// all artists
366+
artist_names: Array.from(new Set([...artists, ...albumArtists])),
367+
// primary artist
368+
release_artist_name: artists[0],
369+
release_artist_names: [artists[0]],
370+
};
371+
372+
if(spotify.track !== undefined) {
373+
addInfo.spotify_id = spotify.track;
374+
}
375+
if(spotify.album !== undefined) {
376+
addInfo.spotify_album_id = spotify.album;
377+
}
378+
if(spotify.albumArtist !== undefined && spotify.albumArtist.length > 0) {
379+
addInfo.spotify_album_artist_ids = spotify.albumArtist;
380+
}
381+
if(spotify.artist !== undefined) {
382+
addInfo.spotify_artist_ids = spotify.artist;
383+
}
384+
346385
return {
347386
listened_at: getScrobbleTsSOCDate(play).unix(),
348387
track_metadata: {
349-
artist_name: artists[0],
388+
artist_name: Array.from(new Set([...artists, ...albumArtists])).join(', '),
350389
track_name: track,
351390
release_name: album,
352391
additional_info: {
353392
duration: play.data.duration !== undefined ? Math.round(duration) : undefined,
354393
track_mbid: brainz.track,
355394
artist_mbids: brainz.artist,
356395
release_mbid: brainz.album,
357-
release_group_mbid: brainz.releaseGroup
396+
release_group_mbid: brainz.releaseGroup,
397+
...addInfo
358398
}
359399
}
360400
}

src/backend/sources/SpotifySource.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import dayjs, { Dayjs } from "dayjs";
22
import EventEmitter from "events";
33
import SpotifyWebApi from "spotify-web-api-node";
44
import request from 'superagent';
5-
import { PlayObject, SCROBBLE_TS_SOC_END, SCROBBLE_TS_SOC_START, ScrobbleTsSOC } from "../../core/Atomic.js";
5+
import { PlayObject, SCROBBLE_TS_SOC_END, SCROBBLE_TS_SOC_START, ScrobbleTsSOC, SpotifyMeta } from "../../core/Atomic.js";
66
import { combinePartsToString, truncateStringToLength } from "../../core/StringUtils.js";
77
import { isNodeNetworkException } from "../common/errors/NodeErrors.js";
88
import { hasUpstreamError, UpstreamError } from "../common/errors/UpstreamError.js";
@@ -155,6 +155,7 @@ export default class SpotifySource extends MemoryPositionalSource {
155155
}
156156

157157
const {
158+
id: albumId,
158159
name: albumName,
159160
artists: albumArtists = [],
160161
images = []
@@ -183,7 +184,15 @@ export default class SpotifySource extends MemoryPositionalSource {
183184
track: name,
184185
duration: duration_ms / 1000,
185186
playDate: played_at,
186-
playDateCompleted
187+
playDateCompleted,
188+
meta: {
189+
spotify: {
190+
track: id,
191+
artist: artists.map(x => x.id),
192+
albumArtist: actualAlbumArtists.map(x => x.id),
193+
album: albumId
194+
}
195+
}
187196
},
188197
meta: {
189198
deviceId: deviceId ?? `${NO_DEVICE}-${NO_USER}`,

src/core/Atomic.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,13 @@ export interface BrainzMeta {
7474
releaseGroup?: string
7575
}
7676

77+
export interface SpotifyMeta {
78+
artist?: string[]
79+
albumArtist?: string[]
80+
album?: string
81+
track?: string
82+
}
83+
7784
export interface TrackData {
7885
artists?: string[]
7986
albumArtists?: string[]
@@ -86,6 +93,7 @@ export interface TrackData {
8693

8794
meta?: {
8895
brainz?: BrainzMeta
96+
spotify?: SpotifyMeta
8997
}
9098
}
9199

0 commit comments

Comments
 (0)