diff --git a/src/backend/common/database/drizzle/repositories/BaseRepository.ts b/src/backend/common/database/drizzle/repositories/BaseRepository.ts index c5e12124..149c2385 100644 --- a/src/backend/common/database/drizzle/repositories/BaseRepository.ts +++ b/src/backend/common/database/drizzle/repositories/BaseRepository.ts @@ -79,13 +79,12 @@ export class GenericRepository extends DrizzleBaseRepositor } export const buildDateCompare = (data: CompareDateOp): RelationsFieldFilter => { - let q: RelationsFieldFilter = {}; if (data.type !== 'between') { - q = { + return { [data.type]: data.date } } else { - q = { + return { AND: [ { [data.inclusive ?? true ? 'gte' : 'gt']: data.range[0] @@ -96,5 +95,4 @@ export const buildDateCompare = (data: CompareDateOp): RelationsFieldFilter { query = removeUndefinedKeys(query); const results = await this.db.query.plays.findMany({ + ...query, limit: args.limit, offset: args.offset, columns: {id: true}, diff --git a/src/backend/common/infrastructure/Atomic.ts b/src/backend/common/infrastructure/Atomic.ts index f080f351..821edea2 100644 --- a/src/backend/common/infrastructure/Atomic.ts +++ b/src/backend/common/infrastructure/Atomic.ts @@ -381,7 +381,7 @@ export interface PaginatedListens { getPaginatedListens(params: PaginatedListensOptions): Promise<{data: PlayObject[], meta: PaginatedListensOptions & PaginatedResults}> } -export const hasPaginagedListens = (obj: Object): obj is PaginatedListens => { +export const hasPaginagedListens = (obj: object): obj is PaginatedListens => { return 'getPaginatedListens' in obj; } @@ -394,7 +394,7 @@ export interface PaginatedTimeRangeListens { getPaginatedUnitOfTime(): ManipulateType; } -export const hasPaginatedTimeRangeListens = (obj: Object): obj is PaginatedTimeRangeListens => { +export const hasPaginatedTimeRangeListens = (obj: object): obj is PaginatedTimeRangeListens => { return 'getPaginatedTimeRangeListens' in obj; } @@ -407,7 +407,7 @@ export interface PagelessTimeRangeListens { getPaginatedUnitOfTime(): ManipulateType; } -export const hasPagelessTimeRangeListens = (obj: Object): obj is PagelessTimeRangeListens => { +export const hasPagelessTimeRangeListens = (obj: object): obj is PagelessTimeRangeListens => { return 'getPagelessTimeRangeListens' in obj; } diff --git a/src/backend/common/vendor/LastfmApiClient.ts b/src/backend/common/vendor/LastfmApiClient.ts index ca0ad28f..982070b0 100644 --- a/src/backend/common/vendor/LastfmApiClient.ts +++ b/src/backend/common/vendor/LastfmApiClient.ts @@ -68,7 +68,7 @@ export default class LastfmApiClient extends AbstractApiClient implements Pagina } = config; this.url = normalizeWebAddress(urlBase, {removeTrailingSlash: false}); - let cbPrefix = 'lastfm'; + let cbPrefix: string; if(this.url.url.host === LASTFM_HOST) { this.logger.info('Using official Last.fm instance host/path'); diff --git a/src/backend/common/vendor/musicbrainz/MusicbrainzApiClient.ts b/src/backend/common/vendor/musicbrainz/MusicbrainzApiClient.ts index 0ccd4af4..972cc1f4 100644 --- a/src/backend/common/vendor/musicbrainz/MusicbrainzApiClient.ts +++ b/src/backend/common/vendor/musicbrainz/MusicbrainzApiClient.ts @@ -68,7 +68,7 @@ export class MusicbrainzApiClient extends AbstractApiClient { const mbApis: Record = {}; for(const mbConfig of this.config.apis) { const u = normalizeWebAddress(mbConfig.url ?? MUSICBRAINZ_URL); - let mb = mbMap.get(u.url.hostname); + const mb = mbMap.get(u.url.hostname); const mbApiConfig: Omit = { ...mbConfig, hostname: u.url.hostname, @@ -97,7 +97,6 @@ export class MusicbrainzApiClient extends AbstractApiClient { api, }; mbMap.set(u.url.hostname, api); - mb = api; } else if(mbApis[u.url.hostname] === undefined) { mbApis[u.url.hostname] = { ...mbApiConfig, @@ -143,9 +142,8 @@ export class MusicbrainzApiClient extends AbstractApiClient { // keep track of last request init at and wait until at least 1 second since that // to help prevent rate limiting - let waitTime = 0; const sinceLast = dayjs().diff(apiConfig.lastRequest, 'ms'); - waitTime = Math.max(0, apiConfig.minRequestIntervalDuration - sinceLast); + const waitTime = Math.max(0, apiConfig.minRequestIntervalDuration - sinceLast); apiConfig.lastRequest = dayjs().add(waitTime, 'ms'); //this.logger.trace(`Waiting ${waitTime}ms to call ${apiConfig.hostname} request at ${apiConfig.lastRequest.toISOString()}`) if(waitTime > 0) { @@ -458,6 +456,6 @@ export const removeNonWordCharacters = (str: string): string => { // remove any non-alphanumeric, non-whitespace characters // with a whitespace EX "My Cool (Title)" => "My Cool Title" - cleaned = str.replaceAll(NON_WORDWHITESPACE_REGEX, ''); + cleaned = cleaned.replaceAll(NON_WORDWHITESPACE_REGEX, ''); return cleaned; } diff --git a/src/backend/scrobblers/AbstractScrobbleClient.ts b/src/backend/scrobblers/AbstractScrobbleClient.ts index 0ee4adbc..0be341e5 100644 --- a/src/backend/scrobblers/AbstractScrobbleClient.ts +++ b/src/backend/scrobblers/AbstractScrobbleClient.ts @@ -581,8 +581,8 @@ export default abstract class AbstractScrobbleClient extends AbstractComponent i } // otherwise sort platform alphabetically and take first - plays.sort((a, b) => a[0].localeCompare(b[0])); - return plays[0][1].player; + preferredPlays.sort((a, b) => a[0].localeCompare(b[0])); + return preferredPlays[0][1].player; } } } @@ -1732,7 +1732,6 @@ export default abstract class AbstractScrobbleClient extends AbstractComponent i // and triggering this early means less, deeper checks const thresholds = this.nowPlayingThresholdsMet(sourcePlayerData); if (!thresholds.minMet) { - shouldUpdate = false; return [false, `${npUpdateTopReason} and ${validStatusReason} --BUT-- ${thresholds.minReason}`]; } else if ( @@ -1754,11 +1753,9 @@ export default abstract class AbstractScrobbleClient extends AbstractComponent i // check for valid play data if the update should be for a playing track if(playerInNPPlayingOnlyState(sourcePlayerData)) { if(sourcePlayerData.play?.data?.track === undefined) { - shouldUpdate = false; return [false, `${npUpdateTopReason} and ${validStatusReason} --BUT-- play is missing track information`]; } if((sourcePlayerData.play?.data?.artists ?? []).length === 0) { - shouldUpdate = false; return [false, `${npUpdateTopReason} and ${validStatusReason} --BUT-- play is missing artist information`]; } } @@ -1767,7 +1764,6 @@ export default abstract class AbstractScrobbleClient extends AbstractComponent i if(shouldUpdate && this.nowPlayingIsRealtime) { // prevent multiple clearing updates if(this.nowPlayingLastPlay !== undefined && shouldClearNPStatus(sourcePlayerData) && shouldClearNPStatus(this.nowPlayingLastPlay)) { - shouldUpdate = false; return [false, `${npUpdateTopReason} and ${validStatusReason} --BUT-- last update already cleared now playing`]; } }