Files
jellyfin-audio-player/src/utility/PlaybackService.ts

120 lines
4.4 KiB
TypeScript
Raw Normal View History

2020-06-16 21:41:02 +02:00
/**
* This is the code that will run tied to the player.
*
* The code here might keep running in the background.
*
* You should put everything here that should be tied to the playback but not the UI
* such as processing media buttons or analytics
*/
2023-04-27 15:08:10 +02:00
import TrackPlayer, { Event, State } from 'react-native-track-player';
import store from '@/store';
2023-04-27 15:08:10 +02:00
import { sendPlaybackEvent } from './JellyfinApi';
import { setRemainingSleepTime } from '@/store/settings/actions';
2020-06-16 21:41:02 +02:00
export default async function() {
TrackPlayer.addEventListener(Event.RemotePlay, () => {
2020-06-16 21:41:02 +02:00
TrackPlayer.play();
});
TrackPlayer.addEventListener(Event.RemotePause, () => {
2020-06-16 21:41:02 +02:00
TrackPlayer.pause();
});
TrackPlayer.addEventListener(Event.RemoteNext, () => {
2020-06-16 21:41:02 +02:00
TrackPlayer.skipToNext();
});
TrackPlayer.addEventListener(Event.RemotePrevious, () => {
2020-06-16 21:41:02 +02:00
TrackPlayer.skipToPrevious();
});
TrackPlayer.addEventListener(Event.RemoteStop, () => {
2022-11-12 16:22:39 +01:00
TrackPlayer.reset();
2020-06-16 21:41:02 +02:00
});
2020-06-17 15:28:21 +02:00
TrackPlayer.addEventListener(Event.RemoteSeek, (event) => {
2020-06-17 15:28:21 +02:00
TrackPlayer.seekTo(event.position);
});
2023-04-27 15:08:10 +02:00
TrackPlayer.addEventListener(Event.PlaybackTrackChanged, async (e) => {
2023-04-27 15:08:10 +02:00
// Retrieve the current settings from the Redux store
const settings = store.getState().settings;
// GUARD: Only report playback when the settings is enabled
if (settings.enablePlaybackReporting && 'track' in e) {
// GUARD: End the previous track if it's about to end
if ('nextTrack' in e && typeof e.track === 'number') {
2023-06-19 23:11:37 +02:00
sendPlaybackEvent('/Sessions/Playing/Stopped', settings.jellyfin, e.track);
}
2023-04-27 15:08:10 +02:00
sendPlaybackEvent('/Sessions/Playing', settings.jellyfin);
}
});
TrackPlayer.addEventListener(Event.PlaybackProgressUpdated, () => {
// Retrieve the current settings from the Redux store
const settings = store.getState().settings;
// GUARD: Only report playback when the settings is enabled
if (settings.enablePlaybackReporting) {
sendPlaybackEvent('/Sessions/Playing/Progress', settings.jellyfin);
}
// check if datetime is undefined, otherwise start timer
if (settings.dateTime === undefined) {
store.dispatch(setRemainingSleepTime(''));
} else {
const millisecondsDiff = settings.dateTime.valueOf() - new Date().valueOf();
const timeDiff = new Date(millisecondsDiff);
let interval = setInterval(() => {});
if (timeDiff.getTime() > 0) {
interval = setInterval(() => {
const settings = store.getState().settings;
if (settings.dateTime !== undefined) {
const millisecondsDiff = settings.dateTime.valueOf() - new Date().valueOf();
const timeDiff = new Date(millisecondsDiff);
if (timeDiff.getTime() > 0) {
let sec = Math.floor(timeDiff.getTime() / 1000);
let min = Math.floor(sec/60);
sec = sec%60;
const hours = Math.floor(min/60);
min = min%60;
const timer = `${hours.toString().length === 1 ? '0' + hours : hours}:${min.toString().length === 1 ? '0' + min : min}:${sec.toString().length === 1 ? '0' + sec : sec}`;
store.dispatch(setRemainingSleepTime(timer));
} else {
store.dispatch(setRemainingSleepTime(''));
TrackPlayer.pause();
clearInterval(interval);
}
} else {
clearInterval(interval);
}
}, 1000);
}
}
2023-04-27 15:08:10 +02:00
});
TrackPlayer.addEventListener(Event.PlaybackState, (event) => {
// Retrieve the current settings from the Redux store
const settings = store.getState().settings;
2023-06-18 22:04:43 +02:00
// GUARD: Only respond to stopped events
if (event.state === State.Stopped) {
2023-04-27 15:08:10 +02:00
// GUARD: Only report playback when the settings is enabled
if (settings.enablePlaybackReporting) {
sendPlaybackEvent('/Sessions/Playing/Stopped', settings.jellyfin);
}
}
});
2020-06-17 15:28:21 +02:00
2020-06-16 21:41:02 +02:00
}