reporting playback to jellyfin server for lastfm scrobbling

This commit is contained in:
Violet Caulfield
2024-12-29 07:01:10 -06:00
parent a64c8f3918
commit 5093a67f2c
9 changed files with 84 additions and 13 deletions

View File

@@ -3,9 +3,11 @@ import { JellifyTrack } from "../types/JellifyTrack";
import { storage } from "../constants/storage";
import { MMKVStorageKeys } from "../enums/mmkv-storage-keys";
import { findPlayQueueIndexStart } from "./helpers";
import { add, reset, setupPlayer } from "react-native-track-player/lib/src/trackPlayer";
import { add, reset, play as rntpPlay, pause as rntpPause, skipToNext, skipToPrevious, setupPlayer, getActiveTrack } from "react-native-track-player/lib/src/trackPlayer";
import _ from "lodash";
import { buildNewQueue } from "./helpers/queue";
import { useApiClientContext } from "../components/jellyfin-api-provider";
import { getPlaystateApi } from "@jellyfin/sdk/lib/utils/api";
interface PlayerContext {
showPlayer: boolean;
@@ -13,6 +15,8 @@ interface PlayerContext {
showMiniplayer: boolean;
setShowMiniplayer: React.Dispatch<SetStateAction<boolean>>;
queue: JellifyTrack[];
play: () => Promise<void>,
pause: () => Promise<void>,
resetQueue: (hideMiniplayer : boolean | undefined) => Promise<void>;
addToQueue: (tracks: JellifyTrack[]) => Promise<void>;
setPlayerState: React.Dispatch<SetStateAction<null>>;
@@ -21,10 +25,15 @@ interface PlayerContext {
const PlayerContextInitializer = () => {
const queueJson = storage.getString(MMKVStorageKeys.PlayQueue);
const { apiClient, sessionId } = useApiClientContext();
const playStateApi = getPlaystateApi(apiClient!)
//#region State
const [showPlayer, setShowPlayer] = useState<boolean>(false);
const [showMiniplayer, setShowMiniplayer] = useState<boolean>(false);
const [queue, setQueue] = useState<JellifyTrack[]>(queueJson ? JSON.parse(queueJson) : []);
//#endregion State
//#region RNTP Setup
setupPlayer().then(() => console.debug("Player setup successfully"));
@@ -32,6 +41,31 @@ const PlayerContextInitializer = () => {
const [playerState, setPlayerState] = useState(null);
//#endregion RNTP Setup
//#region Functions
const play = async () => {
rntpPlay();
const activeTrack = await getActiveTrack() as JellifyTrack;
playStateApi.reportPlaybackStart({
playbackStartInfo: {
SessionId: sessionId,
ItemId: activeTrack.ItemId
}
})
}
const pause = async () => {
rntpPause();
const activeTrack = await getActiveTrack() as JellifyTrack;
playStateApi.reportPlaybackStopped({
playbackStopInfo: {
SessionId: sessionId,
ItemId: activeTrack.ItemId
}
})
}
const resetQueue = async (hideMiniplayer: boolean | undefined) => {
console.debug("Clearing queue")
await reset();
@@ -50,6 +84,7 @@ const PlayerContextInitializer = () => {
setShowMiniplayer(true);
}
//#endregion Functions
return {
showPlayer,
@@ -57,6 +92,8 @@ const PlayerContextInitializer = () => {
showMiniplayer,
setShowMiniplayer,
queue,
play,
pause,
addToQueue,
resetQueue,
setPlayerState,
@@ -69,6 +106,8 @@ export const PlayerContext = createContext<PlayerContext>({
showMiniplayer: false,
setShowMiniplayer: () => {},
queue: [],
play: async () => {},
pause: async () => {},
resetQueue: async () => {},
addToQueue: async ([]) => {},
setPlayerState: () => {},
@@ -81,6 +120,8 @@ export const PlayerProvider: ({ children }: { children: ReactNode }) => React.JS
showMiniplayer,
setShowMiniplayer,
queue,
play,
pause,
resetQueue,
addToQueue,
setPlayerState,
@@ -92,6 +133,8 @@ export const PlayerProvider: ({ children }: { children: ReactNode }) => React.JS
showMiniplayer,
setShowMiniplayer,
queue,
play,
pause,
resetQueue,
addToQueue,
setPlayerState,