feat: persist the queue in the localStorage

This commit is contained in:
Deluan
2020-03-31 14:27:39 -04:00
parent 083a11a563
commit 7fec503b72
6 changed files with 25 additions and 24 deletions
+3 -3
View File
@@ -1,7 +1,7 @@
import React from 'react' import React from 'react'
import { Card, CardContent, CardMedia, Typography } from '@material-ui/core' import { Card, CardContent, CardMedia, Typography } from '@material-ui/core'
import { useTranslate } from 'react-admin' import { useTranslate } from 'react-admin'
import { subsonicUrl } from '../subsonic' import subsonic from '../subsonic'
import { DurationField, formatRange } from '../common' import { DurationField, formatRange } from '../common'
const AlbumDetails = ({ classes, record }) => { const AlbumDetails = ({ classes, record }) => {
@@ -21,8 +21,8 @@ const AlbumDetails = ({ classes, record }) => {
return ( return (
<Card className={classes.container}> <Card className={classes.container}>
<CardMedia <CardMedia
image={subsonicUrl('getCoverArt', record.coverArtId || 'not_found', { image={subsonic.url('getCoverArt', record.coverArtId || 'not_found', {
size: 500 size: 300
})} })}
className={classes.albumCover} className={classes.albumCover}
/> />
+2 -2
View File
@@ -12,12 +12,12 @@ import withWidth from '@material-ui/core/withWidth'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import { linkToRecord } from 'ra-core' import { linkToRecord } from 'ra-core'
import { Loading } from 'react-admin' import { Loading } from 'react-admin'
import { subsonicUrl } from '../subsonic'
import AllInclusiveIcon from '@material-ui/icons/AllInclusive' import AllInclusiveIcon from '@material-ui/icons/AllInclusive'
import ShuffleIcon from '@material-ui/icons/Shuffle' import ShuffleIcon from '@material-ui/icons/Shuffle'
import StarIcon from '@material-ui/icons/Star' import StarIcon from '@material-ui/icons/Star'
import LibraryAddIcon from '@material-ui/icons/LibraryAdd' import LibraryAddIcon from '@material-ui/icons/LibraryAdd'
import VideoLibraryIcon from '@material-ui/icons/VideoLibrary' import VideoLibraryIcon from '@material-ui/icons/VideoLibrary'
import subsonic from '../subsonic'
import { import {
ALBUM_LIST_ALL, ALBUM_LIST_ALL,
ALBUM_LIST_NEWEST, ALBUM_LIST_NEWEST,
@@ -104,7 +104,7 @@ const LoadedAlbumGrid = ({ ids, data, basePath, width }) => {
to={linkToRecord(basePath, data[id].id, 'show')} to={linkToRecord(basePath, data[id].id, 'show')}
> >
<img <img
src={subsonicUrl( src={subsonic.url(
'getCoverArt', 'getCoverArt',
data[id].coverArtId || 'not_found', data[id].coverArtId || 'not_found',
{ size: 300 } { size: 300 }
+6 -10
View File
@@ -1,14 +1,10 @@
import React from 'react' import React from 'react'
import { useDispatch, useSelector } from 'react-redux' import { useDispatch, useSelector } from 'react-redux'
import { import { useAuthState, useDataProvider, useTranslate } from 'react-admin'
fetchUtils,
useAuthState,
useDataProvider,
useTranslate
} from 'react-admin'
import ReactJkMusicPlayer from 'react-jinke-music-player' import ReactJkMusicPlayer from 'react-jinke-music-player'
import 'react-jinke-music-player/assets/index.css' import 'react-jinke-music-player/assets/index.css'
import { scrobble, syncQueue } from './queue' import subsonic from '../subsonic'
import { scrobbled, syncQueue } from './queue'
const Player = () => { const Player = () => {
const translate = useTranslate() const translate = useTranslate()
@@ -64,14 +60,14 @@ const Player = () => {
} }
const item = queue.queue.find((item) => item.id === info.id) const item = queue.queue.find((item) => item.id === info.id)
if (item && !item.scrobbled) { if (item && !item.scrobbled) {
dispatch(scrobble(info.id)) dispatch(scrobbled(info.id))
fetchUtils.fetchJson(info.scrobble(true)) subsonic.scrobble(info.id, true)
} }
} }
const OnAudioPlay = (info) => { const OnAudioPlay = (info) => {
if (info.duration) { if (info.duration) {
fetchUtils.fetchJson(info.scrobble(false)) subsonic.scrobble(info.id, false)
dataProvider.getOne('keepalive', { id: info.id }) dataProvider.getOne('keepalive', { id: info.id })
} }
} }
+5 -6
View File
@@ -1,5 +1,5 @@
import 'react-jinke-music-player/assets/index.css' import 'react-jinke-music-player/assets/index.css'
import { subsonicUrl } from '../subsonic' import subsonic from '../subsonic'
const PLAYER_ADD_TRACK = 'PLAYER_ADD_TRACK' const PLAYER_ADD_TRACK = 'PLAYER_ADD_TRACK'
const PLAYER_SET_TRACK = 'PLAYER_SET_TRACK' const PLAYER_SET_TRACK = 'PLAYER_SET_TRACK'
@@ -11,9 +11,8 @@ const mapToAudioLists = (item) => ({
id: item.id, id: item.id,
name: item.title, name: item.title,
singer: item.artist, singer: item.artist,
cover: subsonicUrl('getCoverArt', item.id, { size: 300 }), cover: subsonic.url('getCoverArt', item.id, { size: 300 }),
musicSrc: subsonicUrl('stream', item.id, { ts: true }), musicSrc: subsonic.url('stream', item.id, { ts: true })
scrobble: (submit) => subsonicUrl('scrobble', item.id, { submission: submit })
}) })
const addTrack = (data) => ({ const addTrack = (data) => ({
@@ -37,7 +36,7 @@ const syncQueue = (data) => ({
data data
}) })
const scrobble = (id) => ({ const scrobbled = (id) => ({
type: PLAYER_SCROBBLE, type: PLAYER_SCROBBLE,
data: id data: id
}) })
@@ -82,4 +81,4 @@ const playQueueReducer = (
} }
} }
export { addTrack, setTrack, playAlbum, syncQueue, scrobble, playQueueReducer } export { addTrack, setTrack, playAlbum, syncQueue, scrobbled, playQueueReducer }
+1 -1
View File
@@ -47,7 +47,7 @@ export default ({
const state = store.getState() const state = store.getState()
saveState({ saveState({
theme: state.theme, theme: state.theme,
// queue: state.queue, TODO: Need to make queue serializable (remove functions from it) queue: state.queue,
albumView: state.albumView albumView: state.albumView
}) })
}), }),
+8 -2
View File
@@ -1,4 +1,6 @@
const subsonicUrl = (command, id, options) => { import { fetchUtils } from 'react-admin'
const url = (command, id, options) => {
const params = new URLSearchParams() const params = new URLSearchParams()
params.append('u', localStorage.getItem('username')) params.append('u', localStorage.getItem('username'))
params.append('t', localStorage.getItem('subsonic-token')) params.append('t', localStorage.getItem('subsonic-token'))
@@ -19,4 +21,8 @@ const subsonicUrl = (command, id, options) => {
return `rest/${command}?${params.toString()}` return `rest/${command}?${params.toString()}`
} }
export { subsonicUrl } const scrobble = (id, submit) => {
return fetchUtils.fetchJson(url('scrobble', id, { submission: submit }))
}
export default { url, scrobble }