diff --git a/src/backend/common/infrastructure/config/source/chromecast.ts b/src/backend/common/infrastructure/config/source/chromecast.ts index 415c352b..54595c4b 100644 --- a/src/backend/common/infrastructure/config/source/chromecast.ts +++ b/src/backend/common/infrastructure/config/source/chromecast.ts @@ -1,5 +1,5 @@ import * as z from "zod"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const chromecastDeviceInfoSchema = z.object({ /** @@ -132,6 +132,25 @@ export const chromecastDataSchema = z.object({ export type ChromecastData = z.infer; +const envDataSchema = z.object({ + CC_BLACKLIST_DEVICES: chromecastDataSchema.shape.blacklistDevices, + CC_WHITELIST_DEVICES: chromecastDataSchema.shape.whitelistDevices, + CC_BLACKLIST_APPS: chromecastDataSchema.shape.blacklistApps, + CC_WHITELIST_APPS: chromecastDataSchema.shape.whitelistApps, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + blacklistDevices: partial.CC_BLACKLIST_DEVICES, + whitelistDevices: partial.CC_WHITELIST_DEVICES, + blacklistApps: partial.CC_BLACKLIST_APPS, + whitelistApps: partial.CC_WHITELIST_APPS + } + }) +}; + export const chromecastSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, data: chromecastDataSchema, diff --git a/src/backend/common/infrastructure/config/source/endpointlfm.ts b/src/backend/common/infrastructure/config/source/endpointlfm.ts index bfe6bf47..f7cf2598 100644 --- a/src/backend/common/infrastructure/config/source/endpointlfm.ts +++ b/src/backend/common/infrastructure/config/source/endpointlfm.ts @@ -1,5 +1,5 @@ import * as z from "zod"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const lastFmEndpointDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -22,6 +22,19 @@ export const lastFmEndpointDataSchema = z.object({ export type LastFMEndpointData = z.infer; +const envDataSchema = z.object({ + LFM_SLUG: lastFmEndpointDataSchema.shape.slug, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + slug: partial.LFM_SLUG + } + }) +}; + export const lastFmEndpointSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, data: lastFmEndpointDataSchema.optional(), diff --git a/src/backend/common/infrastructure/config/source/endpointlz.ts b/src/backend/common/infrastructure/config/source/endpointlz.ts index bff08abb..0cacc7fb 100644 --- a/src/backend/common/infrastructure/config/source/endpointlz.ts +++ b/src/backend/common/infrastructure/config/source/endpointlz.ts @@ -1,5 +1,5 @@ import * as z from "zod"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const listenbrainzEndpointDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -42,6 +42,23 @@ export const listenbrainzEndpointDataSchema = z.object({ export type ListenbrainzEndpointData = z.infer; +const envDataSchema = z.object({ + LZE_SLUG: listenbrainzEndpointDataSchema.shape.slug, + LZE_TOKEN: listenbrainzEndpointDataSchema.shape.token, + LZE_USERNAME: listenbrainzEndpointDataSchema.shape.username, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + slug: partial.LZE_SLUG, + token: partial.LZE_TOKEN, + username: partial.LZE_USERNAME + } + }) +}; + export const listenbrainzEndpointSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, data: listenbrainzEndpointDataSchema.optional(), diff --git a/src/backend/common/infrastructure/config/source/icecast.ts b/src/backend/common/infrastructure/config/source/icecast.ts index 39714fd7..0010d534 100644 --- a/src/backend/common/infrastructure/config/source/icecast.ts +++ b/src/backend/common/infrastructure/config/source/icecast.ts @@ -1,5 +1,5 @@ import * as z from "zod"; -import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema, manualListeningOptionsSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema, manualListeningOptionsSchema, type EnvSourceSchema} from "./index.ts"; export interface IcecastMetadata { icy?: { @@ -44,6 +44,19 @@ export const icecastDataSchema = z.object({ export type IcecastData = z.infer; +const envDataSchema = z.object({ + ICECAST_URL: icecastDataSchema.shape.url, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + url: partial.ICECAST_URL + } + }) +}; + export const icecastSourceOptionsSchema = z.object({ ...commonSourceOptionsSchema.shape, ...manualListeningOptionsSchema.shape, diff --git a/src/backend/common/infrastructure/config/source/jellyfin.ts b/src/backend/common/infrastructure/config/source/jellyfin.ts index 1de7f970..d465eb06 100644 --- a/src/backend/common/infrastructure/config/source/jellyfin.ts +++ b/src/backend/common/infrastructure/config/source/jellyfin.ts @@ -1,5 +1,5 @@ import * as z from "zod"; -import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema, type EnvSourceSchema} from "./index.ts"; export const jellyApiDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -121,6 +121,41 @@ export const jellyApiDataSchema = z.object({ export type JellyApiData = z.infer; +const envDataSchema = z.object({ + JELLYFIN_USER: jellyApiDataSchema.shape.user, + JELLYFIN_PASSWORD: jellyApiDataSchema.shape.password, + JELLYFIN_APIKEY: jellyApiDataSchema.shape.apiKey, + JELLYFIN_URL: jellyApiDataSchema.shape.url, + JELLYFIN_USERS_ALLOW: jellyApiDataSchema.shape.usersAllow, + JELLYFIN_USERS_BLOCK: jellyApiDataSchema.shape.usersBlock, + JELLYFIN_DEVICES_ALLOW: jellyApiDataSchema.shape.devicesAllow, + JELLYFIN_DEVICES_BLOCK: jellyApiDataSchema.shape.devicesBlock, + JELLYFIN_LIBRARIES_ALLOW: jellyApiDataSchema.shape.librariesAllow, + JELLYFIN_LIBRARIES_BLOCK: jellyApiDataSchema.shape.librariesBlock, + JELLYFIN_FRONTEND_URL_OVERRIDE: jellyApiDataSchema.shape.frontendUrlOverride, + JELLYFIN_MEDIATYPES_ALLOW: jellyApiDataSchema.shape.allowMediaTypes, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + user: partial.JELLYFIN_USER, + password: partial.JELLYFIN_PASSWORD, + apiKey: partial.JELLYFIN_APIKEY, + url: partial.JELLYFIN_URL, + usersAllow: partial.JELLYFIN_USERS_ALLOW, + usersBlock: partial.JELLYFIN_USERS_BLOCK, + devicesAllow: partial.JELLYFIN_DEVICES_ALLOW, + devicesBlock: partial.JELLYFIN_DEVICES_BLOCK, + librariesAllow: partial.JELLYFIN_LIBRARIES_ALLOW, + librariesBlock: partial.JELLYFIN_LIBRARIES_BLOCK, + frontendUrlOverride: partial.JELLYFIN_FRONTEND_URL_OVERRIDE, + allowMediaTypes: partial.JELLYFIN_MEDIATYPES_ALLOW + } + }) +}; + export const jellyApiOptionsSchema = z.object({ ...commonSourceOptionsSchema.shape, }); diff --git a/src/backend/common/infrastructure/config/source/jriver.ts b/src/backend/common/infrastructure/config/source/jriver.ts index 481f0d7d..f0e28e21 100644 --- a/src/backend/common/infrastructure/config/source/jriver.ts +++ b/src/backend/common/infrastructure/config/source/jriver.ts @@ -1,6 +1,6 @@ import * as z from "zod"; import {pollingOptionsSchema, requestRetryOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const jRiverDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -47,6 +47,23 @@ export const jRiverDataSchema = z.object({ export type JRiverData = z.infer; +const envDataSchema = z.object({ + JRIVER_URL: jRiverDataSchema.shape.url, + JRIVER_USER: jRiverDataSchema.shape.username, + JRIVER_PASSWORD: jRiverDataSchema.shape.password, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + url: partial.JRIVER_URL, + username: partial.JRIVER_USER, + password: partial.JRIVER_PASSWORD + } + }) +}; + export const jRiverSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, data: jRiverDataSchema, diff --git a/src/backend/common/infrastructure/config/source/kodi.ts b/src/backend/common/infrastructure/config/source/kodi.ts index d501f427..4b2b12c8 100644 --- a/src/backend/common/infrastructure/config/source/kodi.ts +++ b/src/backend/common/infrastructure/config/source/kodi.ts @@ -1,6 +1,6 @@ import * as z from "zod"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const kodiDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -46,6 +46,23 @@ export const kodiDataSchema = z.object({ export type KodiData = z.infer; +const envDataSchema = z.object({ + KODI_URL: kodiDataSchema.shape.url, + KODI_USER: kodiDataSchema.shape.username, + KODI_PASSWORD: kodiDataSchema.shape.password, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + url: partial.KODI_URL, + username: partial.KODI_USER, + password: partial.KODI_PASSWORD + } + }) +}; + export const kodiSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, data: kodiDataSchema, diff --git a/src/backend/common/infrastructure/config/source/koito.ts b/src/backend/common/infrastructure/config/source/koito.ts index 17ab6d1b..b651a38c 100644 --- a/src/backend/common/infrastructure/config/source/koito.ts +++ b/src/backend/common/infrastructure/config/source/koito.ts @@ -1,7 +1,7 @@ import * as z from "zod"; import {koitoDataSchema} from "../client/koito.ts"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const koitoSourceDataSchema = z.object({ ...koitoDataSchema.shape, @@ -11,6 +11,23 @@ export const koitoSourceDataSchema = z.object({ export type KoitoSourceData = z.infer; +const envDataSchema = z.object({ + SOURCE_KOITO_URL: koitoSourceDataSchema.shape.url, + SOURCE_KOITO_TOKEN: koitoSourceDataSchema.shape.token, + SOURCE_KOITO_USER: koitoSourceDataSchema.shape.username, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + url: partial.SOURCE_KOITO_URL, + token: partial.SOURCE_KOITO_TOKEN, + username: partial.SOURCE_KOITO_USER + } + }) +}; + export const koitoSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, /** diff --git a/src/backend/common/infrastructure/config/source/lastfm.ts b/src/backend/common/infrastructure/config/source/lastfm.ts index 1782728d..bfb23087 100644 --- a/src/backend/common/infrastructure/config/source/lastfm.ts +++ b/src/backend/common/infrastructure/config/source/lastfm.ts @@ -1,7 +1,7 @@ import * as z from "zod"; import {lastfmDataSchema} from "../client/lastfm.ts"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const lastFmSourceDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -11,6 +11,25 @@ export const lastFmSourceDataSchema = z.object({ export type LastFmSourceData = z.infer; +const envDataSchema = z.object({ + SOURCE_LASTFM_API_KEY: lastFmSourceDataSchema.shape.apiKey, + SOURCE_LASTFM_SECRET: lastFmSourceDataSchema.shape.secret, + SOURCE_LASTFM_REDIRECT_URI: lastFmSourceDataSchema.shape.redirectUri, + SOURCE_LASTFM_SESSION: lastFmSourceDataSchema.shape.session, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + apiKey: partial.SOURCE_LASTFM_API_KEY, + secret: partial.SOURCE_LASTFM_SECRET, + redirectUri: partial.SOURCE_LASTFM_REDIRECT_URI, + session: partial.SOURCE_LASTFM_SESSION + } + }) +}; + export const lastfmSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, /** diff --git a/src/backend/common/infrastructure/config/source/librefm.ts b/src/backend/common/infrastructure/config/source/librefm.ts index bb7f5682..e2ea0d4b 100644 --- a/src/backend/common/infrastructure/config/source/librefm.ts +++ b/src/backend/common/infrastructure/config/source/librefm.ts @@ -1,7 +1,7 @@ import * as z from "zod"; import {librefmDataSchema} from "../client/librefm.ts"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const librefmSourceDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -11,6 +11,27 @@ export const librefmSourceDataSchema = z.object({ export type librefmSourceData = z.infer; +const envDataSchema = z.object({ + SOURCE_LIBREFM_API_KEY: librefmSourceDataSchema.shape.apiKey, + SOURCE_LIBREFM_SECRET: librefmSourceDataSchema.shape.secret, + SOURCE_LIBREFM_REDIRECT_URI: librefmSourceDataSchema.shape.redirectUri, + SOURCE_LIBREFM_SESSION: librefmSourceDataSchema.shape.session, + SOURCE_LIBREFM_URLBASE: librefmSourceDataSchema.shape.urlBase, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + apiKey: partial.SOURCE_LIBREFM_API_KEY, + secret: partial.SOURCE_LIBREFM_SECRET, + redirectUri: partial.SOURCE_LIBREFM_REDIRECT_URI, + session: partial.SOURCE_LIBREFM_SESSION, + urlBase: partial.SOURCE_LIBREFM_URLBASE + } + }) +}; + export const librefmSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, /** diff --git a/src/backend/common/infrastructure/config/source/listenbrainz.ts b/src/backend/common/infrastructure/config/source/listenbrainz.ts index 45931b45..3d373908 100644 --- a/src/backend/common/infrastructure/config/source/listenbrainz.ts +++ b/src/backend/common/infrastructure/config/source/listenbrainz.ts @@ -1,7 +1,7 @@ import * as z from "zod"; import {listenBrainzDataSchema} from "../client/listenbrainz.ts"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const listenBrainzSourceDataSchema = z.object({ ...listenBrainzDataSchema.shape, @@ -11,6 +11,23 @@ export const listenBrainzSourceDataSchema = z.object({ export type ListenBrainzSourceData = z.infer; +const envDataSchema = z.object({ + SOURCE_LZ_URL: listenBrainzSourceDataSchema.shape.url, + SOURCE_LZ_TOKEN: listenBrainzSourceDataSchema.shape.token, + SOURCE_LZ_USER: listenBrainzSourceDataSchema.shape.username, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + url: partial.SOURCE_LZ_URL, + token: partial.SOURCE_LZ_TOKEN, + username: partial.SOURCE_LZ_USER + } + }) +}; + export const listenBrainzSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, /** diff --git a/src/backend/common/infrastructure/config/source/maloja.ts b/src/backend/common/infrastructure/config/source/maloja.ts index dac951fa..89754720 100644 --- a/src/backend/common/infrastructure/config/source/maloja.ts +++ b/src/backend/common/infrastructure/config/source/maloja.ts @@ -1,7 +1,7 @@ import * as z from "zod"; import {malojaDataSchema} from "../client/maloja.ts"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const malojaSourceDataSchema = z.object({ ...malojaDataSchema.shape, @@ -11,6 +11,21 @@ export const malojaSourceDataSchema = z.object({ export type MalojaSourceData = z.infer; +const envDataSchema = z.object({ + SOURCE_MALOJA_URL: malojaSourceDataSchema.shape.url, + SOURCE_MALOJA_API_KEY: malojaSourceDataSchema.shape.apiKey, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + url: partial.SOURCE_MALOJA_URL, + apiKey: partial.SOURCE_MALOJA_API_KEY + } + }) +}; + export const malojaSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, /** diff --git a/src/backend/common/infrastructure/config/source/mpd.ts b/src/backend/common/infrastructure/config/source/mpd.ts index 345a6f5a..9680e928 100644 --- a/src/backend/common/infrastructure/config/source/mpd.ts +++ b/src/backend/common/infrastructure/config/source/mpd.ts @@ -1,6 +1,6 @@ import * as z from "zod"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema, type EnvSourceSchema} from "./index.ts"; export const mpdDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -39,6 +39,21 @@ export const mpdDataSchema = z.object({ export type MPDData = z.infer; +const envDataSchema = z.object({ + MPD_URL: mpdDataSchema.shape.url, + MPD_PASSWORD: mpdDataSchema.shape.password, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + url: partial.MPD_URL, + password: partial.MPD_PASSWORD + } + }) +}; + export const mpdSourceOptionsSchema = z.object({ ...commonSourceOptionsSchema.shape, }); diff --git a/src/backend/common/infrastructure/config/source/mpris.ts b/src/backend/common/infrastructure/config/source/mpris.ts index 761ff327..dadf8b80 100644 --- a/src/backend/common/infrastructure/config/source/mpris.ts +++ b/src/backend/common/infrastructure/config/source/mpris.ts @@ -1,5 +1,5 @@ import * as z from "zod"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const PLAYBACK_STATUS_PLAYING = 'Playing'; export const PLAYBACK_STATUS_PAUSED = 'Paused'; @@ -56,6 +56,21 @@ export const mprisDataSchema = z.object({ export type MPRISData = z.infer; +const envDataSchema = z.object({ + MPRIS_BLACKLIST: mprisDataSchema.shape.blacklist, + MPRIS_WHITELIST: mprisDataSchema.shape.whitelist, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + blacklist: partial.MPRIS_BLACKLIST, + whitelist: partial.MPRIS_WHITELIST + } + }) +}; + export const mprisSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, data: mprisDataSchema, diff --git a/src/backend/common/infrastructure/config/source/musiccast.ts b/src/backend/common/infrastructure/config/source/musiccast.ts index c94b4863..94cb6782 100644 --- a/src/backend/common/infrastructure/config/source/musiccast.ts +++ b/src/backend/common/infrastructure/config/source/musiccast.ts @@ -1,7 +1,7 @@ import * as z from "zod"; import { REPORTED_PLAYER_STATUSES } from '../../../../../core/Atomic.ts'; import type {ReportedPlayerStatus} from '../../../../../core/Atomic.ts'; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export type PlaybackStatus = 'play' | 'stop' | 'pause' | 'fast_reverse' | 'fast_forward' @@ -86,6 +86,19 @@ export const musicCastDataSchema = z.object({ export type MusicCastData = z.infer; +const envDataSchema = z.object({ + MCAST_URL: musicCastDataSchema.shape.url, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + url: partial.MCAST_URL + } + }) +}; + export const musicCastSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, data: musicCastDataSchema, diff --git a/src/backend/common/infrastructure/config/source/musikcube.ts b/src/backend/common/infrastructure/config/source/musikcube.ts index baa807e8..afc00c4c 100644 --- a/src/backend/common/infrastructure/config/source/musikcube.ts +++ b/src/backend/common/infrastructure/config/source/musikcube.ts @@ -1,5 +1,5 @@ import * as z from "zod"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const PLAYBACK_STATUS_PLAYING_MC = 'playing'; export const PLAYBACK_STATUS_PAUSED_MC = 'paused'; @@ -117,6 +117,21 @@ export const musikcubeDataSchema = z.object({ export type MusikcubeData = z.infer; +const envDataSchema = z.object({ + MC_URL: musikcubeDataSchema.shape.url, + MC_PASSWORD: musikcubeDataSchema.shape.password, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + url: partial.MC_URL, + password: partial.MC_PASSWORD + } + }) +}; + export const musikcubeSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, data: musikcubeDataSchema, diff --git a/src/backend/common/infrastructure/config/source/plex.ts b/src/backend/common/infrastructure/config/source/plex.ts index 9ca97857..364eb572 100644 --- a/src/backend/common/infrastructure/config/source/plex.ts +++ b/src/backend/common/infrastructure/config/source/plex.ts @@ -1,6 +1,6 @@ import * as z from "zod"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema, type EnvSourceSchema} from "./index.ts"; export const plexApiDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -57,6 +57,33 @@ export const plexApiDataSchema = z.object({ export type PlexApiData = z.infer; +const envDataSchema = z.object({ + PLEX_URL: plexApiDataSchema.shape.url, + PLEX_TOKEN: plexApiDataSchema.shape.token, + PLEX_USERS_ALLOW: plexApiDataSchema.shape.usersAllow, + PLEX_USERS_BLOCK: plexApiDataSchema.shape.usersBlock, + PLEX_DEVICES_ALLOW: plexApiDataSchema.shape.devicesAllow, + PLEX_DEVICES_BLOCK: plexApiDataSchema.shape.devicesBlock, + PLEX_LIBRARIES_ALLOW: plexApiDataSchema.shape.librariesAllow, + PLEX_LIBRARIES_BLOCK: plexApiDataSchema.shape.librariesBlock, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + url: partial.PLEX_URL, + token: partial.PLEX_TOKEN, + usersAllow: partial.PLEX_USERS_ALLOW, + usersBlock: partial.PLEX_USERS_BLOCK, + devicesAllow: partial.PLEX_DEVICES_ALLOW, + devicesBlock: partial.PLEX_DEVICES_BLOCK, + librariesAllow: partial.PLEX_LIBRARIES_ALLOW, + librariesBlock: partial.PLEX_LIBRARIES_BLOCK + } + }) +}; + export const plexApiOptionsSchema = z.object({ ...commonSourceOptionsSchema.shape, /** diff --git a/src/backend/common/infrastructure/config/source/rocksky.ts b/src/backend/common/infrastructure/config/source/rocksky.ts index 8468b110..f05b2b2f 100644 --- a/src/backend/common/infrastructure/config/source/rocksky.ts +++ b/src/backend/common/infrastructure/config/source/rocksky.ts @@ -1,7 +1,7 @@ import * as z from "zod"; import {rockSkyDataSchema, rockSkyOptionsSchema} from "../client/rocksky.ts"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema, type EnvSourceSchema} from "./index.ts"; export const rockskySourceDataSchema = z.object({ ...rockSkyDataSchema.shape, @@ -11,6 +11,21 @@ export const rockskySourceDataSchema = z.object({ export type RockskySourceData = z.infer; +const envDataSchema = z.object({ + SOURCE_ROCKSKY_KEY: rockskySourceDataSchema.shape.key, + SOURCE_ROCKSKY_HANDLE: rockskySourceDataSchema.shape.handle, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + key: partial.SOURCE_ROCKSKY_KEY, + handle: partial.SOURCE_ROCKSKY_HANDLE + } + }) +}; + export const rockskySourceOptionsSchema = z.object({ ...rockSkyOptionsSchema.shape, ...commonSourceOptionsSchema.shape, diff --git a/src/backend/common/infrastructure/config/source/sonos.ts b/src/backend/common/infrastructure/config/source/sonos.ts index 555b48e0..817b9407 100644 --- a/src/backend/common/infrastructure/config/source/sonos.ts +++ b/src/backend/common/infrastructure/config/source/sonos.ts @@ -1,6 +1,6 @@ import * as z from "zod"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema, type EnvSourceSchema} from "./index.ts"; export const sonosDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -44,6 +44,27 @@ export const sonosDataSchema = z.object({ export type SonosData = z.infer; +const envDataSchema = z.object({ + SONOS_HOST: sonosDataSchema.shape.host, + SONOS_DEVICES_ALLOW: sonosDataSchema.shape.devicesAllow, + SONOS_DEVICES_BLOCK: sonosDataSchema.shape.devicesBlock, + SONOS_GROUPS_ALLOW: sonosDataSchema.shape.groupsAllow, + SONOS_GROUPS_BLOCK: sonosDataSchema.shape.groupsBlock, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + host: partial.SONOS_HOST, + devicesAllow: partial.SONOS_DEVICES_ALLOW, + devicesBlock: partial.SONOS_DEVICES_BLOCK, + groupsAllow: partial.SONOS_GROUPS_ALLOW, + groupsBlock: partial.SONOS_GROUPS_BLOCK + } + }) +}; + export const sonosSourceOptionsSchema = z.object({ ...commonSourceOptionsSchema.shape, logEmptyPlayer: z.boolean().optional(), diff --git a/src/backend/common/infrastructure/config/source/spotify.ts b/src/backend/common/infrastructure/config/source/spotify.ts index f8c729ec..8a3431a5 100644 --- a/src/backend/common/infrastructure/config/source/spotify.ts +++ b/src/backend/common/infrastructure/config/source/spotify.ts @@ -1,6 +1,6 @@ import * as z from "zod"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const spotifySourceDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -58,6 +58,23 @@ export const spotifySourceDataSchema = z.object({ export type SpotifySourceData = z.infer; +const envDataSchema = z.object({ + SPOTIFY_CLIENT_ID: spotifySourceDataSchema.shape.clientId, + SPOTIFY_CLIENT_SECRET: spotifySourceDataSchema.shape.clientSecret, + SPOTIFY_REDIRECT_URI: spotifySourceDataSchema.shape.redirectUri, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + clientId: partial.SPOTIFY_CLIENT_ID, + clientSecret: partial.SPOTIFY_CLIENT_SECRET, + redirectUri: partial.SPOTIFY_REDIRECT_URI + } + }) +}; + export const spotifySourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, data: spotifySourceDataSchema, diff --git a/src/backend/common/infrastructure/config/source/subsonic.ts b/src/backend/common/infrastructure/config/source/subsonic.ts index 4a8ccc1d..55fd59f3 100644 --- a/src/backend/common/infrastructure/config/source/subsonic.ts +++ b/src/backend/common/infrastructure/config/source/subsonic.ts @@ -1,6 +1,6 @@ import * as z from "zod"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const subsonicDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -102,6 +102,23 @@ export const subsonicDataSchema = z.object({ export type SubsonicData = z.infer; +const envDataSchema = z.object({ + SUBSONIC_USER: subsonicDataSchema.shape.user, + SUBSONIC_PASSWORD: subsonicDataSchema.shape.password, + SUBSONIC_URL: subsonicDataSchema.shape.url, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + user: partial.SUBSONIC_USER, + password: partial.SUBSONIC_PASSWORD, + url: partial.SUBSONIC_URL + } + }) +}; + export const subSonicSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, data: subsonicDataSchema, diff --git a/src/backend/common/infrastructure/config/source/tealfm.ts b/src/backend/common/infrastructure/config/source/tealfm.ts index 6e888da3..45bfc385 100644 --- a/src/backend/common/infrastructure/config/source/tealfm.ts +++ b/src/backend/common/infrastructure/config/source/tealfm.ts @@ -1,7 +1,7 @@ import * as z from "zod"; import {tealClientOptionsSchema, tealDataSchema} from "../client/tealfm.ts"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema, type EnvSourceSchema} from "./index.ts"; export const tealSourceDataSchema = z.object({ ...tealDataSchema.shape, @@ -13,6 +13,21 @@ export const tealSourceDataSchema = z.object({ export type TealSourceData = z.infer; +const envDataSchema = z.object({ + SOURCE_TEALFM_IDENTIFIER: tealSourceDataSchema.shape.identifier, + SOURCE_TEALFM_APP_PW: tealSourceDataSchema.shape.appPassword, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + identifier: partial.SOURCE_TEALFM_IDENTIFIER, + appPassword: partial.SOURCE_TEALFM_APP_PW + } + }) +}; + export const tealSourceOptionsSchema = z.object({ ...commonSourceOptionsSchema.shape, ...tealClientOptionsSchema.shape, diff --git a/src/backend/common/infrastructure/config/source/vlc.ts b/src/backend/common/infrastructure/config/source/vlc.ts index 42ab419d..dc8aa3be 100644 --- a/src/backend/common/infrastructure/config/source/vlc.ts +++ b/src/backend/common/infrastructure/config/source/vlc.ts @@ -1,7 +1,7 @@ import * as z from "zod"; import type {VlcMeta} from "vlc-client/dist/Types.js"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema, type EnvSourceSchema} from "./index.ts"; export const vlcDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -31,6 +31,21 @@ export const vlcDataSchema = z.object({ export type VLCData = z.infer; +const envDataSchema = z.object({ + VLC_URL: vlcDataSchema.shape.url, + VLC_PASSWORD: vlcDataSchema.shape.password, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + url: partial.VLC_URL, + password: partial.VLC_PASSWORD + } + }) +}; + export const vlcSourceOptionsSchema = z.object({ ...commonSourceOptionsSchema.shape, /** A list of regular expressions to use to extract metadata (title, album, artist) from a filename diff --git a/src/backend/common/infrastructure/config/source/webscrobbler.ts b/src/backend/common/infrastructure/config/source/webscrobbler.ts index d37eca78..41f990a3 100644 --- a/src/backend/common/infrastructure/config/source/webscrobbler.ts +++ b/src/backend/common/infrastructure/config/source/webscrobbler.ts @@ -1,5 +1,5 @@ import * as z from "zod"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const webScrobblerDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -46,6 +46,21 @@ export const webScrobblerDataSchema = z.object({ export type WebScrobblerData = z.infer; +const envDataSchema = z.object({ + WS_BLACKLIST: webScrobblerDataSchema.shape.blacklist, + WS_WHITELIST: webScrobblerDataSchema.shape.whitelist, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + blacklist: partial.WS_BLACKLIST, + whitelist: partial.WS_WHITELIST + } + }) +}; + export const webScrobblerSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, data: webScrobblerDataSchema.optional(), diff --git a/src/backend/common/infrastructure/config/source/ymbridge.ts b/src/backend/common/infrastructure/config/source/ymbridge.ts index 26cb4d22..23e5cf71 100644 --- a/src/backend/common/infrastructure/config/source/ymbridge.ts +++ b/src/backend/common/infrastructure/config/source/ymbridge.ts @@ -1,6 +1,6 @@ import * as z from "zod"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, type EnvSourceSchema} from "./index.ts"; export const yandexMusicBridgeDataSchema = z.object({ ...commonSourceDataSchema.shape, @@ -17,6 +17,21 @@ export const yandexMusicBridgeDataSchema = z.object({ export type YandexMusicBridgeData = z.infer; +const envDataSchema = z.object({ + YMBRIDGE_URL: yandexMusicBridgeDataSchema.shape.url, + YMBRIDGE_API_KEY: yandexMusicBridgeDataSchema.shape.apiKey, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + url: partial.YMBRIDGE_URL, + apiKey: partial.YMBRIDGE_API_KEY + } + }) +}; + export const yandexMusicBridgeSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, data: yandexMusicBridgeDataSchema.optional(), diff --git a/src/backend/common/infrastructure/config/source/ytmusic.ts b/src/backend/common/infrastructure/config/source/ytmusic.ts index 45638532..8bc7febd 100644 --- a/src/backend/common/infrastructure/config/source/ytmusic.ts +++ b/src/backend/common/infrastructure/config/source/ytmusic.ts @@ -1,6 +1,6 @@ import * as z from "zod"; import {pollingOptionsSchema} from "../common.ts"; -import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema} from "./index.ts"; +import {commonSourceConfigSchema, commonSourceDataSchema, commonSourceOptionsSchema, type EnvSourceSchema} from "./index.ts"; export const innertubeOptionsSchema = z.object({ /** @@ -98,6 +98,25 @@ export const ytMusicDataSchema = z.object({ export type YTMusicData = z.infer; +const envDataSchema = z.object({ + YTM_REDIRECT_URI: ytMusicDataSchema.shape.redirectUri, + YTM_CLIENT_ID: ytMusicDataSchema.shape.clientId, + YTM_CLIENT_SECRET: ytMusicDataSchema.shape.clientSecret, + YTM_COOKIE: ytMusicDataSchema.shape.cookie, +}); + +export const envSchemas: EnvSourceSchema = { + env: envDataSchema, + toConfig: (partial) => ({ + data: { + redirectUri: partial.YTM_REDIRECT_URI, + clientId: partial.YTM_CLIENT_ID, + clientSecret: partial.YTM_CLIENT_SECRET, + cookie: partial.YTM_COOKIE + } + }) +}; + export const ytMusicSourceConfigSchema = z.object({ ...commonSourceConfigSchema.shape, data: ytMusicDataSchema.optional(),