diff --git a/packages/common/src/api/tan-query/lineups/useForYouFeed.ts b/packages/common/src/api/tan-query/lineups/useForYouFeed.ts index 6e2fee98dae..9a0a16b864d 100644 --- a/packages/common/src/api/tan-query/lineups/useForYouFeed.ts +++ b/packages/common/src/api/tan-query/lineups/useForYouFeed.ts @@ -1,4 +1,4 @@ -import { Id, GetUserRecommendedTracksTimeRangeEnum } from '@audius/sdk' +import { Id } from '@audius/sdk' import { useInfiniteQuery, useQueryClient } from '@tanstack/react-query' import { userTrackMetadataFromSDK } from '~/adapters/track' @@ -24,11 +24,9 @@ export const getForYouFeedQueryKey = (userId: ID | null | undefined) => { } /** - * "For You" feed for the Feed page. Backed by the same recommended-tracks - * endpoint that powers the Explore page's For You section - * (`GET /v1/users/{id}/recommended-tracks`). The dedicated - * `/feed/for-you` endpoint has been retired in favor of consolidating on - * the recommended-tracks source — see the API repo for the deletion. + * "For You" feed for the Feed page. Backed by the dedicated + * `GET /v1/users/{id}/feed/for-you` endpoint — a lean 3-source pipeline + * (in-network, trending, underground) with linear ranking and diversity pass. */ export const useForYouFeed = ( { @@ -57,12 +55,11 @@ export const useForYouFeed = ( const isFirstPage = pageParam === 0 const currentPageSize = isFirstPage ? initialPageSize : loadMorePageSize const sdk = await audiusSdk() - const { data = [] } = await sdk.users.getUserRecommendedTracks({ + const { data = [] } = await sdk.users.getUserForYouFeed({ id: Id.parse(currentUserId), userId: Id.parse(currentUserId), limit: currentPageSize, - offset: pageParam, - timeRange: GetUserRecommendedTracksTimeRangeEnum.Week + offset: pageParam }) const tracks = primeTrackData({ diff --git a/packages/sdk/src/sdk/api/generated/default/apis/UsersApi.ts b/packages/sdk/src/sdk/api/generated/default/apis/UsersApi.ts index db501182c5d..729b339d9c8 100644 --- a/packages/sdk/src/sdk/api/generated/default/apis/UsersApi.ts +++ b/packages/sdk/src/sdk/api/generated/default/apis/UsersApi.ts @@ -687,6 +687,14 @@ export interface GetUserFeedRequest { encodedDataSignature?: string; } +export interface GetUserForYouFeedRequest { + id: string; + limit?: number; + offset?: number; + maxPerArtist?: number; + userId?: string; +} + export interface GetUserIDsByAddressesRequest { address: Array; } @@ -4172,6 +4180,62 @@ export class UsersApi extends runtime.BaseAPI { return await response.value(); } + /** + * @hidden + * Returns a personalized For You feed for the user identified in the path. Twitter-style multi-source pipeline — candidate retrieval (in-network, trending, underground) → linear ranking (recency decay × engagement × social affinity, weighted by source) → diversity (per-artist cap + consecutive-same-artist lookahead). + * Get For You feed for user + */ + async getUserForYouFeedRaw(params: GetUserForYouFeedRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + if (params.id === null || params.id === undefined) { + throw new runtime.RequiredError('id','Required parameter params.id was null or undefined when calling getUserForYouFeed.'); + } + + const queryParameters: any = {}; + + if (params.limit !== undefined) { + queryParameters['limit'] = params.limit; + } + + if (params.offset !== undefined) { + queryParameters['offset'] = params.offset; + } + + if (params.maxPerArtist !== undefined) { + queryParameters['max_per_artist'] = params.maxPerArtist; + } + + if (params.userId !== undefined) { + queryParameters['user_id'] = params.userId; + } + + const headerParameters: runtime.HTTPHeaders = {}; + + if (!headerParameters["Authorization"] && this.configuration && this.configuration.accessToken) { + const token = await this.configuration.accessToken("OAuth2", ["read"]); + if (token) { + headerParameters["Authorization"] = token; + } + } + + const response = await this.request({ + path: `/users/{id}/feed/for-you`.replace(`{${"id"}}`, encodeURIComponent(String(params.id))), + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => TracksFromJSON(jsonValue)); + } + + /** + * Returns a personalized For You feed for the user identified in the path. Twitter-style multi-source pipeline — candidate retrieval (in-network, trending, underground) → linear ranking (recency decay × engagement × social affinity, weighted by source) → diversity (per-artist cap + consecutive-same-artist lookahead). + * Get For You feed for user + */ + async getUserForYouFeed(params: GetUserForYouFeedRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.getUserForYouFeedRaw(params, initOverrides); + return await response.value(); + } + /** * @hidden * Gets User IDs from any Ethereum wallet address or Solana account address associated with their Audius account.