[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
0

Configure Feed

Select the types of activity you want to include in your feed.

feat(tealfm): Massage handle for users who don't read docs

FoxxMD (Nov 7, 2025, 10:41 PM UTC) 04d95098 7ec90b97

+14
+14
src/backend/common/vendor/bluesky/BlueSkyAppApiClient.ts
··· 14 14 WellKnownHandleResolver, 15 15 } from "@atcute/identity-resolver"; 16 16 import { AtprotoDid, DidDocument } from "@atproto/oauth-client-node"; 17 + import { parseRegexSingle } from "@foxxmd/regex-buddy-core"; 17 18 18 19 interface HandleData { 19 20 did: string 20 21 pds: string 21 22 } 23 + 24 + const HANDLE_REGEX = new RegExp(/.+\..+/); 25 + const ATSIGN_REGEX = new RegExp(/^@(.+)/); 22 26 23 27 export class BlueSkyAppApiClient extends AbstractBlueSkyApiClient { 24 28 ··· 30 34 constructor(name: any, config: TealClientData, options: AbstractApiOptions) { 31 35 super(name, config, options); 32 36 this.logger.verbose(`Using App Password auth for session`); 37 + const atRes = parseRegexSingle(ATSIGN_REGEX, this.config.identifier); 38 + if(atRes !== undefined) { 39 + this.logger.warn(`Handle '${this.config.identifier}' has '@' at beginning, removing this.`); 40 + this.config.identifier = atRes.groups[0]; 41 + } 42 + if(undefined == parseRegexSingle(HANDLE_REGEX, config.identifier)) { 43 + const fqId = `${this.config.identifier}.bsky.social`; 44 + this.logger.warn(`Handle '${this.config.identifier}' was not in the form 'handle.TLD', assuming this is a Bluesky account and appending TLD: ${fqId}`); 45 + this.config.identifier = fqId; 46 + } 33 47 } 34 48 35 49 async initClient(): Promise<void> {