Skip to content

Commit b9a3541

Browse files
committed
feat: similar artist query
1 parent ca391cb commit b9a3541

File tree

5 files changed

+142
-1
lines changed

5 files changed

+142
-1
lines changed

apps/web/graphql.schema.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

apps/web/src/api.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ export const {
1515
playlistQuery,
1616
updatePlaylistMutation,
1717
updatePlaylistSongRankMutation,
18+
topSongsByArtistQuery,
19+
similarArtistsQuery,
1820
} = getSdk(gqlClient)
1921

2022
export const queryClient = new QueryClient({
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
query similarArtistsQuery($artist: String!, $limit: Int, $onlyNames: Boolean) {
2+
similarArtists(artist: $artist, limit: $limit, onlyNames: $onlyNames) {
3+
name
4+
image
5+
bannerImage
6+
__typename
7+
}
8+
}

apps/web/src/server/schema/artist/artist-resolver.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import Artist from './artist'
33
import { CacheControl } from '../cache-control'
44
import { Song } from '../song/song'
55
import { lastFM } from '@/server/modules/lastfm'
6+
import { audioDB } from '@/server/modules/audiodb/audiodb'
67

78
@Resolver(Artist)
89
export class ArtistResolver {
@@ -26,4 +27,62 @@ export class ArtistResolver {
2627
playcount: track.playcount,
2728
}))
2829
}
30+
31+
@Query(() => [Artist])
32+
@CacheControl({ maxAge: 60 * 60 * 24 * 7 })
33+
async similarArtists(
34+
@Arg('artist') artist: string,
35+
@Arg('limit', () => Int, { defaultValue: 8 }) limit: number,
36+
@Arg('onlyNames', { defaultValue: true }) onlyNames?: boolean
37+
): Promise<Partial<Artist>[]> {
38+
const getSimilarArtistsResponse = await lastFM.getSimilarArtists({
39+
artist,
40+
limit,
41+
})
42+
43+
const similarArtistsBase =
44+
getSimilarArtistsResponse.data?.similarartists?.artist || []
45+
46+
const similarArtistsNames = similarArtistsBase.map((artist) => ({
47+
name: artist.name,
48+
}))
49+
50+
if (onlyNames) {
51+
return similarArtistsNames
52+
}
53+
54+
const similarArtist = await Promise.all(
55+
similarArtistsNames.map(async (similarArtistName) => {
56+
const getArtistResponse = await audioDB.getArtist({
57+
artist: similarArtistName.name,
58+
})
59+
60+
const similarArtist = getArtistResponse.data.artists?.[0]
61+
62+
return similarArtist
63+
? {
64+
name: similarArtist.strArtist,
65+
formedYear: similarArtist.intFormedYear?.toString(),
66+
image: similarArtist.strArtistThumb,
67+
bannerImage: similarArtist.strArtistFanart,
68+
logo: similarArtist.strArtistLogo,
69+
style: similarArtist.strStyle,
70+
genre: similarArtist.strGenre,
71+
website: similarArtist.strWebsite,
72+
facebook: similarArtist.strFacebook,
73+
twitter: similarArtist.strTwitter,
74+
biography: similarArtist.strBiographyEN,
75+
memberQuantity: Number(similarArtist.intMembers),
76+
location: similarArtist.strCountry,
77+
disbanded: similarArtist.strDisbanded
78+
? Boolean(similarArtist.strDisbanded)
79+
: undefined,
80+
disbandedYear: similarArtist.intDiedYear?.toString(),
81+
}
82+
: similarArtistName
83+
})
84+
)
85+
86+
return similarArtist
87+
}
2988
}

packages/shared/generated/graphql.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export type Query = {
6565
getVideoInfo: Array<SongVideo>;
6666
me: User;
6767
playlist: Playlist;
68+
similarArtists: Array<Artist>;
6869
topSongsByArtist: Array<Song>;
6970
userPlaylists: Array<Playlist>;
7071
};
@@ -77,6 +78,12 @@ export type QueryPlaylistArgs = {
7778
playlistId: Scalars["ID"]["input"];
7879
};
7980

81+
export type QuerySimilarArtistsArgs = {
82+
artist: Scalars["String"]["input"];
83+
limit?: Scalars["Int"]["input"];
84+
onlyNames?: Scalars["Boolean"]["input"];
85+
};
86+
8087
export type QueryTopSongsByArtistArgs = {
8188
artist: Scalars["String"]["input"];
8289
limit?: Scalars["Int"]["input"];
@@ -88,6 +95,25 @@ export type Account = {
8895
provider: Scalars["String"]["output"];
8996
};
9097

98+
export type Artist = {
99+
__typename?: "artist";
100+
bannerImage: Maybe<Scalars["String"]["output"]>;
101+
biography: Maybe<Scalars["String"]["output"]>;
102+
disbanded: Maybe<Scalars["Boolean"]["output"]>;
103+
disbandedYear: Maybe<Scalars["String"]["output"]>;
104+
facebook: Maybe<Scalars["String"]["output"]>;
105+
formedYear: Maybe<Scalars["String"]["output"]>;
106+
genre: Maybe<Scalars["String"]["output"]>;
107+
image: Maybe<Scalars["String"]["output"]>;
108+
location: Maybe<Scalars["String"]["output"]>;
109+
logo: Maybe<Scalars["String"]["output"]>;
110+
memberQuantity: Maybe<Scalars["Float"]["output"]>;
111+
name: Scalars["String"]["output"];
112+
style: Maybe<Scalars["String"]["output"]>;
113+
twitter: Maybe<Scalars["String"]["output"]>;
114+
website: Maybe<Scalars["String"]["output"]>;
115+
};
116+
91117
export type Playlist = {
92118
__typename?: "playlist";
93119
createdAt: Maybe<Scalars["String"]["output"]>;
@@ -213,6 +239,22 @@ export type MeQueryQuery = {
213239
};
214240
};
215241

242+
export type SimilarArtistsQueryQueryVariables = Exact<{
243+
artist: Scalars["String"]["input"];
244+
limit: InputMaybe<Scalars["Int"]["input"]>;
245+
onlyNames: InputMaybe<Scalars["Boolean"]["input"]>;
246+
}>;
247+
248+
export type SimilarArtistsQueryQuery = {
249+
__typename?: "Query";
250+
similarArtists: Array<{
251+
__typename: "artist";
252+
name: string;
253+
image: string | null;
254+
bannerImage: string | null;
255+
}>;
256+
};
257+
216258
export type TopSongsByArtistQueryQueryVariables = Exact<{
217259
artist: Scalars["String"]["input"];
218260
}>;
@@ -337,6 +379,20 @@ export const MeQueryDocument = gql`
337379
}
338380
}
339381
`;
382+
export const SimilarArtistsQueryDocument = gql`
383+
query similarArtistsQuery(
384+
$artist: String!
385+
$limit: Int
386+
$onlyNames: Boolean
387+
) {
388+
similarArtists(artist: $artist, limit: $limit, onlyNames: $onlyNames) {
389+
name
390+
image
391+
bannerImage
392+
__typename
393+
}
394+
}
395+
`;
340396
export const TopSongsByArtistQueryDocument = gql`
341397
query topSongsByArtistQuery($artist: String!) {
342398
topSongsByArtist(artist: $artist) {
@@ -476,6 +532,22 @@ export function getSdk(
476532
variables,
477533
);
478534
},
535+
similarArtistsQuery(
536+
variables: SimilarArtistsQueryQueryVariables,
537+
requestHeaders?: GraphQLClientRequestHeaders,
538+
): Promise<SimilarArtistsQueryQuery> {
539+
return withWrapper(
540+
(wrappedRequestHeaders) =>
541+
client.request<SimilarArtistsQueryQuery>(
542+
SimilarArtistsQueryDocument,
543+
variables,
544+
{ ...requestHeaders, ...wrappedRequestHeaders },
545+
),
546+
"similarArtistsQuery",
547+
"query",
548+
variables,
549+
);
550+
},
479551
topSongsByArtistQuery(
480552
variables: TopSongsByArtistQueryQueryVariables,
481553
requestHeaders?: GraphQLClientRequestHeaders,

0 commit comments

Comments
 (0)