···11-import { CommonSourceConfig, CommonSourceData } from "./index";
22-import { PollingOptions } from "../common";
11+import { CommonSourceConfig, CommonSourceData } from "./index.js";
22+import { PollingOptions } from "../common.js";
3344export interface YTMusicData extends CommonSourceData, PollingOptions {
55 /**
+5-5
src/backend/common/logging.ts
···11import path from "path";
22-import { projectDir } from "./index";
22+import { projectDir } from "./index.js";
33import * as winstonNs from '@foxxmd/winston';
44import winstonDef from '@foxxmd/winston';
55import {DuplexTransport} from "winston-duplex";
66-import { asLogOptions, LogConfig, LogOptions } from "./infrastructure/Atomic";
66+import { asLogOptions, LogConfig, LogOptions } from "./infrastructure/Atomic.js";
77import process from "process";
88-import {fileOrDirectoryIsWriteable, mergeArr, parseBool} from "../utils";
88+import { fileOrDirectoryIsWriteable, mergeArr, parseBool } from "../utils.js";
99import {ErrorWithCause, stackWithCauses} from "pony-cause";
1010import {NullTransport} from 'winston-null';
1111import DailyRotateFile from 'winston-daily-rotate-file';
1212import dayjs from "dayjs";
1313import stringify from 'safe-stable-stringify';
1414import {SPLAT, LEVEL, MESSAGE} from 'triple-beam';
1515-import { LogInfo, LogLevel } from "../../core/Atomic";
1515+import { LogInfo, LogLevel } from "../../core/Atomic.js";
1616import TransportStream from "winston-transport";
1717import {format} from 'logform';
1818···157157 ...rest
158158 }) => {
159159 const keys = Object.keys(rest);
160160- let stringifyValue = keys.length > 0 && !keys.every(x => causeKeys.some(y => y == x)) ? stringify(rest) : '';
160160+ let stringifyValue = keys.length > 0 && !keys.every(x => causeKeys.some(y => y == x)) ? stringify.default(rest) : '';
161161 let msg = message;
162162 let stackMsg = '';
163163 if (stack !== undefined) {
+4-4
src/backend/common/vendor/AbstractApiClient.ts
···11-import { mergeArr } from "../../utils";
11+import { mergeArr } from "../../utils.js";
22import {Logger} from '@foxxmd/winston';
33-import { FormatPlayObjectOptions } from "../infrastructure/Atomic";
33+import { FormatPlayObjectOptions } from "../infrastructure/Atomic.js";
44import winston from '@foxxmd/winston';
55-import { PlayObject } from "../../../core/Atomic";
66-import {capitalize} from "../../../core/StringUtils";
55+import { PlayObject } from "../../../core/Atomic.js";
66+import { capitalize } from "../../../core/StringUtils.js";
7788export default abstract class AbstractApiClient {
99 name: string;
+3-3
src/backend/common/vendor/JRiverApiClient.ts
···11-import AbstractApiClient from "./AbstractApiClient";
22-import {JRiverData} from "../infrastructure/config/source/jriver";
11+import AbstractApiClient from "./AbstractApiClient.js";
22+import {JRiverData} from "../infrastructure/config/source/jriver.js";
33import request, {Request, Response} from 'superagent';
44import xml2js from 'xml2js';
55import {ErrorWithCause} from "pony-cause";
66-import {DEFAULT_RETRY_MULTIPLIER} from "../infrastructure/Atomic";
66+import {DEFAULT_RETRY_MULTIPLIER} from "../infrastructure/Atomic.js";
7788const parser = new xml2js.Parser({'async': true});
99
+5-5
src/backend/common/vendor/KodiApiClient.ts
···11-import AbstractApiClient from "./AbstractApiClient";
11+import AbstractApiClient from "./AbstractApiClient.js";
22import {ErrorWithCause} from "pony-cause";
33-import { KodiData } from "../infrastructure/config/source/kodi";
33+import { KodiData } from "../infrastructure/config/source/kodi.js";
44import { KodiClient } from 'kodi-api'
55import normalizeUrl from "normalize-url";
66import {URL} from "url";
77-import { RecentlyPlayedOptions } from "../../sources/AbstractSource";
88-import { FormatPlayObjectOptions } from "../infrastructure/Atomic";
77+import { RecentlyPlayedOptions } from "../../sources/AbstractSource.js";
88+import { FormatPlayObjectOptions } from "../infrastructure/Atomic.js";
99import dayjs from "dayjs";
1010-import { PlayObject } from "../../../core/Atomic";
1010+import { PlayObject } from "../../../core/Atomic.js";
11111212interface KodiDuration {
1313 hours: number
+7-7
src/backend/common/vendor/LastfmApiClient.ts
···11import LastFm, {AuthGetSessionResponse, TrackObject, UserGetInfoResponse} from "lastfm-node-client";
22-import AbstractApiClient from "./AbstractApiClient";
22+import AbstractApiClient from "./AbstractApiClient.js";
33import dayjs from "dayjs";
44-import { readJson, sleep, writeFile } from "../../utils";
55-import {DEFAULT_RETRY_MULTIPLIER, FormatPlayObjectOptions} from "../infrastructure/Atomic";
66-import { LastfmData } from "../infrastructure/config/client/lastfm";
77-import { PlayObject } from "../../../core/Atomic";
88-import {isNodeNetworkException} from "../errors/NodeErrors";
99-import {nonEmptyStringOrDefault, splitByFirstFound} from "../../../core/StringUtils";
44+import { readJson, sleep, writeFile } from "../../utils.js";
55+import { DEFAULT_RETRY_MULTIPLIER, FormatPlayObjectOptions } from "../infrastructure/Atomic.js";
66+import { LastfmData } from "../infrastructure/config/client/lastfm.js";
77+import { PlayObject } from "../../../core/Atomic.js";
88+import { isNodeNetworkException } from "../errors/NodeErrors.js";
99+import { nonEmptyStringOrDefault, splitByFirstFound } from "../../../core/StringUtils.js";
1010import {source} from "common-tags";
11111212const badErrors = [
···11import {createPlatform, MediaController, PersistentClient} from "@foxxmd/chromecast-client";
22import {Service} from "bonjour-service";
33-import {FormatPlayObjectOptions} from "../../infrastructure/Atomic";
33+import { FormatPlayObjectOptions } from "../../infrastructure/Atomic.js";
44import {Dayjs} from "dayjs";
55import {Logger} from "@foxxmd/winston";
66
+2-2
src/backend/common/vendor/maloja/interfaces.ts
···11import {ResponseError} from "superagent";
22-import {findCauseByFunc} from "../../../utils";
33-import {isSuperAgentResponseError} from "../../errors/ErrorUtils";
22+import { findCauseByFunc } from "../../../utils.js";
33+import { isSuperAgentResponseError } from "../../errors/ErrorUtils.js";
4455export interface MalojaV2ScrobbleData {
66 artists: string[]
+10-14
src/backend/index.ts
···66import relativeTime from 'dayjs/plugin/relativeTime.js';
77import duration from 'dayjs/plugin/duration.js';
88import timezone from 'dayjs/plugin/timezone.js';
99-import {
1010- parseBool,
1111- readJson,
1212- sleep
1313-} from "./utils";
99+import { parseBool, readJson, sleep } from "./utils.js";
1410import * as path from "path";
1515-import {projectDir} from "./common/index";
1616-import SpotifySource from "./sources/SpotifySource";
1717-import { AIOConfig } from "./common/infrastructure/config/aioConfig";
1818-import { getRoot } from "./ioc";
1919-import {getLogger} from "./common/logging";
2020-import {LogInfo} from "../core/Atomic";
2121-import {initServer} from "./server/index";
1111+import { projectDir } from "./common/index.js";
1212+import SpotifySource from "./sources/SpotifySource.js";
1313+import { AIOConfig } from "./common/infrastructure/config/aioConfig.js";
1414+import { getRoot } from "./ioc.js";
1515+import { getLogger } from "./common/logging.js";
1616+import { LogInfo } from "../core/Atomic.js";
1717+import { initServer } from "./server/index.js";
2218import {SimpleIntervalJob, ToadScheduler} from "toad-scheduler";
2323-import {createHeartbeatSourcesTask} from "./tasks/heartbeatSources";
2424-import {createHeartbeatClientsTask} from "./tasks/heartbeatClients";
1919+import { createHeartbeatSourcesTask } from "./tasks/heartbeatSources.js";
2020+import { createHeartbeatClientsTask } from "./tasks/heartbeatClients.js";
252126222723dayjs.extend(utc)
+6-6
src/backend/ioc.ts
···11import {createContainer} from "iti";
22import path from "path";
33-import {configDir, projectDir} from "./common/index";
44-import ScrobbleClients from "./scrobblers/ScrobbleClients";
55-import ScrobbleSources from "./sources/ScrobbleSources";
66-import {Notifiers} from "./notifier/Notifiers";
33+import { configDir, projectDir } from "./common/index.js";
44+import ScrobbleClients from "./scrobblers/ScrobbleClients.js";
55+import ScrobbleSources from "./sources/ScrobbleSources.js";
66+import { Notifiers } from "./notifier/Notifiers.js";
77import {EventEmitter} from "events";
88-import {logPath} from "./common/logging";
99-import { WildcardEmitter } from "./common/WildcardEmitter";
88+import { logPath } from "./common/logging.js";
99+import { WildcardEmitter } from "./common/WildcardEmitter.js";
1010import normalizeUrl from 'normalize-url';
1111import fs from 'fs';
1212
+2-2
src/backend/notifier/AbstractWebhookNotifier.ts
···11-import { GotifyConfig, NtfyConfig, WebhookPayload } from "../common/infrastructure/config/health/webhooks";
11+import { GotifyConfig, NtfyConfig, WebhookPayload } from "../common/infrastructure/config/health/webhooks.js";
22import {Logger} from '@foxxmd/winston';
33-import { mergeArr } from "../utils";
33+import { mergeArr } from "../utils.js";
4455export abstract class AbstractWebhookNotifier {
66
+2-2
src/backend/notifier/GotifyWebhookNotifier.ts
···11-import { AbstractWebhookNotifier } from "./AbstractWebhookNotifier";
22-import { GotifyConfig, PrioritiesConfig, WebhookPayload } from "../common/infrastructure/config/health/webhooks";
11+import { AbstractWebhookNotifier } from "./AbstractWebhookNotifier.js";
22+import { GotifyConfig, PrioritiesConfig, WebhookPayload } from "../common/infrastructure/config/health/webhooks.js";
33import {gotify} from 'gotify';
44import request from 'superagent';
55import {HTTPError} from "got";
+5-5
src/backend/notifier/Notifiers.ts
···11import winston, {config, format, Logger} from '@foxxmd/winston';
22-import { mergeArr } from "../utils";
33-import { GotifyConfig, NtfyConfig, WebhookConfig, WebhookPayload } from "../common/infrastructure/config/health/webhooks";
44-import { AbstractWebhookNotifier } from "./AbstractWebhookNotifier";
55-import { GotifyWebhookNotifier } from "./GotifyWebhookNotifier";
66-import { NtfyWebhookNotifier } from "./NtfyWebhookNotifier";
22+import { mergeArr } from "../utils.js";
33+import { GotifyConfig, NtfyConfig, WebhookConfig, WebhookPayload } from "../common/infrastructure/config/health/webhooks.js";
44+import { AbstractWebhookNotifier } from "./AbstractWebhookNotifier.js";
55+import { GotifyWebhookNotifier } from "./GotifyWebhookNotifier.js";
66+import { NtfyWebhookNotifier } from "./NtfyWebhookNotifier.js";
77import {EventEmitter} from "events";
8899export class Notifiers {
+3-3
src/backend/notifier/NtfyWebhookNotifier.ts
···11-import { AbstractWebhookNotifier } from "./AbstractWebhookNotifier";
22-import { NtfyConfig, PrioritiesConfig, WebhookPayload } from "../common/infrastructure/config/health/webhooks";
11+import { AbstractWebhookNotifier } from "./AbstractWebhookNotifier.js";
22+import { NtfyConfig, PrioritiesConfig, WebhookPayload } from "../common/infrastructure/config/health/webhooks.js";
33import {publish} from 'ntfy';
44import request from "superagent";
55import {Logger} from '@foxxmd/winston';
66-import {Config} from "ntfy/interfaces";
66+import {Config} from "ntfy/interfaces.js";
7788export class NtfyWebhookNotifier extends AbstractWebhookNotifier {
99
+29-19
src/backend/scrobblers/AbstractScrobbleClient.ts
···22import {
33 comparingMultipleArtists,
44 mergeArr,
55- playObjDataMatch, pollingBackoff,
66- setIntersection, sleep, sortByOldestPlayDate,
77-} from "../utils";
55+ playObjDataMatch,
66+ pollingBackoff,
77+ setIntersection,
88+ sleep,
99+ sortByOldestPlayDate,
1010+} from "../utils.js";
811import {
99- ARTIST_WEIGHT, Authenticatable,
1010- ClientType, DEFAULT_RETRY_MULTIPLIER, DUP_SCORE_THRESHOLD,
1212+ ARTIST_WEIGHT,
1313+ Authenticatable,
1414+ ClientType,
1515+ DEFAULT_RETRY_MULTIPLIER,
1616+ DUP_SCORE_THRESHOLD,
1117 FormatPlayObjectOptions,
1218 INITIALIZED,
1319 INITIALIZING,
1420 InitState,
1515- NOT_INITIALIZED, REFERENCE_WEIGHT,
1616- ScrobbledPlayObject, TIME_WEIGHT, TITLE_WEIGHT,
1717-} from "../common/infrastructure/Atomic";
2121+ NOT_INITIALIZED,
2222+ REFERENCE_WEIGHT,
2323+ ScrobbledPlayObject,
2424+ TIME_WEIGHT,
2525+ TITLE_WEIGHT,
2626+} from "../common/infrastructure/Atomic.js";
1827import {Logger} from '@foxxmd/winston';
1919-import { CommonClientConfig } from "../common/infrastructure/config/client/index";
2020-import { Notifiers } from "../notifier/Notifiers";
2828+import { CommonClientConfig } from "../common/infrastructure/config/client/index.js";
2929+import { Notifiers } from "../notifier/Notifiers.js";
2130import {FixedSizeList} from 'fixed-size-list';
2231import {
2332 DeadLetterScrobble,
2433 PlayObject,
2534 QueuedScrobble,
2626- TA_CLOSE, TA_FUZZY,
2727- TrackStringOptions
2828-} from "../../core/Atomic";
2929-import {buildTrackString, capitalize, truncateStringToLength} from "../../core/StringUtils";
3535+ TA_CLOSE,
3636+ TA_FUZZY,
3737+ TrackStringOptions,
3838+} from "../../core/Atomic.js";
3939+import { buildTrackString, capitalize, truncateStringToLength } from "../../core/StringUtils.js";
3040import EventEmitter from "events";
3131-import {compareScrobbleArtists, compareScrobbleTracks, normalizeStr} from "../utils/StringUtils";
3232-import {hasUpstreamError, UpstreamError} from "../common/errors/UpstreamError";
4141+import { compareScrobbleArtists, compareScrobbleTracks, normalizeStr } from "../utils/StringUtils.js";
4242+import { hasUpstreamError, UpstreamError } from "../common/errors/UpstreamError.js";
3343import {nanoid} from "nanoid";
3444import {ErrorWithCause, messageWithCauses} from "pony-cause";
3535-import {hasNodeNetworkException} from "../common/errors/NodeErrors";
4545+import { hasNodeNetworkException } from "../common/errors/NodeErrors.js";
3646import {
3747 comparePlayTemporally,
3848 temporalAccuracyIsAtLeast,
3949 temporalAccuracyToString,
4040- temporalPlayComparisonSummary
4141-} from "../utils/TimeUtils";
5050+ temporalPlayComparisonSummary,
5151+} from "../utils/TimeUtils.js";
42524353export default abstract class AbstractScrobbleClient implements Authenticatable {
4454
+11-11
src/backend/scrobblers/LastfmScrobbler.ts
···11-import AbstractScrobbleClient from "./AbstractScrobbleClient";
11+import AbstractScrobbleClient from "./AbstractScrobbleClient.js";
22import dayjs from 'dayjs';
3344import {
···77 setIntersection,
88 sleep,
99 sortByOldestPlayDate,
1010-} from "../utils";
1111-import LastfmApiClient from "../common/vendor/LastfmApiClient";
1212-import { FormatPlayObjectOptions, INITIALIZING, ScrobbledPlayObject } from "../common/infrastructure/Atomic";
1313-import { LastfmClientConfig } from "../common/infrastructure/config/client/lastfm";
1010+} from "../utils.js";
1111+import LastfmApiClient from "../common/vendor/LastfmApiClient.js";
1212+import { FormatPlayObjectOptions, INITIALIZING, ScrobbledPlayObject } from "../common/infrastructure/Atomic.js";
1313+import { LastfmClientConfig } from "../common/infrastructure/config/client/lastfm.js";
1414import {TrackScrobblePayload, TrackScrobbleResponse, UserGetRecentTracksResponse} from "lastfm-node-client";
1515-import { Notifiers } from "../notifier/Notifiers";
1515+import { Notifiers } from "../notifier/Notifiers.js";
1616import {Logger} from '@foxxmd/winston';
1717-import { PlayObject, TrackStringOptions } from "../../core/Atomic";
1818-import {buildTrackString, capitalize} from "../../core/StringUtils";
1717+import { PlayObject, TrackStringOptions } from "../../core/Atomic.js";
1818+import { buildTrackString, capitalize } from "../../core/StringUtils.js";
1919import EventEmitter from "events";
2020-import {UpstreamError} from "../common/errors/UpstreamError";
2121-import {isNodeNetworkException} from "../common/errors/NodeErrors";
2222-import {getScrobbleTsSOCDate} from "../utils/TimeUtils";
2020+import { UpstreamError } from "../common/errors/UpstreamError.js";
2121+import { isNodeNetworkException } from "../common/errors/NodeErrors.js";
2222+import { getScrobbleTsSOCDate } from "../utils/TimeUtils.js";
23232424export default class LastfmScrobbler extends AbstractScrobbleClient {
2525
+9-9
src/backend/scrobblers/ListenbrainzScrobbler.ts
···11import dayjs from 'dayjs';
2233-import AbstractScrobbleClient from "./AbstractScrobbleClient";
44-import { FormatPlayObjectOptions, INITIALIZING } from "../common/infrastructure/Atomic";
55-import { Notifiers } from "../notifier/Notifiers";
33+import AbstractScrobbleClient from "./AbstractScrobbleClient.js";
44+import { FormatPlayObjectOptions, INITIALIZING } from "../common/infrastructure/Atomic.js";
55+import { Notifiers } from "../notifier/Notifiers.js";
66import {Logger} from '@foxxmd/winston';
77-import { ListenBrainzClientConfig } from "../common/infrastructure/config/client/listenbrainz";
88-import {ListenbrainzApiClient, ListenPayload} from "../common/vendor/ListenbrainzApiClient";
99-import { PlayObject, TrackStringOptions } from "../../core/Atomic";
1010-import {buildTrackString, capitalize} from "../../core/StringUtils";
77+import { ListenBrainzClientConfig } from "../common/infrastructure/config/client/listenbrainz.js";
88+import { ListenbrainzApiClient, ListenPayload } from "../common/vendor/ListenbrainzApiClient.js";
99+import { PlayObject, TrackStringOptions } from "../../core/Atomic.js";
1010+import { buildTrackString, capitalize } from "../../core/StringUtils.js";
1111import EventEmitter from "events";
1212-import {UpstreamError} from "../common/errors/UpstreamError";
1313-import {isNodeNetworkException} from "../common/errors/NodeErrors";
1212+import { UpstreamError } from "../common/errors/UpstreamError.js";
1313+import { isNodeNetworkException } from "../common/errors/NodeErrors.js";
1414import {ErrorWithCause} from "pony-cause";
15151616export default class ListenbrainzScrobbler extends AbstractScrobbleClient {
+18-18
src/backend/scrobblers/MalojaScrobbler.ts
···11-import AbstractScrobbleClient from "./AbstractScrobbleClient";
11+import AbstractScrobbleClient from "./AbstractScrobbleClient.js";
22import request, {ResponseError, SuperAgentRequest} from 'superagent';
33import dayjs from 'dayjs';
44import compareVersions from 'compare-versions';
55-import {
66- sleep,
77- parseRetryAfterSecsFromObj,
88-99-} from "../utils";
1010-import {DEFAULT_RETRY_MULTIPLIER, FormatPlayObjectOptions, INITIALIZING} from "../common/infrastructure/Atomic";
1111-import { MalojaClientConfig } from "../common/infrastructure/config/client/maloja";
1212-import { Notifiers } from "../notifier/Notifiers";
55+import { sleep, parseRetryAfterSecsFromObj } from "../utils.js";
66+import { DEFAULT_RETRY_MULTIPLIER, FormatPlayObjectOptions, INITIALIZING } from "../common/infrastructure/Atomic.js";
77+import { MalojaClientConfig } from "../common/infrastructure/config/client/maloja.js";
88+import { Notifiers } from "../notifier/Notifiers.js";
139import {Logger} from '@foxxmd/winston';
1410import {
1511 getMalojaResponseError,
1616- isMalojaAPIErrorBody, MalojaResponseV3CommonData,
1212+ isMalojaAPIErrorBody,
1313+ MalojaResponseV3CommonData,
1714 MalojaScrobbleData,
1815 MalojaScrobbleRequestData,
1916 MalojaScrobbleV2RequestData,
2020- MalojaScrobbleV3RequestData, MalojaScrobbleV3ResponseData, MalojaV2ScrobbleData, MalojaV3ScrobbleData
2121-} from "../common/vendor/maloja/interfaces";
2222-import { PlayObject, TrackStringOptions } from "../../core/Atomic";
2323-import {buildTrackString, capitalize} from "../../core/StringUtils";
1717+ MalojaScrobbleV3RequestData,
1818+ MalojaScrobbleV3ResponseData,
1919+ MalojaV2ScrobbleData,
2020+ MalojaV3ScrobbleData,
2121+} from "../common/vendor/maloja/interfaces.js";
2222+import { PlayObject, TrackStringOptions } from "../../core/Atomic.js";
2323+import { buildTrackString, capitalize } from "../../core/StringUtils.js";
2424import EventEmitter from "events";
2525import normalizeUrl from "normalize-url";
2626-import {UpstreamError} from "../common/errors/UpstreamError";
2626+import { UpstreamError } from "../common/errors/UpstreamError.js";
2727import {ErrorWithCause} from "pony-cause";
2828-import {getScrobbleTsSOCDate, getScrobbleTsSOCDateWithContext} from "../utils/TimeUtils";
2828+import { getScrobbleTsSOCDate, getScrobbleTsSOCDateWithContext } from "../utils/TimeUtils.js";
2929import e from "express";
3030-import {isNodeNetworkException} from "../common/errors/NodeErrors";
3131-import {isSuperAgentResponseError} from "../common/errors/ErrorUtils";
3030+import { isNodeNetworkException } from "../common/errors/NodeErrors.js";
3131+import { isSuperAgentResponseError } from "../common/errors/ErrorUtils.js";
32323333const feat = ["ft.", "ft", "feat.", "feat", "featuring", "Ft.", "Ft", "Feat.", "Feat", "Featuring"];
3434
+15-15
src/backend/scrobblers/ScrobbleClients.ts
···66 readJson,
77 returnDuplicateStrings,
88 validateJson,
99-} from "../utils";
1010-import MalojaScrobbler from "./MalojaScrobbler";
1111-import LastfmScrobbler from "./LastfmScrobbler";
1212-import { clientTypes, ConfigMeta } from "../common/infrastructure/Atomic";
1313-import { AIOConfig } from "../common/infrastructure/config/aioConfig";
99+} from "../utils.js";
1010+import MalojaScrobbler from "./MalojaScrobbler.js";
1111+import LastfmScrobbler from "./LastfmScrobbler.js";
1212+import { clientTypes, ConfigMeta } from "../common/infrastructure/Atomic.js";
1313+import { AIOConfig } from "../common/infrastructure/config/aioConfig.js";
1414import * as aioSchema from '../common/schema/aio-client.json';
1515import * as clientSchema from '../common/schema/client.json';
1616-import { ClientAIOConfig, ClientConfig } from "../common/infrastructure/config/client/clients";
1717-import { MalojaClientConfig } from "../common/infrastructure/config/client/maloja";
1818-import { LastfmClientConfig } from "../common/infrastructure/config/client/lastfm";
1919-import { Notifiers } from "../notifier/Notifiers";
2020-import AbstractScrobbleClient from "./AbstractScrobbleClient";
1616+import { ClientAIOConfig, ClientConfig } from "../common/infrastructure/config/client/clients.js";
1717+import { MalojaClientConfig } from "../common/infrastructure/config/client/maloja.js";
1818+import { LastfmClientConfig } from "../common/infrastructure/config/client/lastfm.js";
1919+import { Notifiers } from "../notifier/Notifiers.js";
2020+import AbstractScrobbleClient from "./AbstractScrobbleClient.js";
2121import {EventEmitter} from "events";
2222import winston, {Logger} from '@foxxmd/winston';
2323-import ListenbrainzScrobbler from "./ListenbrainzScrobbler";
2424-import { ListenBrainzClientConfig } from "../common/infrastructure/config/client/listenbrainz";
2323+import ListenbrainzScrobbler from "./ListenbrainzScrobbler.js";
2424+import { ListenBrainzClientConfig } from "../common/infrastructure/config/client/listenbrainz.js";
2525import {ErrorWithCause} from "pony-cause";
2626-import { PlayObject } from "../../core/Atomic";
2727-import { buildTrackString } from "../../core/StringUtils";
2828-import { WildcardEmitter } from "../common/WildcardEmitter";
2626+import { PlayObject } from "../../core/Atomic.js";
2727+import { buildTrackString } from "../../core/StringUtils.js";
2828+import { WildcardEmitter } from "../common/WildcardEmitter.js";
29293030type groupedNamedConfigs = {[key: string]: ParsedConfig[]};
3131
+20-18
src/backend/server/api.ts
···11import {ExpressWithAsync} from "@awaitjs/express";
22-import {getRoot} from "../ioc";
33-import {makeClientCheckMiddle, makeSourceCheckMiddle} from "./middleware";
44-import AbstractSource from "../sources/AbstractSource";
22+import { getRoot } from "../ioc.js";
33+import { makeClientCheckMiddle, makeSourceCheckMiddle } from "./middleware.js";
44+import AbstractSource from "../sources/AbstractSource.js";
55import {
66- ClientStatusData, DeadLetterScrobble,
66+ ClientStatusData,
77+ DeadLetterScrobble,
78 LogInfo,
89 LogInfoJson,
910 LogLevel,
1010- LogOutputConfig, PlayObject,
1111+ LogOutputConfig,
1212+ PlayObject,
1113 SourceStatusData,
1212-} from "../../core/Atomic";
1414+} from "../../core/Atomic.js";
1315import {Logger} from "@foxxmd/winston";
1414-import {formatLogToHtml, getLogger, isLogLevelMinLevel, isLogLineMinLevel} from "../common/logging";
1616+import { formatLogToHtml, getLogger, isLogLevelMinLevel, isLogLineMinLevel } from "../common/logging.js";
1517import {MESSAGE} from "triple-beam";
1618import {Transform} from "stream";
1719//import {createSession} from "better-sse";
1820import * as bsse from 'better-sse';
1919-import {setupTautulliRoutes} from "./tautulliRoutes";
2020-import {setupPlexRoutes} from "./plexRoutes";
2121-import {setupJellyfinRoutes} from "./jellyfinRoutes";
2222-import {setupDeezerRoutes} from "./deezerRoutes";
2323-import {setupAuthRoutes} from "./auth";
2424-import {ExpressHandler, ScrobbledPlayObject} from "../common/infrastructure/Atomic";
2525-import MemorySource from "../sources/MemorySource";
2626-import {capitalize} from "../../core/StringUtils";
2121+import { setupTautulliRoutes } from "./tautulliRoutes.js";
2222+import { setupPlexRoutes } from "./plexRoutes.js";
2323+import { setupJellyfinRoutes } from "./jellyfinRoutes.js";
2424+import { setupDeezerRoutes } from "./deezerRoutes.js";
2525+import { setupAuthRoutes } from "./auth.js";
2626+import { ExpressHandler, ScrobbledPlayObject } from "../common/infrastructure/Atomic.js";
2727+import MemorySource from "../sources/MemorySource.js";
2828+import { capitalize } from "../../core/StringUtils.js";
2729import {source} from "common-tags";
2828-import AbstractScrobbleClient from "../scrobblers/AbstractScrobbleClient";
2929-import {sortByNewestPlayDate} from "../utils";
3030+import AbstractScrobbleClient from "../scrobblers/AbstractScrobbleClient.js";
3131+import { sortByNewestPlayDate } from "../utils.js";
3032import bodyParser from "body-parser";
3131-import {setupWebscrobblerRoutes} from "./webscrobblerRoutes";
3333+import { setupWebscrobblerRoutes } from "./webscrobblerRoutes.js";
3234import {FixedSizeList} from 'fixed-size-list';
33353436const maxBufferSize = 300;
+6-6
src/backend/server/auth.ts
···11import {ExpressWithAsync} from "@awaitjs/express";
22import {Logger} from "@foxxmd/winston";
33-import ScrobbleSources from "../sources/ScrobbleSources";
33+import ScrobbleSources from "../sources/ScrobbleSources.js";
44import passport from "passport";
55-import { ExpressHandler } from "../common/infrastructure/Atomic";
66-import ScrobbleClients from "../scrobblers/ScrobbleClients";
77-import LastfmScrobbler from "../scrobblers/LastfmScrobbler";
88-import LastfmSource from "../sources/LastfmSource";
99-import SpotifySource from "../sources/SpotifySource";
55+import { ExpressHandler } from "../common/infrastructure/Atomic.js";
66+import ScrobbleClients from "../scrobblers/ScrobbleClients.js";
77+import LastfmScrobbler from "../scrobblers/LastfmScrobbler.js";
88+import LastfmSource from "../sources/LastfmSource.js";
99+import SpotifySource from "../sources/SpotifySource.js";
10101111export const setupAuthRoutes = (app: ExpressWithAsync, logger: Logger, sourceMiddle: ExpressHandler, clientMiddle: ExpressHandler, scrobbleSources: ScrobbleSources, scrobbleClients: ScrobbleClients) => {
1212 app.use('/api/client/auth', clientMiddle);
+6-6
src/backend/server/deezerRoutes.ts
···11-import { ExpressHandler } from "../common/infrastructure/Atomic";
22-import { mergeArr, parseBool, sleep } from "../utils";
11+import { ExpressHandler } from "../common/infrastructure/Atomic.js";
22+import { mergeArr, parseBool, sleep } from "../utils.js";
33import {ExpressWithAsync} from "@awaitjs/express";
44import {Logger} from "@foxxmd/winston";
55-import ScrobbleSources from "../sources/ScrobbleSources";
66-import PlexSource, { plexRequestMiddle } from "../sources/PlexSource";
77-import { PlexNotifier } from "../sources/ingressNotifiers/PlexNotifier";
88-import DeezerSource from "../sources/DeezerSource";
55+import ScrobbleSources from "../sources/ScrobbleSources.js";
66+import PlexSource, { plexRequestMiddle } from "../sources/PlexSource.js";
77+import { PlexNotifier } from "../sources/ingressNotifiers/PlexNotifier.js";
88+import DeezerSource from "../sources/DeezerSource.js";
99import passport from "passport";
10101111export const setupDeezerRoutes = (app: ExpressWithAsync, logger: Logger, scrobbleSources: ScrobbleSources) => {
+4-4
src/backend/server/index.ts
···55import passport from 'passport';
66import session from 'express-session';
77import path from "path";
88-import { getRoot } from "../ioc";
88+import { getRoot } from "../ioc.js";
99import {Logger} from "@foxxmd/winston";
1010-import { LogInfo } from "../../core/Atomic";
1111-import { setupApi } from "./api";
1212-import { getAddress, mergeArr, parseBool } from "../utils";
1010+import { LogInfo } from "../../core/Atomic.js";
1111+import { setupApi } from "./api.js";
1212+import { getAddress, mergeArr, parseBool } from "../utils.js";
1313import {stripIndents} from "common-tags";
1414import {ErrorWithCause} from "pony-cause";
1515
+4-4
src/backend/server/jellyfinRoutes.ts
···11-import { parseBool, remoteHostIdentifiers } from "../utils";
11+import { parseBool, remoteHostIdentifiers } from "../utils.js";
22import {ExpressWithAsync} from "@awaitjs/express";
33import {Logger} from "@foxxmd/winston";
44-import ScrobbleSources from "../sources/ScrobbleSources";
44+import ScrobbleSources from "../sources/ScrobbleSources.js";
55import bodyParser from "body-parser";
66-import { JellyfinNotifier } from "../sources/ingressNotifiers/JellyfinNotifier";
77-import JellyfinSource from "../sources/JellyfinSource";
66+import { JellyfinNotifier } from "../sources/ingressNotifiers/JellyfinNotifier.js";
77+import JellyfinSource from "../sources/JellyfinSource.js";
8899export const setupJellyfinRoutes = (app: ExpressWithAsync, logger: Logger, scrobbleSources: ScrobbleSources) => {
1010
···11-import { GenericPlayerState } from "./GenericPlayerState";
11+import { GenericPlayerState } from "./GenericPlayerState.js";
22import {Logger} from "@foxxmd/winston";
33-import { PlayPlatformId, ReportedPlayerStatus } from "../../common/infrastructure/Atomic";
44-import { PlayerStateOptions } from "./AbstractPlayerState";
55-import { PlayObject } from "../../../core/Atomic";
33+import { PlayPlatformId, ReportedPlayerStatus } from "../../common/infrastructure/Atomic.js";
44+import { PlayerStateOptions } from "./AbstractPlayerState.js";
55+import { PlayObject } from "../../../core/Atomic.js";
6677export class JellyfinPlayerState extends GenericPlayerState {
88 constructor(logger: Logger, platformId: PlayPlatformId, opts?: PlayerStateOptions) {
+1-1
src/backend/sources/PlayerState/ListenProgress.ts
···11import dayjs, {Dayjs} from "dayjs";
2233-import {PlayProgress, Second} from "../../../core/Atomic";
33+import { PlayProgress, Second } from "../../../core/Atomic.js";
4455export class ListenProgress implements PlayProgress {
66
+2-2
src/backend/sources/PlayerState/ListenRange.ts
···11-import {ListenProgress} from "./ListenProgress";
11+import { ListenProgress } from "./ListenProgress.js";
22import dayjs, {Dayjs} from "dayjs";
33-import {ListenRangeData, Second} from "../../../core/Atomic";
33+import { ListenRangeData, Second } from "../../../core/Atomic.js";
4455export class ListenRange implements ListenRangeData {
66
+6-6
src/backend/sources/PlexSource.ts
···11import dayjs from "dayjs";
22-import { combinePartsToString, mergeArr } from "../utils";
33-import AbstractSource from "./AbstractSource";
22+import { combinePartsToString, mergeArr } from "../utils.js";
33+import AbstractSource from "./AbstractSource.js";
44import formidable from 'formidable';
55import concatStream from 'concat-stream';
66-import { PlexSourceConfig } from "../common/infrastructure/config/source/plex";
77-import { FormatPlayObjectOptions, InternalConfig, SourceType } from "../common/infrastructure/Atomic";
66+import { PlexSourceConfig } from "../common/infrastructure/config/source/plex.js";
77+import { FormatPlayObjectOptions, InternalConfig, SourceType } from "../common/infrastructure/Atomic.js";
88import EventEmitter from "events";
99import winston from '@foxxmd/winston';
1010-import { PlayObject } from "../../core/Atomic";
1111-import { truncateStringToLength } from "../../core/StringUtils";
1010+import { PlayObject } from "../../core/Atomic.js";
1111+import { truncateStringToLength } from "../../core/StringUtils.js";
12121313const shortDeviceId = truncateStringToLength(10, '');
1414
+38-38
src/backend/sources/ScrobbleSources.ts
···11-import { mergeArr, parseBool, readJson, validateJson } from "../utils";
22-import SpotifySource from "./SpotifySource";
33-import PlexSource from "./PlexSource";
44-import TautulliSource from "./TautulliSource";
55-import { SubsonicSource } from "./SubsonicSource";
66-import JellyfinSource from "./JellyfinSource";
77-import LastfmSource from "./LastfmSource";
88-import DeezerSource from "./DeezerSource";
99-import { ConfigMeta, InternalConfig, SourceType, sourceTypes } from "../common/infrastructure/Atomic";
1010-import { configDir as defaultConfigDir } from "../common/index";
11+import { mergeArr, parseBool, readJson, validateJson } from "../utils.js";
22+import SpotifySource from "./SpotifySource.js";
33+import PlexSource from "./PlexSource.js";
44+import TautulliSource from "./TautulliSource.js";
55+import { SubsonicSource } from "./SubsonicSource.js";
66+import JellyfinSource from "./JellyfinSource.js";
77+import LastfmSource from "./LastfmSource.js";
88+import DeezerSource from "./DeezerSource.js";
99+import { ConfigMeta, InternalConfig, SourceType, sourceTypes } from "../common/infrastructure/Atomic.js";
1010+import { configDir as defaultConfigDir } from "../common/index.js";
1111import winston, {Logger} from '@foxxmd/winston';
1212-import { SourceAIOConfig, SourceConfig } from "../common/infrastructure/config/source/sources";
1313-import { DeezerData, DeezerSourceConfig } from "../common/infrastructure/config/source/deezer";
1414-import { LastfmClientConfig } from "../common/infrastructure/config/client/lastfm";
1515-import { JellyData, JellySourceConfig } from "../common/infrastructure/config/source/jellyfin";
1616-import { SubsonicData, SubSonicSourceConfig } from "../common/infrastructure/config/source/subsonic";
1717-import { TautulliSourceConfig } from "../common/infrastructure/config/source/tautulli";
1818-import { PlexSourceConfig } from "../common/infrastructure/config/source/plex";
1919-import { SpotifySourceConfig, SpotifySourceData } from "../common/infrastructure/config/source/spotify";
2020-import AbstractSource from "./AbstractSource";
2121-import { AIOConfig, SourceDefaults } from "../common/infrastructure/config/aioConfig";
1212+import { SourceAIOConfig, SourceConfig } from "../common/infrastructure/config/source/sources.js";
1313+import { DeezerData, DeezerSourceConfig } from "../common/infrastructure/config/source/deezer.js";
1414+import { LastfmClientConfig } from "../common/infrastructure/config/client/lastfm.js";
1515+import { JellyData, JellySourceConfig } from "../common/infrastructure/config/source/jellyfin.js";
1616+import { SubsonicData, SubSonicSourceConfig } from "../common/infrastructure/config/source/subsonic.js";
1717+import { TautulliSourceConfig } from "../common/infrastructure/config/source/tautulli.js";
1818+import { PlexSourceConfig } from "../common/infrastructure/config/source/plex.js";
1919+import { SpotifySourceConfig, SpotifySourceData } from "../common/infrastructure/config/source/spotify.js";
2020+import AbstractSource from "./AbstractSource.js";
2121+import { AIOConfig, SourceDefaults } from "../common/infrastructure/config/aioConfig.js";
2222import * as aioSchema from "../common/schema/aio-source.json";
2323import * as sourceSchema from "../common/schema/source.json";
2424-import { LastfmSourceConfig } from "../common/infrastructure/config/source/lastfm";
2525-import YTMusicSource from "./YTMusicSource";
2626-import { YTMusicSourceConfig } from "../common/infrastructure/config/source/ytmusic";
2727-import { MPRISData, MPRISSourceConfig } from "../common/infrastructure/config/source/mpris";
2828-import { MPRISSource } from "./MPRISSource";
2424+import { LastfmSourceConfig } from "../common/infrastructure/config/source/lastfm.js";
2525+import YTMusicSource from "./YTMusicSource.js";
2626+import { YTMusicSourceConfig } from "../common/infrastructure/config/source/ytmusic.js";
2727+import { MPRISData, MPRISSourceConfig } from "../common/infrastructure/config/source/mpris.js";
2828+import { MPRISSource } from "./MPRISSource.js";
2929import EventEmitter from "events";
3030-import { MopidySource } from "./MopidySource";
3131-import { MopidySourceConfig } from "../common/infrastructure/config/source/mopidy";
3232-import ListenbrainzSource from "./ListenbrainzSource";
3333-import { ListenBrainzSourceConfig } from "../common/infrastructure/config/source/listenbrainz";
3434-import { JRiverSource } from "./JRiverSource";
3535-import { JRiverData, JRiverSourceConfig } from "../common/infrastructure/config/source/jriver";
3636-import { KodiSource } from "./KodiSource";
3737-import { KodiData, KodiSourceConfig } from "../common/infrastructure/config/source/kodi";
3838-import { WildcardEmitter } from "../common/WildcardEmitter";
3939-import {WebScrobblerSource} from "./WebScrobblerSource";
4040-import {WebScrobblerSourceConfig} from "../common/infrastructure/config/source/webscrobbler";
4141-import {ChromecastSource} from "./ChromecastSource";
4242-import {ChromecastSourceConfig} from "../common/infrastructure/config/source/chromecast";
3030+import { MopidySource } from "./MopidySource.js";
3131+import { MopidySourceConfig } from "../common/infrastructure/config/source/mopidy.js";
3232+import ListenbrainzSource from "./ListenbrainzSource.js";
3333+import { ListenBrainzSourceConfig } from "../common/infrastructure/config/source/listenbrainz.js";
3434+import { JRiverSource } from "./JRiverSource.js";
3535+import { JRiverData, JRiverSourceConfig } from "../common/infrastructure/config/source/jriver.js";
3636+import { KodiSource } from "./KodiSource.js";
3737+import { KodiData, KodiSourceConfig } from "../common/infrastructure/config/source/kodi.js";
3838+import { WildcardEmitter } from "../common/WildcardEmitter.js";
3939+import { WebScrobblerSource } from "./WebScrobblerSource.js";
4040+import { WebScrobblerSourceConfig } from "../common/infrastructure/config/source/webscrobbler.js";
4141+import { ChromecastSource } from "./ChromecastSource.js";
4242+import { ChromecastSourceConfig } from "../common/infrastructure/config/source/chromecast.js";
43434444type groupedNamedConfigs = {[key: string]: ParsedConfig[]};
4545
+13-11
src/backend/sources/SpotifySource.ts
···55 sortByOldestPlayDate,
66 sleep,
77 parseRetryAfterSecsFromObj,
88- combinePartsToString, findCauseByFunc,
99-} from "../utils";
88+ combinePartsToString,
99+ findCauseByFunc,
1010+} from "../utils.js";
1011import SpotifyWebApi from "spotify-web-api-node";
1111-import AbstractSource, { RecentlyPlayedOptions } from "./AbstractSource";
1212-import { SpotifySourceConfig } from "../common/infrastructure/config/source/spotify";
1212+import AbstractSource, { RecentlyPlayedOptions } from "./AbstractSource.js";
1313+import { SpotifySourceConfig } from "../common/infrastructure/config/source/spotify.js";
1314import {
1415 DEFAULT_POLLING_INTERVAL,
1516 FormatPlayObjectOptions,
1616- InternalConfig, NO_DEVICE,
1717+ InternalConfig,
1818+ NO_DEVICE,
1719 NO_USER,
1820 PlayerStateData,
1921 ReportedPlayerStatus,
2022 SourceData,
2121-} from "../common/infrastructure/Atomic";
2323+} from "../common/infrastructure/Atomic.js";
2224import PlayHistoryObject = SpotifyApi.PlayHistoryObject;
2325import EventEmitter from "events";
2426import CurrentlyPlayingObject = SpotifyApi.CurrentlyPlayingObject;
···2628import ArtistObjectSimplified = SpotifyApi.ArtistObjectSimplified;
2729import AlbumObjectSimplified = SpotifyApi.AlbumObjectSimplified;
2830import UserDevice = SpotifyApi.UserDevice;
2929-import MemorySource from "./MemorySource";
3131+import MemorySource from "./MemorySource.js";
3032import {ErrorWithCause} from "pony-cause";
3131-import {PlayObject, SCROBBLE_TS_SOC_END, SCROBBLE_TS_SOC_START, ScrobbleTsSOC} from "../../core/Atomic";
3232-import { buildTrackString, truncateStringToLength } from "../../core/StringUtils";
3333-import {isNodeNetworkException} from "../common/errors/NodeErrors";
3434-import {hasUpstreamError, UpstreamError} from "../common/errors/UpstreamError";
3333+import { PlayObject, SCROBBLE_TS_SOC_END, SCROBBLE_TS_SOC_START, ScrobbleTsSOC } from "../../core/Atomic.js";
3434+import { buildTrackString, truncateStringToLength } from "../../core/StringUtils.js";
3535+import { isNodeNetworkException } from "../common/errors/NodeErrors.js";
3636+import { hasUpstreamError, UpstreamError } from "../common/errors/UpstreamError.js";
35373638const scopes = ['user-read-recently-played', 'user-read-currently-playing', 'user-read-playback-state', 'user-read-playback-position'];
3739const state = 'random';
+6-6
src/backend/sources/SubsonicSource.ts
···22import * as crypto from 'crypto';
33import dayjs from "dayjs";
44import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js";
55-import { parseRetryAfterSecsFromObj, removeDuplicates, sleep } from "../utils";
66-import MemorySource from "./MemorySource";
77-import { SubSonicSourceConfig } from "../common/infrastructure/config/source/subsonic";
88-import {DEFAULT_RETRY_MULTIPLIER, FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic";
99-import { RecentlyPlayedOptions } from "./AbstractSource";
55+import { parseRetryAfterSecsFromObj, removeDuplicates, sleep } from "../utils.js";
66+import MemorySource from "./MemorySource.js";
77+import { SubSonicSourceConfig } from "../common/infrastructure/config/source/subsonic.js";
88+import { DEFAULT_RETRY_MULTIPLIER, FormatPlayObjectOptions, InternalConfig } from "../common/infrastructure/Atomic.js";
99+import { RecentlyPlayedOptions } from "./AbstractSource.js";
1010import EventEmitter from "events";
1111-import { PlayObject } from "../../core/Atomic";
1111+import { PlayObject } from "../../core/Atomic.js";
12121313dayjs.extend(isSameOrAfter);
1414
+6-6
src/backend/sources/TautulliSource.ts
···11import dayjs from "dayjs";
22-import PlexSource from "./PlexSource";
33-import { TautulliSourceConfig } from "../common/infrastructure/config/source/tautulli";
44-import { FormatPlayObjectOptions, InternalConfig } from "../common/infrastructure/Atomic";
55-import { combinePartsToString } from "../utils";
22+import PlexSource from "./PlexSource.js";
33+import { TautulliSourceConfig } from "../common/infrastructure/config/source/tautulli.js";
44+import { FormatPlayObjectOptions, InternalConfig } from "../common/infrastructure/Atomic.js";
55+import { combinePartsToString } from "../utils.js";
66import EventEmitter from "events";
77import {Request} from "express";
88-import { PlayObject } from "../../core/Atomic";
99-import { truncateStringToLength } from "../../core/StringUtils";
88+import { PlayObject } from "../../core/Atomic.js";
99+import { truncateStringToLength } from "../../core/StringUtils.js";
10101111const shortDeviceId = truncateStringToLength(10, '');
1212
+8-7
src/backend/sources/WebScrobblerSource.ts
···11-import MemorySource from "./MemorySource";
11+import MemorySource from "./MemorySource.js";
22import {
33 FormatPlayObjectOptions,
44 InternalConfig,
55 NO_USER,
66- PlayerStateData, REPORTED_PLAYER_STATUSES,
77- ReportedPlayerStatus
88-} from "../common/infrastructure/Atomic";
66+ PlayerStateData,
77+ REPORTED_PLAYER_STATUSES,
88+ ReportedPlayerStatus,
99+} from "../common/infrastructure/Atomic.js";
910import EventEmitter from "events";
1010-import {PlayObject} from "../../core/Atomic";
1111-import {WebScrobblerHookEvent, WebScrobblerPayload, WebScrobblerSong} from "../common/vendor/webscrobbler/interfaces";
1111+import { PlayObject } from "../../core/Atomic.js";
1212+import { WebScrobblerHookEvent, WebScrobblerPayload, WebScrobblerSong } from "../common/vendor/webscrobbler/interfaces.js";
1213import dayjs from "dayjs";
1313-import {WebScrobblerSourceConfig} from "../common/infrastructure/config/source/webscrobbler";
1414+import { WebScrobblerSourceConfig } from "../common/infrastructure/config/source/webscrobbler.js";
14151516export class WebScrobblerSource extends MemorySource {
1617
+5-5
src/backend/sources/YTMusicSource.ts
···11import YouTubeMusic from "youtube-music-ts-api";
2233-import AbstractSource, { RecentlyPlayedOptions } from "./AbstractSource";
44-import { FormatPlayObjectOptions, InternalConfig } from "../common/infrastructure/Atomic";
33+import AbstractSource, { RecentlyPlayedOptions } from "./AbstractSource.js";
44+import { FormatPlayObjectOptions, InternalConfig } from "../common/infrastructure/Atomic.js";
55// @ts-ignore
66import {IYouTubeMusicAuthenticated} from "youtube-music-ts-api/interfaces-primary";
77import dayjs from "dayjs";
88-import { parseDurationFromTimestamp, playObjDataMatch } from "../utils";
88+import { parseDurationFromTimestamp, playObjDataMatch } from "../utils.js";
99// @ts-ignore
1010import {IPlaylistDetail, ITrackDetail} from "youtube-music-ts-api/interfaces-supplementary";
1111-import { YTMusicSourceConfig } from "../common/infrastructure/config/source/ytmusic";
1111+import { YTMusicSourceConfig } from "../common/infrastructure/config/source/ytmusic.js";
1212import EventEmitter from "events";
1313-import { PlayObject } from "../../core/Atomic";
1313+import { PlayObject } from "../../core/Atomic.js";
14141515export default class YTMusicSource extends AbstractSource {
1616 apiInstance?: IYouTubeMusicAuthenticated
···11-import { IngressNotifier } from "./IngressNotifier";
11+import { IngressNotifier } from "./IngressNotifier.js";
22import {Request} from "express";
33-import PlexSource from "../PlexSource";
44-import TautulliSource from "../TautulliSource";
33+import PlexSource from "../PlexSource.js";
44+import TautulliSource from "../TautulliSource.js";
5566export class TautulliNotifier extends IngressNotifier {
77
···11-import {IngressNotifier} from "./IngressNotifier";
11+import { IngressNotifier } from "./IngressNotifier.js";
22import {Request} from "express";
33import path from "path";
44
+2-2
src/backend/tasks/heartbeatClients.ts
···11import {config, Logger} from "@foxxmd/winston";
22-import {mergeArr} from "../utils";
22+import { mergeArr } from "../utils.js";
33import {AsyncTask} from "toad-scheduler";
44import {PromisePool} from "@supercharge/promise-pool";
55-import ScrobbleClients from "../scrobblers/ScrobbleClients";
55+import ScrobbleClients from "../scrobblers/ScrobbleClients.js";
6677export const createHeartbeatClientsTask = (clients: ScrobbleClients, parentLogger: Logger) => {
88 const logger = parentLogger.child({labels: ['Heartbeat', 'Clients']}, mergeArr);
+3-3
src/backend/tasks/heartbeatSources.ts
···11import {config, Logger} from "@foxxmd/winston";
22-import {mergeArr} from "../utils";
22+import { mergeArr } from "../utils.js";
33import {AsyncTask} from "toad-scheduler";
44import {PromisePool} from "@supercharge/promise-pool";
55-import ScrobbleSources from "../sources/ScrobbleSources";
66-import {ChromecastSource} from "../sources/ChromecastSource";
55+import ScrobbleSources from "../sources/ScrobbleSources.js";
66+import { ChromecastSource } from "../sources/ChromecastSource.js";
7788export const createHeartbeatSourcesTask = (sources: ScrobbleSources, parentLogger: Logger) => {
99 const logger = parentLogger.child({labels: ['Heartbeat', 'Sources']}, mergeArr);
+3-3
src/backend/tests/jellyfin/jellyfin.test.ts
···22import {assert} from 'chai';
33import samplePayload from './playbackProgressSample.json';
4455-import JellyfinSource from "../../sources/JellyfinSource";
55+import JellyfinSource from "../../sources/JellyfinSource.js";
66import EventEmitter from "events";
77-import {getLogger} from "../../common/logging";
88-import {JsonPlayObject, PlayObject} from "../../../core/Atomic";
77+import { getLogger } from "../../common/logging.js";
88+import { JsonPlayObject, PlayObject } from "../../../core/Atomic.js";
991010const dataAsFixture = (data: any): TestFixture => {
1111 return data as TestFixture;
···1313import incorrectMultiArtistsTrackName from './incorrectlyMapped/multiArtistsInTrackName.json';
1414import veryWrong from './incorrectlyMapped/veryWrong.json';
15151616-import {ListenbrainzApiClient, ListenResponse} from "../../common/vendor/ListenbrainzApiClient";
1717-import {PlayObject} from "../../../core/Atomic";
1616+import { ListenbrainzApiClient, ListenResponse } from "../../common/vendor/ListenbrainzApiClient.js";
1717+import { PlayObject } from "../../../core/Atomic.js";
1818import dayjs from "dayjs";
1919-import {withRequestInterception} from "../utils/networking";
1919+import { withRequestInterception } from "../utils/networking.js";
2020import {http, HttpResponse} from "msw";
2121-import {UpstreamError} from "../../common/errors/UpstreamError";
2222-import {ExpectedResults} from "../utils/interfaces";
2121+import { UpstreamError } from "../../common/errors/UpstreamError.js";
2222+import { ExpectedResults } from "../utils/interfaces.js";
23232424interface LZTestFixture {
2525 data: ListenResponse
+5-10
src/backend/tests/player/player.test.ts
···11import {describe, it} from 'mocha';
22import {assert} from 'chai';
33-import {generatePlay} from "../utils/PlayTestUtils";
44-import {GenericPlayerState} from "../../sources/PlayerState/GenericPlayerState";
55-import {getLogger} from "../../common/logging";
66-import {
77- CALCULATED_PLAYER_STATUSES,
88- NO_DEVICE,
99- NO_USER,
1010- REPORTED_PLAYER_STATUSES
1111-} from "../../common/infrastructure/Atomic";
1212-import {playObjDataMatch} from "../../utils";
33+import { generatePlay } from "../utils/PlayTestUtils.js";
44+import { GenericPlayerState } from "../../sources/PlayerState/GenericPlayerState.js";
55+import { getLogger } from "../../common/logging.js";
66+import { CALCULATED_PLAYER_STATUSES, NO_DEVICE, NO_USER, REPORTED_PLAYER_STATUSES } from "../../common/infrastructure/Atomic.js";
77+import { playObjDataMatch } from "../../utils.js";
138import dayjs from "dayjs";
149import clone from "clone";
1510
+4-4
src/backend/tests/scrobbler/TestScrobbler.ts
···11-import AbstractScrobbleClient from "../../scrobblers/AbstractScrobbleClient";
22-import {PlayObject} from "../../../core/Atomic";
33-import {getLogger} from "../../common/logging";
44-import {Notifiers} from "../../notifier/Notifiers";
11+import AbstractScrobbleClient from "../../scrobblers/AbstractScrobbleClient.js";
22+import { PlayObject } from "../../../core/Atomic.js";
33+import { getLogger } from "../../common/logging.js";
44+import { Notifiers } from "../../notifier/Notifiers.js";
55import EventEmitter from "events";
66import request from "superagent";
77
+5-5
src/backend/tests/scrobbler/scrobblers.test.ts
···77import withDuration from '../plays/withDuration.json';
88import mixedDuration from '../plays/mixedDuration.json';
991010-import {TestScrobbler} from "./TestScrobbler";
1111-import {asPlays, generatePlay, normalizePlays} from "../utils/PlayTestUtils";
1010+import { TestScrobbler } from "./TestScrobbler.js";
1111+import { asPlays, generatePlay, normalizePlays } from "../utils/PlayTestUtils.js";
1212import dayjs from "dayjs";
1313-import {sleep} from "../../utils";
1414-import {MockNetworkError, withRequestInterception} from "../utils/networking";
1515-import {PlayObject} from "../../../core/Atomic";
1313+import { sleep } from "../../utils.js";
1414+import { MockNetworkError, withRequestInterception } from "../utils/networking.js";
1515+import { PlayObject } from "../../../core/Atomic.js";
16161717const firstPlayDate = dayjs().subtract(1, 'hour');
1818const olderFirstPlayDate = dayjs().subtract(4, 'hour');
+1-1
src/backend/tests/utils/PlayTestUtils.ts
···11-import {JsonPlayObject, ObjectPlayData, PlayData, PlayMeta, PlayObject} from "../../../core/Atomic";
11+import { JsonPlayObject, ObjectPlayData, PlayData, PlayMeta, PlayObject } from "../../../core/Atomic.js";
22import dayjs, {Dayjs} from "dayjs";
33import utc from "dayjs/plugin/utc.js";
44import isBetween from "dayjs/plugin/isBetween.js";
+1-1
src/backend/tests/utils/networking.ts
···11-import {NodeNetworkErrorCode, NodeNetworkException} from "../../common/errors/NodeErrors";
11+import { NodeNetworkErrorCode, NodeNetworkException } from "../../common/errors/NodeErrors.js";
22import { setupServer, SetupServer } from 'msw/node';
3344export class MockNetworkError extends Error implements NodeNetworkException {
+3-3
src/backend/tests/utils/strings.test.ts
···11import {describe, it} from 'mocha';
22import {assert} from 'chai';
33-import {compareNormalizedStrings, parseTrackCredits, uniqueNormalizedStrArr} from "../../utils/StringUtils";
33+import { compareNormalizedStrings, parseTrackCredits, uniqueNormalizedStrArr } from "../../utils/StringUtils.js";
44import testData from './playTestData.json';
55-import {ExpectedResults} from "./interfaces";
66-import {intersect} from "../../utils";
55+import { ExpectedResults } from "./interfaces.js";
66+import { intersect } from "../../utils.js";
7788interface PlayTestFixture {
99 caseHints: string[]
+4-4
src/backend/utils.ts
···1818 RegExResult,
1919 RemoteIdentityParts,
2020 ScrobbleThresholdResult,
2121-} from "./common/infrastructure/Atomic";
2121+} from "./common/infrastructure/Atomic.js";
2222import {Request} from "express";
2323import pathUtil from "path";
2424import {ErrorWithCause, getErrorCause} from "pony-cause";
2525import backoffStrategies from '@kenyip/backoff-strategies';
2626import {replaceResultTransformer, stripIndentTransformer, TemplateTag, trimResultTransformer} from 'common-tags';
2727import {Duration} from "dayjs/plugin/duration.js";
2828-import {PlayObject} from "../core/Atomic";
2828+import { PlayObject } from "../core/Atomic.js";
2929import address from "address";
30303131//const { default: Ajv } = AjvNS;
···350350 });
351351}
352352353353-export const createAjvFactory = (logger: Logger): Ajv => {
354354- const validator = new AjvNS.default({logger: logger, verbose: true, strict: "log", allowUnionTypes: true});
353353+export const createAjvFactory = (logger: Logger): AjvNS.default => {
354354+ const validator = new Ajv.default({logger: logger, verbose: true, strict: "log", allowUnionTypes: true});
355355 // https://ajv.js.org/strict-mode.html#unknown-keywords
356356 validator.addKeyword('deprecationMessage');
357357 return validator;
+3-3
src/backend/utils/MDNSUtils.ts
···11import {Logger} from "@foxxmd/winston";
22import AvahiBrowser from 'avahi-browse';
33-import {MaybeLogger} from "../common/logging";
44-import {sleep} from "../utils";
33+import { MaybeLogger } from "../common/logging.js";
44+import { sleep } from "../utils.js";
55import {ErrorWithCause} from "pony-cause";
66-import {MdnsDeviceInfo} from "../common/infrastructure/Atomic";
66+import { MdnsDeviceInfo } from "../common/infrastructure/Atomic.js";
77import {Browser, Service, ServiceType} from "@astronautlabs/mdns";
8899export interface AvahiService {
+3-3
src/backend/utils/StringUtils.ts
···11-import {DELIMITERS} from "../common/infrastructure/Atomic";
22-import {parseRegexSingleOrFail} from "../utils";
33-import {PlayObject} from "../../core/Atomic";
11+import { DELIMITERS } from "../common/infrastructure/Atomic.js";
22+import { parseRegexSingleOrFail } from "../utils.js";
33+import { PlayObject } from "../../core/Atomic.js";
44import {stringSameness, StringSamenessResult} from "@foxxmd/string-sameness";
55import {strategies} from '@foxxmd/string-sameness';
66
+11-8
src/backend/utils/TimeUtils.ts
···11import {
22- PlayObject, SCROBBLE_TS_SOC_END, SCROBBLE_TS_SOC_START, ScrobbleTsSOC,
22+ PlayObject,
33+ SCROBBLE_TS_SOC_END,
44+ SCROBBLE_TS_SOC_START,
55+ ScrobbleTsSOC,
36 TA_CLOSE,
47 TA_EXACT,
58 TA_FUZZY,
69 TA_NONE,
710 TemporalAccuracy,
88- TemporalPlayComparison
99-} from "../../core/Atomic";
1111+ TemporalPlayComparison,
1212+} from "../../core/Atomic.js";
1013import {
1114 DEFAULT_SCROBBLE_DURATION_THRESHOLD,
1215 DEFAULT_SCROBBLE_PERCENT_THRESHOLD,
1316 lowGranularitySources,
1414- ScrobbleThresholdResult
1515-} from "../common/infrastructure/Atomic";
1616-import {formatNumber} from "../utils";
1717-import {ScrobbleThresholds} from "../common/infrastructure/config/source";
1818-import {capitalize} from "../../core/StringUtils";
1717+ ScrobbleThresholdResult,
1818+} from "../common/infrastructure/Atomic.js";
1919+import { formatNumber } from "../utils.js";
2020+import { ScrobbleThresholds } from "../common/infrastructure/config/source/index.js";
2121+import { capitalize } from "../../core/StringUtils.js";
1922import dayjs, {Dayjs} from "dayjs";
20232124export const temporalPlayComparisonSummary = (data: TemporalPlayComparison, existingPlay?: PlayObject, candidatePlay?: PlayObject) => {
+1-1
src/core/Atomic.ts
···11import {Dayjs} from "dayjs";
22import {MESSAGE} from "triple-beam";
33-import {ListenProgress} from "../backend/sources/PlayerState/ListenProgress";
33+import {ListenProgress} from "../backend/sources/PlayerState/ListenProgress.js";
4455export interface SourceStatusData {
66 status: string;
+1-1
src/core/StringUtils.ts
···44import relativeTime from "dayjs/plugin/relativeTime.js";
55import duration from "dayjs/plugin/duration.js";
66import timezone from "dayjs/plugin/timezone.js";
77-import {AmbPlayObject, SCROBBLE_TS_SOC_END, SCROBBLE_TS_SOC_START, ScrobbleTsSOC, TrackStringOptions} from "./Atomic";
77+import {AmbPlayObject, SCROBBLE_TS_SOC_END, SCROBBLE_TS_SOC_START, ScrobbleTsSOC, TrackStringOptions} from "./Atomic.js";
8899dayjs.extend(utc)
1010dayjs.extend(isBetween);