Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
deezer docker jellyfin koito lastfm listenbrainz maloja mopidy mpris music music-assistant plex scrobble self-hosted spotify subsonic tautulli youtube-music
Something went wrong. Try again.
5.0 kB · 123 lines
TypeScript
at strict
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123import { searchAndReplace } from "@foxxmd/regex-buddy-core";import type {ArtistCredit, PlayObject} from "../../../core/Atomic.ts";import { configValToSearchReplace, isSearchAndReplaceTerm, isUserStage, testWhenConditions } from "../../utils/PlayTransformUtils.ts";import type {WebhookPayload} from "../infrastructure/config/health/webhooks.ts";import type {ConditionalSearchAndReplaceRegExp, PlayTransformUserStage} from "../../../core/Transform.ts";import AtomicPartsTransformer from "./AtomicPartsTransformer.ts";
export default class UserTransformer extends AtomicPartsTransformer<ConditionalSearchAndReplaceRegExp[], undefined> {
// protected constructor(config: TransformerCommon) { // super(name, config); // }
protected doParseConfig(data: PlayTransformUserStage<ConditionalSearchAndReplaceRegExp[]>) { if (!isUserStage(data)) { throw new Error(`UserTransformer is only usable with 'user' type stages`); }
const { title = [], artists = [], album = [], albumArtists = [], ...rest } = data;
const { defaults: { title: defTitle = [], artists: defArtist = [], album: defAlbum = [], albumArtists: defAA = [], } = {}, } = this.config;
const stage: PlayTransformUserStage<ConditionalSearchAndReplaceRegExp[]> = { ...rest, title: [...title, ...defTitle], artists: [...artists, ...defArtist], album: [...album, ...defAlbum], albumArtists: [...albumArtists, ...defAA], type: 'user' }
for (const k of ['artists', 'title', 'album', 'albumArtists'] as const) { if (!(k in stage)) { continue; } if (!Array.isArray(stage[k])) { throw new Error(`${k} must be an array`); } try { isSearchAndReplaceTerm(stage[k]); stage[k] = stage[k].map(configValToSearchReplace) as ConditionalSearchAndReplaceRegExp[]; } catch (e) { throw new Error(`Property '${k}' was not a valid type`, { cause: e }); } } return stage; }
protected generateMapper(play: PlayObject) { return (x: ConditionalSearchAndReplaceRegExp): ConditionalSearchAndReplaceRegExp => { const {when} = x; return { ...x, test: (when !== undefined ? () => testWhenConditions(when, play, { testMaybeRegex: this.regex.testMaybeRegex }) : undefined) }; }; }
protected async handleTitle(play: PlayObject, parts: ConditionalSearchAndReplaceRegExp[], _transformData: undefined): Promise<string | undefined> { if (play.data.track === undefined) { return undefined; } const mapper = this.generateMapper(play); const result = searchAndReplace(play.data.track, parts.map(mapper)); if(result.trim() === '') { return undefined; } return result.trim(); } protected async handleArtists(play: PlayObject, parts: ConditionalSearchAndReplaceRegExp[], _transformData: undefined): Promise<ArtistCredit[] | undefined> { if(play.data.artists === undefined || play.data.artists.length === 0) { return play.data.artists; } const mapper = this.generateMapper(play); const transformedArtists = []; for(const artist of play.data.artists) { const a = searchAndReplace(artist.name, parts.map(mapper)); if(a.trim() !== '') { transformedArtists.push({...artist, name: a}); } } return transformedArtists; } protected async handleAlbumArtists(play: PlayObject, parts: ConditionalSearchAndReplaceRegExp[], _transformData: undefined): Promise<ArtistCredit[] | undefined> { if(play.data.albumArtists === undefined || play.data.albumArtists.length === 0) { return play.data.albumArtists; } const mapper = this.generateMapper(play); const transformedArtists = []; for(const artist of play.data.albumArtists) { const a = searchAndReplace(artist.name, parts.map(mapper)); if(a.trim() !== '') { transformedArtists.push({...artist, name: a}); } } return transformedArtists; } protected async handleAlbum(play: PlayObject, parts: ConditionalSearchAndReplaceRegExp[], _transformData: undefined): Promise<string | undefined> { if (play.data.album === undefined) { return undefined; } const mapper = this.generateMapper(play); const result = searchAndReplace(play.data.album, parts.map(mapper)); if(result.trim() === '') { return undefined; } return result.trim(); }
public async notify(payload: WebhookPayload): Promise<void> { }
}