diff --git a/frontend/vue/components/Admin/Backups/LastOutputModal.vue b/frontend/vue/components/Admin/Backups/LastOutputModal.vue index bcbb3009e..ca518b66c 100644 --- a/frontend/vue/components/Admin/Backups/LastOutputModal.vue +++ b/frontend/vue/components/Admin/Backups/LastOutputModal.vue @@ -6,15 +6,15 @@ diff --git a/frontend/vue/components/Common/NowPlaying.js b/frontend/vue/components/Common/NowPlaying.js new file mode 100644 index 000000000..539d3f2d9 --- /dev/null +++ b/frontend/vue/components/Common/NowPlaying.js @@ -0,0 +1,87 @@ +import NowPlaying from '~/components/Entity/NowPlaying'; +import {onMounted, shallowRef, watch} from "vue"; +import {set, useEventSource} from "@vueuse/core"; +import {useAxios} from "~/vendor/axios"; + +export const nowPlayingProps = { + nowPlayingUri: { + type: String, + required: true + }, + useSse: { + type: Boolean, + required: false, + default: false + }, + sseUri: { + type: String, + required: false, + default: null + }, + initialNowPlaying: { + type: Object, + default() { + return NowPlaying; + } + } +}; + +export default function useNowPlaying(props) { + const np = shallowRef(props.initialNowPlaying); + + const setNowPlaying = (np_new) => { + set(np, np_new); + + // Update the browser metadata for browsers that support it (i.e. Mobile Chrome) + if ('mediaSession' in navigator) { + navigator.mediaSession.metadata = new MediaMetadata({ + title: np_new.now_playing.song.title, + artist: np_new.now_playing.song.artist, + artwork: [ + {src: np_new.now_playing.song.art} + ] + }); + } + + document.dispatchEvent(new CustomEvent("now-playing", { + detail: np_new + })); + } + + if (props.useSse) { + const {data} = useEventSource(props.sseUri); + watch(data, (sse_data_raw) => { + const sse_data = JSON.parse(sse_data_raw); + const sse_np = sse_data?.pub?.data?.np || null; + + if (sse_np) { + setTimeout(() => { + setNowPlaying(sse_np); + }, 3000); + } + }); + } else { + const {axios} = useAxios(); + const checkNowPlaying = () => { + axios.get(props.nowPlayingUri, { + headers: { + 'Cache-Control': 'no-cache', + 'Pragma': 'no-cache', + 'Expires': '0', + } + }).then((response) => { + setNowPlaying(response.data); + + setTimeout(checkNowPlaying, (!document.hidden) ? 15000 : 30000); + }).catch(() => { + setTimeout(checkNowPlaying, (!document.hidden) ? 30000 : 120000); + }); + } + + onMounted(() => { + setTimeout(checkNowPlaying, 5000); + }); + } + + return np; +} diff --git a/frontend/vue/components/Common/NowPlaying.vue b/frontend/vue/components/Common/NowPlaying.vue deleted file mode 100644 index ef7ae0fb4..000000000 --- a/frontend/vue/components/Common/NowPlaying.vue +++ /dev/null @@ -1,97 +0,0 @@ - - diff --git a/frontend/vue/components/Common/PieChart.vue b/frontend/vue/components/Common/PieChart.vue index e365f3c95..664f04c0b 100644 --- a/frontend/vue/components/Common/PieChart.vue +++ b/frontend/vue/components/Common/PieChart.vue @@ -5,10 +5,9 @@ diff --git a/frontend/vue/components/Public/FullPlayer.vue b/frontend/vue/components/Public/FullPlayer.vue index 440205db2..aa7d996d7 100644 --- a/frontend/vue/components/Public/FullPlayer.vue +++ b/frontend/vue/components/Public/FullPlayer.vue @@ -13,15 +13,15 @@
- {{ langSongHistory }} + {{ $gettext('Song History') }} - {{ langRequestSong }} + {{ $gettext('Request Song') }} - {{ langDownloadPlaylist }} + {{ $gettext('Playlist') }}
@@ -33,54 +33,45 @@ - diff --git a/frontend/vue/components/Public/History.vue b/frontend/vue/components/Public/History.vue index 55a7f0ecb..d7209ab4c 100644 --- a/frontend/vue/components/Public/History.vue +++ b/frontend/vue/components/Public/History.vue @@ -1,32 +1,25 @@ - diff --git a/frontend/vue/components/Public/Player.vue b/frontend/vue/components/Public/Player.vue index e2a0fec56..82c471417 100644 --- a/frontend/vue/components/Public/Player.vue +++ b/frontend/vue/components/Public/Player.vue @@ -1,12 +1,12 @@ - diff --git a/frontend/vue/components/Stations/Reports/Overview/CommonMetricsView.vue b/frontend/vue/components/Stations/Reports/Overview/CommonMetricsView.vue index 9a1cbaccf..9b28e17e0 100644 --- a/frontend/vue/components/Stations/Reports/Overview/CommonMetricsView.vue +++ b/frontend/vue/components/Stations/Reports/Overview/CommonMetricsView.vue @@ -12,9 +12,9 @@ - - + + @@ -24,9 +24,9 @@ - - + + @@ -34,7 +34,7 @@ + :fields="fields" :responsive="false" :items="stats.all"> @@ -43,74 +43,76 @@ - diff --git a/frontend/vue/components/Stations/Reports/Overview/HourChart.vue b/frontend/vue/components/Stations/Reports/Overview/HourChart.vue index b9807afed..ec15fa58d 100644 --- a/frontend/vue/components/Stations/Reports/Overview/HourChart.vue +++ b/frontend/vue/components/Stations/Reports/Overview/HourChart.vue @@ -5,11 +5,10 @@ diff --git a/frontend/vue/components/Stations/Reports/Overview/ListeningTimeTab.vue b/frontend/vue/components/Stations/Reports/Overview/ListeningTimeTab.vue index b993279de..e26652a37 100644 --- a/frontend/vue/components/Stations/Reports/Overview/ListeningTimeTab.vue +++ b/frontend/vue/components/Stations/Reports/Overview/ListeningTimeTab.vue @@ -10,74 +10,82 @@ {{ $gettext('Listeners by Listening Time') }} - - + + + :fields="fields" :responsive="false" :items="stats.all"> -