diff --git a/model/mediafile.go b/model/mediafile.go index 675629dac..35dcbbd02 100644 --- a/model/mediafile.go +++ b/model/mediafile.go @@ -14,7 +14,7 @@ type MediaFile struct { Album string `json:"album"` ArtistID string `json:"artistId" orm:"pk;column(artist_id)"` Artist string `json:"artist"` - AlbumArtistID string `json:"albumArtistId"` + AlbumArtistID string `json:"albumArtistId" orm:"pk;column(album_artist_id)"` AlbumArtist string `json:"albumArtist"` AlbumID string `json:"albumId" orm:"pk;column(album_id)"` HasCoverArt bool `json:"hasCoverArt"` diff --git a/ui/src/audioplayer/Player.js b/ui/src/audioplayer/Player.js index bd3edf762..53d38dcf7 100644 --- a/ui/src/audioplayer/Player.js +++ b/ui/src/audioplayer/Player.js @@ -1,18 +1,37 @@ import React from 'react' import { useDispatch, useSelector } from 'react-redux' +import { Link } from 'react-router-dom' import { useAuthState, useDataProvider, useTranslate } from 'react-admin' import ReactJkMusicPlayer from 'react-jinke-music-player' import 'react-jinke-music-player/assets/index.css' import subsonic from '../subsonic' import { scrobble, syncQueue } from './queue' import themes from '../themes' +import { makeStyles } from '@material-ui/core/styles' + +const useStyle = makeStyles((theme) => ({ + audioTitle: { + textDecoration: 'none', + color: theme.palette.primary.light, + }, +})) const Player = () => { + const classes = useStyle() const translate = useTranslate() const currentTheme = useSelector((state) => state.theme) const theme = themes[currentTheme] || themes.DarkTheme const playerTheme = (theme.player && theme.player.theme) || 'dark' + const audioTitle = (audioInfo) => ( + + {`${audioInfo.name} - ${audioInfo.singer}`} + + ) + const defaultOptions = { theme: playerTheme, bounds: 'body', @@ -48,6 +67,7 @@ const Player = () => { destroyText: translate('player.destroyText'), downloadText: translate('player.downloadText'), removeAudioListsText: translate('player.removeAudioListsText'), + audioTitle: audioTitle, clickToDeleteText: (name) => translate('player.clickToDeleteText', { name }), emptyLyricText: translate('player.emptyLyricText'), diff --git a/ui/src/audioplayer/queue.js b/ui/src/audioplayer/queue.js index 809f1b7eb..e5f3d74dd 100644 --- a/ui/src/audioplayer/queue.js +++ b/ui/src/audioplayer/queue.js @@ -14,6 +14,8 @@ const mapToAudioLists = (item) => { trackId: id, name: item.title, singer: item.artist, + albumId: item.albumId, + artistId: item.albumArtistId, duration: item.duration, cover: subsonic.url('getCoverArt', id, { size: 300 }), musicSrc: subsonic.url('stream', id, { ts: true }), diff --git a/ui/src/common/ArtistLinkField.js b/ui/src/common/ArtistLinkField.js index 5f9d4e81e..ab950a169 100644 --- a/ui/src/common/ArtistLinkField.js +++ b/ui/src/common/ArtistLinkField.js @@ -26,12 +26,12 @@ const ArtistLinkField = ({ record, className, width }) => { } ArtistLinkField.propTypes = { + record: PropTypes.object, + width: PropTypes.number, className: PropTypes.string, - source: PropTypes.string, } ArtistLinkField.defaultProps = { - source: 'artistId', addLabel: true, }