/* * @copyright Copyright (c) 2021 Jonas Heinrich <onny@project-insanity.org> * * @author Jonas Heinrich <onny@project-insanity.org> * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ import axios from '@nextcloud/axios' import { generateUrl } from '@nextcloud/router' import { Player } from './../services/Player' const player = new Player() const requesttoken = axios.defaults.headers.requesttoken export default { state: { isPlaying: false, isBuffering: false, isMute: false, isPaused: false, volume: 0.5, oldVolume: 0, title: '', image: '', episodeId: null, }, getters: { episodeTitle: state => { return state.title }, episodeImage: state => { return state.image }, isPlaying: state => (id) => { return (state.episodeId === id && state.isPlaying) }, isPaused: state => (id) => { return (state.episodeId === id && state.isPaused) }, }, mutations: { changeVolume(state, volume) { state.volume = volume }, toggleMute(state) { if (state.isMute) { state.volume = state.oldVolume state.isMute = false } else { state.oldVolume = state.volume state.volume = 0 state.isMute = true } }, setTitle(state, title) { state.title = title }, setVolumeState(state, volumeState) { axios.defaults.headers.requesttoken = requesttoken axios.post(generateUrl('/apps/podcast/settings/volumeState'), { volumeState, }) }, getVolumeState(state) { axios.defaults.headers.requesttoken = requesttoken axios .get(generateUrl('/apps/podcast/settings/volumeState')) .then(async response => { const { data: { volumeState: value }, } = response state.volume = value }) }, setPlaying(state, playerState) { state.isPlaying = playerState }, setPausing(state, pauseState) { state.isPaused = pauseState }, setBuffering(state, bufferingState) { state.isBuffering = bufferingState }, setImage(state, image) { state.image = image }, setEpisodeId(state, episodeId) { state.episodeId = episodeId }, }, actions: { setPlaying(context, playerState) { context.commit('setPlaying', playerState) }, setBuffering(context, bufferingState) { context.commit('setBuffering', bufferingState) }, setVolume(context, volume) { context.commit('changeVolume', volume) }, toggleMute(context) { context.commit('toggleMute') }, setVolumeState(context, volumeState) { context.commit('setVolumeState', volumeState) }, getVolumeState(context) { context.commit('getVolumeState') }, playEpisode(context, episode) { if (context.state.isPaused && episode.id === context.state.episodeId) { context.commit('setPausing', false) context.commit('setBuffering', true) player.doResume() } else { context.commit('setBuffering', true) context.commit('setTitle', episode.title) context.commit('setImage', episode.imgURL) context.commit('setEpisodeId', episode.id) context.commit('setPausing', false) player.doPlay(episode.enclosure) } }, pauseEpisode(context) { context.commit('setBuffering', false) context.commit('setPlaying', false) context.commit('setPausing', true) player.doPause() }, seekEpisode(context, startTime) { context.commit('setBuffering', true) player.seek(startTime) }, togglePlay(context) { if (context.state.episodeId === null) { return true } if (context.state.isPaused) { context.commit('setPlaying', true) context.commit('setBuffering', true) context.commit('setPausing', false) player.doResume() } else { context.commit('setBuffering', false) context.commit('setPausing', true) context.commit('setPausing', true) player.doPause() } }, }, }