Add Internet Radio support (#2063)

* add internet radio support

* Add dynamic sidebar icon to Radios

* Fix typos

* Make URL suffix consistent

* Fix typo

* address feedback

* Don't need to preload when playing Internet Radios

* Reorder migration, or else it won't be applied

* Make Radio list view responsive

Also added filter by name, removed RadioActions and RadioContextMenu, and added a default radio icon, in case of favicon is not available.

* Simplify StreamField usage

* fix button, hide progress on mobile

* use js styles over index.css

Co-authored-by: Deluan <deluan@navidrome.org>
This commit is contained in:
Kendall Garner
2023-01-15 20:11:37 +00:00
committed by GitHub
parent aa21a2a305
commit 8877b1695a
34 changed files with 1304 additions and 9 deletions
+8 -1
View File
@@ -18,7 +18,14 @@ const AudioTitle = React.memo(({ audioInfo, isMobile }) => {
const qi = { suffix: song.suffix, bitRate: song.bitRate }
return (
<Link to={`/album/${song.albumId}/show`} className={className}>
<Link
to={
audioInfo.isRadio
? `/radio/${audioInfo.trackId}/show`
: `/album/${song.albumId}/show`
}
className={className}
>
<span>
<span className={clsx(classes.songTitle, 'songTitle')}>
{song.title}
+13 -2
View File
@@ -41,7 +41,9 @@ const Player = () => {
)
const { authenticated } = useAuthState()
const visible = authenticated && playerState.queue.length > 0
const isRadio = playerState.current?.isRadio || false
const classes = useStyle({
isRadio,
visible,
enableCoverAnimation: config.enableCoverAnimation,
})
@@ -88,8 +90,11 @@ const Player = () => {
playIndex: playerState.playIndex,
autoPlay: playerState.clear || playerState.playIndex === 0,
clearPriorAudioLists: playerState.clear,
extendsContent: <PlayerToolbar id={current.trackId} />,
extendsContent: (
<PlayerToolbar id={current.trackId} isRadio={current.isRadio} />
),
defaultVolume: isMobilePlayer ? 1 : playerState.volume,
showMediaSession: !current.isRadio,
}
}, [playerState, defaultOptions, isMobilePlayer])
@@ -116,6 +121,10 @@ const Player = () => {
return
}
if (info.isRadio) {
return
}
if (!preloaded) {
const next = nextSong()
if (next != null) {
@@ -149,7 +158,9 @@ const Player = () => {
if (info.duration) {
const song = info.song
document.title = `${song.title} - ${song.artist} - Navidrome`
subsonic.nowPlaying(info.trackId)
if (!info.isRadio) {
subsonic.nowPlaying(info.trackId)
}
setPreload(false)
if (config.gaTrackingId) {
ReactGA.event({
+2 -1
View File
@@ -29,6 +29,7 @@ const Toolbar = ({ id }) => {
)
}
const PlayerToolbar = ({ id }) => (id ? <Toolbar id={id} /> : <Placeholder />)
const PlayerToolbar = ({ id, isRadio }) =>
id && !isRadio ? <Toolbar id={id} /> : <Placeholder />
export default PlayerToolbar
+11
View File
@@ -78,6 +78,17 @@ const useStyle = makeStyles(
{
display: 'none',
},
'& .music-player-panel .panel-content .progress-bar-content section.audio-main':
{
display: (props) => {
return props.isRadio ? 'none' : 'inline-flex'
},
},
'& .react-jinke-music-player-mobile-progress': {
display: (props) => {
return props.isRadio ? 'none' : 'flex'
},
},
},
}),
{ name: 'NDAudioPlayer' }