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 label: Version
description: What version of Homarr are you running? description: What version of Homarr are you running?
options: options:
- 1.30.0
- 1.29.0 - 1.29.0
- 1.28.1 - 1.28.1
- 1.28.0 - 1.28.0

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -44,11 +44,11 @@
"@homarr/definitions": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0",
"@homarr/log": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0",
"@homarr/server-settings": "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", "@paralleldrive/cuid2": "^2.2.2",
"@testcontainers/mysql": "^11.3.1", "@testcontainers/mysql": "^11.4.0",
"better-sqlite3": "^12.2.0", "better-sqlite3": "^12.2.0",
"dotenv": "^17.2.0", "dotenv": "^17.2.1",
"drizzle-kit": "^0.31.4", "drizzle-kit": "^0.31.4",
"drizzle-orm": "^0.44.3", "drizzle-orm": "^0.44.3",
"drizzle-zod": "^0.7.1", "drizzle-zod": "^0.7.1",

View File

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

View File

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

View File

@@ -25,7 +25,7 @@
}, },
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@ctrl/deluge": "^7.1.0", "@ctrl/deluge": "^7.1.1",
"@ctrl/qbittorrent": "^9.6.0", "@ctrl/qbittorrent": "^9.6.0",
"@ctrl/transmission": "^7.2.0", "@ctrl/transmission": "^7.2.0",
"@gitbeaker/rest": "^43.3.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 imageProxy = new ImageProxy();
const images = const images =
data.MediaContainer.Metadata?.flatMap((item) => [ data.MediaContainer.Metadata?.filter((item) => item.Image)
{ .flatMap((item) => [
mediaKey: item.key, {
type: "poster", mediaKey: item.key,
url: item.Image.find((image) => image?.type === "coverPoster")?.url, 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", {
url: item.Image.find((image) => image?.type === "background")?.url, mediaKey: item.key,
}, type: "backdrop",
]).filter( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
(image): image is { mediaKey: string; type: "poster" | "backdrop"; url: string } => image.url !== undefined, 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( const proxiedImages = await Promise.all(
images.map(async (image) => { images.map(async (image) => {
@@ -117,11 +122,11 @@ export class PlexIntegration extends Integration implements IMediaServerIntegrat
}), }),
); );
return ( const media =
data.MediaContainer.Metadata?.map((item) => { data.MediaContainer.Metadata?.filter((item) => item.Image).map((item) => {
return { return {
id: item.Media.at(0)?.id.toString() ?? item.key, id: item.Media?.at(0)?.id.toString() ?? item.key,
type: item.type === "movie" ? "movie" : item.type === "tv" ? "tv" : "unknown", type: mapType(item.type),
title: item.title, title: item.title,
subtitle: item.tagline, subtitle: item.tagline,
description: item.summary, description: item.summary,
@@ -134,14 +139,15 @@ export class PlexIntegration extends Integration implements IMediaServerIntegrat
}, },
producer: item.studio, producer: item.studio,
rating: item.rating?.toFixed(1), rating: item.rating?.toFixed(1),
tags: item.Genre.map((genre) => genre.tag), tags: item.Genre?.map((genre) => genre.tag) ?? [],
href: super href: super
.url(`/web/index.html#!/server/${machineIdentifier}/details?key=${encodeURIComponent(item.key)}`) .url(`/web/index.html#!/server/${machineIdentifier}/details?key=${encodeURIComponent(item.key)}`)
.toString(), .toString(),
length: item.duration ? Math.round(item.duration / 1000) : undefined, length: item.duration ? Math.round(item.duration / 1000) : undefined,
}; };
}) ?? [] }) ?? [];
);
return media;
} }
private async getMachineIdentifierAsync(): Promise<string> { private async getMachineIdentifierAsync(): Promise<string> {
@@ -210,7 +216,7 @@ const recentlyAddedSchema = z.object({
z.object({ z.object({
key: z.string(), key: z.string(),
studio: z.string().optional(), studio: z.string().optional(),
type: z.string(), // For example "movie" type: z.string(), // For example "movie", "album"
title: z.string(), title: z.string(),
summary: z.string().optional(), summary: z.string().optional(),
duration: z.number().optional(), duration: z.number().optional(),
@@ -218,24 +224,30 @@ const recentlyAddedSchema = z.object({
rating: z.number().optional(), rating: z.number().optional(),
tagline: z.string().optional(), tagline: z.string().optional(),
originallyAvailableAt: z.string().optional(), originallyAvailableAt: z.string().optional(),
Media: z.array( Media: z
z.object({ .array(
id: z.number(), z.object({
}), id: z.number(),
), }),
Image: z.array( )
z .optional(),
.object({ Image: z
type: z.string(), // for example "coverPoster" or "background" .array(
url: z.string(), z
}) .object({
.optional(), type: z.string(), // for example "coverPoster" or "background"
), url: z.string(),
Genre: z.array( })
z.object({ .optional(),
tag: z.string(), )
}), .optional(),
), Genre: z
.array(
z.object({
tag: z.string(),
}),
)
.optional(),
}), }),
) )
.optional(), .optional(),
@@ -248,3 +260,14 @@ const identitySchema = z.object({
machineIdentifier: z.string(), 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/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "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", "@tabler/icons-react": "^3.34.1",
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"next": "15.4.2", "next": "15.4.4",
"react": "19.1.0", "react": "19.1.0",
"react-dom": "19.1.0", "react-dom": "19.1.0",
"zod": "^3.25.76" "zod": "^3.25.76"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -53,6 +53,7 @@ export const CalendarEventList = ({ events }: CalendarEventListProps) => {
pos={"absolute"} pos={"absolute"}
bottom={-6} bottom={-6}
left={"50%"} left={"50%"}
w={"inherit"}
className={classes.badge} className={classes.badge}
>{`S${event.mediaInformation.seasonNumber} / E${event.mediaInformation.episodeNumber}`}</Badge> >{`S${event.mediaInformation.seasonNumber} / E${event.mediaInformation.episodeNumber}`}</Badge>
)} )}
@@ -78,9 +79,11 @@ export const CalendarEventList = ({ events }: CalendarEventListProps) => {
</Text> </Text>
</Group> </Group>
) : ( ) : (
<Group gap={3} wrap="nowrap"> <Group gap={3} wrap="nowrap" align={"center"}>
<IconClock opacity={0.7} size={"1rem"} /> <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>
)} )}
</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", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@next/eslint-plugin-next": "15.4.2", "@next/eslint-plugin-next": "15.4.4",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-config-turbo": "^2.5.5", "eslint-config-turbo": "^2.5.5",
"eslint-plugin-import": "^2.32.0", "eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5", "eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^5.2.0",
"typescript-eslint": "^8.37.0" "typescript-eslint": "^8.38.0"
}, },
"devDependencies": { "devDependencies": {
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",