Skip to content
Snippets Groups Projects
player.js 4.96 KiB
Newer Older
onny's avatar
onny committed
/*
 * @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'
onny's avatar
onny committed
import { Player } from './../services/Player'
const player = new Player()
onny's avatar
onny committed
const requesttoken = axios.defaults.headers.requesttoken

export default {
	state: {
		isPlaying: false,
		isBuffering: false,
		isMute: false,
		isPaused: false,
		volume: 0.5,
		oldVolume: 0,
		title: '',
onny's avatar
onny committed
		image: '',
		episodeId: null,
		duration: 0,
		seek: 0,
onny's avatar
onny committed
	},
	getters: {
onny's avatar
onny committed
		getTitle: state => {
onny's avatar
onny committed
			return state.title
		},
onny's avatar
onny committed
		getImage: state => {
onny's avatar
onny committed
			return state.image
		},
onny's avatar
onny committed
		getSeek: state => {
			return state.seek
		},
		getDuration: state => {
			return state.duration
		},
		getVolume: state => {
			return state.volume
		},
onny's avatar
onny committed
		isPlaying: state => (id) => {
onny's avatar
onny committed
			return state.isPlaying
		},
		isBuffering: state => (id) => {
			return state.isBuffering
		},
		isPaused: state => (id) => {
			return (state.episodeId === id && state.isPaused)
onny's avatar
onny committed
		},
onny's avatar
onny committed
		episodePlaying: state => (id) => {
			return (state.episodeId === id && state.isPlaying)
		},
onny's avatar
onny committed
	},
	mutations: {
onny's avatar
onny committed
		setVolume(state, volume) {
			console.log(volume)
onny's avatar
onny committed
		},
		toggleMute(state) {
onny's avatar
onny committed
			if (state.isMute) {
				state.volume = state.oldVolume
				state.isMute = false
onny's avatar
onny committed
			} else {
onny's avatar
onny committed
				state.oldVolume = state.volume
				state.volume = 0
				state.isMute = true
			player.setVolume(state.volume)
onny's avatar
onny committed
		},
		setTitle(state, title) {
onny's avatar
onny committed
			state.title = title
onny's avatar
onny committed
		},
		setDuration(state, duration) {
			duration = Math.round(duration)
			state.duration = duration
		},
		setSeek(state, seek) {
			seek = Math.round(seek)
			state.seek = seek
		},
onny's avatar
onny committed
		saveVolume(state, volumeState) {
onny's avatar
onny committed
			axios.defaults.headers.requesttoken = requesttoken
			axios.post(generateUrl('/apps/podcast/settings/volumeState'), {
				volumeState,
			})
		},
onny's avatar
onny committed
		loadVolume(state) {
onny's avatar
onny committed
			axios.defaults.headers.requesttoken = requesttoken
			axios
				.get(generateUrl('/apps/podcast/settings/volumeState'))
				.then(async response => {
					const {
						data: { volumeState: value },
					} = response
onny's avatar
onny committed
					state.volume = value
		setPlaying(state, playerState) {
			state.isPlaying = playerState
		},
		setPausing(state, pauseState) {
			state.isPaused = pauseState
		},
onny's avatar
onny committed
		setBuffering(state, bufferingState) {
			state.isBuffering = bufferingState
		},
		setImage(state, image) {
			state.image = image
		},
		setEpisodeId(state, episodeId) {
			state.episodeId = episodeId
		},
onny's avatar
onny committed
	},
	actions: {
onny's avatar
onny committed
		setPlaying(context, playerState) {
			context.commit('setPlaying', playerState)
onny's avatar
onny committed
		setBuffering(context, bufferingState) {
			context.commit('setBuffering', bufferingState)
onny's avatar
onny committed
		setVolume(context, volume) {
onny's avatar
onny committed
			context.commit('setVolume', volume)
			player.setVolume(volume)
onny's avatar
onny committed
		},
		toggleMute(context) {
			context.commit('toggleMute')
		},
onny's avatar
onny committed
		saveVolume(context, volumeState) {
			context.commit('saveVolume', volumeState)
onny's avatar
onny committed
		loadVolume(context) {
			context.commit('loadVolume')
onny's avatar
onny committed
		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()
onny's avatar
onny committed
		},
onny's avatar
onny committed

onny's avatar
onny committed
		setSeek(context, startTime) {
onny's avatar
onny committed
			context.commit('setBuffering', true)
onny's avatar
onny committed
			context.commit('setSeek', startTime)
onny's avatar
onny committed
			player.seek(startTime)
		},
onny's avatar
onny committed

		togglePlay(context) {
			if (context.state.episodeId === null) {
				return true
			}
onny's avatar
onny committed
			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()
			}
		},

		setDuration(context, duration) {
			context.commit('setDuration', duration)
		},