|
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"; |
9 | 9 |
|
10 |
| -export type NowPlayingEntity = 'artist' | 'album' | 'track' |
| 10 | +export type NowPlayingEntity = "artist" | "album" | "track"; |
11 | 11 |
|
12 | 12 | 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; |
23 | 23 | }
|
24 | 24 |
|
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 }; |
27 | 31 |
|
28 | 32 | 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); |
37 | 46 | default:
|
38 |
| - throw new Error('Invalid entity') |
| 47 | + throw new Error("Invalid entity"); |
39 | 48 | }
|
40 |
| -} |
| 49 | +}; |
41 | 50 |
|
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; |
45 | 59 |
|
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 | + ); |
48 | 70 |
|
49 |
| - const track = nowPlaying.tracks[0] |
| 71 | + const track = nowPlaying.tracks[0]; |
50 | 72 | if (!track) {
|
51 |
| - throw new NoScrobblesError(ctx) |
| 73 | + throw new NoScrobblesError(ctx); |
52 | 74 | }
|
53 | 75 |
|
54 | 76 | const info = await entityCall(
|
55 | 77 | 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); |
59 | 83 |
|
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 | + ); |
62 | 88 |
|
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); |
66 | 92 | } else {
|
67 |
| - artistMbid = info?.mbid |
| 93 | + artistMbid = info?.mbid || hashName(info?.name); |
68 | 94 | }
|
69 | 95 |
|
70 | 96 | return {
|
71 | 97 | name: track.name,
|
72 |
| - mbid: info.mbid || hashName(track.name), |
| 98 | + mbid: info?.mbid || hashName(track.name), |
73 | 99 | artistMbid,
|
74 |
| - imageURL: info.images?.[3]?.url || track?.images?.[3]?.url, |
| 100 | + imageURL: info?.images?.[3]?.url || track?.images?.[3]?.url, |
75 | 101 | artist: track.artist.name,
|
76 | 102 | 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, |
79 | 105 | tags: tags.slice(0, 5),
|
80 |
| - isNowPlaying: track.nowPlaying || false |
81 |
| - } |
82 |
| -} |
83 |
| - |
| 106 | + isNowPlaying: track.nowPlaying || false, |
| 107 | + }; |
| 108 | +}; |
0 commit comments