woooot, got streaming via the jellyfin api working!

This commit is contained in:
Chris Kruining 2025-05-28 13:16:54 +02:00
parent 826a30f95f
commit d96f89d4b3
No known key found for this signature in database
GPG key ID: EB894A3560CCCAD2
21 changed files with 282 additions and 169 deletions

View file

@ -57,6 +57,41 @@ export const listUsers = query(async () => {
return data ?? [];
}, "jellyfin.listUsers");
export const listItemIds = query(
async (): Promise<Record<string, { jellyfin: string }>> => {
"use server";
const { data, error } = await getClient().GET("/Items", {
params: {
query: {
hasImdbId: true,
recursive: true,
includeItemTypes: ["Movie", "Series"],
fields: [
"ProviderIds",
"Genres",
"DateLastMediaAdded",
"DateCreated",
"MediaSources",
],
},
},
});
if (data === undefined) {
return {};
}
return Object.fromEntries(
data.Items?.map((item) => ([
item.ProviderIds!["Tmdb"]!,
{ jellyfin: item.Id! },
])) ?? []
);
},
"jellyfin.listItemIds",
);
export const listItems = query(
async (userId: string): Promise<Entry[] | undefined> => {
"use server";
@ -189,28 +224,28 @@ export const getItem = query(
export const getItemStream = query(
async (userId: string, itemId: string): Promise<string | undefined> => {
async (itemId: string, range: string): Promise<Response> => {
"use server";
const item = await getItem(userId, itemId);
console.log(item);
if (item === undefined) {
return undefined;
}
const { data, error } = await getClient().GET("/Videos/{itemId}/stream", {
// I don't really know what is the big difference between mp4 and mkv.
// But mkv is able to use ranges an can report the video's length, whereas mp4 doesn't
const { response } = await getClient().GET("/Videos/{itemId}/stream", {
params: {
path: {
itemId: item.providers.jellyfin,
itemId,
},
query: {
static: true,
container: 'mkv',
},
},
parseAs: 'stream',
headers: {
Range: range
}
});
return data;
return response;
},
"jellyfin.getItemStream",
);
@ -267,7 +302,7 @@ export const getItemPlaybackInfo = query(
);
export const queryItems = query(async () => {
"use server";
"use server";
const { data, error } = await getClient().GET("/Items", {
params: {
@ -285,23 +320,6 @@ export const queryItems = query(async () => {
console.log(data);
}, "jellyfin.queryItems");
export const getItemIds = query(async () => {
"use server";
const { data, error } = await getClient().GET("/Items", {
params: {
query: {
mediaTypes: ["Video"],
fields: ["ProviderIds"],
includeItemTypes: ["Series", "Movie"],
recursive: true,
},
},
});
console.log(data);
}, "jellyfin.getItemIds");
export const getContinueWatching = query(
async (userId: string): Promise<Entry[]> => {
"use server";