import Client from "../api/client"; import { JellifyTrack } from "../types/JellifyTrack"; import { getUserLibraryApi } from "@jellyfin/sdk/lib/utils/api"; import TrackPlayer, { Event, RatingType } from "react-native-track-player"; import { getActiveTrack } from "react-native-track-player/lib/src/trackPlayer"; /** * Jellify Playback Service. * * Sets up event listeners for remote control events and * runs for the duration of the app lifecycle */ export async function PlaybackService() { TrackPlayer.addEventListener(Event.RemotePlay, async () => { await TrackPlayer.play(); }); TrackPlayer.addEventListener(Event.RemotePause, async () => { await TrackPlayer.pause(); }); TrackPlayer.addEventListener(Event.RemoteNext, async () => { await TrackPlayer.skipToNext(); }); TrackPlayer.addEventListener(Event.RemotePrevious, async () => { await TrackPlayer.skipToPrevious(); }); TrackPlayer.addEventListener(Event.RemoteSeek, async (event) => { await TrackPlayer.seekTo(event.position); }); // TrackPlayer.addEventListener(Event.RemoteJumpForward, async (event) => { // await TrackPlayer.seekBy(event.interval) // }); // TrackPlayer.addEventListener(Event.RemoteJumpBackward, async (event) => { // await TrackPlayer.seekBy(-event.interval) // }); TrackPlayer.addEventListener(Event.RemoteLike, async () => { const progress = await TrackPlayer.getProgress(); const nowPlaying = await getActiveTrack() as JellifyTrack; await getUserLibraryApi(Client.api!) .markFavoriteItem({ itemId: nowPlaying.item.Id! }); await TrackPlayer.updateOptions({ likeOptions: { isActive: false, title: "Favorite" }, dislikeOptions: { isActive: true, title: "Unfavorite" } }); }); TrackPlayer.addEventListener(Event.RemoteDislike, async () => { const progress = await TrackPlayer.getProgress(); const nowPlaying = await getActiveTrack() as JellifyTrack; await getUserLibraryApi(Client.api!) .markFavoriteItem({ itemId: nowPlaying.item.Id! }); await TrackPlayer.updateNowPlayingMetadata({ elapsedTime: progress.position, rating: undefined }); await TrackPlayer.updateOptions({ likeOptions: { isActive: true, title: "Favorite" }, dislikeOptions: { isActive: false, title: "Unfavorite" } }); }); }