From 4c38cc1fe6e79a67184877bea66c48ca4d60efca Mon Sep 17 00:00:00 2001 From: Michael Piazza Date: Wed, 7 Oct 2020 14:29:33 -0700 Subject: [PATCH 1/4] Consume stems endpoint --- src/models/Track.ts | 1 + .../audius-api-client/AudiusAPIClient.ts | 82 ++++++++++--------- .../audius-api-client/ResponseAdapter.ts | 57 ++++++++++++- src/services/audius-api-client/types.ts | 9 ++ src/store/cache/tracks/sagas.js | 1 + .../tracks/utils/fetchAndProcessStems.ts | 18 ++-- src/store/cache/tracks/utils/helpers.ts | 8 +- .../tracks/utils/processAndCacheTracks.ts | 6 +- .../cache/tracks/utils/retrieveTracks.ts | 4 +- 9 files changed, 131 insertions(+), 55 deletions(-) diff --git a/src/models/Track.ts b/src/models/Track.ts index 1ac4104ace..7777f4e5c3 100644 --- a/src/models/Track.ts +++ b/src/models/Track.ts @@ -130,6 +130,7 @@ export type LineupTrack = UserTrack & { } // Track with known non-optional stem +export type StemTrackMetadata = TrackMetadata & Required> export type StemTrack = Track & Required> export type StemUserTrack = UserTrack & Required> diff --git a/src/services/audius-api-client/AudiusAPIClient.ts b/src/services/audius-api-client/AudiusAPIClient.ts index bb07ce7fc3..55f46b8a8f 100644 --- a/src/services/audius-api-client/AudiusAPIClient.ts +++ b/src/services/audius-api-client/AudiusAPIClient.ts @@ -7,12 +7,14 @@ import { APITrack, APIPlaylist, APIUser, - OpaqueID + OpaqueID, + APIStem } from './types' import * as adapter from './ResponseAdapter' import AudiusBackend from 'services/AudiusBackend' import { getEagerDiscprov } from 'services/audius-backend/eagerLoadUtils' import { encodeHashId } from 'utils/route/hashIds' +import { StemTrackMetadata } from 'models/Track' const ENDPOINT_MAP = { trending: '/tracks/trending', @@ -31,7 +33,8 @@ const ENDPOINT_MAP = { userRepostsByHandle: (handle: OpaqueID) => `/users/handle/${handle}/reposts`, getPlaylist: (playlistId: OpaqueID) => `/playlists/${playlistId}`, topGenreUsers: '/users/genre/top', - track: (trackId: OpaqueID) => `/tracks/${trackId}` + track: (trackId: OpaqueID) => `/tracks/${trackId}`, + stems: (trackId: OpaqueID) => `/tracks/${trackId}/stems` } const TRENDING_LIMIT = 100 @@ -133,6 +136,10 @@ type GetPlaylistArgs = { currentUserId: ID | null } +type GetStemsArgs = { + trackId: ID +} + type InitializationState = | { state: 'uninitialized ' } | { @@ -183,10 +190,7 @@ class AudiusAPIClient { }: GetFollowingArgs) { this._assertInitialized() const encodedCurrentUserId = encodeHashId(currentUserId) - const encodedProfileUserId = encodeHashId(profileUserId) - if (!encodedProfileUserId) { - throw new Error(`Unable to encode profile user id: ${profileUserId}`) - } + const encodedProfileUserId = this._encodeOrThrow(profileUserId) const params = { user_id: encodedCurrentUserId || undefined, limit, @@ -213,10 +217,7 @@ class AudiusAPIClient { }: GetFollowersArgs) { this._assertInitialized() const encodedCurrentUserId = encodeHashId(currentUserId) - const encodedProfileUserId = encodeHashId(profileUserId) - if (!encodedProfileUserId) { - throw new Error(`Unable to encode profile user id: ${profileUserId}`) - } + const encodedProfileUserId = this._encodeOrThrow(profileUserId) const params = { user_id: encodedCurrentUserId || undefined, limit, @@ -243,10 +244,7 @@ class AudiusAPIClient { }: GetTrackRepostUsersArgs) { this._assertInitialized() const encodedCurrentUserId = encodeHashId(currentUserId) - const encodedTrackId = encodeHashId(trackId) - if (!encodedTrackId) { - throw new Error(`Unable to encode profile user id: ${trackId}`) - } + const encodedTrackId = this._encodeOrThrow(trackId) const params = { user_id: encodedCurrentUserId || undefined, limit, @@ -273,10 +271,7 @@ class AudiusAPIClient { }: GetTrackFavoriteUsersArgs) { this._assertInitialized() const encodedCurrentUserId = encodeHashId(currentUserId) - const encodedTrackId = encodeHashId(trackId) - if (!encodedTrackId) { - throw new Error(`Unable to encode profile user id: ${trackId}`) - } + const encodedTrackId = this._encodeOrThrow(trackId) const params = { user_id: encodedCurrentUserId || undefined, limit, @@ -303,10 +298,7 @@ class AudiusAPIClient { }: GetPlaylistRepostUsersArgs) { this._assertInitialized() const encodedCurrentUserId = encodeHashId(currentUserId) - const encodedPlaylistId = encodeHashId(playlistId) - if (!encodedPlaylistId) { - throw new Error(`Unable to encode profile user id: ${playlistId}`) - } + const encodedPlaylistId = this._encodeOrThrow(playlistId) const params = { user_id: encodedCurrentUserId || undefined, limit, @@ -333,10 +325,7 @@ class AudiusAPIClient { }: GetPlaylistFavoriteUsersArgs) { this._assertInitialized() const encodedCurrentUserId = encodeHashId(currentUserId) - const encodedPlaylistId = encodeHashId(playlistId) - if (!encodedPlaylistId) { - throw new Error(`Unable to encode profile user id: ${playlistId}`) - } + const encodedPlaylistId = this._encodeOrThrow(playlistId) const params = { user_id: encodedCurrentUserId || undefined, limit, @@ -356,10 +345,7 @@ class AudiusAPIClient { } async getTrack({ id, currentUserId, unlistedArgs }: GetTrackArgs) { - const encodedTrackId = encodeHashId(id) - if (!encodedTrackId) { - throw new Error(`Unable to encode track ID: ${id}`) - } + const encodedTrackId = this._encodeOrThrow(id) const encodedCurrentUserId = encodeHashId(currentUserId) this._assertInitialized() @@ -382,6 +368,17 @@ class AudiusAPIClient { return adapted } + async getStems({ trackId }: GetStemsArgs): Promise { + this._assertInitialized() + const encodedTrackId = this._encodeOrThrow(trackId) + const endpoint = this._constructUrl(ENDPOINT_MAP.stems(encodedTrackId)) + const response: APIResponse = await this._getResponse(endpoint) + const adapted = response.data + .map(adapter.makeStemTrack) + .filter(removeNullable) + return adapted + } + async getUserByHandle({ handle, currentUserId }: GetUserByHandleArgs) { const encodedCurrentUserId = encodeHashId(currentUserId) this._assertInitialized() @@ -431,10 +428,7 @@ class AudiusAPIClient { }: GetProfileListArgs) { this._assertInitialized() const encodedUserId = encodeHashId(currentUserId) - const encodedProfileUserId = encodeHashId(profileUserId) - if (!encodedProfileUserId) { - throw new Error(`Unable to encode profile user id: ${profileUserId}`) - } + const encodedProfileUserId = this._encodeOrThrow(profileUserId) const params = { user_id: encodedUserId || undefined, limit, @@ -505,10 +499,7 @@ class AudiusAPIClient { async getPlaylist({ playlistId, currentUserId }: GetPlaylistArgs) { this._assertInitialized() const encodedCurrentUserId = encodeHashId(currentUserId) - const encodedPlaylistId = encodeHashId(playlistId) - if (!encodedPlaylistId) { - throw new Error(`Unable to encode profile user id: ${playlistId}`) - } + const encodedPlaylistId = this._encodeOrThrow(playlistId) const params = { user_id: encodedCurrentUserId || undefined } @@ -575,6 +566,14 @@ class AudiusAPIClient { return `${endpoint}/v1/full` } + _encodeOrThrow(id: ID): OpaqueID { + const encoded = encodeHashId(id) + if (!encoded) { + throw new Error(`Unable to encode id: ${id}`) + } + return encoded + } + _constructUrl( path: string, queryParams: { @@ -585,7 +584,7 @@ class AudiusAPIClient { | boolean | Array | null - } + } = {} ) { if (this.initializationState.state !== 'initialized') throw new Error('_constructURL called uninitialized') @@ -602,6 +601,9 @@ class AudiusAPIClient { } } -const instance = new AudiusAPIClient() +// const instance = new AudiusAPIClient() +const instance = new AudiusAPIClient({ + overrideEndpoint: 'http://docker.for.mac.localhost:5000' +}) export default instance diff --git a/src/services/audius-api-client/ResponseAdapter.ts b/src/services/audius-api-client/ResponseAdapter.ts index 617f4f3f7a..afefa95eaf 100644 --- a/src/services/audius-api-client/ResponseAdapter.ts +++ b/src/services/audius-api-client/ResponseAdapter.ts @@ -1,6 +1,6 @@ import Favorite from 'models/Favorite' import Repost from 'models/Repost' -import { Remix, UserTrackMetadata } from 'models/Track' +import { Remix, StemTrackMetadata, UserTrackMetadata } from 'models/Track' import { UserCollectionMetadata, Variant } from 'models/Collection' import { UserMetadata } from 'models/User' import { decodeHashId } from 'utils/route/hashIds' @@ -12,7 +12,8 @@ import { APIRepost, APITrack, APIPlaylist, - APIUser + APIUser, + APIStem } from './types' export const makeUser = (user: APIUser): UserMetadata | undefined => { @@ -206,3 +207,55 @@ export const makeActivity = ( return makePlaylist(activity.item) } } + +export const makeStemTrack = (stem: APIStem): StemTrackMetadata | undefined => { + const [id, parentId, ownerId] = [stem.id, stem.parent_id, stem.user_id].map( + decodeHashId + ) + console.log({ id, parentId, ownerId }) + if (!(id && parentId && ownerId)) return undefined + + return { + is_delete: false, + track_id: id, + created_at: '', + isrc: null, + iswc: null, + credits_splits: null, + description: null, + followee_reposts: [], + followee_saves: [], + genre: '', + has_current_user_reposted: false, + has_current_user_saved: false, + download: { + is_downloadable: true, + requires_follow: false, + cid: stem.cid + }, + license: null, + mood: null, + play_count: 0, + owner_id: ownerId, + release_date: null, + repost_count: 0, + save_count: 0, + tags: null, + title: '', // TODO: do we need this field? + track_segments: [], + cover_art: null, + cover_art_sizes: null, + is_unlisted: false, + + // Optional Fields + stem_of: { + parent_track_id: parentId, + category: stem.category + }, + remix_of: null, + + // Added fields + duration: 0, + updated_at: '' + } +} diff --git a/src/services/audius-api-client/types.ts b/src/services/audius-api-client/types.ts index d5752d55c4..96229a9936 100644 --- a/src/services/audius-api-client/types.ts +++ b/src/services/audius-api-client/types.ts @@ -8,6 +8,7 @@ import { } from 'models/common/ImageSizes' import { FavoriteType } from 'models/Favorite' import { Download, FieldVisibility, TrackSegment } from 'models/Track' +import { StemCategory } from 'models/Stems' export type OpaqueID = string type PlaylistContents = { @@ -103,6 +104,14 @@ export type APITrack = { is: string } +export type APIStem = { + id: OpaqueID + parent_id: OpaqueID + user_id: OpaqueID + category: StemCategory + cid: CID +} + export type APIPlaylistAddedTimestamp = { timestamp: number track_id: OpaqueID diff --git a/src/store/cache/tracks/sagas.js b/src/store/cache/tracks/sagas.js index 5c9608fdc9..69145ebd7b 100644 --- a/src/store/cache/tracks/sagas.js +++ b/src/store/cache/tracks/sagas.js @@ -58,6 +58,7 @@ function* fetchRepostInfo(entries) { function* fetchSegment(metadata) { const user = yield call(waitForValue, getUser, { id: metadata.owner_id }) const gateways = getCreatorNodeIPFSGateways(user.creator_node_endpoint) + if (!metadata.track_segments[0]) return const cid = metadata.track_segments[0].multihash return yield call(fetchCID, cid, gateways, /* cache */ false) } diff --git a/src/store/cache/tracks/utils/fetchAndProcessStems.ts b/src/store/cache/tracks/utils/fetchAndProcessStems.ts index d23939989b..1fe6e71a81 100644 --- a/src/store/cache/tracks/utils/fetchAndProcessStems.ts +++ b/src/store/cache/tracks/utils/fetchAndProcessStems.ts @@ -1,13 +1,13 @@ import { call, put } from 'redux-saga/effects' import { ID } from 'models/common/Identifiers' import { Kind } from 'store/types' -import AudiusBackend from 'services/AudiusBackend' -import { StemUserTrack, Stem } from 'models/Track' +import { Stem, StemTrackMetadata } from 'models/Track' import { waitForValue } from 'utils/sagaHelpers' import { getTrack } from '../selectors' import * as cacheActions from 'store/cache/actions' import { StemCategory } from 'models/Stems' import { processAndCacheTracks } from './processAndCacheTracks' +import apiClient from 'services/audius-api-client/AudiusAPIClient' /** * Fetches stems for a parent track. @@ -17,9 +17,16 @@ import { processAndCacheTracks } from './processAndCacheTracks' * @param trackId the parent track for which to fetch stems */ export function* fetchAndProcessStems(trackId: ID) { - const stems: Array = yield call(AudiusBackend.getStems, { - trackId - }) + const stems: StemTrackMetadata[] = yield call( + args => apiClient.getStems(args), + { + trackId + } + ) + console.log({ stems }) + // const stems: Array = yield call(AudiusBackend.getStems, { + // trackId + // }) if (stems.length) { yield call(processAndCacheTracks, stems) @@ -34,6 +41,7 @@ export function* fetchAndProcessStems(trackId: ID) { category: StemCategory[s.stem_of.category] })) + console.log({ stemsUpdate }) yield put( cacheActions.update(Kind.TRACKS, [ { diff --git a/src/store/cache/tracks/utils/helpers.ts b/src/store/cache/tracks/utils/helpers.ts index 662c1b8f0f..54b9d95084 100644 --- a/src/store/cache/tracks/utils/helpers.ts +++ b/src/store/cache/tracks/utils/helpers.ts @@ -1,4 +1,4 @@ -import Track, { UserTrackMetadata } from 'models/Track' +import { TrackMetadata } from 'models/Track' import User from 'models/User' import { Kind } from 'store/types' import { put } from 'redux-saga/effects' @@ -10,11 +10,13 @@ import { makeUid } from 'utils/uid' * Adds users from track metadata to cache. * @param metadataArray */ -export function* addUsersFromTracks(metadataArray: UserTrackMetadata[]) { +export function* addUsersFromTracks( + metadataArray: T[] +) { const users = metadataArray .filter(m => m.user) .map(m => { - const track = m as Track & { user: User } + const track = m as TrackMetadata & { user: User } return { id: track.user.user_id, uid: makeUid(Kind.USERS, track.user.user_id), diff --git a/src/store/cache/tracks/utils/processAndCacheTracks.ts b/src/store/cache/tracks/utils/processAndCacheTracks.ts index 5bf9aa87dd..600eeb8232 100644 --- a/src/store/cache/tracks/utils/processAndCacheTracks.ts +++ b/src/store/cache/tracks/utils/processAndCacheTracks.ts @@ -4,15 +4,15 @@ import { reformat } from './reformat' import { Kind } from 'store/types' import { makeUid } from 'utils/uid' import { addUsersFromTracks } from './helpers' -import Track, { UserTrackMetadata } from 'models/Track' +import Track, { TrackMetadata } from 'models/Track' /** * Processes tracks, adding users and calling `reformat`, before * caching the tracks. * @param tracks */ -export function* processAndCacheTracks( - tracks: UserTrackMetadata[] +export function* processAndCacheTracks( + tracks: T[] ): Generator { // Add users yield addUsersFromTracks(tracks) diff --git a/src/store/cache/tracks/utils/retrieveTracks.ts b/src/store/cache/tracks/utils/retrieveTracks.ts index c82f0947fa..1ed967d3a6 100644 --- a/src/store/cache/tracks/utils/retrieveTracks.ts +++ b/src/store/cache/tracks/utils/retrieveTracks.ts @@ -7,7 +7,7 @@ import { getTracks as getTracksSelector } from 'store/cache/tracks/selectors' import { Kind, AppState } from 'store/types' import { addUsersFromTracks } from './helpers' import AudiusBackend from 'services/AudiusBackend' -import Track, { UserTrackMetadata } from 'models/Track' +import Track, { TrackMetadata, UserTrackMetadata } from 'models/Track' import { fetchAndProcessRemixes, fetchAndProcessRemixParents @@ -148,7 +148,7 @@ export function* retrieveTracks({ forceRetrieveFromSource: false, shouldSetLoading: true, deleteExistingEntry: false, - onBeforeAddToCache: function* (tracks: UserTrackMetadata[]) { + onBeforeAddToCache: function* (tracks: T[]) { yield addUsersFromTracks(tracks) return tracks.map(track => reformat(track)) } From c6a1591d09cd2995be6df26e35ebe6c98b4a59a5 Mon Sep 17 00:00:00 2001 From: Michael Piazza Date: Wed, 7 Oct 2020 17:08:07 -0700 Subject: [PATCH 2/4] Consume remixes endpts --- .../store/lineups/tracks/sagas.ts | 11 ++- src/services/AudiusBackend.js | 52 ------------ .../audius-api-client/AudiusAPIClient.ts | 79 +++++++++++++++++-- .../tracks/utils/fetchAndProcessRemixes.ts | 22 ++++-- .../tracks/utils/fetchAndProcessStems.ts | 4 - 5 files changed, 94 insertions(+), 74 deletions(-) diff --git a/src/containers/remixes-page/store/lineups/tracks/sagas.ts b/src/containers/remixes-page/store/lineups/tracks/sagas.ts index 2fe4ec68f9..4f47172986 100644 --- a/src/containers/remixes-page/store/lineups/tracks/sagas.ts +++ b/src/containers/remixes-page/store/lineups/tracks/sagas.ts @@ -1,7 +1,5 @@ import { call, put } from 'redux-saga/effects' -import AudiusBackend from 'services/AudiusBackend' - import { PREFIX, tracksActions @@ -11,6 +9,9 @@ import { LineupSagas } from 'store/lineup/sagas' import { processAndCacheTracks } from 'store/cache/tracks/utils' import { setCount } from '../../slice' import { AppState } from 'store/types' +import apiClient from 'services/audius-api-client/AudiusAPIClient' +import { getUserId } from 'store/account/selectors' +import { select } from 'redux-saga-test-plan/matchers' function* getTracks({ offset, @@ -24,10 +25,12 @@ function* getTracks({ const { trackId } = payload if (!trackId) return [] - const { tracks, count } = yield call(AudiusBackend.getRemixesOfTrack, { + const currentUserId = yield select(getUserId) + const { tracks, count } = yield call(args => apiClient.getRemixes(args), { trackId, offset, - limit + limit, + currentUserId }) yield put(setCount({ count })) diff --git a/src/services/AudiusBackend.js b/src/services/AudiusBackend.js index 100d0ac518..0445fa19f4 100644 --- a/src/services/AudiusBackend.js +++ b/src/services/AudiusBackend.js @@ -685,58 +685,6 @@ class AudiusBackend { } } - static async getStems({ trackId }) { - try { - const stems = await withEagerOption( - { - normal: libs => libs.Track.getStemsForTrack, - eager: DiscoveryAPI.getStemsForTrack - }, - trackId - ) - return stems - } catch (e) { - console.error(e) - throw e - } - } - - static async getRemixesOfTrack({ trackId, offset, limit }) { - try { - const remixes = await withEagerOption( - { - normal: libs => libs.Track.getRemixesOfTrack, - eager: DiscoveryAPI.getRemixesOfTrack - }, - trackId, - limit, - offset - ) - return remixes - } catch (e) { - console.error(e) - throw e - } - } - - static async getRemixTrackParents({ trackId, offset, limit }) { - try { - const remixes = await withEagerOption( - { - normal: libs => libs.Track.getRemixTrackParents, - eager: DiscoveryAPI.getRemixTrackParents - }, - trackId, - limit, - offset - ) - return remixes - } catch (e) { - console.error(e) - throw e - } - } - static async getSocialFeed({ filter, offset, diff --git a/src/services/audius-api-client/AudiusAPIClient.ts b/src/services/audius-api-client/AudiusAPIClient.ts index 55f46b8a8f..edaf31310a 100644 --- a/src/services/audius-api-client/AudiusAPIClient.ts +++ b/src/services/audius-api-client/AudiusAPIClient.ts @@ -1,5 +1,5 @@ import TimeRange from 'models/TimeRange' -import { removeNullable } from 'utils/typeUtils' +import { Nullable, removeNullable } from 'utils/typeUtils' import { ID } from 'models/common/Identifiers' import { APIActivity, @@ -34,7 +34,9 @@ const ENDPOINT_MAP = { getPlaylist: (playlistId: OpaqueID) => `/playlists/${playlistId}`, topGenreUsers: '/users/genre/top', track: (trackId: OpaqueID) => `/tracks/${trackId}`, - stems: (trackId: OpaqueID) => `/tracks/${trackId}/stems` + stems: (trackId: OpaqueID) => `/tracks/${trackId}/stems`, + remixes: (trackId: OpaqueID) => `/tracks/${trackId}/remixes`, + remixing: (trackId: OpaqueID) => `/tracks/${trackId}/remixing` } const TRENDING_LIMIT = 100 @@ -105,7 +107,7 @@ type GetUserByHandleArgs = { type GetUserTracksByHandleArgs = { handle: string - currentUserId: ID | null + currentUserId: Nullable sort?: 'date' | 'plays' offset?: number limit?: number @@ -113,7 +115,7 @@ type GetUserTracksByHandleArgs = { type GetProfileListArgs = { profileUserId: ID - currentUserId: ID | null + currentUserId: Nullable limit?: number offset?: number } @@ -126,20 +128,39 @@ type GetTopArtistGenresArgs = { type GetUserRepostsByHandleArgs = { handle: string - currentUserId: ID | null + currentUserId: Nullable offset?: number limit?: number } type GetPlaylistArgs = { playlistId: ID - currentUserId: ID | null + currentUserId: Nullable } type GetStemsArgs = { trackId: ID } +type GetRemixesArgs = { + trackId: ID + currentUserId: Nullable + limit: number + offset: number +} + +type RemixesResponse = { + tracks: APITrack[] + count: number +} + +type GetRemixingArgs = { + trackId: ID + currentUserId: Nullable + limit: number + offset: number +} + type InitializationState = | { state: 'uninitialized ' } | { @@ -379,6 +400,52 @@ class AudiusAPIClient { return adapted } + async getRemixes({ trackId, limit, offset, currentUserId }: GetRemixesArgs) { + this._assertInitialized() + const encodedTrackId = this._encodeOrThrow(trackId) + const encodedUserId = encodeHashId(currentUserId) + const params = { + userId: encodedUserId ?? undefined, + limit, + offset + } + const endpoint = this._constructUrl( + ENDPOINT_MAP.remixes(encodedTrackId), + params + ) + const remixesResponse: APIResponse = await this._getResponse( + endpoint + ) + + const tracks = remixesResponse.data.tracks.map(adapter.makeTrack) + return { count: remixesResponse.data.count, tracks } + } + + async getRemixing({ + trackId, + limit, + offset, + currentUserId + }: GetRemixingArgs) { + this._assertInitialized() + const encodedTrackId = this._encodeOrThrow(trackId) + const encodedUserId = encodeHashId(currentUserId) + const params = { + userId: encodedUserId ?? undefined, + limit, + offset + } + const endpoint = this._constructUrl( + ENDPOINT_MAP.remixing(encodedTrackId), + params + ) + const remixingResponse: APIResponse = await this._getResponse( + endpoint + ) + const tracks = remixingResponse.data.map(adapter.makeTrack) + return tracks + } + async getUserByHandle({ handle, currentUserId }: GetUserByHandleArgs) { const encodedCurrentUserId = encodeHashId(currentUserId) this._assertInitialized() diff --git a/src/store/cache/tracks/utils/fetchAndProcessRemixes.ts b/src/store/cache/tracks/utils/fetchAndProcessRemixes.ts index 93faf5739d..eea3046d66 100644 --- a/src/store/cache/tracks/utils/fetchAndProcessRemixes.ts +++ b/src/store/cache/tracks/utils/fetchAndProcessRemixes.ts @@ -1,12 +1,14 @@ import { call, put } from 'redux-saga/effects' import { ID } from 'models/common/Identifiers' import { Kind } from 'store/types' -import AudiusBackend from 'services/AudiusBackend' -import { RemixUserTrack } from 'models/Track' +import { UserTrackMetadata } from 'models/Track' import { waitForValue } from 'utils/sagaHelpers' import { getTrack } from '../selectors' import * as cacheActions from 'store/cache/actions' import { processAndCacheTracks } from './processAndCacheTracks' +import apiClient from 'services/audius-api-client/AudiusAPIClient' +import { getUserId } from 'store/account/selectors' +import { select } from 'redux-saga-test-plan/matchers' const INITIAL_FETCH_LIMIT = 6 @@ -18,15 +20,17 @@ const INITIAL_FETCH_LIMIT = 6 * @param trackId the parent track for which to fetch remixes */ export function* fetchAndProcessRemixes(trackId: ID) { + const currentUserId = yield select(getUserId) const { tracks: remixes, count - }: { tracks: Array; count: number } = yield call( - AudiusBackend.getRemixesOfTrack, + }: { tracks: UserTrackMetadata[]; count: number } = yield call( + args => apiClient.getRemixes(args), { trackId, + offset: 0, limit: INITIAL_FETCH_LIMIT, - offset: 0 + currentUserId } ) @@ -67,12 +71,14 @@ export function* fetchAndProcessRemixes(trackId: ID) { * @param trackId the track for which to fetch remix parents */ export function* fetchAndProcessRemixParents(trackId: ID) { - const remixParents: Array = yield call( - AudiusBackend.getRemixTrackParents, + const currentUserId = yield select(getUserId) + const remixParents: UserTrackMetadata[] = yield call( + args => apiClient.getRemixing(args), { trackId, limit: 1, - offset: 0 + offset: 0, + currentUserId } ) diff --git a/src/store/cache/tracks/utils/fetchAndProcessStems.ts b/src/store/cache/tracks/utils/fetchAndProcessStems.ts index 1fe6e71a81..67d5d307bc 100644 --- a/src/store/cache/tracks/utils/fetchAndProcessStems.ts +++ b/src/store/cache/tracks/utils/fetchAndProcessStems.ts @@ -23,10 +23,6 @@ export function* fetchAndProcessStems(trackId: ID) { trackId } ) - console.log({ stems }) - // const stems: Array = yield call(AudiusBackend.getStems, { - // trackId - // }) if (stems.length) { yield call(processAndCacheTracks, stems) From 5a6ddae38ffa6d51d7b442526ff29434fad51e32 Mon Sep 17 00:00:00 2001 From: Michael Piazza Date: Wed, 7 Oct 2020 17:14:33 -0700 Subject: [PATCH 3/4] Cleanup --- .../audius-api-client/AudiusAPIClient.ts | 23 ++++++++----------- .../audius-api-client/ResponseAdapter.ts | 1 - .../tracks/utils/fetchAndProcessStems.ts | 1 - 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/services/audius-api-client/AudiusAPIClient.ts b/src/services/audius-api-client/AudiusAPIClient.ts index edaf31310a..b4425da99e 100644 --- a/src/services/audius-api-client/AudiusAPIClient.ts +++ b/src/services/audius-api-client/AudiusAPIClient.ts @@ -43,7 +43,7 @@ const TRENDING_LIMIT = 100 export type GetTrackArgs = { id: ID - currentUserId?: ID | null + currentUserId?: Nullable unlistedArgs?: { urlTitle: string handle: string @@ -54,55 +54,55 @@ type GetTrendingArgs = { timeRange?: TimeRange offset?: number limit?: number - currentUserId: ID | null + currentUserId: Nullable genre?: string } type GetFollowingArgs = { profileUserId: ID - currentUserId: ID | null + currentUserId: Nullable offset?: number limit?: number } type GetFollowersArgs = { profileUserId: ID - currentUserId: ID | null + currentUserId: Nullable offset?: number limit?: number } type GetTrackRepostUsersArgs = { trackId: ID - currentUserId: ID | null + currentUserId: Nullable limit?: number offset?: number } type GetTrackFavoriteUsersArgs = { trackId: ID - currentUserId: ID | null + currentUserId: Nullable limit?: number offset?: number } type GetPlaylistRepostUsersArgs = { playlistId: ID - currentUserId: ID | null + currentUserId: Nullable limit?: number offset?: number } type GetPlaylistFavoriteUsersArgs = { playlistId: ID - currentUserId: ID | null + currentUserId: Nullable limit?: number offset?: number } type GetUserByHandleArgs = { handle: string - currentUserId: ID | null + currentUserId: Nullable } type GetUserTracksByHandleArgs = { @@ -668,9 +668,6 @@ class AudiusAPIClient { } } -// const instance = new AudiusAPIClient() -const instance = new AudiusAPIClient({ - overrideEndpoint: 'http://docker.for.mac.localhost:5000' -}) +const instance = new AudiusAPIClient() export default instance diff --git a/src/services/audius-api-client/ResponseAdapter.ts b/src/services/audius-api-client/ResponseAdapter.ts index afefa95eaf..d15c714fa9 100644 --- a/src/services/audius-api-client/ResponseAdapter.ts +++ b/src/services/audius-api-client/ResponseAdapter.ts @@ -212,7 +212,6 @@ export const makeStemTrack = (stem: APIStem): StemTrackMetadata | undefined => { const [id, parentId, ownerId] = [stem.id, stem.parent_id, stem.user_id].map( decodeHashId ) - console.log({ id, parentId, ownerId }) if (!(id && parentId && ownerId)) return undefined return { diff --git a/src/store/cache/tracks/utils/fetchAndProcessStems.ts b/src/store/cache/tracks/utils/fetchAndProcessStems.ts index 67d5d307bc..1dc4e85ce2 100644 --- a/src/store/cache/tracks/utils/fetchAndProcessStems.ts +++ b/src/store/cache/tracks/utils/fetchAndProcessStems.ts @@ -37,7 +37,6 @@ export function* fetchAndProcessStems(trackId: ID) { category: StemCategory[s.stem_of.category] })) - console.log({ stemsUpdate }) yield put( cacheActions.update(Kind.TRACKS, [ { From fd3fc36a2e7df0406c204bd3db01e66b0330e59c Mon Sep 17 00:00:00 2001 From: Michael Piazza Date: Wed, 7 Oct 2020 17:44:54 -0700 Subject: [PATCH 4/4] More cleanup --- .../audius-api-client/AudiusAPIClient.ts | 16 ++++++++-------- .../audius-api-client/ResponseAdapter.ts | 6 +----- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/services/audius-api-client/AudiusAPIClient.ts b/src/services/audius-api-client/AudiusAPIClient.ts index b4425da99e..6cb2de9f56 100644 --- a/src/services/audius-api-client/AudiusAPIClient.ts +++ b/src/services/audius-api-client/AudiusAPIClient.ts @@ -33,10 +33,10 @@ const ENDPOINT_MAP = { userRepostsByHandle: (handle: OpaqueID) => `/users/handle/${handle}/reposts`, getPlaylist: (playlistId: OpaqueID) => `/playlists/${playlistId}`, topGenreUsers: '/users/genre/top', - track: (trackId: OpaqueID) => `/tracks/${trackId}`, - stems: (trackId: OpaqueID) => `/tracks/${trackId}/stems`, - remixes: (trackId: OpaqueID) => `/tracks/${trackId}/remixes`, - remixing: (trackId: OpaqueID) => `/tracks/${trackId}/remixing` + getTrack: (trackId: OpaqueID) => `/tracks/${trackId}`, + getStems: (trackId: OpaqueID) => `/tracks/${trackId}/stems`, + getRemixes: (trackId: OpaqueID) => `/tracks/${trackId}/remixes`, + getRemixing: (trackId: OpaqueID) => `/tracks/${trackId}/remixing` } const TRENDING_LIMIT = 100 @@ -379,7 +379,7 @@ class AudiusAPIClient { } const endpoint = this._constructUrl( - ENDPOINT_MAP.track(encodedTrackId), + ENDPOINT_MAP.getTrack(encodedTrackId), args ) const trackResponse: APIResponse = await this._getResponse( @@ -392,7 +392,7 @@ class AudiusAPIClient { async getStems({ trackId }: GetStemsArgs): Promise { this._assertInitialized() const encodedTrackId = this._encodeOrThrow(trackId) - const endpoint = this._constructUrl(ENDPOINT_MAP.stems(encodedTrackId)) + const endpoint = this._constructUrl(ENDPOINT_MAP.getStems(encodedTrackId)) const response: APIResponse = await this._getResponse(endpoint) const adapted = response.data .map(adapter.makeStemTrack) @@ -410,7 +410,7 @@ class AudiusAPIClient { offset } const endpoint = this._constructUrl( - ENDPOINT_MAP.remixes(encodedTrackId), + ENDPOINT_MAP.getRemixes(encodedTrackId), params ) const remixesResponse: APIResponse = await this._getResponse( @@ -436,7 +436,7 @@ class AudiusAPIClient { offset } const endpoint = this._constructUrl( - ENDPOINT_MAP.remixing(encodedTrackId), + ENDPOINT_MAP.getRemixing(encodedTrackId), params ) const remixingResponse: APIResponse = await this._getResponse( diff --git a/src/services/audius-api-client/ResponseAdapter.ts b/src/services/audius-api-client/ResponseAdapter.ts index d15c714fa9..0170a89aec 100644 --- a/src/services/audius-api-client/ResponseAdapter.ts +++ b/src/services/audius-api-client/ResponseAdapter.ts @@ -240,20 +240,16 @@ export const makeStemTrack = (stem: APIStem): StemTrackMetadata | undefined => { repost_count: 0, save_count: 0, tags: null, - title: '', // TODO: do we need this field? + title: '', track_segments: [], cover_art: null, cover_art_sizes: null, is_unlisted: false, - - // Optional Fields stem_of: { parent_track_id: parentId, category: stem.category }, remix_of: null, - - // Added fields duration: 0, updated_at: '' }