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

47 lines
1.5 KiB
TypeScript
Raw Normal View History

2020-06-21 10:30:41 +02:00
import { useTypedSelector } from 'store';
import { useCallback } from 'react';
import TrackPlayer, { Track } from 'react-native-track-player';
import { generateTrack } from './JellyfinApi';
2022-01-01 19:09:21 +01:00
import { EntityId } from '@reduxjs/toolkit';
import { shuffle as shuffleArray } from 'lodash';
2020-06-21 10:30:41 +02:00
/**
* Generate a callback function that starts playing a full album given its
* supplied id.
*/
2022-01-01 19:09:21 +01:00
export default function usePlayTracks() {
2020-06-21 10:30:41 +02:00
const credentials = useTypedSelector(state => state.settings.jellyfin);
const tracks = useTypedSelector(state => state.music.tracks.entities);
2022-01-01 19:09:21 +01:00
return useCallback(async function playTracks(
trackIds: EntityId[] | undefined,
play: boolean = true,
shuffle: boolean = false,
): Promise<Track[] | undefined> {
if (!trackIds) {
2020-06-21 10:30:41 +02:00
return;
}
2022-01-01 19:09:21 +01:00
// Convert all trackIds to the relevant format for react-native-track-player
const newTracks = trackIds.map((trackId) => {
2020-06-21 10:30:41 +02:00
const track = tracks[trackId];
2022-01-01 19:09:21 +01:00
2020-06-21 10:30:41 +02:00
if (!trackId || !track) {
return;
}
return generateTrack(track, credentials);
}).filter((t): t is Track => typeof t !== 'undefined');
// Clear the queue and add all tracks
await TrackPlayer.reset();
2022-01-01 19:09:21 +01:00
await TrackPlayer.add(shuffle ? shuffleArray(newTracks) : newTracks);
// Play the queue
if (play) {
await TrackPlayer.play();
}
return newTracks;
2022-01-01 19:09:21 +01:00
}, [credentials, tracks]);
2020-06-21 10:30:41 +02:00
}