From a0fd466bcf8c9650c5a6337438a6c90d79d8519f Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Thu, 19 Jun 2025 18:15:45 +0000 Subject: [PATCH 1/3] dev: Add ENV only launch config --- .vscode/launch.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index 40e5df2e..8b134f15 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -16,6 +16,25 @@ "${workspaceFolder}/node_modules/**", ], }, + { + "name": "dev (ENV Only)", + "type": "node", + "request": "launch", + // Debug app in VSCode + "program": "${workspaceFolder}/src/backend/index.ts", + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/tsx", + "console": "integratedTerminal", + "envFile": "${workspaceFolder}/.env", + "env": { + "CONFIG_DIR": "./not-real" + }, + "internalConsoleOptions": "neverOpen", + "skipFiles": [ + "/**", + // Ignore all dependencies (optional) + "${workspaceFolder}/node_modules/**", + ], + }, { "name": "tsx", "type": "node", -- 2.51.2 From 7fdf93c5d395a65924d482bb19725e9560000a67 Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Fri, 20 Jun 2025 16:42:04 +0000 Subject: [PATCH 2/3] feat(spotify): Add spotify meta ids to play --- src/backend/sources/SpotifySource.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/backend/sources/SpotifySource.ts b/src/backend/sources/SpotifySource.ts index 1f483b8d..2eccf600 100644 --- a/src/backend/sources/SpotifySource.ts +++ b/src/backend/sources/SpotifySource.ts @@ -2,7 +2,7 @@ import dayjs, { Dayjs } from "dayjs"; import EventEmitter from "events"; import SpotifyWebApi from "spotify-web-api-node"; import request from 'superagent'; -import { PlayObject, SCROBBLE_TS_SOC_END, SCROBBLE_TS_SOC_START, ScrobbleTsSOC } from "../../core/Atomic.js"; +import { PlayObject, SCROBBLE_TS_SOC_END, SCROBBLE_TS_SOC_START, ScrobbleTsSOC, SpotifyMeta } from "../../core/Atomic.js"; import { combinePartsToString, truncateStringToLength } from "../../core/StringUtils.js"; import { isNodeNetworkException } from "../common/errors/NodeErrors.js"; import { hasUpstreamError, UpstreamError } from "../common/errors/UpstreamError.js"; @@ -155,6 +155,7 @@ export default class SpotifySource extends MemoryPositionalSource { } const { + id: albumId, name: albumName, artists: albumArtists = [], images = [] @@ -183,7 +184,15 @@ export default class SpotifySource extends MemoryPositionalSource { track: name, duration: duration_ms / 1000, playDate: played_at, - playDateCompleted + playDateCompleted, + meta: { + spotify: { + track: id, + artist: artists.map(x => x.id), + albumArtist: actualAlbumArtists.map(x => x.id), + album: albumId + } + } }, meta: { deviceId: deviceId ?? `${NO_DEVICE}-${NO_USER}`, -- 2.51.2 From 720c07b008dd89b973daca1d7324a0a7e9d7e0d1 Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Fri, 20 Jun 2025 16:43:01 +0000 Subject: [PATCH 3/3] feat(listenbrainz): Include more ids/fields in submit additional_info #311 --- .../common/vendor/ListenbrainzApiClient.ts | 48 +++++++++++++++++-- src/core/Atomic.ts | 8 ++++ 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/backend/common/vendor/ListenbrainzApiClient.ts b/src/backend/common/vendor/ListenbrainzApiClient.ts index 8e7fb8e2..f2a8a751 100644 --- a/src/backend/common/vendor/ListenbrainzApiClient.ts +++ b/src/backend/common/vendor/ListenbrainzApiClient.ts @@ -74,8 +74,21 @@ export interface AdditionalTrackInfoResponse extends AdditionalTrackInfo { recording_msid?: string } +// using submit-listens example from openapi https://rain0r.github.io/listenbrainz-openapi/index.html#/lbCore/submitListens +// which is documented in official docs https://listenbrainz.readthedocs.io/en/latest/users/api/index.html#openapi-specification +// and based on this LZ developer comment https://github.com/lyarenei/jellyfin-plugin-listenbrainz/issues/10#issuecomment-1253867941 +export interface SubmitListenAdditionalTrackInfo extends AdditionalTrackInfo { + artist_names?: string[] + release_artist_name?: string + release_artist_names?: string[] + spotify_album_id?: string + spotify_album_artist_ids?: string[] + spotify_artist_ids?: string[] + albumartist?: string +} + export interface TrackPayload extends MinimumTrack { - additional_info?: AdditionalTrackInfo + additional_info?: SubmitListenAdditionalTrackInfo } export interface ListenPayload { @@ -339,14 +352,40 @@ export class ListenbrainzApiClient extends AbstractApiClient { track, duration, meta: { - brainz = {} + brainz = {}, + spotify = {} } = {} } } = play; + // using submit-listens exmaple from openapi https://rain0r.github.io/listenbrainz-openapi/index.html#/lbCore/submitListens + // which is documented in official docs https://listenbrainz.readthedocs.io/en/latest/users/api/index.html#openapi-specification + // and based on this LZ developer comment https://github.com/lyarenei/jellyfin-plugin-listenbrainz/issues/10#issuecomment-1253867941 + + const addInfo: SubmitListenAdditionalTrackInfo = { + // all artists + artist_names: Array.from(new Set([...artists, ...albumArtists])), + // primary artist + release_artist_name: artists[0], + release_artist_names: [artists[0]], + }; + + if(spotify.track !== undefined) { + addInfo.spotify_id = spotify.track; + } + if(spotify.album !== undefined) { + addInfo.spotify_album_id = spotify.album; + } + if(spotify.albumArtist !== undefined && spotify.albumArtist.length > 0) { + addInfo.spotify_album_artist_ids = spotify.albumArtist; + } + if(spotify.artist !== undefined) { + addInfo.spotify_artist_ids = spotify.artist; + } + return { listened_at: getScrobbleTsSOCDate(play).unix(), track_metadata: { - artist_name: artists[0], + artist_name: Array.from(new Set([...artists, ...albumArtists])).join(', '), track_name: track, release_name: album, additional_info: { @@ -354,7 +393,8 @@ export class ListenbrainzApiClient extends AbstractApiClient { track_mbid: brainz.track, artist_mbids: brainz.artist, release_mbid: brainz.album, - release_group_mbid: brainz.releaseGroup + release_group_mbid: brainz.releaseGroup, + ...addInfo } } } diff --git a/src/core/Atomic.ts b/src/core/Atomic.ts index d69ba893..a7bbf988 100644 --- a/src/core/Atomic.ts +++ b/src/core/Atomic.ts @@ -74,6 +74,13 @@ export interface BrainzMeta { releaseGroup?: string } +export interface SpotifyMeta { + artist?: string[] + albumArtist?: string[] + album?: string + track?: string +} + export interface TrackData { artists?: string[] albumArtists?: string[] @@ -86,6 +93,7 @@ export interface TrackData { meta?: { brainz?: BrainzMeta + spotify?: SpotifyMeta } } -- 2.51.2