diff --git a/packages/common/src/models/Track.ts b/packages/common/src/models/Track.ts index 2c23f6f820..a3dc40914a 100644 --- a/packages/common/src/models/Track.ts +++ b/packages/common/src/models/Track.ts @@ -94,8 +94,17 @@ export type TrackMetadata = { // Added fields dateListened?: string duration: number + + offline?: OfflineTrackMetadata } & Timestamped +// This is available on mobile for offline tracks +export type OfflineTrackMetadata = { + downloaded_from_collection: string[] + download_completed_time: EpochTimeStamp + last_verified_time: EpochTimeStamp +} + export type Stem = { track_id: ID category: StemCategory diff --git a/packages/mobile/src/components/audio/Audio.tsx b/packages/mobile/src/components/audio/Audio.tsx index ccab748c7f..2a0ab35d3b 100644 --- a/packages/mobile/src/components/audio/Audio.tsx +++ b/packages/mobile/src/components/audio/Audio.tsx @@ -18,6 +18,7 @@ import type { OnProgressData } from 'react-native-video' import Video from 'react-native-video' import { useDispatch, useSelector } from 'react-redux' +import { useOfflineTrackUri } from 'app/hooks/useOfflineTrack' import { audiusBackendInstance } from 'app/services/audius-backend-instance' import { useChromecast } from './GoogleCast' @@ -330,6 +331,7 @@ export const Audio = () => { progressInvalidator ] ) + const offlineTrackUri = useOfflineTrackUri(track) if (!track || track.is_delete) return null @@ -344,15 +346,22 @@ export const Audio = () => { gateways }) + let source + if (offlineTrackUri) { + source = { uri: offlineTrackUri } + } else if (m3u8) { + source = { + uri: m3u8, + type: 'm3u8' + } + } + return ( - {m3u8 && ( + {source && (