Skip to content

Commit e057b98

Browse files
committed
fix(completeNowPlaying): check for possibly null values before inserting
1 parent 7336f64 commit e057b98

File tree

1 file changed

+80
-55
lines changed

1 file changed

+80
-55
lines changed

src/fmEngine/completeNowPlaying.ts

+80-55
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,108 @@
1-
import { client } from './index.js'
2-
import { NoScrobblesError } from '../commandEngine/errors.js'
3-
import { Context } from '../multiplatformEngine/common/context.js'
4-
import { LastfmRecentTracksTrack } from '@musicorum/lastfm/dist/types/packages/user.js'
5-
import { LastfmTag } from '@musicorum/lastfm/dist/types/packages/common.js'
6-
import { debug } from '../loggingEngine/logging.js'
7-
import { hashName } from '../utils.js'
8-
import { upsertArtistScrobbles } from '../graphEngine/operations/artist-scrobbles.js'
1+
import { client } from "./index.js";
2+
import { NoScrobblesError } from "../commandEngine/errors.js";
3+
import { Context } from "../multiplatformEngine/common/context.js";
4+
import { LastfmRecentTracksTrack } from "@musicorum/lastfm/dist/types/packages/user.js";
5+
import { LastfmTag } from "@musicorum/lastfm/dist/types/packages/common.js";
6+
import { debug } from "../loggingEngine/logging.js";
7+
import { hashName } from "../utils.js";
8+
import { upsertArtistScrobbles } from "../graphEngine/operations/artist-scrobbles.js";
99

10-
export type NowPlayingEntity = 'artist' | 'album' | 'track'
10+
export type NowPlayingEntity = "artist" | "album" | "track";
1111

1212
export interface NowPlayingData<NowPlayingEntity> {
13-
name: string
14-
mbid: string
15-
artistMbid: string
16-
imageURL: string
17-
artist?: string
18-
album?: string
19-
playCount?: number
20-
loved: boolean
21-
tags: string[]
22-
isNowPlaying: boolean
13+
name: string;
14+
mbid: string;
15+
artistMbid: string;
16+
imageURL: string;
17+
artist?: string;
18+
album?: string;
19+
playCount?: number;
20+
loved: boolean;
21+
tags: string[];
22+
isNowPlaying: boolean;
2323
}
2424

25-
const entityCall = async (entity: NowPlayingEntity, username: string, track: LastfmRecentTracksTrack) => {
26-
const data = { username }
25+
const entityCall = async (
26+
entity: NowPlayingEntity,
27+
username: string,
28+
track: LastfmRecentTracksTrack,
29+
) => {
30+
const data = { username };
2731

2832
switch (entity) {
29-
case 'artist':
30-
const d = await client.artist.getInfo(track.artist.name, data)
31-
if (d?.playCount && d?.playCount > 1 && d?.mbid) await upsertArtistScrobbles(username, d?.mbid, d?.playCount)
32-
return d
33-
case 'album':
34-
return client.album.getInfo(track.album.name, track.artist.name, data)
35-
case 'track':
36-
return client.track.getInfo(track.name, track.artist.name, data)
33+
case "artist":
34+
const d = await client.artist.getInfo(track.artist.name, data);
35+
if (d?.playCount && d?.playCount > 1 && d?.name)
36+
await upsertArtistScrobbles(
37+
username,
38+
d?.mbid || hashName(d?.name),
39+
d?.playCount,
40+
);
41+
return d;
42+
case "album":
43+
return client.album.getInfo(track.album.name, track.artist.name, data);
44+
case "track":
45+
return client.track.getInfo(track.name, track.artist.name, data);
3746
default:
38-
throw new Error('Invalid entity')
47+
throw new Error("Invalid entity");
3948
}
40-
}
49+
};
4150

42-
export const getNowPlaying = async (ctx: Context, entity: NowPlayingEntity, getFromRegisteredUserForTargeted?: boolean, informationForRegistered?: boolean): Promise<NowPlayingData<NowPlayingEntity>> => {
43-
const targetUserData = ctx.targetedUserData ?? ctx.registeredUserData
44-
const targetUser = ctx.targetedUser ?? ctx.registeredUser
51+
export const getNowPlaying = async (
52+
ctx: Context,
53+
entity: NowPlayingEntity,
54+
getFromRegisteredUserForTargeted?: boolean,
55+
informationForRegistered?: boolean,
56+
): Promise<NowPlayingData<NowPlayingEntity>> => {
57+
const targetUserData = ctx.targetedUserData ?? ctx.registeredUserData;
58+
const targetUser = ctx.targetedUser ?? ctx.registeredUser;
4559

46-
debug('fmEngine.getNowPlaying', `getting now playing for ${targetUser.name} (fm username is ${targetUserData.fmUsername})`)
47-
const nowPlaying = await client.user.getRecentTracks(getFromRegisteredUserForTargeted ? ctx.registeredUserData.fmUsername : targetUserData.fmUsername, { limit: 1 })
60+
debug(
61+
"fmEngine.getNowPlaying",
62+
`getting now playing for ${targetUser.name} (fm username is ${targetUserData.fmUsername})`,
63+
);
64+
const nowPlaying = await client.user.getRecentTracks(
65+
getFromRegisteredUserForTargeted
66+
? ctx.registeredUserData.fmUsername
67+
: targetUserData.fmUsername,
68+
{ limit: 1 },
69+
);
4870

49-
const track = nowPlaying.tracks[0]
71+
const track = nowPlaying.tracks[0];
5072
if (!track) {
51-
throw new NoScrobblesError(ctx)
73+
throw new NoScrobblesError(ctx);
5274
}
5375

5476
const info = await entityCall(
5577
entity,
56-
informationForRegistered ? ctx.registeredUserData.fmUsername : targetUserData.fmUsername,
57-
track
58-
).catch(() => undefined)
78+
informationForRegistered
79+
? ctx.registeredUserData.fmUsername
80+
: targetUserData.fmUsername,
81+
track,
82+
).catch(() => undefined);
5983

60-
let tags = info?.tags?.map?.((tag: LastfmTag) => tag.name ?? tag) || []
61-
tags = tags.map((a: string) => a.toLowerCase().replaceAll('-', '_').replaceAll(' ', '_'))
84+
let tags = info?.tags?.map?.((tag: LastfmTag) => tag.name ?? tag) || [];
85+
tags = tags.map((a: string) =>
86+
a.toLowerCase().replaceAll("-", "_").replaceAll(" ", "_"),
87+
);
6288

63-
let artistMbid
64-
if (entity === 'track' || entity === 'album') {
65-
artistMbid = track.artist.mbid || hashName(track.artist.name)
89+
let artistMbid;
90+
if (entity === "track" || entity === "album") {
91+
artistMbid = track?.artist?.mbid || hashName(track?.artist?.name);
6692
} else {
67-
artistMbid = info?.mbid
93+
artistMbid = info?.mbid || hashName(info?.name);
6894
}
6995

7096
return {
7197
name: track.name,
72-
mbid: info.mbid || hashName(track.name),
98+
mbid: info?.mbid || hashName(track.name),
7399
artistMbid,
74-
imageURL: info.images?.[3]?.url || track?.images?.[3]?.url,
100+
imageURL: info?.images?.[3]?.url || track?.images?.[3]?.url,
75101
artist: track.artist.name,
76102
album: track.album.name || info.album?.name,
77-
playCount: info.user?.playCount || 0,
78-
loved: info.user?.loved || false,
103+
playCount: info?.user?.playCount || 0,
104+
loved: info?.user?.loved || false,
79105
tags: tags.slice(0, 5),
80-
isNowPlaying: track.nowPlaying || false
81-
}
82-
}
83-
106+
isNowPlaying: track.nowPlaying || false,
107+
};
108+
};

0 commit comments

Comments
 (0)