diff --git a/src/backend/common/infrastructure/Atomic.ts b/src/backend/common/infrastructure/Atomic.ts index b3bd9936..a819ab85 100644 --- a/src/backend/common/infrastructure/Atomic.ts +++ b/src/backend/common/infrastructure/Atomic.ts @@ -7,138 +7,11 @@ import { FixedSizeList } from 'fixed-size-list'; import { isPlayObject, PlayMeta, PlayMetaLifecycleless, PlayObject, PlayObjectLifecycleless, UnixTimestamp } from "../../../core/Atomic.js"; import TupleMap from "../TupleMap.js"; import { MusicBrainzApi } from 'musicbrainz-api'; - -export type SourceType = - 'spotify' - | 'plex' - | 'subsonic' - | 'jellyfin' - | 'lastfm' - | 'librefm' - | 'deezer' - | 'endpointlz' - | 'endpointlfm' - | 'ytmusic' - | 'mpris' - | 'mopidy' - | 'musiccast' - | 'listenbrainz' - | 'jriver' - | 'kodi' - | 'webscrobbler' - | 'chromecast' - | 'maloja' - | 'musikcube' - | 'mpd' - | 'vlc' - | 'icecast' - | 'azuracast' - | 'koito' - | 'tealfm' - | 'rocksky' - | 'sonos'; - -export const sourceTypes: SourceType[] = [ - 'spotify', - 'plex', - 'subsonic', - 'jellyfin', - 'lastfm', - 'librefm', - 'deezer', - 'endpointlz', - 'endpointlfm', - 'ytmusic', - 'mpris', - 'mopidy', - 'musiccast', - 'listenbrainz', - 'jriver', - 'kodi', - 'webscrobbler', - 'chromecast', - 'maloja', - 'musikcube', - 'mpd', - 'vlc', - 'icecast', - 'azuracast', - 'koito', - 'tealfm', - 'rocksky', - 'sonos' -]; - -export const sourceInterfaces = [ - 'AIOSourceRelaxedConfig', - 'SpotifySourceConfig', - 'PlexCompatConfig', - 'DeezerCompatConfig', - 'ListenbrainzEndpointSourceConfig', - 'LastFMEndpointSourceConfig', - 'IcecastSourceConfig', - 'SubSonicSourceConfig', - 'JellyfinCompatConfig', - 'LastfmSourceConfig', - 'LibrefmSourceConfig', - 'YTMusicSourceConfig', - 'MalojaSourceConfig', - 'MPRISSourceConfig', - 'MopidySourceConfig', - 'ListenBrainzSourceConfig', - 'JRiverSourceConfig', - 'KodiSourceConfig', - 'ChromecastSourceConfig', - 'WebScrobblerSourceConfig', - 'MusikcubeSourceConfig', - 'MusicCastSourceConfig', - 'MPDSourceConfig', - 'VLCSourceConfig', - 'AzuracastSourceConfig', - 'KoitoSourceConfig', - 'TealSourceConfig', - 'RockskySourceConfig', - 'SonosSourceConfig' -] - -export const isSourceType = (data: string): data is SourceType => { - return sourceTypes.includes(data as SourceType); -} +import { SourceType } from './config/source/sources.js'; +import { ClientType, clientTypes } from './config/client/clients.js'; export const lowGranularitySources: SourceType[] = ['subsonic', 'ytmusic']; -export type ClientType = - 'maloja' - | 'lastfm' - | 'librefm' - | 'listenbrainz' - | 'koito' - | 'tealfm' - | 'rocksky' - | 'discord'; -export const clientTypes: ClientType[] = [ - 'maloja', - 'lastfm', - 'librefm', - 'listenbrainz', - 'koito', - 'tealfm', - 'rocksky', - 'discord' -]; - -export const clientInterfaces = [ - 'AIOClientRelaxedConfig', - 'MalojaClientConfig', - 'LastfmClientConfig', - 'LibrefmClientConfig', - 'ListenBrainzClientConfig', - 'KoitoClientConfig', - 'TealClientConfig', - 'RockSkyClientConfig', - 'DiscordClientConfig' -]; - export const isClientType = (data: string): data is ClientType => { return clientTypes.includes(data as ClientType); } diff --git a/src/backend/common/infrastructure/config/aioConfig.ts b/src/backend/common/infrastructure/config/aioConfig.ts index 6e8d032d..be1241e5 100644 --- a/src/backend/common/infrastructure/config/aioConfig.ts +++ b/src/backend/common/infrastructure/config/aioConfig.ts @@ -5,7 +5,7 @@ import { RequestRetryOptions } from "./common.js"; import { WebhookConfig } from "./health/webhooks.js"; import { CommonSourceOptions, SourceRetryOptions } from "./source/index.js"; import { SourceAIOConfig } from "./source/sources.js"; -import { CacheConfigOptions, ClientType, SourceType } from "../Atomic.js"; +import { CacheConfigOptions } from "../Atomic.js"; import { TransformerCommonConfig } from "../../../../core/Atomic.js"; diff --git a/src/backend/common/infrastructure/config/client/clients.ts b/src/backend/common/infrastructure/config/client/clients.ts index fc569bb2..4dc8d3a5 100644 --- a/src/backend/common/infrastructure/config/client/clients.ts +++ b/src/backend/common/infrastructure/config/client/clients.ts @@ -7,6 +7,53 @@ import { RockSkyClientAIOConfig, RockSkyClientConfig } from "./rocksky.js"; import { LibrefmClientConfig, LibrefmClientAIOConfig } from "./librefm.js"; import { DiscordClientAIOConfig, DiscordClientConfig } from "./discord.js"; -export type ClientConfig = MalojaClientConfig | LastfmClientConfig | LibrefmClientConfig | ListenBrainzClientConfig | KoitoClientConfig | TealClientConfig | RockSkyClientConfig | DiscordClientConfig; +export type ClientConfig = MalojaClientConfig +| LastfmClientConfig +| LibrefmClientConfig +| ListenBrainzClientConfig +| KoitoClientConfig +| TealClientConfig +| RockSkyClientConfig +| DiscordClientConfig; -export type ClientAIOConfig = MalojaClientAIOConfig | LastfmClientAIOConfig | LibrefmClientAIOConfig | ListenBrainzClientAIOConfig | KoitoClientAIOConfig | TealClientAIOConfig | RockSkyClientAIOConfig | DiscordClientAIOConfig; +export type ClientAIOConfig = MalojaClientAIOConfig +| LastfmClientAIOConfig +| LibrefmClientAIOConfig +| ListenBrainzClientAIOConfig +| KoitoClientAIOConfig +| TealClientAIOConfig +| RockSkyClientAIOConfig +| DiscordClientAIOConfig; + +export const clientInterfaces = [ + 'AIOClientRelaxedConfig', + 'MalojaClientConfig', + 'LastfmClientConfig', + 'LibrefmClientConfig', + 'ListenBrainzClientConfig', + 'KoitoClientConfig', + 'TealClientConfig', + 'RockSkyClientConfig', + 'DiscordClientConfig' +]; + +export type ClientType = + 'maloja' + | 'lastfm' + | 'librefm' + | 'listenbrainz' + | 'koito' + | 'tealfm' + | 'rocksky' + | 'discord'; + +export const clientTypes: ClientType[] = [ + 'maloja', + 'lastfm', + 'librefm', + 'listenbrainz', + 'koito', + 'tealfm', + 'rocksky', + 'discord' +]; \ No newline at end of file diff --git a/src/backend/common/infrastructure/config/source/sources.ts b/src/backend/common/infrastructure/config/source/sources.ts index 6a650fcf..493eef35 100644 --- a/src/backend/common/infrastructure/config/source/sources.ts +++ b/src/backend/common/infrastructure/config/source/sources.ts @@ -89,3 +89,101 @@ export type SourceAIOConfig = | TealSourceAIOConfig | RockskySourceAIOConfig | SonosSourceAIOConfig; + +export type SourceType = + 'spotify' + | 'plex' + | 'subsonic' + | 'jellyfin' + | 'lastfm' + | 'librefm' + | 'deezer' + | 'endpointlz' + | 'endpointlfm' + | 'ytmusic' + | 'mpris' + | 'mopidy' + | 'musiccast' + | 'listenbrainz' + | 'jriver' + | 'kodi' + | 'webscrobbler' + | 'chromecast' + | 'maloja' + | 'musikcube' + | 'mpd' + | 'vlc' + | 'icecast' + | 'azuracast' + | 'koito' + | 'tealfm' + | 'rocksky' + | 'sonos'; + +export const sourceTypes: SourceType[] = [ + 'spotify', + 'plex', + 'subsonic', + 'jellyfin', + 'lastfm', + 'librefm', + 'deezer', + 'endpointlz', + 'endpointlfm', + 'ytmusic', + 'mpris', + 'mopidy', + 'musiccast', + 'listenbrainz', + 'jriver', + 'kodi', + 'webscrobbler', + 'chromecast', + 'maloja', + 'musikcube', + 'mpd', + 'vlc', + 'icecast', + 'azuracast', + 'koito', + 'tealfm', + 'rocksky', + 'sonos' +]; + +export const sourceInterfaces = [ + 'AIOSourceRelaxedConfig', + 'SpotifySourceConfig', + 'PlexCompatConfig', + 'DeezerCompatConfig', + 'ListenbrainzEndpointSourceConfig', + 'LastFMEndpointSourceConfig', + 'IcecastSourceConfig', + 'SubSonicSourceConfig', + 'JellyfinCompatConfig', + 'LastfmSourceConfig', + 'LibrefmSourceConfig', + 'YTMusicSourceConfig', + 'MalojaSourceConfig', + 'MPRISSourceConfig', + 'MopidySourceConfig', + 'ListenBrainzSourceConfig', + 'JRiverSourceConfig', + 'KodiSourceConfig', + 'ChromecastSourceConfig', + 'WebScrobblerSourceConfig', + 'MusikcubeSourceConfig', + 'MusicCastSourceConfig', + 'MPDSourceConfig', + 'VLCSourceConfig', + 'AzuracastSourceConfig', + 'KoitoSourceConfig', + 'TealSourceConfig', + 'RockskySourceConfig', + 'SonosSourceConfig' +]; + +export const isSourceType = (data: string): data is SourceType => { + return sourceTypes.includes(data as SourceType); +}; + diff --git a/src/backend/scrobblers/AbstractScrobbleClient.ts b/src/backend/scrobblers/AbstractScrobbleClient.ts index 809ab08e..ded4da9a 100644 --- a/src/backend/scrobblers/AbstractScrobbleClient.ts +++ b/src/backend/scrobblers/AbstractScrobbleClient.ts @@ -22,7 +22,6 @@ import { ARTIST_WEIGHT, Authenticatable, CALCULATED_PLAYER_STATUSES, - ClientType, DEFAULT_RETRY_MULTIPLIER, DUP_SCORE_THRESHOLD, FormatPlayObjectOptions, @@ -34,6 +33,7 @@ import { TimeRangeListensFetcher, TITLE_WEIGHT, } from "../common/infrastructure/Atomic.js"; +import { ClientType } from '../common/infrastructure/config/client/clients.js'; import { CommonClientConfig, NowPlayingOptions, UpstreamRefreshOptions } from "../common/infrastructure/config/client/index.js"; import { TRANSFORM_HOOK } from "../common/infrastructure/Transform.js"; import { Notifiers } from "../notifier/Notifiers.js"; diff --git a/src/backend/scrobblers/ScrobbleClients.ts b/src/backend/scrobblers/ScrobbleClients.ts index 5df89471..b32135bf 100644 --- a/src/backend/scrobblers/ScrobbleClients.ts +++ b/src/backend/scrobblers/ScrobbleClients.ts @@ -2,7 +2,8 @@ import { childLogger, Logger } from '@foxxmd/logging'; import dayjs, { Dayjs } from "dayjs"; import { PlayObject, SourcePlayerObj } from "../../core/Atomic.js"; -import { ClientType, clientTypes, ConfigMeta, InternalConfig, InternalConfigOptional, isClientType, REPORTED_PLAYER_STATUSES, SourceIdentifier } from "../common/infrastructure/Atomic.js"; +import { ConfigMeta, InternalConfig, InternalConfigOptional, isClientType, SourceIdentifier } from "../common/infrastructure/Atomic.js"; +import { clientTypes, ClientType } from '../common/infrastructure/config/client/clients.js'; import { AIOConfig } from "../common/infrastructure/config/aioConfig.js"; import { ClientAIOConfig, ClientConfig } from "../common/infrastructure/config/client/clients.js"; import { LastfmClientConfig } from "../common/infrastructure/config/client/lastfm.js"; diff --git a/src/backend/sources/AbstractSource.ts b/src/backend/sources/AbstractSource.ts index 81e706e5..19e3c5c6 100644 --- a/src/backend/sources/AbstractSource.ts +++ b/src/backend/sources/AbstractSource.ts @@ -2,7 +2,7 @@ import { childLogger, LogDataPretty, LogLevel } from '@foxxmd/logging'; import dayjs, { Dayjs } from "dayjs"; import { EventEmitter } from "events"; import { FixedSizeList } from "fixed-size-list"; -import { PlayObject, TA_CLOSE, TA_DEFAULT_ACCURACY } from "../../core/Atomic.js"; +import { PlayObject } from "../../core/Atomic.js"; import { buildTrackString, capitalize, truncateStringToLength } from "../../core/StringUtils.js"; import AbstractComponent from "../common/AbstractComponent.js"; import { @@ -18,9 +18,8 @@ import { PlayUserId, ProgressAwarePlayObject, SINGLE_USER_PLATFORM_ID, - SourceType, } from "../common/infrastructure/Atomic.js"; -import { SourceConfig } from "../common/infrastructure/config/source/sources.js"; +import { SourceType, SourceConfig } from '../common/infrastructure/config/source/sources.js'; import { TRANSFORM_HOOK } from "../common/infrastructure/Transform.js"; import TupleMap from "../common/TupleMap.js"; import { diff --git a/src/backend/sources/LastfmSource.ts b/src/backend/sources/LastfmSource.ts index 18d88c9a..73737055 100644 --- a/src/backend/sources/LastfmSource.ts +++ b/src/backend/sources/LastfmSource.ts @@ -1,6 +1,7 @@ import EventEmitter from "events"; import { PlayObject, SOURCE_SOT } from "../../core/Atomic.js"; -import { FormatPlayObjectOptions, InternalConfig, PlayPlatformId, SourceType, TimeRangeListensFetcher } from "../common/infrastructure/Atomic.js"; +import { FormatPlayObjectOptions, InternalConfig, PlayPlatformId, TimeRangeListensFetcher } from "../common/infrastructure/Atomic.js"; +import { SourceType } from '../common/infrastructure/config/source/sources.js'; import { LastfmSourceConfig } from "../common/infrastructure/config/source/lastfm.js"; import LastfmApiClient, { formatPlayObj } from "../common/vendor/LastfmApiClient.js"; import { sortByOldestPlayDate } from "../utils.js"; diff --git a/src/backend/sources/MemoryPositionalSource.ts b/src/backend/sources/MemoryPositionalSource.ts index 00297307..b6696925 100644 --- a/src/backend/sources/MemoryPositionalSource.ts +++ b/src/backend/sources/MemoryPositionalSource.ts @@ -1,10 +1,9 @@ import { Logger } from "@foxxmd/logging"; -import { InternalConfig, PlayerStateDataMaybePlay, PlayPlatformId, SourceType } from "../common/infrastructure/Atomic.js"; +import { InternalConfig, PlayPlatformId } from "../common/infrastructure/Atomic.js"; import MemorySource from "./MemorySource.js"; import { PlayerStateOptions } from "./PlayerState/AbstractPlayerState.js"; import { PositionalPlayerState } from "./PlayerState/PositionalPlayerState.js"; -import { PlayObject } from "../../core/Atomic.js"; -import { SourceConfig } from "../common/infrastructure/config/source/sources.js"; +import { SourceConfig, SourceType } from "../common/infrastructure/config/source/sources.js"; import EventEmitter from "events"; export class MemoryPositionalSource extends MemorySource { diff --git a/src/backend/sources/MemorySource.ts b/src/backend/sources/MemorySource.ts index 9db83603..26b650b2 100644 --- a/src/backend/sources/MemorySource.ts +++ b/src/backend/sources/MemorySource.ts @@ -9,11 +9,9 @@ import { CALCULATED_PLAYER_STATUSES, InternalConfig, PlayerStateDataMaybePlay, PlayPlatformId, - ProgressAwarePlayObject, - SourceType -} from "../common/infrastructure/Atomic.js"; + ProgressAwarePlayObject} from "../common/infrastructure/Atomic.js"; +import { SourceType, SourceConfig } from '../common/infrastructure/config/source/sources.js'; import { PollingOptions } from "../common/infrastructure/config/common.js"; -import { SourceConfig } from "../common/infrastructure/config/source/sources.js"; import { formatNumber, genGroupId, diff --git a/src/backend/sources/ScrobbleSources.ts b/src/backend/sources/ScrobbleSources.ts index efd59cd9..9ef06721 100644 --- a/src/backend/sources/ScrobbleSources.ts +++ b/src/backend/sources/ScrobbleSources.ts @@ -1,7 +1,10 @@ /* eslint-disable no-case-declarations */ import { childLogger, Logger } from '@foxxmd/logging'; import EventEmitter from "events"; -import { ConfigMeta, InternalConfig, InternalConfigOptional, isSourceType, SourceType, sourceTypes } from "../common/infrastructure/Atomic.js"; +import { ConfigMeta, InternalConfig, InternalConfigOptional } from "../common/infrastructure/Atomic.js"; +import { isSourceType } from '../common/infrastructure/config/source/sources.js'; +import { sourceTypes } from '../common/infrastructure/config/source/sources.js'; +import { SourceType } from '../common/infrastructure/config/source/sources.js'; import { AIOConfig, SourceDefaults } from "../common/infrastructure/config/aioConfig.js"; import { AzuracastData, AzuracastSourceConfig } from "../common/infrastructure/config/source/azuracast.js"; import { ChromecastSourceConfig } from "../common/infrastructure/config/source/chromecast.js"; diff --git a/src/backend/tests/config/config.test.ts b/src/backend/tests/config/config.test.ts index 8d4d8d66..10717d91 100644 --- a/src/backend/tests/config/config.test.ts +++ b/src/backend/tests/config/config.test.ts @@ -9,7 +9,8 @@ import ScrobbleClients from '../../scrobblers/ScrobbleClients.js'; import ScrobbleSources from '../../sources/ScrobbleSources.js'; import EventEmitter from "events"; import {loggerTest, loggerDebug} from '@foxxmd/logging'; -import { clientTypes, SourceType, sourceTypes } from '../../common/infrastructure/Atomic.js'; +import { clientTypes } from '../../common/infrastructure/config/client/clients.js'; +import { sourceTypes } from '../../common/infrastructure/config/source/sources.js'; import { Notifiers } from '../../notifier/Notifiers.js'; import { difference, intersect } from '../../utils.js'; diff --git a/src/backend/utils/SchemaAppStaticUtils.ts b/src/backend/utils/SchemaAppStaticUtils.ts index c79689d7..198b375d 100644 --- a/src/backend/utils/SchemaAppStaticUtils.ts +++ b/src/backend/utils/SchemaAppStaticUtils.ts @@ -2,7 +2,8 @@ import { writeFileSync } from "node:fs"; import { resolve } from "path"; import { projectDir } from "../common/index.js"; import {getTypeSchemaFromConfigGenerator} from "./SchemaUtils.js"; -import { clientInterfaces, sourceInterfaces } from "../common/infrastructure/Atomic.js"; +import { clientInterfaces } from '../common/infrastructure/config/client/clients.js'; +import { sourceInterfaces } from '../common/infrastructure/config/source/sources.js'; for(const inter of sourceInterfaces) { const schema = getTypeSchemaFromConfigGenerator(inter);