diff --git a/src/backend/common/infrastructure/Atomic.ts b/src/backend/common/infrastructure/Atomic.ts index 5f4aa35c..e0f4d9a7 100644 --- a/src/backend/common/infrastructure/Atomic.ts +++ b/src/backend/common/infrastructure/Atomic.ts @@ -109,12 +109,6 @@ export type GroupedPlays = TupleMap>; -export const NO_DEVICE = 'NoDevice'; -export const NO_USER = 'SingleUser'; - -export const SINGLE_USER_PLATFORM_ID: PlayPlatformId = [NO_DEVICE, NO_USER]; -export const SINGLE_USER_PLATFORM_ID_STR = `${NO_DEVICE}-${NO_USER}`; - export interface ScrobbledPlayObject { play: PlayObject scrobble: PlayObjectMinimal diff --git a/src/backend/scrobblers/DiscordScrobbler.ts b/src/backend/scrobblers/DiscordScrobbler.ts index 28ed2706..9bb1cbc5 100644 --- a/src/backend/scrobblers/DiscordScrobbler.ts +++ b/src/backend/scrobblers/DiscordScrobbler.ts @@ -1,7 +1,8 @@ import type {Logger, LogLevel} from "@foxxmd/logging"; import type EventEmitter from "events"; import type {PlayMatchResult, PlayObject, SourcePlayerObj} from "../../core/Atomic.ts"; -import { type FormatPlayObjectOptions, SINGLE_USER_PLATFORM_ID_STR } from "../common/infrastructure/Atomic.ts"; +import { type FormatPlayObjectOptions } from "../common/infrastructure/Atomic.ts"; +import { SINGLE_USER_PLATFORM_ID_STR } from '../../core/Atomic.ts'; import { CALCULATED_PLAYER_STATUSES } from '../../core/Atomic.ts'; import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; diff --git a/src/backend/sources/AzuracastSource.ts b/src/backend/sources/AzuracastSource.ts index 607ba933..f3a6a297 100644 --- a/src/backend/sources/AzuracastSource.ts +++ b/src/backend/sources/AzuracastSource.ts @@ -10,8 +10,8 @@ import { type FormatPlayObjectOptions, type InternalConfig, type PlayerStateData, - SINGLE_USER_PLATFORM_ID, } from "../common/infrastructure/Atomic.ts"; +import { SINGLE_USER_PLATFORM_ID } from '../../core/Atomic.ts'; import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; import type {AzuracastSourceConfig, AzuraNowPlayingResponse, AzuraStationResponse} from "../common/infrastructure/config/source/azuracast.ts"; import { isPortReachable, normalizeWSAddress } from "../utils/NetworkUtils.ts"; diff --git a/src/backend/sources/ChromecastSource.ts b/src/backend/sources/ChromecastSource.ts index 341a5ee9..2b796897 100644 --- a/src/backend/sources/ChromecastSource.ts +++ b/src/backend/sources/ChromecastSource.ts @@ -13,10 +13,10 @@ import { type FormatPlayObjectOptions, type InternalConfig, type MdnsDeviceInfo, - NO_USER, type PlayerStateData, type SourceData, } from "../common/infrastructure/Atomic.ts"; +import { NO_USER } from '../../core/Atomic.ts'; import type {ChromecastSourceConfig} from "../common/infrastructure/config/source/chromecast.ts"; import { MaybeLogger } from '../common/MaybeLogger.ts'; import { diff --git a/src/backend/sources/EndpointLastfmSource.ts b/src/backend/sources/EndpointLastfmSource.ts index da0dfecd..0c8b6242 100644 --- a/src/backend/sources/EndpointLastfmSource.ts +++ b/src/backend/sources/EndpointLastfmSource.ts @@ -5,8 +5,8 @@ import { type ExpressRequest, type FormatPlayObjectOptions, type InternalConfig, - NO_USER, type PlayerStateData} from "../common/infrastructure/Atomic.ts"; +import { NO_USER } from '../../core/Atomic.ts'; import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; import type {PlayPlatformId} from '../../core/Atomic.ts'; import MemorySource from "./MemorySource.ts"; diff --git a/src/backend/sources/EndpointListenbrainzSource.ts b/src/backend/sources/EndpointListenbrainzSource.ts index a6d01f22..44a22c5f 100644 --- a/src/backend/sources/EndpointListenbrainzSource.ts +++ b/src/backend/sources/EndpointListenbrainzSource.ts @@ -5,8 +5,8 @@ import { type ExpressRequest, type FormatPlayObjectOptions, type InternalConfig, - NO_USER, type PlayerStateData} from "../common/infrastructure/Atomic.ts"; +import { NO_USER } from '../../core/Atomic.ts'; import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; import type {ReportedPlayerStatus} from '../../core/Atomic.ts'; import type {PlayPlatformId} from '../../core/Atomic.ts'; diff --git a/src/backend/sources/IcecastSource.ts b/src/backend/sources/IcecastSource.ts index 7b78e35a..6e944deb 100644 --- a/src/backend/sources/IcecastSource.ts +++ b/src/backend/sources/IcecastSource.ts @@ -5,8 +5,8 @@ import { type FormatPlayObjectOptions, type InternalConfig, type PlayerStateData, - SINGLE_USER_PLATFORM_ID, } from "../common/infrastructure/Atomic.ts"; +import { SINGLE_USER_PLATFORM_ID } from '../../core/Atomic.ts'; import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; import { isPortReachableConnect, normalizeWebAddress } from "../utils/NetworkUtils.ts"; import MemorySource from "./MemorySource.ts"; diff --git a/src/backend/sources/MPDSource.ts b/src/backend/sources/MPDSource.ts index 2a4c6da9..f6c49794 100644 --- a/src/backend/sources/MPDSource.ts +++ b/src/backend/sources/MPDSource.ts @@ -7,8 +7,8 @@ import { type FormatPlayObjectOptions, type InternalConfig, type PlayerStateData, - SINGLE_USER_PLATFORM_ID, } from "../common/infrastructure/Atomic.ts"; +import { SINGLE_USER_PLATFORM_ID } from '../../core/Atomic.ts'; import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; import type {ReportedPlayerStatus} from '../../core/Atomic.ts'; import type {MPDSourceConfig, PlayerState} from "../common/infrastructure/config/source/mpd.ts"; diff --git a/src/backend/sources/MopidySource.ts b/src/backend/sources/MopidySource.ts index d78c5507..f584437d 100644 --- a/src/backend/sources/MopidySource.ts +++ b/src/backend/sources/MopidySource.ts @@ -11,8 +11,8 @@ import { type FormatPlayObjectOptions, type InternalConfig, type PlayerStateData, - SINGLE_USER_PLATFORM_ID, } from "../common/infrastructure/Atomic.ts"; +import { SINGLE_USER_PLATFORM_ID } from '../../core/Atomic.ts'; import type {MopidySourceConfig} from "../common/infrastructure/config/source/mopidy.ts"; import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import { MemoryPositionalSource } from "./MemoryPositionalSource.ts"; diff --git a/src/backend/sources/MusicCastSource.ts b/src/backend/sources/MusicCastSource.ts index c631a811..df1d3035 100644 --- a/src/backend/sources/MusicCastSource.ts +++ b/src/backend/sources/MusicCastSource.ts @@ -6,8 +6,8 @@ import { type FormatPlayObjectOptions, type InternalConfig, type PlayerStateData, - SINGLE_USER_PLATFORM_ID, } from "../common/infrastructure/Atomic.ts"; +import { SINGLE_USER_PLATFORM_ID } from '../../core/Atomic.ts'; import { isPortReachableConnect, joinedUrl, normalizeWebAddress } from "../utils/NetworkUtils.ts"; import { type DeviceInfoResponse, type DeviceStatusResponse, MusicCastResponseCodes, type MusicCastSourceConfig, playbackToReportedStatus, type PlayInfoCDResponse, type PlayInfoNetResponse } from "../common/infrastructure/config/source/musiccast.ts"; import request from 'superagent'; diff --git a/src/backend/sources/MusikcubeSource.ts b/src/backend/sources/MusikcubeSource.ts index 320756c1..3ff8cb22 100644 --- a/src/backend/sources/MusikcubeSource.ts +++ b/src/backend/sources/MusikcubeSource.ts @@ -10,8 +10,8 @@ import { type FormatPlayObjectOptions, type InternalConfig, type PlayerStateData, - SINGLE_USER_PLATFORM_ID, } from "../common/infrastructure/Atomic.ts"; +import { SINGLE_USER_PLATFORM_ID } from '../../core/Atomic.ts'; import type {MCAuthenticateRequest, MCAuthenticateResponse, MCPlaybackOverviewRequest, MCPlaybackOverviewResponse, MusikcubeSourceConfig} from "../common/infrastructure/config/source/musikcube.ts"; import { sleep } from "../utils.ts"; import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; diff --git a/src/backend/sources/SonosSource.ts b/src/backend/sources/SonosSource.ts index 5dab7d81..09cac3ae 100644 --- a/src/backend/sources/SonosSource.ts +++ b/src/backend/sources/SonosSource.ts @@ -3,10 +3,10 @@ import type {PlayObject, PlayObjectMinimal} from "../../core/Atomic.ts"; import { type FormatPlayObjectOptions, type InternalConfig, - NO_DEVICE, - NO_USER, type PlayerStateData, } from "../common/infrastructure/Atomic.ts"; +import { NO_USER } from '../../core/Atomic.ts'; +import { NO_DEVICE } from '../../core/Atomic.ts'; import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; import type {ReportedPlayerStatus} from '../../core/Atomic.ts'; import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; diff --git a/src/backend/sources/SpotifySource.ts b/src/backend/sources/SpotifySource.ts index 018d38a9..dd06f197 100644 --- a/src/backend/sources/SpotifySource.ts +++ b/src/backend/sources/SpotifySource.ts @@ -10,8 +10,6 @@ import { DEFAULT_POLLING_INTERVAL, type FormatPlayObjectOptions, type InternalConfig, - NO_DEVICE, - NO_USER, type PaginatedListensTimeRangeOptions, type PaginatedTimeRangeListens, type PaginatedTimeRangeListensResult, @@ -19,6 +17,8 @@ import { type SourceData, type TimeRangeListensFetcher, } from "../common/infrastructure/Atomic.ts"; +import { NO_USER } from '../../core/Atomic.ts'; +import { NO_DEVICE } from '../../core/Atomic.ts'; import type {ReportedPlayerStatus} from '../../core/Atomic.ts'; import type {SpotifySourceConfig} from "../common/infrastructure/config/source/spotify.ts"; import { diff --git a/src/backend/sources/SubsonicSource.ts b/src/backend/sources/SubsonicSource.ts index 9ae5cb86..6f199fec 100644 --- a/src/backend/sources/SubsonicSource.ts +++ b/src/backend/sources/SubsonicSource.ts @@ -22,6 +22,7 @@ import { baseFormatPlayObj } from '../utils/PlayTransformUtils.ts'; import { noRetryOnUpstreamError, tryApiCall } from '../utils/RequestUtils.ts'; import { artistNameToCredit } from '../../core/StringUtils.ts'; import { timeToHumanTimestamp, todayAwareFormat } from '../../core/TimeUtils.ts'; +import type { ComponentSourceApiJson, SubsonicSourceApiJson } from '../../core/Api.ts'; dayjs.extend(isSameOrAfter); @@ -373,6 +374,13 @@ export class SubsonicSource extends MemoryPositionalSource { } getNewPlayer = (logger: Logger, id: PlayPlatformId, opts: PlayerStateOptions) => new SubsonicPlayerState(logger, id, opts); + + public getApiData(): SubsonicSourceApiJson { + return { + ...super.getApiData(), + playbackReporting: this.playbackReportSupported + } + } } const subsonicPlaybackStateToReportedStatus = (state: string | undefined) => { diff --git a/src/backend/sources/VLCSource.ts b/src/backend/sources/VLCSource.ts index cebc811a..72a35de1 100644 --- a/src/backend/sources/VLCSource.ts +++ b/src/backend/sources/VLCSource.ts @@ -7,8 +7,8 @@ import { type FormatPlayObjectOptions, type InternalConfig, type PlayerStateData, - SINGLE_USER_PLATFORM_ID, } from "../common/infrastructure/Atomic.ts"; +import { SINGLE_USER_PLATFORM_ID } from '../../core/Atomic.ts'; import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; import type {ReportedPlayerStatus} from '../../core/Atomic.ts'; import type {VlcAudioMeta, VLCSourceConfig, PlayerState} from "../common/infrastructure/config/source/vlc.ts"; diff --git a/src/backend/sources/WebScrobblerSource.ts b/src/backend/sources/WebScrobblerSource.ts index c4754837..7f708174 100644 --- a/src/backend/sources/WebScrobblerSource.ts +++ b/src/backend/sources/WebScrobblerSource.ts @@ -4,9 +4,9 @@ import { type PlayObjectMinimal, SOURCE_SOT } from "../../core/Atomic.ts"; import { type FormatPlayObjectOptions, type InternalConfig, - NO_USER, type PlayerStateData, } from "../common/infrastructure/Atomic.ts"; +import { NO_USER } from '../../core/Atomic.ts'; import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; import type {ReportedPlayerStatus} from '../../core/Atomic.ts'; import type {PlayPlatformId} from '../../core/Atomic.ts'; diff --git a/src/backend/sources/YandexMusicBridgeSource.ts b/src/backend/sources/YandexMusicBridgeSource.ts index c269c608..124a6e7a 100644 --- a/src/backend/sources/YandexMusicBridgeSource.ts +++ b/src/backend/sources/YandexMusicBridgeSource.ts @@ -5,10 +5,10 @@ import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import type {PlayObject, PlayObjectMinimal, URLData} from "../../core/Atomic.ts"; import { type InternalConfig, - NO_DEVICE, - NO_USER, type PlayerStateDataMaybePlay, } from "../common/infrastructure/Atomic.ts"; +import { NO_USER } from '../../core/Atomic.ts'; +import { NO_DEVICE } from '../../core/Atomic.ts'; import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; import type {YandexMusicBridgeSourceConfig} from "../common/infrastructure/config/source/ymbridge.ts"; import { isPortReachableConnect, joinedUrl, normalizeWebAddress } from "../utils/NetworkUtils.ts"; diff --git a/src/backend/tests/player/player.test.ts b/src/backend/tests/player/player.test.ts index d0ea10dd..8f8d5ef8 100644 --- a/src/backend/tests/player/player.test.ts +++ b/src/backend/tests/player/player.test.ts @@ -4,11 +4,10 @@ import clone from "clone"; import dayjs, { type Dayjs } from "dayjs"; import { describe, it } from 'mocha'; import { - NO_DEVICE, - NO_USER, - type PlayerStateDataMaybePlay, - SINGLE_USER_PLATFORM_ID -} from "../../common/infrastructure/Atomic.ts"; + type PlayerStateDataMaybePlay} from "../../common/infrastructure/Atomic.ts"; +import { SINGLE_USER_PLATFORM_ID } from '../../../core/Atomic.ts'; +import { NO_USER } from '../../../core/Atomic.ts'; +import { NO_DEVICE } from '../../../core/Atomic.ts'; import { CALCULATED_PLAYER_STATUSES } from '../../../core/Atomic.ts'; import { REPORTED_PLAYER_STATUSES } from '../../../core/Atomic.ts'; import { GenericPlayerState } from "../../sources/PlayerState/GenericPlayerState.ts"; diff --git a/src/backend/utils.ts b/src/backend/utils.ts index a4a46b29..49a381b7 100644 --- a/src/backend/utils.ts +++ b/src/backend/utils.ts @@ -9,13 +9,13 @@ import { TimeoutError, WebapiError } from "spotify-web-api-node/src/response-err import { DEFAULT_MISSING_MBIDS_TYPES, type MissingMbidType, type PlayObject } from "../core/Atomic.ts"; import { asPlayerStateDataMaybePlay, - NO_DEVICE, - NO_USER, type PlayerStateDataMaybePlay, type ProgressAwarePlayObject, type RemoteIdentityParts, type ScrobbleThresholdResult, } from "./common/infrastructure/Atomic.ts"; +import { NO_USER } from '../core/Atomic.ts'; +import { NO_DEVICE } from '../core/Atomic.ts'; import type {PlayPlatformId} from '../core/Atomic.ts'; import { genGroupIdStr } from '../core/PlayUtils.ts'; import { durationToNormalizedTime } from '../core/TimeUtils.ts'; diff --git a/src/core/Atomic.ts b/src/core/Atomic.ts index 5bb9508e..b8c9e3c6 100644 --- a/src/core/Atomic.ts +++ b/src/core/Atomic.ts @@ -802,3 +802,7 @@ export interface MonitoringStatus { monitoring: boolean origin: MonitoringOrigin } +export const NO_DEVICE = 'NoDevice';export const NO_USER = 'SingleUser'; +export const SINGLE_USER_PLATFORM_ID: PlayPlatformId = [NO_DEVICE, NO_USER]; +export const SINGLE_USER_PLATFORM_ID_STR = `${NO_DEVICE}-${NO_USER}`; + diff --git a/src/core/tests/utils/PlayTestUtils.ts b/src/core/tests/utils/PlayTestUtils.ts index c04a2cb5..e0f8cc3f 100644 --- a/src/core/tests/utils/PlayTestUtils.ts +++ b/src/core/tests/utils/PlayTestUtils.ts @@ -8,7 +8,10 @@ import utc from "dayjs/plugin/utc.js"; import { type ArtistCredit, type BrainzMeta, FEAT, JOINERS, JOINERS_FINAL, type JsonPlayObject, type MBID, type ObjectPlayData, type PlayMeta, type PlayObject, type SourcePlayerObj } from "../../Atomic.ts"; import { genGroupIdStr } from '../../PlayUtils.ts'; import { sortByNewestPlayDate } from '../../PlayUtils.ts'; -import { NO_DEVICE, NO_USER, type PlayerStateDataMaybePlay, SINGLE_USER_PLATFORM_ID } from '../../../backend/common/infrastructure/Atomic.ts'; +import type { PlayerStateDataMaybePlay } from '../../../backend/common/infrastructure/Atomic.ts'; +import { SINGLE_USER_PLATFORM_ID } from '../../Atomic.ts'; +import { NO_USER } from '../../Atomic.ts'; +import { NO_DEVICE } from '../../Atomic.ts'; import { CALCULATED_PLAYER_STATUSES } from '../../Atomic.ts'; import { REPORTED_PLAYER_STATUSES } from '../../Atomic.ts'; import type {PlayPlatformId} from '../../Atomic.ts';