chore(release): automatic release v1.30.1

This commit is contained in:
homarr-releases[bot]
2025-07-25 19:17:13 +00:00
committed by GitHub
27 changed files with 457 additions and 437 deletions

View File

@@ -31,6 +31,7 @@ body:
label: Version
description: What version of Homarr are you running?
options:
- 1.30.0
- 1.29.0
- 1.28.1
- 1.28.0

View File

@@ -50,12 +50,12 @@
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@homarr/widgets": "workspace:^0.1.0",
"@mantine/colors-generator": "^8.1.3",
"@mantine/core": "^8.1.3",
"@mantine/dropzone": "^8.1.3",
"@mantine/hooks": "^8.1.3",
"@mantine/modals": "^8.1.3",
"@mantine/tiptap": "^8.1.3",
"@mantine/colors-generator": "^8.2.1",
"@mantine/core": "^8.2.1",
"@mantine/dropzone": "^8.2.1",
"@mantine/hooks": "^8.2.1",
"@mantine/modals": "^8.2.1",
"@mantine/tiptap": "^8.2.1",
"@million/lint": "1.0.14",
"@tabler/icons-react": "^3.34.1",
"@tanstack/react-query": "^5.83.0",
@@ -71,12 +71,12 @@
"chroma-js": "^3.1.2",
"clsx": "^2.1.1",
"dayjs": "^1.11.13",
"dotenv": "^17.2.0",
"dotenv": "^17.2.1",
"flag-icons": "^7.5.0",
"glob": "^11.0.3",
"jotai": "^2.12.5",
"mantine-react-table": "2.0.0-beta.9",
"next": "15.4.2",
"next": "15.4.4",
"postcss-preset-mantine": "^1.18.0",
"prismjs": "^1.30.0",
"react": "19.1.0",

View File

@@ -35,7 +35,7 @@
"@homarr/validation": "workspace:^0.1.0",
"@homarr/widgets": "workspace:^0.1.0",
"dayjs": "^1.11.13",
"dotenv": "^17.2.0",
"dotenv": "^17.2.1",
"fastify": "^5.4.0",
"superjson": "2.2.2",
"undici": "7.12.0"

View File

@@ -25,7 +25,7 @@
"@homarr/log": "workspace:^",
"@homarr/redis": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"dotenv": "^17.2.0",
"dotenv": "^17.2.1",
"tsx": "4.20.3",
"ws": "^8.18.3"
},

View File

@@ -38,7 +38,7 @@
"@semantic-release/github": "^11.0.3",
"@semantic-release/npm": "^12.0.2",
"@semantic-release/release-notes-generator": "^14.0.3",
"@testcontainers/redis": "^11.3.1",
"@testcontainers/redis": "^11.4.0",
"@turbo/gen": "^2.5.5",
"@vitejs/plugin-react": "^4.7.0",
"@vitest/coverage-v8": "^3.2.4",
@@ -48,7 +48,7 @@
"jsdom": "^26.1.0",
"prettier": "^3.6.2",
"semantic-release": "^24.2.7",
"testcontainers": "^11.3.1",
"testcontainers": "^11.4.0",
"turbo": "^2.5.5",
"typescript": "^5.8.3",
"vite-tsconfig-paths": "^5.1.4",

View File

@@ -46,7 +46,7 @@
"@trpc/server": "^11.4.3",
"@trpc/tanstack-react-query": "^11.4.3",
"lodash.clonedeep": "^4.5.0",
"next": "15.4.2",
"next": "15.4.4",
"react": "19.1.0",
"react-dom": "19.1.0",
"superjson": "2.2.2",

View File

@@ -34,8 +34,8 @@
"@homarr/validation": "workspace:^0.1.0",
"bcrypt": "^6.0.0",
"cookies": "^0.9.1",
"ldapts": "8.0.6",
"next": "15.4.2",
"ldapts": "8.0.8",
"next": "15.4.4",
"next-auth": "5.0.0-beta.29",
"react": "19.1.0",
"react-dom": "19.1.0",

View File

@@ -28,7 +28,7 @@
"@homarr/common": "workspace:^0.1.0",
"@homarr/db": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"dotenv": "^17.2.0"
"dotenv": "^17.2.1"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",

View File

@@ -31,7 +31,7 @@
"@homarr/log": "workspace:^0.1.0",
"@paralleldrive/cuid2": "^2.2.2",
"dayjs": "^1.11.13",
"next": "15.4.2",
"next": "15.4.4",
"react": "19.1.0",
"react-dom": "19.1.0",
"undici": "7.12.0",

View File

@@ -44,11 +44,11 @@
"@homarr/definitions": "workspace:^0.1.0",
"@homarr/log": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@mantine/core": "^8.1.3",
"@mantine/core": "^8.2.1",
"@paralleldrive/cuid2": "^2.2.2",
"@testcontainers/mysql": "^11.3.1",
"@testcontainers/mysql": "^11.4.0",
"better-sqlite3": "^12.2.0",
"dotenv": "^17.2.0",
"dotenv": "^17.2.1",
"drizzle-kit": "^0.31.4",
"drizzle-orm": "^0.44.3",
"drizzle-zod": "^0.7.1",

View File

@@ -26,7 +26,7 @@
"@homarr/common": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/form": "^8.1.3",
"@mantine/form": "^8.2.1",
"zod": "^3.25.76"
},
"devDependencies": {

View File

@@ -29,7 +29,7 @@
"@homarr/notifications": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.1.3",
"@mantine/core": "^8.2.1",
"react": "19.1.0",
"zod": "^3.25.76"
},

View File

@@ -25,7 +25,7 @@
},
"prettier": "@homarr/prettier-config",
"dependencies": {
"@ctrl/deluge": "^7.1.0",
"@ctrl/deluge": "^7.1.1",
"@ctrl/qbittorrent": "^9.6.0",
"@ctrl/transmission": "^7.2.0",
"@gitbeaker/rest": "^43.3.0",

View File

@@ -79,24 +79,29 @@ export class PlexIntegration extends Integration implements IMediaServerIntegrat
},
});
const data = await recentlyAddedSchema.parseAsync(await response.json());
const json = await response.json();
const data = await recentlyAddedSchema.parseAsync(json);
const imageProxy = new ImageProxy();
const images =
data.MediaContainer.Metadata?.flatMap((item) => [
{
mediaKey: item.key,
type: "poster",
url: item.Image.find((image) => image?.type === "coverPoster")?.url,
},
{
mediaKey: item.key,
type: "backdrop",
url: item.Image.find((image) => image?.type === "background")?.url,
},
]).filter(
(image): image is { mediaKey: string; type: "poster" | "backdrop"; url: string } => image.url !== undefined,
) ?? [];
data.MediaContainer.Metadata?.filter((item) => item.Image)
.flatMap((item) => [
{
mediaKey: item.key,
type: "poster",
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
url: item.Image!.find((image) => image?.type === "coverPoster")?.url,
},
{
mediaKey: item.key,
type: "backdrop",
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
url: item.Image!.find((image) => image?.type === "background")?.url,
},
])
.filter(
(image): image is { mediaKey: string; type: "poster" | "backdrop"; url: string } => image.url !== undefined,
) ?? [];
const proxiedImages = await Promise.all(
images.map(async (image) => {
@@ -117,11 +122,11 @@ export class PlexIntegration extends Integration implements IMediaServerIntegrat
}),
);
return (
data.MediaContainer.Metadata?.map((item) => {
const media =
data.MediaContainer.Metadata?.filter((item) => item.Image).map((item) => {
return {
id: item.Media.at(0)?.id.toString() ?? item.key,
type: item.type === "movie" ? "movie" : item.type === "tv" ? "tv" : "unknown",
id: item.Media?.at(0)?.id.toString() ?? item.key,
type: mapType(item.type),
title: item.title,
subtitle: item.tagline,
description: item.summary,
@@ -134,14 +139,15 @@ export class PlexIntegration extends Integration implements IMediaServerIntegrat
},
producer: item.studio,
rating: item.rating?.toFixed(1),
tags: item.Genre.map((genre) => genre.tag),
tags: item.Genre?.map((genre) => genre.tag) ?? [],
href: super
.url(`/web/index.html#!/server/${machineIdentifier}/details?key=${encodeURIComponent(item.key)}`)
.toString(),
length: item.duration ? Math.round(item.duration / 1000) : undefined,
};
}) ?? []
);
}) ?? [];
return media;
}
private async getMachineIdentifierAsync(): Promise<string> {
@@ -210,7 +216,7 @@ const recentlyAddedSchema = z.object({
z.object({
key: z.string(),
studio: z.string().optional(),
type: z.string(), // For example "movie"
type: z.string(), // For example "movie", "album"
title: z.string(),
summary: z.string().optional(),
duration: z.number().optional(),
@@ -218,24 +224,30 @@ const recentlyAddedSchema = z.object({
rating: z.number().optional(),
tagline: z.string().optional(),
originallyAvailableAt: z.string().optional(),
Media: z.array(
z.object({
id: z.number(),
}),
),
Image: z.array(
z
.object({
type: z.string(), // for example "coverPoster" or "background"
url: z.string(),
})
.optional(),
),
Genre: z.array(
z.object({
tag: z.string(),
}),
),
Media: z
.array(
z.object({
id: z.number(),
}),
)
.optional(),
Image: z
.array(
z
.object({
type: z.string(), // for example "coverPoster" or "background"
url: z.string(),
})
.optional(),
)
.optional(),
Genre: z
.array(
z.object({
tag: z.string(),
}),
)
.optional(),
}),
)
.optional(),
@@ -248,3 +260,14 @@ const identitySchema = z.object({
machineIdentifier: z.string(),
}),
});
const mapType = (type: string): "movie" | "tv" | "unknown" => {
switch (type) {
case "movie":
return "movie";
case "tv":
return "tv";
default:
return "unknown";
}
};

View File

@@ -33,10 +33,10 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.1.3",
"@mantine/core": "^8.2.1",
"@tabler/icons-react": "^3.34.1",
"dayjs": "^1.11.13",
"next": "15.4.2",
"next": "15.4.4",
"react": "19.1.0",
"react-dom": "19.1.0",
"zod": "^3.25.76"

View File

@@ -24,8 +24,8 @@
"dependencies": {
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.1.3",
"@mantine/hooks": "^8.1.3",
"@mantine/core": "^8.2.1",
"@mantine/hooks": "^8.2.1",
"react": "19.1.0"
},
"devDependencies": {

View File

@@ -24,7 +24,7 @@
"prettier": "@homarr/prettier-config",
"dependencies": {
"@homarr/ui": "workspace:^0.1.0",
"@mantine/notifications": "^8.1.3",
"@mantine/notifications": "^8.2.1",
"@tabler/icons-react": "^3.34.1"
},
"devDependencies": {

View File

@@ -37,10 +37,10 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.1.3",
"@mantine/hooks": "^8.1.3",
"@mantine/core": "^8.2.1",
"@mantine/hooks": "^8.2.1",
"adm-zip": "0.5.16",
"next": "15.4.2",
"next": "15.4.4",
"react": "19.1.0",
"react-dom": "19.1.0",
"superjson": "2.2.2",

View File

@@ -26,8 +26,8 @@
"@homarr/api": "workspace:^0.1.0",
"@homarr/db": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@mantine/dates": "^8.1.3",
"next": "15.4.2",
"@mantine/dates": "^8.2.1",
"next": "15.4.4",
"react": "19.1.0",
"react-dom": "19.1.0"
},

View File

@@ -33,12 +33,12 @@
"@homarr/settings": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.1.3",
"@mantine/hooks": "^8.1.3",
"@mantine/spotlight": "^8.1.3",
"@mantine/core": "^8.2.1",
"@mantine/hooks": "^8.2.1",
"@mantine/spotlight": "^8.2.1",
"@tabler/icons-react": "^3.34.1",
"jotai": "^2.12.5",
"next": "15.4.2",
"next": "15.4.4",
"react": "19.1.0",
"react-dom": "19.1.0",
"use-deep-compare-effect": "^1.8.1"

View File

@@ -32,7 +32,7 @@
"dayjs": "^1.11.13",
"deepmerge": "4.3.1",
"mantine-react-table": "2.0.0-beta.9",
"next": "15.4.2",
"next": "15.4.4",
"next-intl": "4.3.4",
"react": "19.1.0",
"react-dom": "19.1.0"

View File

@@ -30,12 +30,12 @@
"@homarr/log": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.1.3",
"@mantine/dates": "^8.1.3",
"@mantine/hooks": "^8.1.3",
"@mantine/core": "^8.2.1",
"@mantine/dates": "^8.2.1",
"@mantine/hooks": "^8.2.1",
"@tabler/icons-react": "^3.34.1",
"mantine-react-table": "2.0.0-beta.9",
"next": "15.4.2",
"next": "15.4.4",
"react": "19.1.0",
"react-dom": "19.1.0",
"svgson": "^5.3.1"

View File

@@ -48,9 +48,9 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/charts": "^8.1.3",
"@mantine/core": "^8.1.3",
"@mantine/hooks": "^8.1.3",
"@mantine/charts": "^8.2.1",
"@mantine/core": "^8.2.1",
"@mantine/hooks": "^8.2.1",
"@tabler/icons-react": "^3.34.1",
"@tiptap/extension-color": "2.26.1",
"@tiptap/extension-highlight": "2.26.1",
@@ -71,7 +71,7 @@
"clsx": "^2.1.1",
"dayjs": "^1.11.13",
"mantine-react-table": "2.0.0-beta.9",
"next": "15.4.2",
"next": "15.4.4",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-markdown": "^10.1.0",

View File

@@ -53,6 +53,7 @@ export const CalendarEventList = ({ events }: CalendarEventListProps) => {
pos={"absolute"}
bottom={-6}
left={"50%"}
w={"inherit"}
className={classes.badge}
>{`S${event.mediaInformation.seasonNumber} / E${event.mediaInformation.episodeNumber}`}</Badge>
)}
@@ -78,9 +79,11 @@ export const CalendarEventList = ({ events }: CalendarEventListProps) => {
</Text>
</Group>
) : (
<Group gap={3} wrap="nowrap">
<Group gap={3} wrap="nowrap" align={"center"}>
<IconClock opacity={0.7} size={"1rem"} />
<Text c={"dimmed"}>{dayjs(event.date).format("HH:mm")}</Text>
<Text c={"dimmed"} size={"sm"}>
{dayjs(event.date).format("HH:mm")}
</Text>
</Group>
)}
</Group>

683
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -17,14 +17,14 @@
},
"prettier": "@homarr/prettier-config",
"dependencies": {
"@next/eslint-plugin-next": "15.4.2",
"@next/eslint-plugin-next": "15.4.4",
"eslint-config-prettier": "^10.1.8",
"eslint-config-turbo": "^2.5.5",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0",
"typescript-eslint": "^8.37.0"
"typescript-eslint": "^8.38.0"
},
"devDependencies": {
"@homarr/prettier-config": "workspace:^0.1.0",