Skip to content
Snippets Groups Projects
player.js 5.72 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/>.
 *
 */

onny's avatar
onny committed
import { Player } from './../services/Player'
onny's avatar
onny committed
import { FyydApi } from './../services/FyydApi'

onny's avatar
onny committed
const player = new Player()
onny's avatar
onny committed
const fyydClient = new FyydApi()
onny's avatar
onny committed

export default {
	state: {
		isPlaying: false,
		isBuffering: false,
		isMute: false,
		isPaused: false,
onny's avatar
onny committed
		volume: 0.5,
		oldVolume: null,
onny's avatar
onny committed
		title: '',
onny's avatar
onny committed
		image: '',
		episodeId: null,
		duration: null,
onny's avatar
onny committed
		seek: 0,
		lastplaytimeupdate: null,
onny's avatar
onny committed
		podcastName: '',
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
		getPodcastName: state => {
			return state.podcastName
		},
onny's avatar
onny committed
		getImage: state => {
onny's avatar
onny committed
			return state.image
		},
onny's avatar
onny committed
		getSeek: state => {
onny's avatar
onny committed
			if (state.seek) {
				return state.seek
			} else {
				return 0
			}
onny's avatar
onny committed
		},
		getDuration: state => {
			return state.duration
		},
		getVolume: state => {
onny's avatar
onny committed
			return state.volume
onny's avatar
onny committed
		},
		isPlaying: state => {
onny's avatar
onny committed
			return state.isPlaying
		},
		isBuffering: state => {
onny's avatar
onny committed
			return state.isBuffering
		},
		isPaused: state => (id) => {
			return (state.episodeId === id && state.isPaused)
onny's avatar
onny committed
		},
onny's avatar
onny committed
		episodeLoaded: state => (id) => {
			return (state.episodeId === id)
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) {
			state.volume = volume
onny's avatar
onny committed
			localStorage.setItem('podcast.volume', state.volume)
onny's avatar
onny committed
			player.volume(state.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
				if (state.volume === 0) {
					state.volume = 1
				} else {
					state.oldVolume = state.volume
					state.volume = 0
					state.isMute = true
				}
onny's avatar
onny committed
			localStorage.setItem('podcast.volume', state.volume)
onny's avatar
onny committed
			player.volume(state.volume)
onny's avatar
onny committed
		},
		setTitle(state, title) {
onny's avatar
onny committed
			state.title = title
		setDuration(state, duration) {
			duration = Math.round(duration)
			state.duration = duration
		},
		setSeek(state, seek) {
			seek = Math.round(seek)
onny's avatar
onny committed
			if (seek) {
				state.seek = seek
			}
		seekEpisode(state, seek) {
			player.seek(seek)
			seek = Math.round(seek)
			state.seek = seek
		},
		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
		setPodcastName(state, name) {
			state.podcastName = name
		},
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)
onny's avatar
onny committed
		loadVolume(context) {
			const volume = localStorage.getItem('podcast.volume')
			if (typeof volume === 'string') {
				context.commit('setVolume', volume)
			}
		},
onny's avatar
onny committed
		toggleMute(context) {
			context.commit('toggleMute')
		},
onny's avatar
onny committed
		loadEpisode(context, episode) {
			context.commit('setPodcastName', '')
			context.commit('setTitle', episode.title)
			if (episode.imgURL) {
				context.commit('setImage', episode.imgURL)
			} else {
				context.commit('setImage', episode.imgurl)
			}
			context.commit('setEpisodeId', episode.id)
			context.commit('setPausing', true)
			if (episode.podcast_id) {
				context.dispatch('setPodcastName', episode.podcast_id)
			} else {
				context.dispatch('setPodcastName', episode.podcastid)
			}
			context.commit('setDuration', episode.duration)
			if (episode.playtime) {
				context.commit('setSeek', episode.playtime)
			}
onny's avatar
onny committed
			player.load(episode.enclosure)
onny's avatar
onny committed
		},
onny's avatar
onny committed
		playEpisode(context, episode) {
			if (context.state.isPaused && episode.id === context.state.episodeId) {
onny's avatar
onny committed
				player.play()
onny's avatar
onny committed
			} else {
				context.dispatch('loadEpisode', episode)
				context.dispatch('addEpisode', episode)
onny's avatar
onny committed
				player.play()
			}
		},
		pauseEpisode(context) {
onny's avatar
onny committed
			player.pause()
onny's avatar
onny committed
		},
onny's avatar
onny committed

onny's avatar
onny committed
		setSeek(context, startTime) {
			context.commit('setSeek', startTime)
onny's avatar
onny committed
		},
onny's avatar
onny committed

		togglePlay(context) {
			if (context.state.episodeId === null) {
				return true
			}
onny's avatar
onny committed
			if (context.state.isPaused) {
onny's avatar
onny committed
				player.play()
onny's avatar
onny committed
			} else {
onny's avatar
onny committed
				player.pause()
onny's avatar
onny committed
			}
		},

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

		seekEpisode(context, startTime) {
			context.commit('seekEpisode', startTime)
		},
onny's avatar
onny committed
		setPausing(context, state) {
			context.commit('setPausing', state)
		},

		storePlaybacktime(context, position) {
			const episodeId = context.state.episodeId
			const episode = context.getters.episodeById(episodeId)
			const episodeLastPlayed = episode.lastplayed
			const dateNow = Date.now()
			if (dateNow - episodeLastPlayed >= 5000) {
				context.dispatch('updateEpisode', { episode, playtime: position })
			}
		},
onny's avatar
onny committed

		async setPodcastName(context, podcastId) {
			const podcast = await fyydClient.queryPodcast(podcastId)
			context.commit('setPodcastName', podcast.data.title)
		},