mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-01-15 23:59:08 +00:00
50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import type { Api } from "@jellyfin/sdk";
|
|
import { getMediaInfoApi } from "@jellyfin/sdk/lib/utils/api";
|
|
|
|
/**
|
|
* Retrieves the playback URL for the given item ID and user ID.
|
|
*
|
|
* @param api - The Jellyfin API instance.
|
|
* @param itemId - The ID of the media item to retrieve playback URL for.
|
|
* @param userId - The ID of the user requesting the playback URL.
|
|
* @returns The playback URL as a string.
|
|
*/
|
|
export const getPlaybackUrl = async (
|
|
api: Api,
|
|
itemId: string,
|
|
userId: string,
|
|
): Promise<string> => {
|
|
const playbackData = await getMediaInfoApi(api).getPlaybackInfo({
|
|
itemId,
|
|
userId,
|
|
});
|
|
|
|
const mediaSources = playbackData.data?.MediaSources;
|
|
if (!mediaSources || mediaSources.length === 0) {
|
|
throw new Error(
|
|
"No media sources available for the requested item and user.",
|
|
);
|
|
}
|
|
|
|
const mediaSource = mediaSources[0];
|
|
const transcodeUrl = mediaSource.TranscodingUrl;
|
|
if (transcodeUrl) {
|
|
return transcodeUrl;
|
|
}
|
|
|
|
// Construct a fallback URL if the TranscodingUrl is not available
|
|
const { Id, ETag } = mediaSource;
|
|
if (!Id) {
|
|
throw new Error("Media source ID is missing.");
|
|
}
|
|
|
|
const queryParams = new URLSearchParams({
|
|
deviceId: api.deviceInfo?.id || "",
|
|
api_key: api.accessToken || "",
|
|
Tag: ETag || "",
|
|
MediaSourceId: Id || "",
|
|
});
|
|
|
|
return `/Videos/${Id}/stream?${queryParams}`;
|
|
};
|