Merge pull request #81 from acid-info/audio-player
Add thumbnail and episode data to GlobalAudioPlayer
This commit is contained in:
commit
9abec91f69
|
@ -2,7 +2,7 @@
|
||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
reactStrictMode: true,
|
reactStrictMode: true,
|
||||||
images: {
|
images: {
|
||||||
domains: ['images.cdn.unbody.io'],
|
domains: ['images.cdn.unbody.io', 'image.simplecastcdn.com'],
|
||||||
// loader: 'imgix',
|
// loader: 'imgix',
|
||||||
// path: 'https://images.cdn.unbody.io',
|
// path: 'https://images.cdn.unbody.io',
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
import ReactPlayer from 'react-player'
|
import ReactPlayer from 'react-player'
|
||||||
import styled from '@emotion/styled'
|
import styled from '@emotion/styled'
|
||||||
import { useRef, useState } from 'react'
|
import { useMemo, useRef, useState } from 'react'
|
||||||
import { PlayIcon } from '../Icons/PlayIcon'
|
import { PlayIcon } from '../Icons/PlayIcon'
|
||||||
import { PauseIcon } from '../Icons/PauseIcon'
|
import { PauseIcon } from '../Icons/PauseIcon'
|
||||||
import { VolumeIcon } from '../Icons/VolumeIcon'
|
import { VolumeIcon } from '../Icons/VolumeIcon'
|
||||||
import styles from './GlobalAudioPlayer.module.css'
|
import styles from './GlobalAudioPlayer.module.css'
|
||||||
import { convertSecToMinAndSec } from '@/utils/string.utils'
|
import { convertSecToMinAndSec } from '@/utils/string.utils'
|
||||||
import { Typography } from '@acid-info/lsd-react'
|
import { Typography } from '@acid-info/lsd-react'
|
||||||
|
import { getAudioSourceFromEpisode } from '@/utils/data.utils'
|
||||||
|
import Image from 'next/image'
|
||||||
|
|
||||||
type StateProps = {
|
type StateProps = {
|
||||||
url: string | null
|
url: string | null
|
||||||
|
@ -25,13 +27,48 @@ type StateProps = {
|
||||||
seeking: boolean
|
seeking: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
const TEMP_URL =
|
// Hasing it out episodes: https://api.simplecast.com/podcasts/b54c0885-7c72-415d-b032-7d294b78d785/episodes?preview=true
|
||||||
'https://cdn.simplecast.com/audio/b54c0885-7c72-415d-b032-7d294b78d785/episodes/30d4e2f5-4434-419c-8fc1-a76e4b367e20/audio/3c8eb229-3f34-45a4-84f1-ce1d6bd65922/default_tc.mp3'
|
const TEMP_EPISODE_ID = '30d4e2f5-4434-419c-8fc1-a76e4b367e20'
|
||||||
|
|
||||||
export default function GlobalAudioPlayer() {
|
type Props = {
|
||||||
|
episodeId: string
|
||||||
|
}
|
||||||
|
|
||||||
|
type EpisodeProps = {
|
||||||
|
title: string
|
||||||
|
podcast: string
|
||||||
|
url: string
|
||||||
|
thumbnail: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function GlobalAudioPlayer({ episodeId }: Props) {
|
||||||
const ref = useRef<ReactPlayer>(null)
|
const ref = useRef<ReactPlayer>(null)
|
||||||
|
const [episode, setEpisode] = useState<EpisodeProps>({
|
||||||
|
title: '',
|
||||||
|
podcast: '',
|
||||||
|
url: '',
|
||||||
|
thumbnail: '',
|
||||||
|
})
|
||||||
|
|
||||||
|
useMemo(() => {
|
||||||
|
const getAudioSource = async () => {
|
||||||
|
const response = await getAudioSourceFromEpisode(
|
||||||
|
episodeId || TEMP_EPISODE_ID,
|
||||||
|
)
|
||||||
|
|
||||||
|
setEpisode({
|
||||||
|
title: response.title,
|
||||||
|
podcast: response.podcast.title,
|
||||||
|
url: response.ad_free_audio_file_url,
|
||||||
|
thumbnail: response.image_url,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
getAudioSource()
|
||||||
|
}, [episodeId])
|
||||||
|
|
||||||
const [state, setState] = useState<StateProps>({
|
const [state, setState] = useState<StateProps>({
|
||||||
url: TEMP_URL,
|
url: episode.url,
|
||||||
pip: false,
|
pip: false,
|
||||||
playing: false,
|
playing: false,
|
||||||
playedSeconds: 0,
|
playedSeconds: 0,
|
||||||
|
@ -46,6 +83,7 @@ export default function GlobalAudioPlayer() {
|
||||||
loop: false,
|
loop: false,
|
||||||
seeking: false,
|
seeking: false,
|
||||||
})
|
})
|
||||||
|
|
||||||
const [showVolume, setShowVolume] = useState(false)
|
const [showVolume, setShowVolume] = useState(false)
|
||||||
|
|
||||||
// const handleLoad = (url: string) => {
|
// const handleLoad = (url: string) => {
|
||||||
|
@ -171,7 +209,7 @@ export default function GlobalAudioPlayer() {
|
||||||
<ReactPlayer
|
<ReactPlayer
|
||||||
ref={ref}
|
ref={ref}
|
||||||
style={{ display: 'none' }}
|
style={{ display: 'none' }}
|
||||||
url={state.url ?? TEMP_URL}
|
url={episode.url}
|
||||||
width="100%"
|
width="100%"
|
||||||
height="100%"
|
height="100%"
|
||||||
pip={state.pip}
|
pip={state.pip}
|
||||||
|
@ -194,7 +232,19 @@ export default function GlobalAudioPlayer() {
|
||||||
onDuration={handleDuration}
|
onDuration={handleDuration}
|
||||||
onProgress={handleProgress}
|
onProgress={handleProgress}
|
||||||
/>
|
/>
|
||||||
<RightMenu></RightMenu>
|
|
||||||
|
<RightMenu>
|
||||||
|
<Image
|
||||||
|
src={episode.thumbnail}
|
||||||
|
alt={episode.thumbnail}
|
||||||
|
width={86}
|
||||||
|
height={48}
|
||||||
|
/>
|
||||||
|
<EpisodeData>
|
||||||
|
<Typography variant="body2">{episode.title}</Typography>
|
||||||
|
<Typography variant="body3">{episode.podcast}</Typography>
|
||||||
|
</EpisodeData>
|
||||||
|
</RightMenu>
|
||||||
</Container>
|
</Container>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -246,7 +296,12 @@ const AudioPlayer = styled.div`
|
||||||
`
|
`
|
||||||
|
|
||||||
const RightMenu = styled.div`
|
const RightMenu = styled.div`
|
||||||
|
display: flex;
|
||||||
width: 40%;
|
width: 40%;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-end;
|
||||||
|
margin-left: 32px;
|
||||||
|
gap: 16px;
|
||||||
`
|
`
|
||||||
|
|
||||||
const PlayPause = styled.button`
|
const PlayPause = styled.button`
|
||||||
|
@ -271,3 +326,9 @@ const TimeContainer = styled(Row)`
|
||||||
const Time = styled(Typography)`
|
const Time = styled(Typography)`
|
||||||
width: 32px;
|
width: 32px;
|
||||||
`
|
`
|
||||||
|
|
||||||
|
const EpisodeData = styled.div`
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 4px;
|
||||||
|
`
|
||||||
|
|
|
@ -25,7 +25,7 @@ export const shuffle = (array: any[]) => {
|
||||||
|
|
||||||
export const unique = (arr: any[]) => Array.from(new Set(arr))
|
export const unique = (arr: any[]) => Array.from(new Set(arr))
|
||||||
|
|
||||||
export const getAudioSourceFromSimplecastPlayer = async (url: string) => {
|
export const getAudioSourceFromEpisode = async (episodId: string) => {
|
||||||
const myHeaders = new Headers()
|
const myHeaders = new Headers()
|
||||||
myHeaders.append(
|
myHeaders.append(
|
||||||
'Authorization',
|
'Authorization',
|
||||||
|
@ -38,11 +38,10 @@ export const getAudioSourceFromSimplecastPlayer = async (url: string) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await fetch(
|
const result = await fetch(
|
||||||
`https://api.simplecast.com/episodes/${url}`,
|
`https://api.simplecast.com/episodes/${episodId}`,
|
||||||
requestOptions,
|
requestOptions,
|
||||||
)
|
)
|
||||||
|
|
||||||
const data = await result.json()
|
const data = await result.json()
|
||||||
console.log(data)
|
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue