Skip to content

Commit

Permalink
[C-5549] Migrate album backlinks to api (#10758)
Browse files Browse the repository at this point in the history
  • Loading branch information
dylanjeffers authored Dec 18, 2024
1 parent 8e857ed commit cce74dd
Show file tree
Hide file tree
Showing 25 changed files with 320 additions and 88 deletions.
5 changes: 4 additions & 1 deletion packages/common/src/adapters/track.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,10 @@ export const userTrackMetadataFromSDK = (
pinned_comment_id: input.pinnedCommentId ?? null,
is_owned_by_user: input.isOwnedByUser,
cover_original_artist: input.coverOriginalArtist ?? null,
cover_original_song_title: input.coverOriginalSongTitle ?? null
cover_original_song_title: input.coverOriginalSongTitle ?? null,
album_backlink: input.albumBacklink
? snakecaseKeys(input.albumBacklink)
: undefined
}

return newTrack
Expand Down
13 changes: 4 additions & 9 deletions packages/common/src/hooks/useTrackMetadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { Mood } from '@audius/sdk'

import { useGetTrackById } from '~/api/track'
import { ID } from '~/models'
import { trpc } from '~/services/trpc'
import { parseMusicalKey } from '~/utils/musicalKeys'
import { searchPage } from '~/utils/route'

Expand Down Expand Up @@ -36,11 +35,6 @@ export const useTrackMetadata = ({
}: TrackMetadataProps): TrackMetadataInfo[] => {
const { data: track } = useGetTrackById({ id: trackId })

const { data: albumInfo } = trpc.tracks.getAlbumBacklink.useQuery(
{ trackId },
{ enabled: !!trackId }
)

if (!track) return []

const {
Expand All @@ -51,7 +45,8 @@ export const useTrackMetadata = ({
is_unlisted: isUnlisted,
musical_key,
bpm,
is_custom_bpm: isCustomBpm
is_custom_bpm: isCustomBpm,
album_backlink
} = track

const parsedBpm = bpm
Expand All @@ -64,8 +59,8 @@ export const useTrackMetadata = ({
{
id: TrackMetadataType.ALBUM,
label: 'Album',
value: albumInfo?.playlist_name ?? '',
url: albumInfo?.permalink
value: album_backlink?.playlist_name ?? '',
url: album_backlink?.permalink
},
{
id: TrackMetadataType.GENRE,
Expand Down
5 changes: 5 additions & 0 deletions packages/common/src/models/Track.ts
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,11 @@ export type TrackMetadata = {
url?: string
mirrors: string[]
}
album_backlink?: {
playlist_id: ID
playlist_name: string
permalink: string
}
} & Timestamped

export type DownloadReason = {
Expand Down
12 changes: 12 additions & 0 deletions packages/discovery-provider/src/api/v1/models/tracks.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,16 @@
},
)


album_backlink = ns.model(
"album_backlink",
{
"playlist_id": fields.Integer(required=True),
"playlist_name": fields.String(required=True),
"permalink": fields.String(required=True),
},
)

track = ns.model(
"Track",
{
Expand Down Expand Up @@ -119,6 +129,7 @@
"ddex_app": fields.String(allow_null=True),
"playlists_containing_track": fields.List(fields.Integer),
"pinned_comment_id": fields.Integer(allow_null=True),
"album_backlink": fields.Nested(album_backlink, allow_null=True),
},
)

Expand Down Expand Up @@ -229,6 +240,7 @@
"stream": fields.Nested(url_with_mirrors, required=True),
"download": fields.Nested(url_with_mirrors, required=True),
"preview": fields.Nested(url_with_mirrors, required=True),
"album_backlink": fields.Nested(album_backlink, allow_null=True),
},
)

Expand Down
47 changes: 47 additions & 0 deletions packages/discovery-provider/src/queries/query_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
)
from src.models.playlists.aggregate_playlist import AggregatePlaylist
from src.models.playlists.playlist import Playlist
from src.models.playlists.playlist_route import PlaylistRoute
from src.models.playlists.playlist_track import PlaylistTrack
from src.models.social.follow import Follow
from src.models.social.repost import Repost, RepostType
from src.models.social.save import Save, SaveType
Expand Down Expand Up @@ -499,6 +501,48 @@ def populate_track_metadata(
# if no current user (guest), populate access based on track stream/download conditions
_populate_gated_content_metadata(session, tracks, current_user_id)

# Get album backlinks for all tracks in a single query
album_backlinks = (
session.query(
PlaylistTrack.track_id,
Playlist.playlist_id,
Playlist.playlist_name,
User.handle,
PlaylistRoute.slug,
)
.join(Playlist, Playlist.playlist_id == PlaylistTrack.playlist_id)
.join(
User,
and_(User.user_id == Playlist.playlist_owner_id, User.is_current == True),
)
.join(
PlaylistRoute,
and_(
PlaylistRoute.playlist_id == Playlist.playlist_id,
PlaylistRoute.is_current == True,
),
)
.filter(
PlaylistTrack.track_id.in_(track_ids),
PlaylistTrack.is_removed == False,
Playlist.is_album == True,
Playlist.is_delete == False,
Playlist.is_current == True,
)
.order_by(Playlist.created_at.desc())
.all()
)

# Create a dict of track_id to its most recent album (first in the ordered results)
album_backlink_dict = {}
for track_id, playlist_id, playlist_name, handle, slug in album_backlinks:
if track_id not in album_backlink_dict:
album_backlink_dict[track_id] = {
"playlist_id": playlist_id,
"playlist_name": playlist_name,
"permalink": f"/{handle}/album/{slug}" if handle and slug else None,
}

for track in tracks:
track_id = track["track_id"]

Expand Down Expand Up @@ -553,6 +597,9 @@ def populate_track_metadata(
else:
track[response_name_constants.remix_of] = None

# Add album backlink
track["album_backlink"] = album_backlink_dict.get(track_id)

return tracks


Expand Down
13 changes: 4 additions & 9 deletions packages/mobile/src/components/lineup-tile/TrackTile.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import {
isContentUSDCPurchaseGated
} from '@audius/common/models'
import type { Track, User } from '@audius/common/models'
import { trpc } from '@audius/common/services'
import {
accountSelectors,
cacheTracksSelectors,
Expand Down Expand Up @@ -112,7 +111,8 @@ export const TrackTileComponent = ({
preview_cid,
ddex_app: ddexApp,
is_unlisted: isUnlisted,
_co_sign: coSign
_co_sign: coSign,
album_backlink
} = track

const { artist_pick_track_id } = user
Expand All @@ -134,11 +134,6 @@ export const TrackTileComponent = ({
[track]
)

const { data: albumInfo } = trpc.tracks.getAlbumBacklink.useQuery(
{ trackId: track_id },
{ enabled: !!track_id }
)

const handlePress = useCallback(() => {
setTimeout(() => {
togglePlay({
Expand Down Expand Up @@ -171,7 +166,7 @@ export const TrackTileComponent = ({
isLongFormContent
? OverflowAction.VIEW_EPISODE_PAGE
: OverflowAction.VIEW_TRACK_PAGE,
albumInfo ? OverflowAction.VIEW_ALBUM_PAGE : null,
album_backlink ? OverflowAction.VIEW_ALBUM_PAGE : null,
isLongFormContent
? playbackPositionInfo?.status === 'COMPLETED'
? OverflowAction.MARK_AS_UNPLAYED
Expand Down Expand Up @@ -200,7 +195,7 @@ export const TrackTileComponent = ({
isOwner,
ddexApp,
isUnlisted,
albumInfo,
album_backlink,
playbackPositionInfo?.status,
isArtistPick,
isOnArtistsTracksTab,
Expand Down
17 changes: 2 additions & 15 deletions packages/mobile/src/components/now-playing-drawer/ActionsBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import {
ModalSource
} from '@audius/common/models'
import type { Track } from '@audius/common/models'
import { trpc } from '@audius/common/services'
import {
accountSelectors,
castSelectors,
Expand Down Expand Up @@ -124,11 +123,6 @@ export const ActionsBar = ({ track }: ActionsBarProps) => {
usePremiumContentPurchaseModal()
const currentQueueItem = useSelector(makeGetCurrent())

const { data: albumInfo } = trpc.tracks.getAlbumBacklink.useQuery(
{ trackId: track?.track_id ?? 0 },
{ enabled: !!track?.track_id }
)

const handlePurchasePress = useCallback(() => {
if (track?.track_id) {
openPremiumContentPurchaseModal(
Expand Down Expand Up @@ -206,7 +200,7 @@ export const ActionsBar = ({ track }: ActionsBarProps) => {
isLongFormContent
? OverflowAction.VIEW_EPISODE_PAGE
: OverflowAction.VIEW_TRACK_PAGE,
albumInfo ? OverflowAction.VIEW_ALBUM_PAGE : null,
track.album_backlink ? OverflowAction.VIEW_ALBUM_PAGE : null,
isLongFormContent
? playbackPositionInfo?.status === 'COMPLETED'
? OverflowAction.MARK_AS_UNPLAYED
Expand All @@ -223,14 +217,7 @@ export const ActionsBar = ({ track }: ActionsBarProps) => {
})
)
}
}, [
track,
isOwner,
isUnlisted,
albumInfo,
playbackPositionInfo?.status,
dispatch
])
}, [track, isOwner, isUnlisted, playbackPositionInfo?.status, dispatch])

const { openAirplayDialog } = useAirplay()
const castDevices = useDevices()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import {
ModalSource
} from '@audius/common/models'
import type { ID } from '@audius/common/models'
import { trpc } from '@audius/common/services'
import {
accountSelectors,
cacheCollectionsActions,
Expand Down Expand Up @@ -88,10 +87,7 @@ const TrackOverflowMenuDrawer = ({ render }: Props) => {
(t) => t.track === track?.track_id
)

const { data: albumInfo } = trpc.tracks.getAlbumBacklink.useQuery(
{ trackId: id },
{ enabled: !!id }
)
const albumInfo = track?.album_backlink

const user = useSelector((state: CommonState) =>
getUser(state, { id: track?.owner_id })
Expand Down
13 changes: 4 additions & 9 deletions packages/mobile/src/components/track-list/TrackListItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import {
type User,
isContentUSDCPurchaseGated
} from '@audius/common/models'
import { trpc } from '@audius/common/services'
import {
accountSelectors,
cacheCollectionsSelectors,
Expand Down Expand Up @@ -220,7 +219,8 @@ const TrackListItemComponent = (props: TrackListItemComponentProps) => {
track_id,
owner_id,
ddex_app: ddexApp,
stream_conditions: streamConditions
stream_conditions: streamConditions,
album_backlink
} = track
const { is_deactivated, name } = user

Expand Down Expand Up @@ -274,11 +274,6 @@ const TrackListItemComponent = (props: TrackListItemComponentProps) => {
getTrackPosition(state, { trackId: track_id, userId: currentUserId })
)

const { data: albumInfo } = trpc.tracks.getAlbumBacklink.useQuery(
{ trackId: track_id },
{ enabled: !!track_id }
)

const handleOpenOverflowMenu = useCallback(() => {
const overflowActions = [
!isUnlisted || isTrackOwner ? OverflowAction.SHARE : null,
Expand All @@ -300,7 +295,7 @@ const TrackListItemComponent = (props: TrackListItemComponentProps) => {
isLongFormContent
? OverflowAction.VIEW_EPISODE_PAGE
: OverflowAction.VIEW_TRACK_PAGE,
!showViewAlbum && albumInfo ? OverflowAction.VIEW_ALBUM_PAGE : null,
!showViewAlbum && album_backlink ? OverflowAction.VIEW_ALBUM_PAGE : null,
isLongFormContent
? playbackPositionInfo?.status === 'COMPLETED'
? OverflowAction.MARK_AS_UNPLAYED
Expand Down Expand Up @@ -329,7 +324,7 @@ const TrackListItemComponent = (props: TrackListItemComponentProps) => {
ddexApp,
isLongFormContent,
showViewAlbum,
albumInfo,
album_backlink,
playbackPositionInfo?.status,
isContextPlaylistOwner,
dispatch,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import type {
Track,
User
} from '@audius/common/models'
import { FeatureFlags, trpc } from '@audius/common/services'
import { FeatureFlags } from '@audius/common/services'
import type { CommonState } from '@audius/common/store'
import {
accountSelectors,
Expand Down Expand Up @@ -196,7 +196,8 @@ export const TrackScreenDetailsTile = ({
release_date: releaseDate,
is_scheduled_release: isScheduledRelease,
_is_publishing,
preview_cid
preview_cid,
album_backlink
} = track as Track

const isOwner = ownerId === currentUserId
Expand All @@ -211,10 +212,6 @@ export const TrackScreenDetailsTile = ({
(track as Track)?.is_downloadable ||
((track as Track)?._stems?.length ?? 0) > 0

const { data: albumInfo } = trpc.tracks.getAlbumBacklink.useQuery(
{ trackId },
{ enabled: !!trackId }
)
const { open: openCommentDrawer } = useCommentDrawer()

const isLongFormContent =
Expand Down Expand Up @@ -440,7 +437,7 @@ export const TrackScreenDetailsTile = ({
? OverflowAction.MARK_AS_UNPLAYED
: OverflowAction.MARK_AS_PLAYED
: null,
albumInfo ? OverflowAction.VIEW_ALBUM_PAGE : null,
album_backlink ? OverflowAction.VIEW_ALBUM_PAGE : null,
OverflowAction.VIEW_ARTIST_PAGE,
isOwner && !ddexApp ? OverflowAction.EDIT_TRACK : null,
isOwner && isScheduledRelease && isUnlisted
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ index.ts
models/Access.ts
models/AccessInfoResponse.ts
models/Activity.ts
models/AlbumBacklink.ts
models/AlbumsResponse.ts
models/AuthorizedApp.ts
models/AuthorizedApps.ts
Expand Down
Loading

0 comments on commit cce74dd

Please sign in to comment.