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';
|
2023-07-21 15:54:57 +03:00
|
|
|
import store, { useTypedSelector } from '@/store';
|
2023-04-27 15:08:10 +02:00
|
|
|
import { sendPlaybackEvent } from './JellyfinApi';
|
2023-07-21 15:54:57 +03:00
|
|
|
import { useDispatch } from 'react-redux';
|
|
|
|
|
import { setSleepTime } from '@/store/settings/actions';
|
|
|
|
|
import internal from 'stream';
|
2020-06-16 21:41:02 +02:00
|
|
|
|
|
|
|
|
export default async function() {
|
2023-07-21 15:54:57 +03:00
|
|
|
let interval = setInterval(() => {}, 0);
|
|
|
|
|
|
2021-12-31 15:04:37 +01:00
|
|
|
TrackPlayer.addEventListener(Event.RemotePlay, () => {
|
2020-06-16 21:41:02 +02:00
|
|
|
TrackPlayer.play();
|
|
|
|
|
});
|
|
|
|
|
|
2021-12-31 15:04:37 +01:00
|
|
|
TrackPlayer.addEventListener(Event.RemotePause, () => {
|
2020-06-16 21:41:02 +02:00
|
|
|
TrackPlayer.pause();
|
|
|
|
|
});
|
|
|
|
|
|
2021-12-31 15:04:37 +01:00
|
|
|
TrackPlayer.addEventListener(Event.RemoteNext, () => {
|
2020-06-16 21:41:02 +02:00
|
|
|
TrackPlayer.skipToNext();
|
|
|
|
|
});
|
|
|
|
|
|
2021-12-31 15:04:37 +01:00
|
|
|
TrackPlayer.addEventListener(Event.RemotePrevious, () => {
|
2020-06-16 21:41:02 +02:00
|
|
|
TrackPlayer.skipToPrevious();
|
|
|
|
|
});
|
|
|
|
|
|
2021-12-31 15:04:37 +01:00
|
|
|
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
|
|
|
|
2021-12-31 15:04:37 +01: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
|
|
|
|
2023-06-18 22:04:20 +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
|
2023-06-18 22:04:20 +02:00
|
|
|
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-06-18 22:04:20 +02:00
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
2023-07-21 15:54:57 +03:00
|
|
|
|
|
|
|
|
// regularly check if sleeper is enabled, then disable the timer
|
|
|
|
|
if (!settings.enabledSleeper) {
|
|
|
|
|
clearInterval(interval);
|
|
|
|
|
}
|
2023-04-27 15:08:10 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
TrackPlayer.addEventListener(Event.PlaybackState, (event) => {
|
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
|
|
|
// 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/Stopped', settings.jellyfin);
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-07-21 15:54:57 +03:00
|
|
|
|
|
|
|
|
// Handle is playback state is playing
|
|
|
|
|
if (event.state === State.Playing) {
|
|
|
|
|
const settings = store.getState().settings;
|
|
|
|
|
|
|
|
|
|
// Start timer is sleeper is enabled
|
|
|
|
|
if (settings.enabledSleeper) {
|
|
|
|
|
let time = settings.sleepTime;
|
|
|
|
|
interval = setInterval(() => {
|
|
|
|
|
if (time > 0) {
|
|
|
|
|
time -= 1;
|
|
|
|
|
} else {
|
|
|
|
|
TrackPlayer.pause();
|
|
|
|
|
clearInterval(interval);
|
|
|
|
|
}
|
|
|
|
|
}, 1000);
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-04-27 15:08:10 +02:00
|
|
|
});
|
2020-06-17 15:28:21 +02:00
|
|
|
|
2020-06-16 21:41:02 +02:00
|
|
|
}
|