diff --git a/src/backend/common/vendor/ListenbrainzApiClient.ts b/src/backend/common/vendor/ListenbrainzApiClient.ts index a3e7ae0a..8e65e801 100644 --- a/src/backend/common/vendor/ListenbrainzApiClient.ts +++ b/src/backend/common/vendor/ListenbrainzApiClient.ts @@ -1,7 +1,7 @@ import { stringSameness } from '@foxxmd/string-sameness'; import dayjs from "dayjs"; import request, { Request, Response } from 'superagent'; -import { BrainzMeta, PlayObject, URLData } from "../../../core/Atomic.js"; +import { BrainzMeta, PlayObject, SCROBBLE_TS_SOC_START, URLData } from "../../../core/Atomic.js"; import { combinePartsToString, slice } from "../../../core/StringUtils.js"; import { findDelimiters, @@ -263,7 +263,10 @@ export class ListenbrainzApiClient extends AbstractApiClient { release_mbid, release_group_mbid, release_artist_name, - release_artist_names = [] + release_artist_names = [], + scrobble_ts_soc = SCROBBLE_TS_SOC_START, + listened_for, + listened_at_completed } = {} } = {}, } = payload; @@ -276,7 +279,7 @@ export class ListenbrainzApiClient extends AbstractApiClient { albumArtists = unique([...(albumArtists ?? []), ...release_artist_names]) } - return { + const play: PlayObject = { data: { playDate: typeof listened_at === 'number' ? dayjs.unix(listened_at) : dayjs(listened_at), track: track_name, @@ -295,8 +298,18 @@ export class ListenbrainzApiClient extends AbstractApiClient { }, meta: { nowPlaying, + scrobbleTsSOC: scrobble_ts_soc } } + + if(listened_at_completed !== undefined) { + play.data.playDateCompleted = dayjs.unix(listened_at_completed); + } + if(listened_for !== undefined) { + play.data.listenedFor = listened_for; + } + + return play; } static listenResponseToPlay(listen: ListenResponse): PlayObject { diff --git a/src/backend/common/vendor/listenbrainz/interfaces.ts b/src/backend/common/vendor/listenbrainz/interfaces.ts index 360d358a..3b15d5fe 100644 --- a/src/backend/common/vendor/listenbrainz/interfaces.ts +++ b/src/backend/common/vendor/listenbrainz/interfaces.ts @@ -3,6 +3,8 @@ * https://musicbrainz.org/doc/MusicBrainz_Database/Schema#Overview */ +import { ScrobbleTsSOC } from "../../../../core/Atomic.js"; + /** A unique product a Recording is issued on. * * This is like an album (release group) but is specific to the type, year, catalog, etc... for this release @@ -123,6 +125,21 @@ export interface SubmitListenAdditionalTrackInfo extends AdditionalTrackInfo { spotify_album_artist_ids?: string[]; spotify_artist_ids?: string[]; albumartist?: string; + /** Is the timestamp (listened_at) from when the user started listening or when they stopped listening? + * + * Specific to multi-scrobbler + */ + scrobble_ts_soc?: ScrobbleTsSOC + /** Unix timestamp for when the user stopped listening + * + * Specific to multi-scrobbler + */ + listened_at_completed?: number + /** Number of seconds track was listened to + * + * Specific to multi-scrobbler + */ + listened_for?: number } export interface TrackPayload extends MinimumTrack { additional_info?: SubmitListenAdditionalTrackInfo;