From f33fc838cf59625ec183ebe8e51f55fb50d9f079 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 24 Jul 2026 21:17:32 +0000 Subject: [PATCH 01/16] docs(helm): update chart installation page --- apps/docs/docs/getting-started/installation/helm.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/docs/docs/getting-started/installation/helm.md b/apps/docs/docs/getting-started/installation/helm.md index d768ec69a..0d897ffa9 100644 --- a/apps/docs/docs/getting-started/installation/helm.md +++ b/apps/docs/docs/getting-started/installation/helm.md @@ -2,9 +2,9 @@ homarr logo -![Version: 8.23.0](https://img.shields.io/badge/Version-8.23.0-informational?style=flat) +![Version: 8.24.0](https://img.shields.io/badge/Version-8.24.0-informational?style=flat) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat) -![AppVersion: v1.71.0](https://img.shields.io/badge/AppVersion-v1.71.0-informational?style=flat) +![AppVersion: v1.72.0](https://img.shields.io/badge/AppVersion-v1.72.0-informational?style=flat) A Helm chart to deploy homarr for Kubernetes @@ -429,7 +429,7 @@ All available values are listed on the [artifacthub](https://artifacthub.io/pack | httproute.rules[0].matches[0].path.value | string | `"/"` | Path value to match | | image.pullPolicy | string | `"IfNotPresent"` | Image pull policy | | image.repository | string | `"ghcr.io/homarr-labs/homarr"` | Image repository | -| image.tag | string | `"v1.71.0"` | Overrides the image tag whose default is the chart appVersion | +| image.tag | string | `"v1.72.0"` | Overrides the image tag whose default is the chart appVersion | | imagePullSecrets | list | `[]` | Secrets for Docker registry | | ingress.annotations | object | `{}` | Ingress annotations | | ingress.enabled | bool | `false` | Enable ingress | From 4ef7641cb2a30bb1999bddcc1ee8407c52bc4489 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sat, 25 Jul 2026 02:43:47 +0000 Subject: [PATCH 02/16] chore(deps): update pnpm to v11.15.1 (#6466) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- deployments/prebuilt-debian/package.json | 4 ++-- package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deployments/prebuilt-debian/package.json b/deployments/prebuilt-debian/package.json index 2b2aab63c..f6914c52e 100644 --- a/deployments/prebuilt-debian/package.json +++ b/deployments/prebuilt-debian/package.json @@ -6,7 +6,7 @@ }, "engines": { "node": ">=24.18.0", - "pnpm": ">=11.15.0" + "pnpm": ">=11.15.1" }, - "packageManager": "pnpm@11.15.0" + "packageManager": "pnpm@11.15.1" } diff --git a/package.json b/package.json index 245acb533..7bf83f0d9 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ }, "engines": { "node": ">=24.18.0", - "pnpm": ">=11.15.0" + "pnpm": ">=11.15.1" }, - "packageManager": "pnpm@11.15.0" + "packageManager": "pnpm@11.15.1" } From e66979bab688aa48f363c1ba7d85d7d8b2dc54bb Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 28 Jul 2026 14:49:51 +0200 Subject: [PATCH 03/16] feat(auth): link credentials users with OIDC (#6445) --- .../docs/advanced/single-sign-on/index.mdx | 3 + packages/auth/adapter.ts | 28 +++++- packages/auth/configuration.ts | 2 +- packages/auth/env.ts | 1 + packages/auth/events.ts | 4 +- packages/auth/providers/oidc/oidc-provider.ts | 5 +- .../auth/providers/oidc/verified-email.ts | 11 +++ .../auth/providers/test/oidc-provider.spec.ts | 87 ++++++++++++++++++ packages/auth/test/adapter.spec.ts | 90 ++++++++++++++++++- packages/auth/test/events.spec.ts | 46 ++++++++-- 10 files changed, 262 insertions(+), 15 deletions(-) create mode 100644 packages/auth/providers/oidc/verified-email.ts create mode 100644 packages/auth/providers/test/oidc-provider.spec.ts diff --git a/apps/docs/docs/advanced/single-sign-on/index.mdx b/apps/docs/docs/advanced/single-sign-on/index.mdx index b4865ec88..ae1d9ca31 100644 --- a/apps/docs/docs/advanced/single-sign-on/index.mdx +++ b/apps/docs/docs/advanced/single-sign-on/index.mdx @@ -127,6 +127,8 @@ Homarr supports multiple authentication options, from internal userbase (credent If you'd rather manage group memberships for OIDC users locally (instead of via the IdP), set `AUTH_OIDC_GROUPS_LOCAL_MANAGEMENT=true`. While enabled, Homarr stops syncing OIDC users' group memberships from the groups claim, and admins can add/remove OIDC users on a group's members page. If you turn this back to `false`, the next login of each user resumes the regular sync and reconciles their groups with the IdP's claim again, which may remove memberships that were added manually while local management was enabled. + To let an existing credentials user also sign in with OIDC, set `AUTH_OIDC_ENABLE_DANGEROUS_CREDENTIALS_LINKING=true`. On the first OIDC sign-in, Homarr links a credentials user with the same email address instead of creating a second user. The user keeps their password login, local username and profile, groups, permissions, boards, settings, and API keys. OIDC profile and group claims do not overwrite the credentials-owned data. Homarr requires the OIDC profile to contain `email_verified: true` while this option is enabled. Only enable this when your OIDC provider verifies email addresses, because a matching email could otherwise be used to take over an existing account. +
Example Setup @@ -204,6 +206,7 @@ Homarr supports multiple authentication options, from internal userbase (credent | ``AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE`` | Overwrite name attribute. By default it will use preferred_username if it does not contain a `@` and otherwise name. | --- | | ``AUTH_OIDC_FORCE_USERINFO`` | Force userinfo endpoint to be used for user information. | false | | ``AUTH_OIDC_ENABLE_DANGEROUS_ACCOUNT_LINKING`` | Enable account linking for OIDC provider. This will link the OIDC accounts by email. Be sure that you have verified emails to prevent stealing accounts. | false | + | ``AUTH_OIDC_ENABLE_DANGEROUS_CREDENTIALS_LINKING`` | Link an OIDC identity to an existing credentials user with the same email. The credentials login and existing user data are preserved. Requires the OIDC profile to contain `email_verified: true`. | false | | ``AUTH_OIDC_TOKEN_ENDPOINT_AUTH_METHOD`` | Override method for the token endpoint authentication. Supported values are `client_secret_basic`, `client_secret_post`, `client_secret_jwt` and `none`. | client_secret_basic | ### Permission System diff --git a/packages/auth/adapter.ts b/packages/auth/adapter.ts index 30984a403..e120d3220 100644 --- a/packages/auth/adapter.ts +++ b/packages/auth/adapter.ts @@ -6,20 +6,24 @@ import { and, eq } from "@homarr/db"; import { accounts, sessions, users } from "@homarr/db/schema"; import type { SupportedAuthProvider } from "@homarr/definitions"; -export const createAdapter = (db: Database, provider: SupportedAuthProvider | "unknown"): Adapter => { +export const createAdapter = ( + db: Database, + provider: SupportedAuthProvider | "unknown", + enableDangerousCredentialsLinking = false, +): Adapter => { const drizzleAdapter = DrizzleAdapter(db, { usersTable: users, sessionsTable: sessions, accountsTable: accounts }); return { ...drizzleAdapter, - // We override the default implementation as we want to have a provider - // flag in the user instead of the account to not intermingle users from different providers + // Keep users isolated by their primary provider. The explicit credentials-linking + // opt-in is the only exception and keeps credentials as the primary provider. // eslint-disable-next-line no-restricted-syntax getUserByEmail: async (email) => { if (provider === "unknown") { throw new Error("Unable to get user by email for unknown provider"); } - const user = await db.query.users.findFirst({ + let user = await db.query.users.findFirst({ where: and(eq(users.email, email), eq(users.provider, provider)), columns: { id: true, @@ -30,6 +34,22 @@ export const createAdapter = (db: Database, provider: SupportedAuthProvider | "u }, }); + if (!user && provider === "oidc" && enableDangerousCredentialsLinking) { + // Credentials accounts do not have an email-verification flow, so their + // Auth.js emailVerified field is always null. The OIDC profile's strict + // email_verified check is the security boundary for this opt-in. + user = await db.query.users.findFirst({ + where: and(eq(users.email, email), eq(users.provider, "credentials")), + columns: { + id: true, + name: true, + email: true, + emailVerified: true, + image: true, + }, + }); + } + if (!user) { return null; } diff --git a/packages/auth/configuration.ts b/packages/auth/configuration.ts index d408dbb1d..69693a77e 100644 --- a/packages/auth/configuration.ts +++ b/packages/auth/configuration.ts @@ -44,7 +44,7 @@ export const createConfiguration = ( headers: ReadonlyHeaders | null, useSecureCookies: boolean, ) => { - const adapter = createAdapter(db, provider); + const adapter = createAdapter(db, provider, env.AUTH_OIDC_ENABLE_DANGEROUS_CREDENTIALS_LINKING); return NextAuth({ logger: { error: (error) => { diff --git a/packages/auth/env.ts b/packages/auth/env.ts index 8fcec0b66..484db5531 100644 --- a/packages/auth/env.ts +++ b/packages/auth/env.ts @@ -46,6 +46,7 @@ export const env = createEnv({ AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE: z.string().optional(), AUTH_OIDC_FORCE_USERINFO: createBooleanSchema(false), AUTH_OIDC_ENABLE_DANGEROUS_ACCOUNT_LINKING: createBooleanSchema(false), + AUTH_OIDC_ENABLE_DANGEROUS_CREDENTIALS_LINKING: createBooleanSchema(false), AUTH_OIDC_TOKEN_ENDPOINT_AUTH_METHOD: z .enum(["client_secret_basic", "client_secret_post", "client_secret_jwt", "none"]) .default("client_secret_basic"), diff --git a/packages/auth/events.ts b/packages/auth/events.ts index 7f8ecdc33..0a729fd52 100644 --- a/packages/auth/events.ts +++ b/packages/auth/events.ts @@ -24,6 +24,7 @@ export const createSignInEventHandler = (db: Database): Exclude => ({ id: "oidc", @@ -18,7 +19,8 @@ export const OidcProvider = (headers: ReadonlyHeaders | null): OIDCConfig { + if ( + isCredentialsLinkingEnabled && + (profile.email_verified !== true || typeof profile.email !== "string" || profile.email.trim().length === 0) + ) { + throw new Error("OIDC provider did not return a verified email while credentials linking is enabled"); + } +}; diff --git a/packages/auth/providers/test/oidc-provider.spec.ts b/packages/auth/providers/test/oidc-provider.spec.ts new file mode 100644 index 000000000..e377595f1 --- /dev/null +++ b/packages/auth/providers/test/oidc-provider.spec.ts @@ -0,0 +1,87 @@ +import { afterEach, describe, expect, test, vi } from "vitest"; + +import { OidcProvider } from "../oidc/oidc-provider"; +import { assertVerifiedEmailForCredentialsLinking } from "../oidc/verified-email"; + +const mockEnv = vi.hoisted(() => ({ + AUTH_OIDC_CLIENT_ID: "client-id", + AUTH_OIDC_CLIENT_NAME: "OIDC", + AUTH_OIDC_CLIENT_SECRET: "client-secret", + AUTH_OIDC_ENABLE_DANGEROUS_ACCOUNT_LINKING: false, + AUTH_OIDC_ENABLE_DANGEROUS_CREDENTIALS_LINKING: false, + AUTH_OIDC_FORCE_USERINFO: false, + AUTH_OIDC_ISSUER: "https://example.com", + AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE: undefined, + AUTH_OIDC_SCOPE_OVERWRITE: "openid email profile", + AUTH_OIDC_TOKEN_ENDPOINT_AUTH_METHOD: "client_secret_basic" as const, +})); + +vi.mock("../../env", () => ({ env: mockEnv })); +vi.mock("next-auth", () => ({ customFetch: Symbol("customFetch") })); + +afterEach(() => { + mockEnv.AUTH_OIDC_ENABLE_DANGEROUS_CREDENTIALS_LINKING = false; +}); + +describe("assertVerifiedEmailForCredentialsLinking", () => { + test("allows a strictly verified OIDC email when credentials linking is enabled", () => { + expect(() => + assertVerifiedEmailForCredentialsLinking({ email: "test@example.com", email_verified: true }, true), + ).not.toThrow(); + }); + + test.each([ + { email: "test@example.com", email_verified: false }, + { email: "test@example.com", email_verified: "true" }, + { email_verified: true }, + { email: null, email_verified: true }, + { email: " ", email_verified: true }, + {}, + ])("rejects an OIDC profile without a strictly verified email when credentials linking is enabled", (profile) => { + expect(() => assertVerifiedEmailForCredentialsLinking(profile, true)).toThrow( + "OIDC provider did not return a verified email while credentials linking is enabled", + ); + }); + + test("does not require the claim when credentials linking is disabled", () => { + expect(() => assertVerifiedEmailForCredentialsLinking({}, false)).not.toThrow(); + }); + + test("OIDC provider rejects an unverified profile when credentials linking is enabled", () => { + mockEnv.AUTH_OIDC_ENABLE_DANGEROUS_CREDENTIALS_LINKING = true; + const provider = OidcProvider(null); + expect(provider.allowDangerousEmailAccountLinking).toBe(true); + const mapProfile = provider.profile; + if (!mapProfile) throw new Error("Expected OIDC profile mapper to be defined"); + + expect(() => + mapProfile( + { + sub: "subject", + preferred_username: "test", + email: "test@example.com", + email_verified: false, + }, + {}, + ), + ).toThrow("OIDC provider did not return a verified email while credentials linking is enabled"); + }); + + test("OIDC provider accepts an unverified profile when credentials linking is disabled", () => { + const provider = OidcProvider(null); + const mapProfile = provider.profile; + if (!mapProfile) throw new Error("Expected OIDC profile mapper to be defined"); + + expect(() => + mapProfile( + { + sub: "subject", + preferred_username: "test", + email: "test@example.com", + email_verified: false, + }, + {}, + ), + ).not.toThrow(); + }); +}); diff --git a/packages/auth/test/adapter.spec.ts b/packages/auth/test/adapter.spec.ts index d20ae3d1a..a9f5cc1c3 100644 --- a/packages/auth/test/adapter.spec.ts +++ b/packages/auth/test/adapter.spec.ts @@ -1,6 +1,7 @@ import { describe, expect, test } from "vitest"; -import { users } from "@homarr/db/schema"; +import { eq } from "@homarr/db"; +import { accounts, apiKeys, groupMembers, groups, users } from "@homarr/db/schema"; import { createDb } from "@homarr/db/test"; import { createAdapter } from "../adapter"; @@ -64,4 +65,91 @@ describe("createAdapter should create drizzle adapter", () => { // Assert await expect(actAsync()).rejects.toThrow("Unable to get user by email for unknown provider"); }); + + test("getUserByEmail should return a credentials user for oidc when credentials linking is enabled", async () => { + const db = createDb(); + const adapter = createAdapter(db, "oidc", true); + const email = "test@example.com"; + await db.insert(users).values({ id: "credentials-user", name: "test", email, provider: "credentials" }); + + const user = await adapter.getUserByEmail?.(email); + + expect(user?.id).toBe("credentials-user"); + }); + + test("getUserByEmail should not return credentials users for non-oidc providers", async () => { + const db = createDb(); + const adapter = createAdapter(db, "ldap", true); + const email = "test@example.com"; + await db.insert(users).values({ id: "credentials-user", name: "test", email, provider: "credentials" }); + + const user = await adapter.getUserByEmail?.(email); + + expect(user).toBeNull(); + }); + + test("getUserByEmail should prefer an existing oidc user over a credentials user", async () => { + const db = createDb(); + const adapter = createAdapter(db, "oidc", true); + const email = "test@example.com"; + await db.insert(users).values([ + { id: "credentials-user", name: "credentials", email, provider: "credentials" }, + { id: "oidc-user", name: "oidc", email, provider: "oidc" }, + ]); + + const user = await adapter.getUserByEmail?.(email); + + expect(user?.id).toBe("oidc-user"); + }); + + test("linkAccount should preserve the credentials user and their data", async () => { + const db = createDb(); + const adapter = createAdapter(db, "oidc", true); + const email = "test@example.com"; + await db.insert(users).values({ + id: "credentials-user", + name: "test", + email, + password: "hashed-password", + provider: "credentials", + colorScheme: "light", + completedBoardTour: true, + }); + await db.insert(groups).values({ id: "group", name: "Test group", position: 1 }); + await db.insert(groupMembers).values({ groupId: "group", userId: "credentials-user" }); + await db.insert(apiKeys).values({ id: "api-key", apiKey: "secret", userId: "credentials-user" }); + + const user = await adapter.getUserByEmail?.(email); + if (!user) throw new Error("Expected credentials user to be found for OIDC linking"); + await adapter.linkAccount?.({ + userId: user.id, + type: "oidc", + provider: "oidc", + providerAccountId: "oidc-subject", + }); + + const linkedUser = await db.query.users.findFirst({ where: eq(users.id, "credentials-user") }); + const account = await db.query.accounts.findFirst({ where: eq(accounts.providerAccountId, "oidc-subject") }); + const membership = await db.query.groupMembers.findFirst({ + where: eq(groupMembers.userId, "credentials-user"), + }); + const apiKey = await db.query.apiKeys.findFirst({ where: eq(apiKeys.userId, "credentials-user") }); + const userByAccount = await adapter.getUserByAccount?.({ + provider: "oidc", + providerAccountId: "oidc-subject", + }); + const allUsers = await db.query.users.findMany(); + expect(linkedUser).toMatchObject({ + id: "credentials-user", + password: "hashed-password", + provider: "credentials", + colorScheme: "light", + completedBoardTour: true, + }); + expect(account?.userId).toBe("credentials-user"); + expect(membership?.groupId).toBe("group"); + expect(apiKey?.id).toBe("api-key"); + expect(userByAccount?.id).toBe("credentials-user"); + expect(allUsers).toHaveLength(1); + }); }); diff --git a/packages/auth/test/events.spec.ts b/packages/auth/test/events.spec.ts index c11eebdff..c94df69b8 100644 --- a/packages/auth/test/events.spec.ts +++ b/packages/auth/test/events.spec.ts @@ -135,7 +135,7 @@ describe("createSignInEventHandler should create signInEventHandler", () => { test("should add missing group membership", async () => { // Arrange const db = createDb(); - await createUserAsync(db); + await createUserAsync(db, "oidc"); await createGroupAsync(db); const eventHandler = createSignInEventHandler(db); @@ -155,7 +155,7 @@ describe("createSignInEventHandler should create signInEventHandler", () => { test("should remove group membership", async () => { // Arrange const db = createDb(); - await createUserAsync(db); + await createUserAsync(db, "oidc"); await createGroupAsync(db); await db.insert(groupMembers).values({ userId: "1", @@ -179,7 +179,7 @@ describe("createSignInEventHandler should create signInEventHandler", () => { test("should not remove group membership for everyone group", async () => { // Arrange const db = createDb(); - await createUserAsync(db); + await createUserAsync(db, "oidc"); await createGroupAsync(db, everyoneGroup); await db.insert(groupMembers).values({ userId: "1", @@ -204,7 +204,7 @@ describe("createSignInEventHandler should create signInEventHandler", () => { // Arrange mockEnv.AUTH_OIDC_GROUPS_LOCAL_MANAGEMENT = true; const db = createDb(); - await createUserAsync(db); + await createUserAsync(db, "oidc"); await createGroupAsync(db); const eventHandler = createSignInEventHandler(db); @@ -229,10 +229,10 @@ describe("createSignInEventHandler should create signInEventHandler", () => { ["ldap" as const, { name: "test-new" }, undefined], ["oidc" as const, { name: "test" }, { preferred_username: "test-new" }], ["oidc" as const, { name: "test" }, { preferred_username: "test@example.com", name: "test-new" }], - ])("signInEventHandler should update username for %s provider", async (_provider, user, profile) => { + ])("signInEventHandler should update username for %s provider", async (provider, user, profile) => { // Arrange const db = createDb(); - await createUserAsync(db); + await createUserAsync(db, provider); const eventHandler = createSignInEventHandler(db); // Act @@ -251,6 +251,32 @@ describe("createSignInEventHandler should create signInEventHandler", () => { }); expect(dbUser?.name).toBe("test-new"); }); + test("signInEventHandler should preserve credentials-owned data when the user signs in with linked oidc", async () => { + const db = createDb(); + await createUserAsync(db, "credentials", "local-avatar"); + await createGroupAsync(db); + await db.insert(groupMembers).values({ userId: "1", groupId: "1" }); + const eventHandler = createSignInEventHandler(db); + + await eventHandler?.({ + user: { id: "1", name: "test" }, + profile: { + preferred_username: "oidc-name", + picture: "oidc-avatar", + someRandomGroupsKey: [], + }, + account: null, + }); + + const dbUser = await db.query.users.findFirst({ where: eq(users.id, "1") }); + const membership = await db.query.groupMembers.findFirst({ where: eq(groupMembers.userId, "1") }); + expect(dbUser).toMatchObject({ + name: "test", + image: "local-avatar", + provider: "credentials", + }); + expect(membership?.groupId).toBe("1"); + }); test("signInEventHandler should set color-scheme cookie", async () => { // Arrange const db = createDb(); @@ -275,11 +301,17 @@ describe("createSignInEventHandler should create signInEventHandler", () => { }); }); -const createUserAsync = async (db: Database) => +const createUserAsync = async ( + db: Database, + provider: "credentials" | "ldap" | "oidc" = "credentials", + image?: string, +) => await db.insert(users).values({ id: "1", name: "test", colorScheme: "dark", + image, + provider, }); const createGroupAsync = async (db: Database, name = "test") => From 91a6b19ba17aed8e9364d1aeecdd1feb02d40082 Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Tue, 28 Jul 2026 22:55:33 +1000 Subject: [PATCH 04/16] fix(beszel): expire stored sessions so the integration recovers from token expiry (#6476) Co-authored-by: Tim Moore --- .../integrations/src/base/session-store.ts | 11 +- .../src/beszel/beszel-integration.ts | 76 ++++++- .../src/beszel/test/beszel-session.spec.ts | 213 ++++++++++++++++++ 3 files changed, 292 insertions(+), 8 deletions(-) create mode 100644 packages/integrations/src/beszel/test/beszel-session.spec.ts diff --git a/packages/integrations/src/base/session-store.ts b/packages/integrations/src/base/session-store.ts index 468440a0e..5c3ef0ce0 100644 --- a/packages/integrations/src/base/session-store.ts +++ b/packages/integrations/src/base/session-store.ts @@ -23,10 +23,15 @@ export const createSessionStore = (integration: { id: string }) => { return null; } }, - async setAsync(value: TValue) { - logger.debug("Updating session in store", { store: channelName }); + /** + * @param value session to store + * @param options pass `ttlSeconds` when the credential has a known lifetime, so a stored + * session can never outlive the token it holds + */ + async setAsync(value: TValue, options?: { ttlSeconds?: number }) { + logger.debug("Updating session in store", { store: channelName, ttlSeconds: options?.ttlSeconds }); try { - await channel.setAsync(encryptSecret(superjson.stringify(value))); + await channel.setAsync(encryptSecret(superjson.stringify(value)), options); } catch (error) { logger.error(new ErrorWithMetadata("Failed to save session", { store: channelName }, { cause: error })); } diff --git a/packages/integrations/src/beszel/beszel-integration.ts b/packages/integrations/src/beszel/beszel-integration.ts index bc026fc18..a9599e216 100644 --- a/packages/integrations/src/beszel/beszel-integration.ts +++ b/packages/integrations/src/beszel/beszel-integration.ts @@ -1,5 +1,6 @@ import { ResponseError } from "@homarr/common/server"; import { createLogger } from "@homarr/core/infrastructure/logs"; +import { ErrorWithMetadata } from "@homarr/core/infrastructure/logs/error"; import { createCertificateAgentAsync, fetchWithTrustedCertificatesAsync } from "@homarr/core/infrastructure/http"; import type { Response as UndiciResponse } from "undici"; @@ -81,11 +82,47 @@ export const normalizeRealtimeSnapshot = ( return events; }; -interface BeszelSession { +export interface BeszelSession { token: string; userId: string; + /** Epoch milliseconds, taken from the token's `exp` claim. Undefined when it could not be read. */ + expiresAt?: number; } +/** + * Re-authenticate this long before the token actually lapses, so a request can never be sent + * with a token that expires while it is in flight. + */ +const sessionExpiryLeewayMs = 60_000; + +/** + * Reads the expiration out of a PocketBase auth token. + * + * @returns expiry as epoch milliseconds, or null when the token is malformed or carries no + * numeric `exp` claim — in which case we fall back to the existing 401 retry path. + */ +export const parseTokenExpiration = (token: string): number | null => { + const payload = token.split(".")[1]; + if (!payload) return null; + + try { + const decoded = Buffer.from(payload.replace(/-/g, "+").replace(/_/g, "/"), "base64").toString("utf8"); + const { exp } = JSON.parse(decoded) as { exp?: unknown }; + return typeof exp === "number" && Number.isFinite(exp) ? exp * 1000 : null; + } catch { + return null; + } +}; + +/** + * Beszel answers requests carrying an expired token with `200` and an empty list rather than `401`, + * because its collection rules filter on `@request.auth.id` instead of rejecting. The 401 retry in + * `fetchWithAuthAsync` therefore never fires, so a stored session would otherwise be trusted + * forever. Sessions have to expire themselves. + */ +export const isSessionExpired = (session: BeszelSession, now = Date.now()) => + session.expiresAt !== undefined && session.expiresAt - sessionExpiryLeewayMs <= now; + export class BeszelIntegration extends Integration { private readonly sessionStore: SessionStore; @@ -96,11 +133,19 @@ export class BeszelIntegration extends Integration { private async authenticateAsync(): Promise { const existingSession = await this.sessionStore.getAsync(); - if (existingSession) { + if (existingSession && !isSessionExpired(existingSession)) { logger.debug("Using stored Beszel session", { integrationId: this.integration.id }); return existingSession; } + if (existingSession) { + logger.info("Stored Beszel session expired, re-authenticating", { + integrationId: this.integration.id, + expiresAt: existingSession.expiresAt, + }); + await this.sessionStore.clearAsync(); + } + const authUrl = this.url("/api/collections/users/auth-with-password"); logger.debug("Authenticating with Beszel", { integrationId: this.integration.id, url: authUrl.pathname }); const response = await fetchWithTrustedCertificatesAsync(authUrl, { @@ -119,9 +164,30 @@ export class BeszelIntegration extends Integration { } const data = (await response.json()) as BeszelAuthResponse; - const session: BeszelSession = { token: data.token, userId: data.record.id }; - await this.sessionStore.setAsync(session); - logger.debug("Saved Beszel session", { integrationId: this.integration.id, userId: session.userId }); + const expiresAt = parseTokenExpiration(data.token) ?? undefined; + + // A token that has already lapsed by the time it reaches us means our clock and Beszel's + // disagree by more than the token lifetime. Re-authenticating would only mint another dead + // token, and using this one would silently produce the empty responses this check exists to + // prevent — so fail loudly instead. + if (expiresAt !== undefined && expiresAt <= Date.now()) { + logger.warn("Beszel issued an already-expired token", { integrationId: this.integration.id, expiresAt }); + throw new ErrorWithMetadata("Beszel issued an already-expired authentication token, check for clock skew", { + integrationId: this.integration.id, + expiresAt, + }); + } + + const session: BeszelSession = { token: data.token, userId: data.record.id, expiresAt }; + // Give the stored entry the token's own lifetime, so the cache cannot outlive the credential + // even if the session is never read again before it lapses. + const ttlSeconds = expiresAt === undefined ? undefined : Math.max(1, Math.ceil((expiresAt - Date.now()) / 1000)); + await this.sessionStore.setAsync(session, ttlSeconds === undefined ? undefined : { ttlSeconds }); + logger.debug("Saved Beszel session", { + integrationId: this.integration.id, + userId: session.userId, + expiresAt, + }); return session; } diff --git a/packages/integrations/src/beszel/test/beszel-session.spec.ts b/packages/integrations/src/beszel/test/beszel-session.spec.ts new file mode 100644 index 000000000..1e77dc4f1 --- /dev/null +++ b/packages/integrations/src/beszel/test/beszel-session.spec.ts @@ -0,0 +1,213 @@ +// @vitest-environment node +import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; + +vi.hoisted(() => { + process.env.SKIP_ENV_VALIDATION = "true"; + process.env.SECRET_ENCRYPTION_KEY = "ff3f4f7ce30e870c9630de9e5d244ffa81101a24ed0dfe5f064beb53a7e684f1"; + process.env.ENABLE_DNS_CACHING = "false"; +}); + +// A stateful stand-in for redis, so a session actually survives between calls and the +// expiry logic can be exercised end to end. +const store = vi.hoisted(() => new Map()); + +vi.mock("@homarr/redis", () => ({ + createGetSetChannel: (name: string) => ({ + getAsync: () => Promise.resolve(store.get(name)?.value ?? null), + setAsync: (value: string, options?: { ttlSeconds?: number }) => { + store.set(name, { value, ttlSeconds: options?.ttlSeconds }); + return Promise.resolve(); + }, + removeAsync: () => { + store.delete(name); + return Promise.resolve(); + }, + }), +})); + +vi.mock("@homarr/core/infrastructure/logs", () => ({ + createLogger: () => ({ debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() }), + ErrorWithMetadata: class extends Error {}, +})); + +vi.mock("@homarr/core/infrastructure/http", () => ({ + fetchWithTrustedCertificatesAsync: (url: URL | string, init?: RequestInit) => fetch(url, init), + createAxiosCertificateInstanceAsync: vi.fn().mockResolvedValue({}), + createCertificateAgentAsync: vi.fn().mockResolvedValue({ close: vi.fn() }), +})); + +vi.mock("@homarr/core/infrastructure/certificates", () => ({ + getTrustedCertificateHostnamesAsync: vi.fn().mockResolvedValue([]), + getAllTrustedCertificatesAsync: vi.fn().mockResolvedValue([]), +})); + +import { BeszelIntegration, isSessionExpired, parseTokenExpiration } from "../beszel-integration"; + +const base64Url = (value: object) => Buffer.from(JSON.stringify(value)).toString("base64url"); +const createToken = (expiresAtSeconds: number) => `header.${base64Url({ exp: expiresAtSeconds })}.signature`; + +describe("parseTokenExpiration", () => { + test("reads the exp claim as epoch milliseconds", () => { + expect(parseTokenExpiration(createToken(1_800_000_000))).toBe(1_800_000_000_000); + }); + + test("decodes base64url payloads containing - and _", () => { + // A payload that base64-encodes with both + and /, which must be url-decoded first. + const token = `header.${Buffer.from(JSON.stringify({ sub: "a>b?c>>", exp: 1_700_000_000 })).toString("base64url")}.sig`; + expect(parseTokenExpiration(token)).toBe(1_700_000_000_000); + }); + + test.each([ + ["not-a-jwt", "no segments"], + ["header.%%%not-base64%%%.signature", "undecodable payload"], + [`header.${base64Url({ id: "user-1" })}.signature`, "no exp claim"], + [`header.${base64Url({ exp: "soon" })}.signature`, "non-numeric exp"], + ])("returns null for %s (%s)", (token) => { + expect(parseTokenExpiration(token)).toBeNull(); + }); +}); + +const session = (expiresAt?: number) => ({ token: "t", userId: "u", expiresAt }); + +describe("isSessionExpired", () => { + const now = Date.UTC(2026, 6, 26, 12, 0, 0); + + test("treats a session with an unknown expiry as valid, falling back to the 401 retry", () => { + expect(isSessionExpired(session(undefined), now)).toBe(false); + }); + + test("keeps a session that is comfortably in the future", () => { + expect(isSessionExpired(session(now + 60 * 60 * 1000), now)).toBe(false); + }); + + test("expires a session that lapses within the leeway window", () => { + expect(isSessionExpired(session(now + 30_000), now)).toBe(true); + }); + + test("expires a session that has already lapsed", () => { + expect(isSessionExpired(session(now - 1), now)).toBe(true); + }); +}); + +const createIntegration = () => + new BeszelIntegration({ + id: "test-beszel-session", + name: "Test Beszel", + url: "http://localhost:8090", + externalUrl: null, + decryptedSecrets: [ + { kind: "username", value: "user@example.com" }, + { kind: "password", value: "password" }, + ], + }); + +describe("BeszelIntegration session lifecycle", () => { + const originalFetch = globalThis.fetch; + let authCount = 0; + let issuedToken = ""; + + beforeEach(() => { + store.clear(); + authCount = 0; + globalThis.fetch = vi.fn((input: RequestInfo | URL) => { + const url = String(input); + if (url.endsWith("/api/collections/users/auth-with-password")) { + authCount++; + return Promise.resolve(Response.json({ token: issuedToken, record: { id: "user-1" } })); + } + if (url.includes("/api/collections/systems/records")) { + return Promise.resolve(Response.json({ page: 1, perPage: 500, totalItems: 0, totalPages: 0, items: [] })); + } + throw new Error(`Unexpected request: ${url}`); + }) as typeof fetch; + }); + + afterEach(() => { + globalThis.fetch = originalFetch; + }); + + test("reuses a stored session while its token is still valid", async () => { + issuedToken = createToken(Math.floor(Date.now() / 1000) + 7 * 24 * 60 * 60); + const integration = createIntegration(); + + await integration.getSystemsAsync(); + await integration.getSystemsAsync(); + + expect(authCount).toBe(1); + }); + + test("persists the session with a ttl matching the token lifetime", async () => { + const lifetimeSeconds = 7 * 24 * 60 * 60; + issuedToken = createToken(Math.floor(Date.now() / 1000) + lifetimeSeconds); + + await createIntegration().getSystemsAsync(); + + const stored = store.get("session-store:test-beszel-session"); + expect(stored?.ttlSeconds).toBeGreaterThan(lifetimeSeconds - 60); + expect(stored?.ttlSeconds).toBeLessThanOrEqual(lifetimeSeconds); + }); + + test("re-authenticates once the stored token has expired", async () => { + // Beszel replies 200 + empty list to an expired token instead of 401, so without an expiry + // check the stale session would be reused forever. See homarr-labs/homarr#6470. + vi.useFakeTimers(); + + try { + const lifetimeSeconds = 7 * 24 * 60 * 60; + const issuedAt = new Date("2026-07-26T00:00:00.000Z"); + vi.setSystemTime(issuedAt); + issuedToken = createToken(Math.floor(issuedAt.getTime() / 1000) + lifetimeSeconds); + const integration = createIntegration(); + + await integration.getSystemsAsync(); + expect(authCount).toBe(1); + + // Step past the token's lifetime, exactly as an idle Homarr instance would. + vi.setSystemTime(new Date(issuedAt.getTime() + (lifetimeSeconds + 1) * 1000)); + issuedToken = createToken(Math.floor(Date.now() / 1000) + lifetimeSeconds); + await integration.getSystemsAsync(); + + expect(authCount).toBe(2); + } finally { + vi.useRealTimers(); + } + }); + + test("uses a short-lived token that is valid now but lapses inside the leeway window", async () => { + // The leeway exists to stop a token expiring mid-request; it must not reject a token that is + // still valid, or an instance with a short authToken.duration could never authenticate. + issuedToken = createToken(Math.floor(Date.now() / 1000) + 30); + + await expect(createIntegration().getSystemsAsync()).resolves.toEqual([]); + expect(authCount).toBe(1); + expect(store.get("session-store:test-beszel-session")?.ttlSeconds).toBeGreaterThan(0); + }); + + test("fails loudly when Beszel issues an already-expired token instead of returning empty data", async () => { + issuedToken = createToken(Math.floor(Date.now() / 1000) - 600); + + const caught = await createIntegration() + .getSystemsAsync() + .then( + () => null, + (error: unknown) => error, + ); + + // The integration base class wraps thrown errors, so assert against the cause chain. + const messages: string[] = []; + for (let error: unknown = caught; error instanceof Error; error = error.cause) messages.push(error.message); + expect(messages.join(" | ")).toMatch(/clock skew/i); + + // The dead token must not be persisted, or it would be served to the next caller. + expect(store.has("session-store:test-beszel-session")).toBe(false); + expect(authCount).toBe(1); + }); + + test("does not store a ttl when the token carries no readable expiry", async () => { + issuedToken = "opaque-token-without-claims"; + + await createIntegration().getSystemsAsync(); + + expect(store.get("session-store:test-beszel-session")?.ttlSeconds).toBeUndefined(); + }); +}); From d08eb2afa6152b7bf619bfa8629119922f9e89b3 Mon Sep 17 00:00:00 2001 From: "homarr-update-contributors[bot]" <210161987+homarr-update-contributors[bot]@users.noreply.github.com> Date: Tue, 28 Jul 2026 14:56:42 +0200 Subject: [PATCH 05/16] chore: update contributors (#6461) --- static-data/translators.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static-data/translators.json b/static-data/translators.json index 74c6a7689..c33ef9fad 100644 --- a/static-data/translators.json +++ b/static-data/translators.json @@ -1 +1 @@ -[{"username":"carlchina","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png"},{"username":"zielmann","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png"},{"username":"Thalyn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12494028/medium/5faf5acc945a874ed116c4567edaa09f_default.png"},{"username":"magnushj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12503488/medium/68f32e33ea7b891960055c9f831f7344_default.png"},{"username":"almontegil","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png"},{"username":"andibing","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg"},{"username":"gronare","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12680911/medium/c6eb14d1504156f34a158e507f73aa3d_default.png"},{"username":"SmartPhoneLover","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg"},{"username":"marcelotk_15","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12773227/medium/ecf6bea16ab0c873c131df2154ee9718_default.png"},{"username":"S3OD177","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13051544/medium/11dd990837f61f7e8f7d36b041a7fddb_default.png"},{"username":"marcg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13153301/medium/ebcf60fbf27deb148ec40a659566c6ff_default.png"},{"username":"BeersTeddy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png"},{"username":"jamesmcmahon0","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg"},{"username":"b1nar10","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13286752/medium/aaa1f083e04c572f953fde4563171e4a.jpeg"},{"username":"vannCN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg"},{"username":"binswm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png"},{"username":"SkewRam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg"},{"username":"raphcatarino","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg"},{"username":"shillos5","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13600557/medium/b17650b2b84f829d54fa548c44c1ab27.jpeg"},{"username":"wolong98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg"},{"username":"spair0039","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png"},{"username":"MajorMarcin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14072183/medium/0a197e64bb92b6ea94cecbb607512c45.jpg"},{"username":"KosmoMoustache","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14103535/medium/51c438cdd9f86e8811c75f4869de479c.png"},{"username":"Soochaehwa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png"},{"username":"garryfield","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14187035/medium/520c964706676045f6eeec1b08edc880.jpg"},{"username":"droidenko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg"},{"username":"maathis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14489950/medium/6eeddf13a757ee35f78f1763f94d95e1.jpeg"},{"username":"bukvam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14546502/medium/a819dc40a13c57395a17dc46e847d3ce.jpg"},{"username":"gm.cinalli","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg"},{"username":"antoine2tt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png"},{"username":"cretzen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14799754/medium/3ba5c1805ec20c000d5810c07985afe9.jpg"},{"username":"ktKongTong","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg"},{"username":"marinkaberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg"},{"username":"djismgaming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14934947/medium/f5a8570713c34ab0f7d5405d105e2a9a.jpeg"},{"username":"f1refa11","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png"},{"username":"jeffersonraimon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057621/medium/6dff469563860e2618bc9d45646d0ab4.png"},{"username":"giop98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057987/medium/b8a4825d3fc39fc662f35ee258db4b2d.jpeg"},{"username":"tomislav.kraljevic","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15118857/medium/e133f1061cc92850b854d05d8faaeafd.png"},{"username":"Walkx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15202182/medium/5c37361ae45aeed487b34582c1f7ca37.png"},{"username":"andrea.rosso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15246318/medium/11f3f5ef44ec7f55b6f143090e208704_default.png"},{"username":"ajnart","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15270132/medium/a0f107a463c8910ee96bc2fa843a17e3.jpeg"},{"username":"Witchling","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15282238/medium/9e196b6783415b10ca571b7673c2ef33.jpg"},{"username":"guineuu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15292058/medium/22fbb758bda3b7805d50bf21d38f2c20.jpeg"},{"username":"Bulgus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15304568/medium/0e8787e5ceb02ed5c96a514d0068ae87.jpg"},{"username":"Narno","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15314996/medium/a6ba093f24884250a1bf6c6f2ca50f1b_default.png"},{"username":"BySempron","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15315986/medium/e3d22d7b1423c6823a9f36d595ed4bdb.png"},{"username":"jonathan.berglin.work","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15359236/medium/95930b2093db13b76179782f7322c5d5.png"},{"username":"icdmkg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405504/medium/f334d16cde1ac4ffb935b440d03465af.gif"},{"username":"irithys","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405614/medium/3086461c47cce0a0c031925e5f943412.png"},{"username":"JannesV","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419912/medium/a7809eb4b817d7c49b62cf10ae86b950.png"},{"username":"benniblot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419914/medium/8086b1573d31f152ba41949b3a172445.jpeg"},{"username":"pacjo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419916/medium/3cbeddbd7bc01faafb5a3bf47bba915b_default.png"},{"username":"Payou6994","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419934/medium/37c9b9b17dfb578404c1c1ddb73ba7a8.png"},{"username":"fzibi21","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419976/medium/0da688450358e0290a7b7359cc1f7328.png"},{"username":"WowMurdock","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420118/medium/de19576fccb495b6dfe4c4c04a56b834.png"},{"username":"hbooo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420120/medium/6c7c7f8db785061356ebb03d044d3329.jpeg"},{"username":"Manicraft1001","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420178/medium/50ec94563a06a9f74f33bd09f01eed4d.jpg"},{"username":"Void123","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420354/medium/86929d44df92a00f9fe900a985c196df_default.png"},{"username":"R4cc","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15422606/medium/a390979662b84694f59de30bdb732141.jpeg"},{"username":"fabricionaweb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15425808/medium/a9354142e7ae5152c144409d55fda551_default.png"},{"username":"JokeOfDead","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15426890/medium/a383eac9365e9de64fd4ab1d6fd0cb95.jpeg"},{"username":"hkz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15427174/medium/c88acefb0d7306e1f7470e872029fb39_default.png"},{"username":"Steken","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428516/medium/d5aea5653c769c3a523182bdb60d1664.png"},{"username":"flar.anton","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg"},{"username":"Bon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15433542/medium/5397da4dfc821f20b6ac14fe0c514e9a.jpeg"},{"username":"bfkadan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434162/medium/4f9a0b43cfe3acaea60124c14ba7f44a.png"},{"username":"BunnySweety","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434662/medium/f0ef200a6a0dcf0e1d0e9ecd4148f560_default.png"},{"username":"HRKings","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15436168/medium/69a31e461d38549f01864e7ef10d642e.png"},{"username":"wiston81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15439078/medium/10f292c8d12a7c21a44b54495fa4a3d8.jpeg"},{"username":"qaz0911","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15440860/medium/3d3e50ee388c72dc4bf7a771761f2d89_default.png"},{"username":"qqyule","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15441462/medium/7a3cdf82710ffb5d8f388bc0bd010665.png"},{"username":"Bims0n","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15445560/medium/603220b603eeb3367e0f0d3fa675247c.jpg"},{"username":"TariqDaCoder","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15446228/medium/50b0f4040112bbd67690b769477398e5_default.png"},{"username":"Anarchon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15449644/medium/e925e1f3e3ffbf0f982391ce263a1a28.jpeg"},{"username":"Ashun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15453020/medium/ccdcf51c73d6aae40751bb30beee1915_default.png"},{"username":"sebekmartin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg"},{"username":"RagnarGraves","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15459882/medium/143d5af850c1154070a218bea124e9cb_default.png"},{"username":"PrtmPhlp","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15462414/medium/b80db55e9de301432dcd1f8c8b24fd49_default.png"},{"username":"DooYoo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15470768/medium/2a18cf4be67094724b508c9e1e698a21_default.png"},{"username":"espentruls","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486092/medium/8e38afc3a4ff669226a0cfd3e420ff3a.jpeg"},{"username":"frisco82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486922/medium/4e1c5d4189b42508e660daa3c1c25b2a.jpeg"},{"username":"lupineDK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png"},{"username":"hillaliy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15492732/medium/0bae17b421604892d888e3fc70cf0587.jpeg"},{"username":"MarcOrfilaCarreras","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15501072/medium/ea52b26c3c6f21e4931e38e3ce3f3d6e.png"},{"username":"robertbridda","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15507822/medium/a368c2e30411bb2da9b49290084191f3.png"},{"username":"MKoniuszko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518090/medium/87605434fcc839f6763ab07c50f6d232.jpeg"},{"username":"HeroSizy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518710/medium/4e79c0e98cbeb536dd961e656331b509.png"},{"username":"dwt136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15520022/medium/554422503f2baea43ace85facb4546fb_default.png"},{"username":"asifthewebguy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15526719/medium/b18931dd0c800d725048bd440646198b_default.png"},{"username":"eiloogs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15545537/medium/f290a2f1190983530a9b76b2e858a609.gif"},{"username":"_vytdv","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15547289/medium/60d8644cc8ad6f11a92ccea4a14cd098_default.png"},{"username":"crendasien","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg"},{"username":"edxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15573823/medium/8a565b732a75a77f840dd123cdb30bf4.png"},{"username":"somerlev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg"},{"username":"kid1412621","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15643771/medium/dd455e32de652fa88e6fd97598bdffa7.png"},{"username":"suming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15644717/medium/244159dfe10fa03436205506f80c9e25.png"},{"username":"nick.gher","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15647517/medium/5374a2c6fef60a3fbf0edf86b997c351_default.png"},{"username":"DataCat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15650315/medium/ce7c1365adf35c5d490d77500a4607fb_default.png"},{"username":"dizo89","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15658375/medium/0ca745e5017d491fe1b22b0239904de8.jpeg"},{"username":"tee_noodle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674577/medium/804d9cf06f5196026acb6436b809d0da_default.png"},{"username":"Marty88","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg"},{"username":"Spillebulle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15677023/medium/20b98bb85062e07afe0e63618f8a5feb.PNG"},{"username":"petitmewen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15685239/medium/15de9b62d2e0bc25013435f1784bbcc1.jpeg"},{"username":"NoProsNoNoobs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15687709/medium/ae8f65fafeb8bcf74dcb8871bbe46461.png"},{"username":"y.gybson","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15690777/medium/b5cb5d2d5768904ff6586c727e3a6c77.jpeg"},{"username":"inside90","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15704947/medium/c1355fcb30dd76f8e39d98d1d49f1c52.png"},{"username":"RJSkudra","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png"},{"username":"binge203","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15713937/medium/77c1cfa4314673db80e6881fd9f64668.gif"},{"username":"Mailootje","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15714337/medium/743c3bc4ab1989966a375eeeec83d8b8.jpeg"},{"username":"tim-wiegers","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15719805/medium/08a96f064813350661cd6b20bf3d7d99.png"},{"username":"GkhnG","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15722911/medium/71a027caec489ef6ce82bcf1888329d0_default.png"},{"username":"Zoen-Millo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15760967/medium/9e956f11adc5b34f5636268b5c485dbf.jpg"},{"username":"HooinKyoma","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15792897/medium/9489f0a9b368e0e827ae758b740a2eed.jpeg"},{"username":"wathergeen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15794495/medium/a83b7fc80d180669ebfd6deb3544cfd0.png"},{"username":"MoeToo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15818233/medium/d35cd6953717706eaf20f6c143c62947.png"},{"username":"itodouble","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15836233/medium/e984caea18fb0673bf319fcf28cef649.png"},{"username":"loslocitos","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15847901/medium/fe30d12fd2cf38212f929e13b169f9ec.jpeg"},{"username":"Oversleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15849065/medium/06141f13a6d541d753f3c2f2947b8068_default.png"},{"username":"Beardy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png"},{"username":"raelyan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15875457/medium/2f4fda1d1aaa5dcc79b328baf3f03151.jpeg"},{"username":"dolphin738","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15913763/medium/ee6fede7b8528ca642329ada80d1cc18.png"},{"username":"brunotco","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15916719/medium/09db45880fc05abc18adb8d932a5ecf9_default.png"},{"username":"LukeIsHereToDevelop","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15924739/medium/3e6cd3940297bb4ba7bb039c93e6f918.png"},{"username":"kennit","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15925879/medium/6b0733ad3c5949b91c55e4d8b03db8a5_default.png"},{"username":"kuunpire","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15950309/medium/8192a4f08f07086828ac9f74ed29a169.jpeg"},{"username":"Sandor-dev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15951759/medium/0216c2da4eb028164ebbecf1c72f6271_default.png"},{"username":"Meierschlumpf","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15953187/medium/23c744faef1ab84fbdc9351a7850aab6.jpeg"},{"username":"harmlesscat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15970733/medium/dd8d0214a0250c932bb518b1b55e45a2_default.png"},{"username":"OrzWTF","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15976121/medium/4c4557cbff7ff7b0503455bc59c020e0.jpeg"},{"username":"tagaishi","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png"},{"username":"azurite928","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15981895/medium/547ccc459ee123e78b5401c499f1022d.png"},{"username":"Ronner231","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16021342/medium/7734d550df2de5a2fec2ffff33e7024c.jpeg"},{"username":"ugyes","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16034148/medium/ed001e3f470a2dea9a8ce955b18e7bd5.png"},{"username":"rpieja","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16045554/medium/bd55baca2ef8b92502a760cc9ee7c505_default.png"},{"username":"flambyisyou","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16051620/medium/3a3bc0c90f6b95ab4ef74396a0a17beb.png"},{"username":"Topbcy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16077170/medium/d3aed33ea56330338756cfcd89477cfe.jpeg"},{"username":"ai5d02sb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16084674/medium/7c8119fe2a5ca71bb15f636916a42b95_default.png"},{"username":"explosiveparrot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16097722/medium/7762f80fc1da63f5b2eb87de9d640324_default.png"},{"username":"DestroyCom","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16111544/medium/83e3d3ac5c8bfed634cd1a074854db67.png"},{"username":"neotraxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16116966/medium/b30df957873329019a8a90a69f6efe3a.png"},{"username":"gzxpa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16123314/medium/487b05577310a946b0b98bc72c11213b_default.png"},{"username":"TORIK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16124732/medium/de770890e6411860ac06e8cc2dc0abd0_default.png"},{"username":"sergio.pibot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16138114/medium/80db802b2fcd6bbf19ea4c7413367dca.jpeg"},{"username":"karam-ajaj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16139838/medium/7539ab958d3c85d5f67e7849483ea8f7.jpeg"},{"username":"SimonHenz97","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16151520/medium/9b94a85b536688e2d94538c384fd0a76.png"},{"username":"olsson82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16198988/medium/eeaab4cba210c537424d4204754b604e.png"},{"username":"bo3bdo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16222806/medium/8652f3beacb6098dde5a4cd0a29fe80d.jpeg"},{"username":"AngryPlayer04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245192/medium/342715274f4dc31fd4132cdae9126188.jpeg"},{"username":"ehatamm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245884/medium/979d5e5526fe545be9bf46db481f7182.jpeg"},{"username":"Balionelis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16246058/medium/986d62ba363594c517d966fe9178dcbb.png"},{"username":"kwargs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16248816/medium/19ce11f04bf1ae2637e0483399c675f9_default.png"},{"username":"lucicu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16273892/medium/3b09e8f3bead221ef98d6a45a16851dc_default.png"},{"username":"Michael5564445","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16357688/medium/9d9026a8bf3eaccb0417da240932ebf7.png"},{"username":"Netscream","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16359198/medium/694e0c8572dc8a47e6d63da31ec5b992.png"},{"username":"belicstefan04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16368142/medium/4742dcfd7bf7ad7e33e37ac44fba7e0f.png"},{"username":"Hamad2066","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16371478/medium/f37bbc7685b6757defdbd1494236af61.jpeg"},{"username":"3ct0pl4sm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16399616/medium/ce796d1c40163975624c0a483e56374f.png"},{"username":"sanchez.marcell626","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16433865/medium/3ddde1314764cc2205ffdcd1ae719a91.png"},{"username":"Minoctis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16490079/medium/91fd0849303a4eca033d660d0a7b6854.jpeg"},{"username":"homarr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16657003/medium/3afabfd3de949a54ff5d40ad04552aba.png"},{"username":"mwgg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16658379/medium/763dd09f5c238cc5324d4d5357985292.png"},{"username":"kiwinho","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16671855/medium/bfe3a2d497dc4748a04d02e4ae2139cb.jpeg"},{"username":"tjvg4m34r13","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16679135/medium/7a483b9b0abe0d925e54808e1cb38fa0.jpeg"},{"username":"Diegoem","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16705921/medium/29ce68ebc191fc3f65499511b12de98f_default.png"},{"username":"bouks69","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16746091/medium/b58b1fc08520de416198be9df5d093eb.jpeg"},{"username":"futhgar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16748067/medium/b8c526b097f9aa9d687250cac3df16dc.jpeg"},{"username":"GrimSQL","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16764343/medium/fff729a76d1f8fbcdaee9bb0c0f5f3fd.png"},{"username":"chnikel","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767047/medium/3dda2a37e03049dafefe6697bb00f75c.png"},{"username":"yuki19870616","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767951/medium/f59c848e38382cda6c8464b0a7b9e642_default.png"},{"username":"noamdal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16782245/medium/b4a72a61f9caf138f0322c0cb987e6d0.png"},{"username":"MalithRukshan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16809057/medium/084d6a5b35fbbeacc70e7021197d222f.png"},{"username":"minirope19","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16930929/medium/e8cbbc26747e31c5a8959215e1dd067b.jpeg"},{"username":"prubin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17503492/medium/96ac87644691e49c1f983f2f094e541c_default.png"},{"username":"sam-tam-sam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17578052/medium/1628dc2954ce3ae95e0caaa2bd60ab0c.png"},{"username":"KydoxOwn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17764383/medium/0bc150a09d77f5fda43988e6342777dc.png"},{"username":"toineenzo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12371852/medium/9f1b2bedb4794c59479cd289bdba9fab.png"},{"username":"ArcaneWater","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12421105/medium/1ac82517a6c658f6b62c48aebcb17e86_default.png"},{"username":"Ebedami","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12974801/medium/b596dea5c09454c4c828eac558389755.jpg"},{"username":"perrygamerptyt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13117177/medium/1406c949507ecd438480473c8a1f6124.jpg"},{"username":"SergiSvK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13320543/medium/3df3c79cc5f0c53716c559cd3fd2fc20.png"},{"username":"jeongeon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13362856/medium/eb572f72cde5e5526c517ca3a6489850_default.png"},{"username":"MrTranCFCVN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13439475/medium/a1789d69c85d90c667194b5d6a518c08_default.png"},{"username":"Tobost06","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13467449/medium/9227dc07f6366bc060d28304f5cb8ce7.jpeg"},{"username":"Kf637","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13530622/medium/118b00bb72d01d3229c97409637e25d1_default.png"},{"username":"Cruellest","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13610615/medium/2a74faa0947ee08d18f7946fb8602c1e.jpg"},{"username":"olavinto","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14424644/medium/37c01732bd2b7a272b421807a05ccfeb.png"},{"username":"OzakIOne","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14446246/medium/3abb08846344706d3a16a9fb196655ee.jpeg"},{"username":"Thario","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14491372/medium/dd5e142070802a672900121aa3f332a6_default.png"},{"username":"Wjouter","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14585620/medium/b91a51513332bdc0a0a9ecbed99ecbc3.png"},{"username":"albanobattistella","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14686194/medium/564afcfd76f5cd24751bd669cf4943aa.jpg"},{"username":"angrystar170","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14736454/medium/7a70edc6b50122877533e95a4e971203.jpeg"},{"username":"Kachelkaiser","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14763406/medium/203a781797da4a18fe0f4e7db8fd547c.png"},{"username":"regi4","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14842936/medium/f7e1d672f562a7db61ba6b4b8f4de41d.png"},{"username":"baton5129","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14891064/medium/8d438f557b82977dd02f0ead3187265f.PNG"},{"username":"legocuedy09","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15206280/medium/a93129b77a54ffbb2c9f136f18718e80.png"},{"username":"meviper","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15958903/medium/209f521ce33a05831fa8d7d1b7babc20_default.png"},{"username":"GerOriki","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16268376/medium/da00e54b08cd40348231d92873a0cd0a_default.png"},{"username":"TheRedCyclops","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16486399/medium/7f39226180120d5a9efcb8e13d8aec8e_default.png"},{"username":"dymek37","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16659221/medium/d1dc6d11d7e7fc370efc5070e837ae03.png"},{"username":"B3CKDOOR","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16744975/medium/e6c7b2d45e76465d54e6efb67c83da7d.png"},{"username":"on9686","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16768173/medium/6282fed9aafe0262a173a5ec0887e5d9_default.png"},{"username":"Larsluph","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16779933/medium/ed7d36f8b44013bad3a16ac0491bd0f7.png"},{"username":"FOEDI","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16781001/medium/6b4552fb72e359aa016f7a054078fac8.png"},{"username":"xmarkurion","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16805443/medium/34a20428427de5aaef99c7d140646803.png"},{"username":"gregid","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16806705/medium/f3c8f4a20436e8538929130142bbc104.png"},{"username":"Flameberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16820453/medium/d47be866148474c9d05fec6fbe406d88.png"},{"username":"Playfust","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16872865/medium/5f4609cc711e5fb9fa8a0b178635769c.jpeg"},{"username":"Cotignac","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16879297/medium/81ff353edf030699a159bb79cda26e84.jpg"},{"username":"LeaHun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16916375/medium/618520f0543b1e212ebc83d66b683d4b_default.png"},{"username":"jackwellerreal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16919717/medium/37bbfdc03893f141133ccc619593266d.png"},{"username":"renan.costaalencar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16938427/medium/6d25b25320c5bde734118dec4af9cd5b.png"},{"username":"andrius.cim","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16967845/medium/46028fc1a0ddfaaeebcb37b39739625d_default.png"},{"username":"xjxexrxrxyx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17041412/medium/d34d664166db6fb25579bca9ff3b50b4.jpeg"},{"username":"bilhal.fellah","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17044572/medium/d1ec6f17e4aa013e9eededc83778d2c6.png"},{"username":"the_octo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17058060/medium/7423ab3a4cabb67f5decb2e2dfa2b675_default.png"},{"username":"BamesJond","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17075846/medium/128d7ffd40254c8e376f45678e2fc620_default.png"},{"username":"Kornikus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17134240/medium/d7a42b2c30db46ff152699ca01f9e11a_default.png"},{"username":"Master3307","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17161852/medium/94ec577dd53e16b434f2aac9c34f64c6.png"},{"username":"xoxyuxu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17176526/medium/108055aa24343043de852e412bec74be.png"},{"username":"cryptodntsleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17249408/medium/b9e15aa2b24a0dbc1e4f194aa8ed5109.png"},{"username":"yaniorg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17261842/medium/7dbfc77f21c826845961243c44540d26.jpg"},{"username":"Vidariondr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17262438/medium/45fbc71be02ef27296b6f423e97b6a03_default.png"},{"username":"Fastery","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17263066/medium/701b0edc59676174863ad651528bbb37.jpeg"},{"username":"stratself","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17290388/medium/57d9d8161b3fd0abf4dc5558b4a1fa05_default.png"},{"username":"wuzeqin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17292606/medium/b9e0308410b31337e2d7aa6ed346d718_default.png"},{"username":"ChristopherBull","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17304338/medium/21a175ce596bfae81430767467908b90.jpeg"},{"username":"darkbcnlord","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17311436/medium/b271bc0b419ec3a26ddb7b63ff8ffc4b.png"},{"username":"zhoran1997","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17344028/medium/c8f450b5a8f1e9494a45dc60af7ce63e.png"},{"username":"Pakura","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17396930/medium/18602738018348bf2ffa83a78bf165e2_default.png"},{"username":"gilalves1703","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17447768/medium/3f1de562a5c2391c88bbf8d5cf40a266.png"},{"username":"iServeCloud","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17470960/medium/11649b99d609438d66455a4d2fdc70f7.png"},{"username":"guibolzantvbox","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17474136/medium/59a576e6da538664ceb972253916fa02.jpeg"},{"username":"ivann136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17506062/medium/67d09ada36fac5f444a1f7517e3a97bd_default.png"},{"username":"Maheshivara","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17516082/medium/576e1e6581cf969615b265de6aeff8b7.jpeg"},{"username":"brunogui81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17517542/medium/7c0d174e810435af518fe8e0c05e151f.jpeg"},{"username":"michelwilhelm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17542190/medium/4c6b33fd8993ff565fa75add2ce8355e.jpeg"},{"username":"dias-gxstavo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17547376/medium/8c6b109aae8aeb651192346a39ae9e5b.jpeg"},{"username":"ToxykAuBleu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17614030/medium/8d21e0608560172b121bd46126d827c7.jpeg"},{"username":"e.erdemir","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17617994/medium/7259a29db9941c6171a8cbbd643b92bd.png"},{"username":"sjonkreutz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17618306/medium/7601c45d015189a863656e21348d223b.png"},{"username":"volovich0377","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17620388/medium/c929a8fbd24f96d17620fa497ade7309.png"},{"username":"Hamstio1","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17624898/medium/406e0bf40094c24a01c3064f8f5b2a82.png"},{"username":"i3laa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17627462/medium/613a9d283ed8b69819ee181903851660.jpeg"},{"username":"bastiengrignon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17629884/medium/ddfc3339285bd65195fcd834e512e9b7.jpeg"},{"username":"kauhee","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17644600/medium/def1b9066cf9275b4273a5a5dca7f325.png"},{"username":"hongminzheng","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17683860/medium/a764f4963912777d27a7cd98e136a2b2.png"},{"username":"d-lindahl","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17726729/medium/cbde348582fbabcfadd89a56cd5a0b40.png"},{"username":"Enoal-Fauchille-Bolle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17734649/medium/6e6fb29198782dc7856ea21811db669c.jpeg"},{"username":"manos-grigorakis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17737973/medium/b37f685587c920c81fdaf9a357962434.jpeg"},{"username":"SertraFurr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17738703/medium/5f1e9f270e315ee3185cf2ccb3f5a833.png"},{"username":"Kle.Ma","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17739207/medium/b767d6093e6608f251ca152f53d359b8_default.png"},{"username":"WalkerLukas","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17744485/medium/87508ce83a9b6e5391f55883a66a054b.png"},{"username":"mtya","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17748447/medium/f574d5a770d74814f8c49ee68e00f5b7.jpeg"},{"username":"Elaktrato","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17750977/medium/f4109d379f29dc8ea2e7799ac9e208c8.png"},{"username":"marcelmeis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17753627/medium/4ba32116c27e427d3073e45713f6564e.png"},{"username":"ProKafelek12e","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17760377/medium/5199af152f1ea42cee718e7729bd41ff.png"},{"username":"zalaghi","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17763367/medium/a06f7b15222663517b58b8dc8902f8a1.png"},{"username":"Amato21","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17776775/medium/214b1f1581a85fe10f1ae3241aab43e4.png"},{"username":"jabalv","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17778347/medium/14dd47fff64f6543e6015be7373420c3.png"}] \ No newline at end of file +[{"username":"carlchina","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png"},{"username":"zielmann","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png"},{"username":"Thalyn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12494028/medium/5faf5acc945a874ed116c4567edaa09f_default.png"},{"username":"magnushj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12503488/medium/68f32e33ea7b891960055c9f831f7344_default.png"},{"username":"almontegil","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png"},{"username":"andibing","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg"},{"username":"gronare","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12680911/medium/c6eb14d1504156f34a158e507f73aa3d_default.png"},{"username":"SmartPhoneLover","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg"},{"username":"marcelotk_15","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12773227/medium/ecf6bea16ab0c873c131df2154ee9718_default.png"},{"username":"S3OD177","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13051544/medium/11dd990837f61f7e8f7d36b041a7fddb_default.png"},{"username":"marcg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13153301/medium/ebcf60fbf27deb148ec40a659566c6ff_default.png"},{"username":"BeersTeddy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png"},{"username":"jamesmcmahon0","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg"},{"username":"b1nar10","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13286752/medium/aaa1f083e04c572f953fde4563171e4a.jpeg"},{"username":"vannCN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg"},{"username":"binswm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png"},{"username":"SkewRam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg"},{"username":"raphcatarino","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg"},{"username":"shillos5","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13600557/medium/b17650b2b84f829d54fa548c44c1ab27.jpeg"},{"username":"wolong98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg"},{"username":"spair0039","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png"},{"username":"MajorMarcin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14072183/medium/0a197e64bb92b6ea94cecbb607512c45.jpg"},{"username":"KosmoMoustache","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14103535/medium/51c438cdd9f86e8811c75f4869de479c.png"},{"username":"Soochaehwa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png"},{"username":"garryfield","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14187035/medium/520c964706676045f6eeec1b08edc880.jpg"},{"username":"droidenko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg"},{"username":"maathis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14489950/medium/6eeddf13a757ee35f78f1763f94d95e1.jpeg"},{"username":"bukvam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14546502/medium/a819dc40a13c57395a17dc46e847d3ce.jpg"},{"username":"gm.cinalli","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg"},{"username":"antoine2tt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png"},{"username":"cretzen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14799754/medium/3ba5c1805ec20c000d5810c07985afe9.jpg"},{"username":"ktKongTong","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg"},{"username":"marinkaberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg"},{"username":"djismgaming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14934947/medium/f5a8570713c34ab0f7d5405d105e2a9a.jpeg"},{"username":"f1refa11","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png"},{"username":"jeffersonraimon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057621/medium/6dff469563860e2618bc9d45646d0ab4.png"},{"username":"giop98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057987/medium/b8a4825d3fc39fc662f35ee258db4b2d.jpeg"},{"username":"tomislav.kraljevic","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15118857/medium/e133f1061cc92850b854d05d8faaeafd.png"},{"username":"Walkx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15202182/medium/5c37361ae45aeed487b34582c1f7ca37.png"},{"username":"andrea.rosso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15246318/medium/11f3f5ef44ec7f55b6f143090e208704_default.png"},{"username":"ajnart","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15270132/medium/a0f107a463c8910ee96bc2fa843a17e3.jpeg"},{"username":"Witchling","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15282238/medium/9e196b6783415b10ca571b7673c2ef33.jpg"},{"username":"guineuu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15292058/medium/22fbb758bda3b7805d50bf21d38f2c20.jpeg"},{"username":"Bulgus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15304568/medium/0e8787e5ceb02ed5c96a514d0068ae87.jpg"},{"username":"Narno","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15314996/medium/a6ba093f24884250a1bf6c6f2ca50f1b_default.png"},{"username":"BySempron","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15315986/medium/e3d22d7b1423c6823a9f36d595ed4bdb.png"},{"username":"jonathan.berglin.work","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15359236/medium/95930b2093db13b76179782f7322c5d5.png"},{"username":"icdmkg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405504/medium/f334d16cde1ac4ffb935b440d03465af.gif"},{"username":"irithys","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405614/medium/3086461c47cce0a0c031925e5f943412.png"},{"username":"JannesV","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419912/medium/a7809eb4b817d7c49b62cf10ae86b950.png"},{"username":"benniblot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419914/medium/8086b1573d31f152ba41949b3a172445.jpeg"},{"username":"pacjo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419916/medium/3cbeddbd7bc01faafb5a3bf47bba915b_default.png"},{"username":"Payou6994","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419934/medium/37c9b9b17dfb578404c1c1ddb73ba7a8.png"},{"username":"fzibi21","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419976/medium/0da688450358e0290a7b7359cc1f7328.png"},{"username":"WowMurdock","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420118/medium/de19576fccb495b6dfe4c4c04a56b834.png"},{"username":"hbooo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420120/medium/6c7c7f8db785061356ebb03d044d3329.jpeg"},{"username":"Manicraft1001","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420178/medium/50ec94563a06a9f74f33bd09f01eed4d.jpg"},{"username":"Void123","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420354/medium/86929d44df92a00f9fe900a985c196df_default.png"},{"username":"R4cc","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15422606/medium/a390979662b84694f59de30bdb732141.jpeg"},{"username":"fabricionaweb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15425808/medium/a9354142e7ae5152c144409d55fda551_default.png"},{"username":"JokeOfDead","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15426890/medium/a383eac9365e9de64fd4ab1d6fd0cb95.jpeg"},{"username":"hkz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15427174/medium/c88acefb0d7306e1f7470e872029fb39_default.png"},{"username":"Steken","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428516/medium/d5aea5653c769c3a523182bdb60d1664.png"},{"username":"flar.anton","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg"},{"username":"Bon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15433542/medium/5397da4dfc821f20b6ac14fe0c514e9a.jpeg"},{"username":"bfkadan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434162/medium/4f9a0b43cfe3acaea60124c14ba7f44a.png"},{"username":"BunnySweety","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434662/medium/f0ef200a6a0dcf0e1d0e9ecd4148f560_default.png"},{"username":"HRKings","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15436168/medium/69a31e461d38549f01864e7ef10d642e.png"},{"username":"wiston81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15439078/medium/10f292c8d12a7c21a44b54495fa4a3d8.jpeg"},{"username":"qaz0911","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15440860/medium/3d3e50ee388c72dc4bf7a771761f2d89_default.png"},{"username":"qqyule","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15441462/medium/7a3cdf82710ffb5d8f388bc0bd010665.png"},{"username":"Bims0n","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15445560/medium/603220b603eeb3367e0f0d3fa675247c.jpg"},{"username":"TariqDaCoder","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15446228/medium/50b0f4040112bbd67690b769477398e5_default.png"},{"username":"Anarchon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15449644/medium/e925e1f3e3ffbf0f982391ce263a1a28.jpeg"},{"username":"Ashun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15453020/medium/ccdcf51c73d6aae40751bb30beee1915_default.png"},{"username":"sebekmartin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg"},{"username":"RagnarGraves","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15459882/medium/143d5af850c1154070a218bea124e9cb_default.png"},{"username":"PrtmPhlp","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15462414/medium/b80db55e9de301432dcd1f8c8b24fd49_default.png"},{"username":"DooYoo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15470768/medium/2a18cf4be67094724b508c9e1e698a21_default.png"},{"username":"espentruls","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486092/medium/8e38afc3a4ff669226a0cfd3e420ff3a.jpeg"},{"username":"frisco82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486922/medium/4e1c5d4189b42508e660daa3c1c25b2a.jpeg"},{"username":"lupineDK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png"},{"username":"hillaliy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15492732/medium/0bae17b421604892d888e3fc70cf0587.jpeg"},{"username":"MarcOrfilaCarreras","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15501072/medium/ea52b26c3c6f21e4931e38e3ce3f3d6e.png"},{"username":"robertbridda","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15507822/medium/a368c2e30411bb2da9b49290084191f3.png"},{"username":"MKoniuszko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518090/medium/87605434fcc839f6763ab07c50f6d232.jpeg"},{"username":"HeroSizy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518710/medium/4e79c0e98cbeb536dd961e656331b509.png"},{"username":"dwt136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15520022/medium/554422503f2baea43ace85facb4546fb_default.png"},{"username":"asifthewebguy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15526719/medium/b18931dd0c800d725048bd440646198b_default.png"},{"username":"eiloogs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15545537/medium/f290a2f1190983530a9b76b2e858a609.gif"},{"username":"_vytdv","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15547289/medium/60d8644cc8ad6f11a92ccea4a14cd098_default.png"},{"username":"crendasien","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg"},{"username":"edxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15573823/medium/8a565b732a75a77f840dd123cdb30bf4.png"},{"username":"somerlev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg"},{"username":"kid1412621","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15643771/medium/dd455e32de652fa88e6fd97598bdffa7.png"},{"username":"suming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15644717/medium/244159dfe10fa03436205506f80c9e25.png"},{"username":"nick.gher","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15647517/medium/5374a2c6fef60a3fbf0edf86b997c351_default.png"},{"username":"DataCat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15650315/medium/ce7c1365adf35c5d490d77500a4607fb_default.png"},{"username":"dizo89","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15658375/medium/0ca745e5017d491fe1b22b0239904de8.jpeg"},{"username":"tee_noodle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674577/medium/804d9cf06f5196026acb6436b809d0da_default.png"},{"username":"Marty88","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg"},{"username":"Spillebulle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15677023/medium/20b98bb85062e07afe0e63618f8a5feb.PNG"},{"username":"petitmewen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15685239/medium/15de9b62d2e0bc25013435f1784bbcc1.jpeg"},{"username":"NoProsNoNoobs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15687709/medium/ae8f65fafeb8bcf74dcb8871bbe46461.png"},{"username":"y.gybson","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15690777/medium/b5cb5d2d5768904ff6586c727e3a6c77.jpeg"},{"username":"inside90","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15704947/medium/c1355fcb30dd76f8e39d98d1d49f1c52.png"},{"username":"RJSkudra","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png"},{"username":"binge203","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15713937/medium/77c1cfa4314673db80e6881fd9f64668.gif"},{"username":"Mailootje","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15714337/medium/743c3bc4ab1989966a375eeeec83d8b8.jpeg"},{"username":"tim-wiegers","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15719805/medium/08a96f064813350661cd6b20bf3d7d99.png"},{"username":"GkhnG","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15722911/medium/71a027caec489ef6ce82bcf1888329d0_default.png"},{"username":"Zoen-Millo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15760967/medium/9e956f11adc5b34f5636268b5c485dbf.jpg"},{"username":"HooinKyoma","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15792897/medium/9489f0a9b368e0e827ae758b740a2eed.jpeg"},{"username":"wathergeen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15794495/medium/a83b7fc80d180669ebfd6deb3544cfd0.png"},{"username":"MoeToo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15818233/medium/d35cd6953717706eaf20f6c143c62947.png"},{"username":"itodouble","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15836233/medium/e984caea18fb0673bf319fcf28cef649.png"},{"username":"loslocitos","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15847901/medium/fe30d12fd2cf38212f929e13b169f9ec.jpeg"},{"username":"Oversleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15849065/medium/06141f13a6d541d753f3c2f2947b8068_default.png"},{"username":"Beardy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png"},{"username":"raelyan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15875457/medium/2f4fda1d1aaa5dcc79b328baf3f03151.jpeg"},{"username":"dolphin738","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15913763/medium/ee6fede7b8528ca642329ada80d1cc18.png"},{"username":"brunotco","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15916719/medium/09db45880fc05abc18adb8d932a5ecf9_default.png"},{"username":"LukeIsHereToDevelop","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15924739/medium/3e6cd3940297bb4ba7bb039c93e6f918.png"},{"username":"kennit","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15925879/medium/6b0733ad3c5949b91c55e4d8b03db8a5_default.png"},{"username":"kuunpire","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15950309/medium/8192a4f08f07086828ac9f74ed29a169.jpeg"},{"username":"Sandor-dev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15951759/medium/0216c2da4eb028164ebbecf1c72f6271_default.png"},{"username":"Meierschlumpf","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15953187/medium/23c744faef1ab84fbdc9351a7850aab6.jpeg"},{"username":"harmlesscat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15970733/medium/dd8d0214a0250c932bb518b1b55e45a2_default.png"},{"username":"OrzWTF","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15976121/medium/4c4557cbff7ff7b0503455bc59c020e0.jpeg"},{"username":"tagaishi","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png"},{"username":"azurite928","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15981895/medium/547ccc459ee123e78b5401c499f1022d.png"},{"username":"Ronner231","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16021342/medium/7734d550df2de5a2fec2ffff33e7024c.jpeg"},{"username":"ugyes","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16034148/medium/ed001e3f470a2dea9a8ce955b18e7bd5.png"},{"username":"rpieja","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16045554/medium/bd55baca2ef8b92502a760cc9ee7c505_default.png"},{"username":"flambyisyou","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16051620/medium/3a3bc0c90f6b95ab4ef74396a0a17beb.png"},{"username":"Topbcy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16077170/medium/d3aed33ea56330338756cfcd89477cfe.jpeg"},{"username":"ai5d02sb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16084674/medium/7c8119fe2a5ca71bb15f636916a42b95_default.png"},{"username":"explosiveparrot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16097722/medium/7762f80fc1da63f5b2eb87de9d640324_default.png"},{"username":"DestroyCom","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16111544/medium/83e3d3ac5c8bfed634cd1a074854db67.png"},{"username":"neotraxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16116966/medium/b30df957873329019a8a90a69f6efe3a.png"},{"username":"gzxpa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16123314/medium/487b05577310a946b0b98bc72c11213b_default.png"},{"username":"TORIK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16124732/medium/de770890e6411860ac06e8cc2dc0abd0_default.png"},{"username":"sergio.pibot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16138114/medium/80db802b2fcd6bbf19ea4c7413367dca.jpeg"},{"username":"karam-ajaj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16139838/medium/7539ab958d3c85d5f67e7849483ea8f7.jpeg"},{"username":"SimonHenz97","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16151520/medium/9b94a85b536688e2d94538c384fd0a76.png"},{"username":"olsson82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16198988/medium/eeaab4cba210c537424d4204754b604e.png"},{"username":"bo3bdo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16222806/medium/8652f3beacb6098dde5a4cd0a29fe80d.jpeg"},{"username":"AngryPlayer04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245192/medium/342715274f4dc31fd4132cdae9126188.jpeg"},{"username":"ehatamm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245884/medium/979d5e5526fe545be9bf46db481f7182.jpeg"},{"username":"Balionelis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16246058/medium/986d62ba363594c517d966fe9178dcbb.png"},{"username":"kwargs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16248816/medium/19ce11f04bf1ae2637e0483399c675f9_default.png"},{"username":"lucicu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16273892/medium/3b09e8f3bead221ef98d6a45a16851dc_default.png"},{"username":"Michael5564445","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16357688/medium/9d9026a8bf3eaccb0417da240932ebf7.png"},{"username":"Netscream","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16359198/medium/694e0c8572dc8a47e6d63da31ec5b992.png"},{"username":"belicstefan04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16368142/medium/4742dcfd7bf7ad7e33e37ac44fba7e0f.png"},{"username":"Hamad2066","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16371478/medium/f37bbc7685b6757defdbd1494236af61.jpeg"},{"username":"3ct0pl4sm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16399616/medium/ce796d1c40163975624c0a483e56374f.png"},{"username":"sanchez.marcell626","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16433865/medium/3ddde1314764cc2205ffdcd1ae719a91.png"},{"username":"Minoctis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16490079/medium/91fd0849303a4eca033d660d0a7b6854.jpeg"},{"username":"homarr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16657003/medium/3afabfd3de949a54ff5d40ad04552aba.png"},{"username":"mwgg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16658379/medium/763dd09f5c238cc5324d4d5357985292.png"},{"username":"kiwinho","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16671855/medium/bfe3a2d497dc4748a04d02e4ae2139cb.jpeg"},{"username":"tjvg4m34r13","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16679135/medium/7a483b9b0abe0d925e54808e1cb38fa0.jpeg"},{"username":"Diegoem","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16705921/medium/29ce68ebc191fc3f65499511b12de98f_default.png"},{"username":"bouks69","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16746091/medium/b58b1fc08520de416198be9df5d093eb.jpeg"},{"username":"futhgar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16748067/medium/b8c526b097f9aa9d687250cac3df16dc.jpeg"},{"username":"GrimSQL","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16764343/medium/fff729a76d1f8fbcdaee9bb0c0f5f3fd.png"},{"username":"chnikel","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767047/medium/3dda2a37e03049dafefe6697bb00f75c.png"},{"username":"yuki19870616","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767951/medium/f59c848e38382cda6c8464b0a7b9e642_default.png"},{"username":"noamdal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16782245/medium/b4a72a61f9caf138f0322c0cb987e6d0.png"},{"username":"MalithRukshan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16809057/medium/084d6a5b35fbbeacc70e7021197d222f.png"},{"username":"minirope19","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16930929/medium/e8cbbc26747e31c5a8959215e1dd067b.jpeg"},{"username":"prubin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17503492/medium/96ac87644691e49c1f983f2f094e541c_default.png"},{"username":"sam-tam-sam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17578052/medium/1628dc2954ce3ae95e0caaa2bd60ab0c.png"},{"username":"KydoxOwn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17764383/medium/0bc150a09d77f5fda43988e6342777dc.png"},{"username":"toineenzo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12371852/medium/9f1b2bedb4794c59479cd289bdba9fab.png"},{"username":"ArcaneWater","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12421105/medium/1ac82517a6c658f6b62c48aebcb17e86_default.png"},{"username":"Ascalon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12743376/medium/7845361ea1fae14e71978df906d60250.png"},{"username":"Ebedami","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12974801/medium/b596dea5c09454c4c828eac558389755.jpg"},{"username":"perrygamerptyt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13117177/medium/1406c949507ecd438480473c8a1f6124.jpg"},{"username":"SergiSvK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13320543/medium/3df3c79cc5f0c53716c559cd3fd2fc20.png"},{"username":"jeongeon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13362856/medium/eb572f72cde5e5526c517ca3a6489850_default.png"},{"username":"MrTranCFCVN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13439475/medium/a1789d69c85d90c667194b5d6a518c08_default.png"},{"username":"Tobost06","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13467449/medium/9227dc07f6366bc060d28304f5cb8ce7.jpeg"},{"username":"Kf637","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13530622/medium/118b00bb72d01d3229c97409637e25d1_default.png"},{"username":"Cruellest","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13610615/medium/2a74faa0947ee08d18f7946fb8602c1e.jpg"},{"username":"olavinto","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14424644/medium/37c01732bd2b7a272b421807a05ccfeb.png"},{"username":"OzakIOne","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14446246/medium/3abb08846344706d3a16a9fb196655ee.jpeg"},{"username":"Thario","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14491372/medium/dd5e142070802a672900121aa3f332a6_default.png"},{"username":"Wjouter","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14585620/medium/b91a51513332bdc0a0a9ecbed99ecbc3.png"},{"username":"albanobattistella","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14686194/medium/564afcfd76f5cd24751bd669cf4943aa.jpg"},{"username":"angrystar170","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14736454/medium/7a70edc6b50122877533e95a4e971203.jpeg"},{"username":"Kachelkaiser","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14763406/medium/203a781797da4a18fe0f4e7db8fd547c.png"},{"username":"regi4","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14842936/medium/f7e1d672f562a7db61ba6b4b8f4de41d.png"},{"username":"baton5129","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14891064/medium/8d438f557b82977dd02f0ead3187265f.PNG"},{"username":"legocuedy09","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15206280/medium/a93129b77a54ffbb2c9f136f18718e80.png"},{"username":"meviper","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15958903/medium/209f521ce33a05831fa8d7d1b7babc20_default.png"},{"username":"GerOriki","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16268376/medium/da00e54b08cd40348231d92873a0cd0a_default.png"},{"username":"TheRedCyclops","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16486399/medium/7f39226180120d5a9efcb8e13d8aec8e_default.png"},{"username":"dymek37","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16659221/medium/d1dc6d11d7e7fc370efc5070e837ae03.png"},{"username":"B3CKDOOR","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16744975/medium/e6c7b2d45e76465d54e6efb67c83da7d.png"},{"username":"on9686","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16768173/medium/6282fed9aafe0262a173a5ec0887e5d9_default.png"},{"username":"Larsluph","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16779933/medium/ed7d36f8b44013bad3a16ac0491bd0f7.png"},{"username":"FOEDI","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16781001/medium/6b4552fb72e359aa016f7a054078fac8.png"},{"username":"xmarkurion","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16805443/medium/34a20428427de5aaef99c7d140646803.png"},{"username":"gregid","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16806705/medium/f3c8f4a20436e8538929130142bbc104.png"},{"username":"Flameberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16820453/medium/d47be866148474c9d05fec6fbe406d88.png"},{"username":"Playfust","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16872865/medium/5f4609cc711e5fb9fa8a0b178635769c.jpeg"},{"username":"Cotignac","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16879297/medium/81ff353edf030699a159bb79cda26e84.jpg"},{"username":"LeaHun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16916375/medium/618520f0543b1e212ebc83d66b683d4b_default.png"},{"username":"jackwellerreal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16919717/medium/37bbfdc03893f141133ccc619593266d.png"},{"username":"renan.costaalencar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16938427/medium/6d25b25320c5bde734118dec4af9cd5b.png"},{"username":"andrius.cim","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16967845/medium/46028fc1a0ddfaaeebcb37b39739625d_default.png"},{"username":"xjxexrxrxyx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17041412/medium/d34d664166db6fb25579bca9ff3b50b4.jpeg"},{"username":"bilhal.fellah","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17044572/medium/d1ec6f17e4aa013e9eededc83778d2c6.png"},{"username":"the_octo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17058060/medium/7423ab3a4cabb67f5decb2e2dfa2b675_default.png"},{"username":"BamesJond","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17075846/medium/128d7ffd40254c8e376f45678e2fc620_default.png"},{"username":"Kornikus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17134240/medium/d7a42b2c30db46ff152699ca01f9e11a_default.png"},{"username":"Master3307","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17161852/medium/94ec577dd53e16b434f2aac9c34f64c6.png"},{"username":"xoxyuxu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17176526/medium/108055aa24343043de852e412bec74be.png"},{"username":"cryptodntsleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17249408/medium/b9e15aa2b24a0dbc1e4f194aa8ed5109.png"},{"username":"yaniorg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17261842/medium/7dbfc77f21c826845961243c44540d26.jpg"},{"username":"Vidariondr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17262438/medium/45fbc71be02ef27296b6f423e97b6a03_default.png"},{"username":"Fastery","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17263066/medium/701b0edc59676174863ad651528bbb37.jpeg"},{"username":"stratself","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17290388/medium/57d9d8161b3fd0abf4dc5558b4a1fa05_default.png"},{"username":"wuzeqin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17292606/medium/b9e0308410b31337e2d7aa6ed346d718_default.png"},{"username":"ChristopherBull","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17304338/medium/21a175ce596bfae81430767467908b90.jpeg"},{"username":"darkbcnlord","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17311436/medium/b271bc0b419ec3a26ddb7b63ff8ffc4b.png"},{"username":"zhoran1997","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17344028/medium/c8f450b5a8f1e9494a45dc60af7ce63e.png"},{"username":"Pakura","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17396930/medium/18602738018348bf2ffa83a78bf165e2_default.png"},{"username":"gilalves1703","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17447768/medium/3f1de562a5c2391c88bbf8d5cf40a266.png"},{"username":"iServeCloud","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17470960/medium/11649b99d609438d66455a4d2fdc70f7.png"},{"username":"guibolzantvbox","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17474136/medium/59a576e6da538664ceb972253916fa02.jpeg"},{"username":"ivann136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17506062/medium/67d09ada36fac5f444a1f7517e3a97bd_default.png"},{"username":"Maheshivara","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17516082/medium/576e1e6581cf969615b265de6aeff8b7.jpeg"},{"username":"brunogui81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17517542/medium/7c0d174e810435af518fe8e0c05e151f.jpeg"},{"username":"michelwilhelm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17542190/medium/4c6b33fd8993ff565fa75add2ce8355e.jpeg"},{"username":"dias-gxstavo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17547376/medium/8c6b109aae8aeb651192346a39ae9e5b.jpeg"},{"username":"ToxykAuBleu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17614030/medium/8d21e0608560172b121bd46126d827c7.jpeg"},{"username":"e.erdemir","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17617994/medium/7259a29db9941c6171a8cbbd643b92bd.png"},{"username":"sjonkreutz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17618306/medium/7601c45d015189a863656e21348d223b.png"},{"username":"volovich0377","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17620388/medium/c929a8fbd24f96d17620fa497ade7309.png"},{"username":"Hamstio1","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17624898/medium/406e0bf40094c24a01c3064f8f5b2a82.png"},{"username":"i3laa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17627462/medium/613a9d283ed8b69819ee181903851660.jpeg"},{"username":"bastiengrignon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17629884/medium/ddfc3339285bd65195fcd834e512e9b7.jpeg"},{"username":"kauhee","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17644600/medium/def1b9066cf9275b4273a5a5dca7f325.png"},{"username":"hongminzheng","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17683860/medium/a764f4963912777d27a7cd98e136a2b2.png"},{"username":"d-lindahl","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17726729/medium/cbde348582fbabcfadd89a56cd5a0b40.png"},{"username":"Enoal-Fauchille-Bolle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17734649/medium/6e6fb29198782dc7856ea21811db669c.jpeg"},{"username":"manos-grigorakis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17737973/medium/b37f685587c920c81fdaf9a357962434.jpeg"},{"username":"SertraFurr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17738703/medium/5f1e9f270e315ee3185cf2ccb3f5a833.png"},{"username":"Kle.Ma","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17739207/medium/b767d6093e6608f251ca152f53d359b8_default.png"},{"username":"WalkerLukas","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17744485/medium/87508ce83a9b6e5391f55883a66a054b.png"},{"username":"mtya","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17748447/medium/f574d5a770d74814f8c49ee68e00f5b7.jpeg"},{"username":"Elaktrato","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17750977/medium/f4109d379f29dc8ea2e7799ac9e208c8.png"},{"username":"marcelmeis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17753627/medium/4ba32116c27e427d3073e45713f6564e.png"},{"username":"ProKafelek12e","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17760377/medium/5199af152f1ea42cee718e7729bd41ff.png"},{"username":"zalaghi","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17763367/medium/a06f7b15222663517b58b8dc8902f8a1.png"},{"username":"Amato21","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17776775/medium/214b1f1581a85fe10f1ae3241aab43e4.png"},{"username":"jabalv","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17778347/medium/14dd47fff64f6543e6015be7373420c3.png"},{"username":"agiledivider","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17801131/medium/0039d926d5a716e712e36b06004369ab_default.png"}] \ No newline at end of file From 51a6cbe6d4282ed4eb448899701e45ddf0f1d70f Mon Sep 17 00:00:00 2001 From: "homarr-releases[bot]" <175486441+homarr-releases[bot]@users.noreply.github.com> Date: Tue, 28 Jul 2026 14:56:56 +0200 Subject: [PATCH 06/16] chore: update bug report template (#6464) --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e4fbfecc1..e41e2f3c0 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -33,6 +33,7 @@ body: options: # The below comment is used to insert a new version with on-release.yml #NEXT_VERSION# + - 1.72.0 - 1.71.0 - 1.70.0 - 1.69.2 From 3419805a49db49912e8a6c4b9c2a8e9a341330c4 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 28 Jul 2026 21:49:04 +0200 Subject: [PATCH 07/16] fix(beszel): restore balanced grid layout for Beszel System Grid widget (#6389) --- .../widgets/src/beszel-system-grid/component.tsx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/widgets/src/beszel-system-grid/component.tsx b/packages/widgets/src/beszel-system-grid/component.tsx index 51e5d014c..dd2f56c54 100644 --- a/packages/widgets/src/beszel-system-grid/component.tsx +++ b/packages/widgets/src/beszel-system-grid/component.tsx @@ -114,14 +114,22 @@ const getMaxVisibleMetrics = (cellHeight: number, size: SizeConfig): number => { return Math.max(1, Math.floor(available / size.rowHeight)); }; -const MIN_CELL_WIDTH = 180; +const MIN_CELL_WIDTH = 140; const MIN_CELL_HEIGHT = 80; -const getColCount = (width: number, height: number, itemCount: number): number => { +const getColCount = (width: number, _height: number, itemCount: number): number => { if (itemCount <= 1) return 1; const maxCols = Math.min(itemCount, Math.max(1, Math.floor(width / MIN_CELL_WIDTH))); - const aspectRatio = width / Math.max(height, MIN_CELL_HEIGHT); - return Math.min(maxCols, Math.max(1, Math.ceil(Math.sqrt(itemCount * aspectRatio)))); + + let best = 1; + for (let c = 1; c <= maxCols; c++) { + const emptyCells = (c - (itemCount % c)) % c; + const bestEmpty = (best - (itemCount % best)) % best; + if (emptyCells < bestEmpty || (emptyCells === bestEmpty && c > best)) { + best = c; + } + } + return best; }; interface MetricRowProps { From 906c9f11faa339cc30939b97609987cb2d819418 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 28 Jul 2026 21:50:09 +0200 Subject: [PATCH 08/16] feat(widgets): rework downloads widget with mantine-datatable (#6430) --- .cursor/rules/mantine-datatable-migration.mdc | 622 +++++ .../widgets/downloads/img/context-menu.png | Bin 0 -> 215381 bytes .../docs/widgets/downloads/img/screenshot.png | Bin 21574 -> 124959 bytes apps/docs/docs/widgets/downloads/index.mdx | 44 +- apps/docs/docs/widgets/downloads/index.ts | 56 +- .../qbittorrent/qbittorrent-integration.ts | 2 +- packages/old-import/src/widgets/options.ts | 7 +- packages/translation/src/lang/en.json | 35 +- packages/widgets/src/downloads/component.tsx | 2164 ++++++++++------- packages/widgets/src/downloads/index.ts | 59 +- packages/widgets/src/downloads/styles.css | 60 +- 11 files changed, 2141 insertions(+), 908 deletions(-) create mode 100644 .cursor/rules/mantine-datatable-migration.mdc create mode 100644 apps/docs/docs/widgets/downloads/img/context-menu.png diff --git a/.cursor/rules/mantine-datatable-migration.mdc b/.cursor/rules/mantine-datatable-migration.mdc new file mode 100644 index 000000000..08d2b8202 --- /dev/null +++ b/.cursor/rules/mantine-datatable-migration.mdc @@ -0,0 +1,622 @@ +# Migrating Tables from mantine-react-table to mantine-datatable + +This document captures every pattern, fix, and decision from the downloads widget rework (PR #6430). Use it as a playbook when porting other tables. + +## Migration Candidates + +Current `mantine-react-table` consumers that could be migrated: + +**Widgets (in `packages/widgets/`):** +- `docker/component.tsx` — Docker container table +- `media-server/component.tsx` — Media server sessions + +**Admin pages (in `apps/nextjs/src/app/[locale]/manage/`):** +- `tools/docker/docker-table.tsx` +- `tools/tasks/_components/tasks-table.tsx` +- `tools/api/components/api-keys.tsx` +- `users/_components/user-list.tsx` +- `users/invites/_components/invite-list.tsx` +- `tools/kubernetes/` — 8 Kubernetes resource tables + +**Modals:** +- `packages/modals-collection/src/search-engines/request-media-modal.tsx` + +**Shared hook to remove once all migrated:** +- `packages/ui/src/hooks/use-translated-mantine-react-table.ts` + +--- + +## 1. Core Migration: mantine-react-table → mantine-datatable + +### Import changes + +```typescript +// BEFORE +import { MantineReactTable, useMantineReactTable } from "mantine-react-table"; +import type { MRT_ColumnDef } from "mantine-react-table"; + +// AFTER +import { DataTable, useDataTableColumns } from "mantine-datatable"; +import type { DataTableColumn, DataTableSortStatus } from "mantine-datatable"; +``` + +### Column definition shape + +```typescript +// BEFORE (MRT) +const columns: MRT_ColumnDef[] = [ + { + accessorKey: "name", + header: "Name", + size: 200, + enableSorting: true, + Cell: ({ row }) => {row.original.name}, + }, +]; + +// AFTER (mantine-datatable) +const columns: DataTableColumn[] = [ + { + accessor: "name", // not accessorKey + title: "Name", // not header + width: 200, // not size + sortable: true, // not enableSorting + render: (record) => {record.name}, // not Cell + }, +]; +``` + +Key differences: +- `accessorKey` → `accessor` +- `header` → `title` +- `size` → `width` +- `Cell: ({ row }) =>` → `render: (record) =>` +- `enableSorting` → `sortable` +- `enableColumnActions` → does not exist (no column action menus) +- `mantineTableBodyCellProps` → `cellsStyle` in `defaultColumnProps` + +### Table component + +```typescript +// BEFORE +const table = useTranslatedMantineReactTable({ columns, data, ... }); +return ; + +// AFTER +return ( + +); +``` + +### Sorting is manual + +mantine-datatable does NOT sort for you. You must sort the data yourself: + +```typescript +const [sortStatus, setSortStatus] = useState>({ + columnAccessor: "name", + direction: "asc", +}); + +const sortedData = useMemo(() => { + const mult = sortStatus.direction === "desc" ? -1 : 1; + return [...data].toSorted((a, b) => { + const aVal = a[sortStatus.columnAccessor]; + const bVal = b[sortStatus.columnAccessor]; + if (typeof aVal === "string") return aVal.localeCompare(bVal as string) * mult; + return ((aVal as number) - (bVal as number)) * mult; + }); +}, [data, sortStatus]); + +// Pass sortedData to records, not data + +``` + +--- + +## 2. Making Tables Transparent (Widget Context) + +Widgets sit inside board cards that have user-controlled opacity. The table must be fully transparent so the card background shows through. mantine-datatable defaults to `var(--mantine-color-body)` which is opaque. + +Create a CSS file alongside the component: + +```css +/* styles.css */ +.my-table, +.my-table .mantine-datatable-table, +.my-table .mantine-datatable-table thead, +.my-table .mantine-datatable-table tbody, +.my-table .mantine-datatable-table tfoot, +.my-table th, +.my-table td { + background-color: transparent !important; +} + +.my-table .mantine-datatable-table tr { + background-color: transparent; +} + +/* Hover: translucent instead of opaque */ +.my-table .mantine-datatable-table tbody tr:hover { + background-color: color-mix(in srgb, var(--mantine-color-default-hover) 40%, transparent) !important; +} + +/* Headers: frosted glass effect */ +.my-table th { + white-space: nowrap; + background-color: color-mix(in srgb, var(--mantine-color-body) 60%, transparent) !important; + backdrop-filter: blur(8px); +} + +/* Cell overflow */ +.my-table td { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* Hide sort icon until hover */ +.my-table .mantine-datatable-header-cell-sortable-icon { + opacity: 0; + transition: opacity 150ms; +} +.my-table th:hover .mantine-datatable-header-cell-sortable-icon { + opacity: 1; +} + +/* Row expansion area */ +.my-table .mantine-datatable-row-expansion-cell { + background-color: color-mix(in srgb, var(--mantine-color-body) 40%, transparent) !important; +} +``` + +Import it: `import "./styles.css";` and apply via `className="my-table"`. + +--- + +## 3. Responsive Column Visibility + +Use a lookup table of width breakpoints instead of media queries. The widget receives `width` as a prop. + +```typescript +interface SizeConfig { + fontSize: "xs" | "sm"; + iconSize: number; + cellPadding: number; + showSpeedColumns: boolean; + showTimeColumn: boolean; + showStateColumn: boolean; +} + +const SIZE_BREAKPOINTS: { maxWidth: number; config: SizeConfig }[] = [ + { maxWidth: 300, config: { fontSize: "xs", iconSize: 12, cellPadding: 2, showSpeedColumns: false, showTimeColumn: false, showStateColumn: false } }, + { maxWidth: 500, config: { fontSize: "xs", iconSize: 14, cellPadding: 4, showSpeedColumns: false, showTimeColumn: true, showStateColumn: false } }, +]; + +const DEFAULT_SIZE_CONFIG: SizeConfig = { fontSize: "sm", iconSize: 14, cellPadding: 4, showSpeedColumns: true, showTimeColumn: true, showStateColumn: true }; + +function getSizeConfig(width: number): SizeConfig { + for (const { maxWidth, config } of SIZE_BREAKPOINTS) { + if (width < maxWidth) return config; + } + return DEFAULT_SIZE_CONFIG; +} + +// Usage: memoize it +const size = useMemo(() => getSizeConfig(width), [width]); +``` + +Then use a visibility check lookup table for columns: + +```typescript +const columnVisibilityChecks: Partial boolean>> = { + upSpeed: (ctx) => ctx.hasTorrents && ctx.size.showSpeedColumns, + downSpeed: (ctx) => ctx.size.showSpeedColumns, + time: (ctx) => ctx.size.showTimeColumn, + state: (ctx) => ctx.size.showStateColumn, +}; + +function shouldIncludeColumn(accessor: string, ctx: ColumnContext): boolean { + if (!ctx.optionsColumnSet.has(accessor)) return false; + const check = columnVisibilityChecks[accessor]; + if (check && !check(ctx)) return false; + return true; +} +``` + +--- + +## 4. Column Persistence (Drag/Resize → Server) + +`useDataTableColumns` stores column order and widths in localStorage by default. For widgets, this must persist server-side so it works across devices. + +### Hidden widget options + +In `index.ts`, add hidden text options: + +```typescript +columnOrder: factory.text({ defaultValue: "" }), +columnWidths: factory.text({ defaultValue: "" }), +``` + +With visibility override: + +```typescript +{ + columnOrder: { shouldHide: () => true }, + columnWidths: { shouldHide: () => true }, +} +``` + +### Translation keys required + +Even hidden options need translation keys or the translation test fails: + +```json +"widget.mywidget.option.columnOrder.label": "Column order", +"widget.mywidget.option.columnWidths.label": "Column widths" +``` + +### Old-import mappings + +Add to `packages/old-import/src/widgets/options.ts`: + +```typescript +columnOrder: () => undefined, +columnWidths: () => undefined, +``` + +### Dynamic storeKey + +Use a key that includes `itemId` and sorted column names. This prevents cross-widget localStorage bleeding: + +```typescript +const storeKey = `mytable-${itemId ?? "preview"}-${[...options.columns].toSorted().join(",")}`; +``` + +### Hydration from server → localStorage + +On mount, seed `useDataTableColumns` with server-persisted values. Use a `hydrated` ref to prevent the persist effect from immediately writing defaults back: + +```typescript +const { effectiveColumns, columnsOrder, columnsWidth, setColumnsOrder, setMultipleColumnWidths } = + useDataTableColumns({ key: storeKey, columns }); + +const lastStoreKey = useRef(storeKey); +const hydrated = useRef(false); + +useEffect(() => { + if (lastStoreKey.current !== storeKey) { + lastStoreKey.current = storeKey; + hydrated.current = false; + } + if (hydrated.current) return; + if (savedOrder.length > 0) setColumnsOrder(savedOrder); + if (Object.keys(savedWidths).length > 0) { + setMultipleColumnWidths( + Object.entries(savedWidths).map(([accessor, w]) => ({ accessor, width: w })), + ); + } + requestAnimationFrame(() => { hydrated.current = true; }); +}, [storeKey, savedOrder, savedWidths, setColumnsOrder, setMultipleColumnWidths]); +``` + +### Persist localStorage → server + +Watch for changes and write back: + +```typescript +const prevOrder = useRef(columnsOrder); +const prevWidths = useRef(columnsWidth); + +useEffect(() => { + if (!hydrated.current) return; + const orderChanged = JSON.stringify(columnsOrder) !== JSON.stringify(prevOrder.current); + const widthsChanged = JSON.stringify(columnsWidth) !== JSON.stringify(prevWidths.current); + prevOrder.current = columnsOrder; + prevWidths.current = columnsWidth; + + if (!orderChanged && !widthsChanged) return; + + if (orderChanged) persistOption({ columnOrder: JSON.stringify(columnsOrder) }); + if (widthsChanged) { + const widthMap: Record = {}; + for (const entry of columnsWidth) { + const key = Object.keys(entry)[0]; + if (!key) continue; + const w = entry[key as keyof typeof entry]; + if (typeof w === "number") widthMap[key] = w; + else if (typeof w === "string" && w.endsWith("px")) widthMap[key] = parseInt(w, 10); + } + persistOption({ columnWidths: JSON.stringify(widthMap) }); + } +}, [columnsOrder, columnsWidth, persistOption]); +``` + +The `persistOption` helper calls both `setOptions` (local state) and `saveItemOptions` (server mutation). + +--- + +## 5. Context Menu (Right-Click) + +Do NOT install `mantine-contextmenu`. Use Mantine's `Menu` + `Portal` directly: + +```typescript +interface ContextMenuState { + x: number; + y: number; + item: MyRow; +} + +const [contextMenu, setContextMenu] = useState(null); + +const handleContextMenu = useCallback( + ({ record, event }: { record: MyRow; event: React.MouseEvent }) => { + event.preventDefault(); + setContextMenu({ x: event.clientX, y: event.clientY, item: record }); + }, + [], +); + +// On DataTable: + + +// Render: +{contextMenu && } +``` + +The menu component uses `Portal` for correct z-index: + +```tsx +function RowContextMenu({ state, onClose }: { state: ContextMenuState; onClose: () => void }) { + return ( + + + + + + + { /* action */ onClose(); }}>Action + + + + ); +} +``` + +**Key fix:** Use `closeOnItemClick={false}` if any menu item needs a two-step confirmation (like delete → confirm). Close the menu on scroll: `onScroll={() => { if (contextMenu) closeContextMenu(); }}`. + +--- + +## 6. Row Expansion + +```typescript + , + }} +/> +``` + +**Critical:** Do NOT set `onRowClick` when using `rowExpansion` with `trigger: "click"`. They conflict and the expansion won't work. + +--- + +## 7. Common Pitfalls & Fixes + +### Status indicator dots + +Don't use `` without children — it renders a pill with empty space. Use a plain `Box`: + +```tsx + +``` + +### Tooltip overflow on long text columns + +When a column has `ellipsis: true`, the tooltip target element can still extend beyond the cell bounds if inner elements don't clip. Fix: + +```tsx + + + ... + + +``` + +Use `position="bottom-start"` instead of `position="right"` so the tooltip never escapes the widget horizontally. + +### Dark mode tooltips + +Mantine tooltips default to the theme's tooltip color which may be white in light mode and stay white in dark mode. Always set `color="dark"` on informational tooltips inside widgets. + +### Division by zero + +Guard all ratio calculations: + +```typescript +if (item.size > 0) ratio = item.sent / item.size; +if (totalDown > 0) ratio = totalUp / totalDown; +``` + +### Composite idAccessor + +When rows can come from multiple integrations, IDs may collide. Use a composite key: + +```typescript +idAccessor={(record) => `${record.integration.id}:${record.id}`} +``` + +### JSON option parsing + +Always wrap in try/catch: + +```typescript +function parseJsonOption(value: string | undefined, fallback: T): T { + if (!value) return fallback; + try { return JSON.parse(value) as T; } + catch { return fallback; } +} +``` + +### Clipboard API + +`navigator.clipboard.writeText()` can throw in non-HTTPS contexts. Always catch: + +```typescript +void navigator.clipboard.writeText(text).catch(() => {}); +``` + +### Sync sortStatus with widget options + +If the widget has configurable default sort, sync it: + +```typescript +useEffect(() => { + setSortStatus({ columnAccessor: options.defaultSort, direction: defaultSortDirection }); +}, [options.defaultSort, defaultSortDirection]); +``` + +--- + +## 8. Accessibility + +- All `ActionIcon` components need `aria-label` +- Filter toggles (client badges, status badges) need `aria-pressed={isActive}` +- `textSelectionDisabled` on DataTable prevents accidental text selection during drag/resize + +--- + +## 9. Error Handling + +- Every mutation needs an `onError` callback with `showErrorNotification` +- The `saveItemOptions` mutation (column persistence) also needs `onError` +- Check `isError` on the main query and show a fallback UI +- Use a shared `mutationOptions` object to avoid repeating `onSettled`/`onError`: + +```typescript +const mutationOptions = { + onSettled: () => void utils.myQuery.invalidate(), + onError: () => showErrorNotification({ title: t("errors.actionFailed"), message: t("errors.actionFailedMessage") }), +}; +``` + +--- + +## 10. i18n + +- No hardcoded strings. Every user-visible string goes through `useScopedI18n` +- Column titles: `t("items.{accessor}.columnTitle")` +- Detail labels: `t("items.{accessor}.detailsTitle")` +- States: `t("states.{state}")` +- Actions: `t("actions.{action}")` +- Errors: `t("errors.{errorKey}")` +- Hidden options still need `.label` translation keys + +--- + +## 11. Edit Mode + +Disable pointer events on the table during edit mode to prevent conflicts with the board's drag-and-drop: + +```typescript +let tablePointerEvents: React.CSSProperties["pointerEvents"]; +if (isEditMode) tablePointerEvents = "none"; + +let rowContextMenuHandler = handleContextMenu; +if (isEditMode) rowContextMenuHandler = undefined; + + +``` + +--- + +## 12. DataTable Props Reference (Commonly Used) + +```typescript + record.uniqueKey} + height="100%" + className="my-table" + defaultColumnProps={{ + noWrap: true, + draggable: true, + resizable: true, + cellsStyle: () => ({ padding: `${size.cellPadding}px 8px` }), + }} + scrollAreaProps={{ type: "auto", scrollbarSize: 6 }} + rowBackgroundColor={(record) => conditionalBgMap[record.state]} + onRowContextMenu={handleContextMenu} + rowExpansion={{ ... }} + onScroll={() => { if (contextMenu) closeContextMenu(); }} +/> +``` + +--- + +## 13. Layout Stability + +- Don't use `table-layout: fixed` — it fights mantine-datatable's resize logic +- Give non-name columns explicit `width` values so only the name column flexes +- Use `ellipsis: true` on the name column — it handles `text-overflow: ellipsis` internally +- Names should truncate at the cell boundary, not a character count, so the layout is stable regardless of content length +- `flexShrink: 0` on badges/icons prevents them from being squeezed by long names + +--- + +## 14. Checklist for Each Migration + +1. Replace imports (`mantine-react-table` → `mantine-datatable`) +2. Convert column definitions (`accessorKey` → `accessor`, `header` → `title`, `Cell` → `render`, etc.) +3. Implement manual sorting with `useState` + `useMemo` +4. Add CSS file for transparent backgrounds (if widget context) +5. Add responsive column visibility (if widget context) +6. Add hidden options + hydration logic (if column persistence needed) +7. Add old-import mappings for new options +8. Add translation keys (including hidden option labels) +9. Add context menu if row actions exist +10. Add row expansion if detail view exists +11. Add error handling on all mutations +12. Add accessibility attributes +13. Test at multiple widget widths +14. Update docs in `apps/docs/docs/widgets/` if applicable +15. Run `pnpm turbo typecheck` — catches old-import mismatches +16. Run translation spec — catches missing keys diff --git a/apps/docs/docs/widgets/downloads/img/context-menu.png b/apps/docs/docs/widgets/downloads/img/context-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..350051d00a3bb2d623257da215a615faab62a2c6 GIT binary patch literal 215381 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≪l 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ℜeNyNJ1!`m-yz5?u;z4VWe3PL)<%l3eC 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
    q-z`?zLe-{M1 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

    0#G&+jWBy`zSM3;Z}kf7j|#t#kaAQpO|vf^ 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 literal 21574 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 diff --git a/apps/docs/docs/widgets/downloads/index.mdx b/apps/docs/docs/widgets/downloads/index.mdx index 9242a84eb..000fd066b 100644 --- a/apps/docs/docs/widgets/downloads/index.mdx +++ b/apps/docs/docs/widgets/downloads/index.mdx @@ -4,6 +4,7 @@ description: 'Allows you to view and manage your Downloads from both Torrent and hide_title: true --- +import { aria2Integration } from '@site/docs/integrations/aria2'; import { delugeIntegration } from '@site/docs/integrations/deluge'; import { nzbgetIntegration } from '@site/docs/integrations/nzbget'; import { qBittorentIntegration } from '@site/docs/integrations/q-bittorent'; @@ -14,9 +15,6 @@ import { AddingWidget } from '@site/src/components/widgets/adding'; import { WidgetConfig } from '@site/src/components/widgets/configuration'; import { WidgetHeader } from '@site/src/components/widgets/header'; import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { IconAd } from "@tabler/icons-react"; -import TabItem from '@theme/TabItem'; -import Tabs from '@theme/Tabs'; import { downloadsWidget } from '.'; @@ -25,16 +23,37 @@ import { downloadsWidget } from '.'; categories={['Torrent client', 'Usenet client', 'Downloads']} /> -This widget displays a list of torrents or usenet-articles that are currently being downloaded, along with their progress and other relevant information. +This widget displays a list of torrents or usenet-articles that are currently being downloaded, along with their progress and other relevant information. It supports 7 download client integrations and provides a rich, responsive table interface. ### Screenshots import downloadsCard from './img/screenshot.png'; +import contextMenuImg from './img/context-menu.png';

    - downloads + Downloads widget showing torrent and usenet items
    +#### Right-click context menu + +
    + Downloads widget context menu with pause, delete, and copy actions +
    + +### Features + +- **Responsive table** — columns automatically adapt to widget width, hiding less important columns at smaller sizes +- **Sortable columns** — click any column header to sort ascending/descending +- **Column customization** — choose which columns to display via the widget options panel +- **Right-click context menu** — pause, resume, delete downloads, or copy download names directly from the context menu +- **Row expansion** — click any row to see full details inline without opening a separate modal +- **Hover tooltips** — hover a download name to see size, speeds, ETA, ratio, and category +- **Global stats bar** — toggle a summary bar showing queue progress, total size, speeds, ratio, and per-state counts +- **Client filtering** — filter downloads by integration or status using the footer filter panel +- **Global controls** — pause/resume all downloads across all clients from the footer bar +- **Status indicators** — color-coded badges show download state at a glance +- **Speed overview** — total download and upload speeds displayed in the footer + ### Supported Integrations ### Interactions -- Pause / Resume one download by clicking on the according icon. -- Delete one download by clicking on the trash icon. (Can also delete the files) -- Pause / Resume all downloads by using the bottom button. +- **Right-click** any download to open a context menu with pause/resume, delete, and copy actions +- **Click** any row to expand it and see full download details inline +- **Hover** a download name for a quick stats tooltip +- **Stats toggle** — show or hide the global stats bar from the footer +- **Pause / Resume** all downloads using the footer controls +- **Filter** by integration or status using the filter button in the footer +- **Sort** by clicking column headers (with persistent sort direction) ### Adding the widget diff --git a/apps/docs/docs/widgets/downloads/index.ts b/apps/docs/docs/widgets/downloads/index.ts index 4810aec89..4245af310 100644 --- a/apps/docs/docs/widgets/downloads/index.ts +++ b/apps/docs/docs/widgets/downloads/index.ts @@ -2,26 +2,23 @@ import { WidgetDefinition } from "@site/src/types"; import { IconDownload } from "@tabler/icons-react"; const columnsList = [ - "id", - "actions", - "added", - "category", - "downSpeed", - "index", - "integration", "name", "progress", + "size", + "downSpeed", + "upSpeed", + "time", + "state", + "added", "ratio", "received", "sent", - "size", - "state", - "time", + "category", + "integration", + "index", "type", - "upSpeed", ]; -const sortingExclusion = ["actions", "id", "state"]; -const columnsSort = columnsList.filter((column) => !sortingExclusion.some((exclusion) => exclusion === column)); +const sortColumns = columnsList.filter((c) => !["state", "category", "integration"].includes(c)); export const downloadsWidget: WidgetDefinition = { icon: IconDownload, @@ -32,25 +29,20 @@ export const downloadsWidget: WidgetDefinition = { items: [ { name: "Columns to show", - description: "Select the columns you want to display in the widget.", + description: + "Select the columns you want to display in the widget. Columns automatically hide/show based on widget width.", values: `List of columns: ${columnsList.join(", ")}`, - defaultValue: ["integration", "name", "progress", "time", "actions"].join(", "), + defaultValue: ["name", "progress", "downSpeed", "time", "state"].join(", "), }, { - name: "Enable items sorting", - description: "Enables the sorting in the table.", - values: { type: "boolean" }, - defaultValue: "no", - }, - { - name: "Column used for sorting by default", - description: "By default it will sort by this column.", - defaultValue: "type", - values: `List of columns: ${columnsSort.join(", ")}`, + name: "Default sort column", + description: "The column used for initial sorting when the widget loads.", + defaultValue: "progress", + values: `List of columns: ${sortColumns.join(", ")}`, }, { name: "Invert sorting", - description: "This will invert the sorting order of the table.", + description: "This will invert the default sorting order.", values: { type: "boolean" }, defaultValue: "no", }, @@ -76,13 +68,13 @@ export const downloadsWidget: WidgetDefinition = { name: "Hide completed torrent under this threshold (in kiB/s)", description: "This will hide completed torrent entries that have a download speed below the specified threshold.", - values: "Any number above 1, 0 to disable", + values: "Any number above 0, 0 to disable", defaultValue: "0", }, { - name: "Categories/names to filter", - description: "You can filter the items by categories or names. Use a comma to separate multiple values.", - values: "Comma-separated list of categories or names", + name: "Categories/labels to filter", + description: "You can filter the items by categories or labels. Use a comma to separate multiple values.", + values: "Comma-separated list of categories or labels", defaultValue: "-", }, { @@ -94,13 +86,13 @@ export const downloadsWidget: WidgetDefinition = { }, { name: "Use filter to calculate Ratio", - description: "This will use the filter to calculate the ratio of items shown in the widget.", + description: "This will use the category filter when calculating the global torrent ratio.", values: { type: "boolean" }, defaultValue: "yes", }, { name: "Limit items per integration", - description: "This will limit the number of items shown per integration, not globally", + description: "This will limit the number of items shown per integration, not globally.", values: "Any number above 1", defaultValue: "50", }, diff --git a/packages/integrations/src/download-client/qbittorrent/qbittorrent-integration.ts b/packages/integrations/src/download-client/qbittorrent/qbittorrent-integration.ts index edc071889..c08dd5848 100644 --- a/packages/integrations/src/download-client/qbittorrent/qbittorrent-integration.ts +++ b/packages/integrations/src/download-client/qbittorrent/qbittorrent-integration.ts @@ -30,7 +30,7 @@ export class QBitTorrentIntegration extends Integration implements IDownloadClie public async getClientJobsAndStatusAsync(input: { limit: number }): Promise { const type = "torrent"; const client = await this.getClientAsync(); - const torrents = await client.listTorrents({ limit: input.limit, sort: "progress", reverse: false }); + const torrents = await client.listTorrents({ limit: input.limit }); const rates = torrents.reduce( ({ down, up }, { dlspeed, upspeed }) => ({ down: down + dlspeed, up: up + upspeed }), { down: 0, up: 0 }, diff --git a/packages/old-import/src/widgets/options.ts b/packages/old-import/src/widgets/options.ts index 003696439..0cf84b493 100644 --- a/packages/old-import/src/widgets/options.ts +++ b/packages/old-import/src/widgets/options.ts @@ -77,15 +77,16 @@ const optionMapping: OptionMapping = { categoryFilter: (oldOptions) => ("labelFilter" in oldOptions ? oldOptions.labelFilter : undefined), filterIsWhitelist: (oldOptions) => "labelFilterIsWhitelist" in oldOptions ? oldOptions.labelFilterIsWhitelist : undefined, - enableRowSorting: (oldOptions) => ("rowSorting" in oldOptions ? oldOptions.rowSorting : undefined), showCompletedTorrent: (oldOptions) => "displayCompletedTorrents" in oldOptions ? oldOptions.displayCompletedTorrents : undefined, - columns: () => ["integration", "name", "progress", "time", "actions"], - defaultSort: () => "type", + columns: () => ["integration", "name", "progress", "time", "state"], + defaultSort: () => "progress", descendingDefaultSort: () => false, showCompletedUsenet: () => true, showCompletedHttp: () => true, limitPerIntegration: () => undefined, + columnOrder: () => undefined, + columnWidths: () => undefined, }, weather: { forecastDayCount: (oldOptions) => oldOptions.forecastDays, diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index 681166967..388dc4186 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -3079,11 +3079,20 @@ "limitPerIntegration": { "label": "Limit items per integration", "description": "This will limit the number of items shown per integration, not globally" + }, + "columnOrder": { + "label": "Column order" + }, + "columnWidths": { + "label": "Column widths" } }, "errors": { "noColumns": "Select Columns in Items", - "noCommunications": "Can't load data from integration" + "noCommunications": "Can't load data from integration", + "noItems": "No downloads found", + "actionFailed": "Action failed", + "actionFailedMessage": "The action could not be completed. Please try again." }, "items": { "actions": { @@ -3106,7 +3115,8 @@ "detailsTitle": "Current index within client" }, "id": { - "columnTitle": "Id" + "columnTitle": "Id", + "detailsTitle": "Item ID" }, "integration": { "columnTitle": "Integration" @@ -3140,7 +3150,8 @@ }, "time": { "columnTitle": "Finish time", - "detailsTitle": "Time since/to completion" + "detailsTitle": "Time since/to completion", + "eta": "ETA" }, "type": { "columnTitle": "Type", @@ -3184,7 +3195,23 @@ } } }, - "globalRatio": "Global Ratio" + "globalRatio": "Global Ratio", + "contextMenu": { + "copyName": "Copy name", + "copyId": "Copy ID", + "clearFilters": "Clear filters" + }, + "footer": { + "filter": "Filter downloads" + }, + "stats": { + "show": "Show global stats", + "hide": "Hide global stats", + "overallProgress": "Overall queue progress", + "totalSize": "Total queue size", + "clients": "{count, plural, one {# client} other {# clients}}" + }, + "disconnected": "(disconnected)" }, "mediaReleases": { "name": "Media releases", diff --git a/packages/widgets/src/downloads/component.tsx b/packages/widgets/src/downloads/component.tsx index ff9b71664..e03c937bf 100644 --- a/packages/widgets/src/downloads/component.tsx +++ b/packages/widgets/src/downloads/component.tsx @@ -3,922 +3,1444 @@ import "../widgets-common.css"; import "./styles.css"; -import { useCallback, useMemo, useState } from "react"; -import type { MantineStyleProp } from "@mantine/core"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { ActionIcon, Avatar, - AvatarGroup, - Button, + Badge, + Box, Center, - Chip, Divider, Group, - Modal, - Paper, - Popover, + Menu, + Portal, Progress, - Space, + RingProgress, + SimpleGrid, Stack, Text, - Title, Tooltip, + UnstyledButton, } from "@mantine/core"; import { useDisclosure } from "@mantine/hooks"; import { - IconAlertTriangle, - IconCirclesRelation, + IconChevronDown, + IconChevronUp, + IconCopy, + IconDatabase, + IconDownload, IconFilter, - IconInfinity, + IconFilterOff, IconInfoCircle, IconPlayerPause, IconPlayerPlay, IconTrash, - IconX, + IconTrashX, + IconUpload, } from "@tabler/icons-react"; import dayjs from "dayjs"; import relativeTime from "dayjs/plugin/relativeTime"; -import type { MRT_ColumnDef, MRT_VisibilityState } from "mantine-react-table"; -import { MantineReactTable, useMantineReactTable } from "mantine-react-table"; +import type { DataTableColumn, DataTableSortStatus } from "mantine-datatable"; +import { DataTable, useDataTableColumns } from "mantine-datatable"; import { clientApi } from "@homarr/api/client"; import { useIntegrationsWithInteractAccess } from "@homarr/auth/client"; import { formatByteRate, formatBytes, useIntegrationConnected } from "@homarr/common"; import { getIconUrl, getIntegrationKindsByCategory } from "@homarr/definitions"; import type { ExtendedClientStatus, ExtendedDownloadClientItem } from "@homarr/integrations"; +import { showErrorNotification } from "@homarr/notifications"; import { useScopedI18n } from "@homarr/translation/client"; import type { WidgetComponentProps } from "../definition"; dayjs.extend(relativeTime); -interface QuickFilter { - integrationKinds: string[]; - statuses: ExtendedDownloadClientItem["state"][]; +type DownloadsT = ReturnType>; +type DownloadState = ExtendedDownloadClientItem["state"]; + +interface SizeConfig { + fontSize: "xs" | "sm"; + iconSize: number; + cellPadding: number; + showSpeedColumns: boolean; + showTimeColumn: boolean; + showStateColumn: boolean; } -//Ratio table for relative width between columns -const columnsRatios: Record = { - actions: 2, - added: 4, - category: 1, - downSpeed: 3, - id: 1, - index: 1, - integration: 1, - name: 16, - progress: 6, - ratio: 2, - received: 3, - sent: 3, - size: 3, - state: 3, - time: 4, - type: 2, - upSpeed: 3, +interface ContextMenuState { + x: number; + y: number; + item: ExtendedDownloadClientItem; +} + +interface ColumnContext { + optionsColumnSet: Set; + hasTorrents: boolean; + hasMultipleClients: boolean; + hasMultipleTypes: boolean; + size: SizeConfig; +} + +const SIZE_BREAKPOINTS: { maxWidth: number; config: SizeConfig }[] = [ + { + maxWidth: 300, + config: { + fontSize: "xs", + iconSize: 12, + cellPadding: 2, + showSpeedColumns: false, + showTimeColumn: false, + showStateColumn: false, + }, + }, + { + maxWidth: 500, + config: { + fontSize: "xs", + iconSize: 14, + cellPadding: 4, + showSpeedColumns: false, + showTimeColumn: true, + showStateColumn: false, + }, + }, +]; + +const DEFAULT_SIZE_CONFIG: SizeConfig = { + fontSize: "sm", + iconSize: 14, + cellPadding: 4, + showSpeedColumns: true, + showTimeColumn: true, + showStateColumn: true, }; +const stateColorMap: Record = { + downloading: "blue", + leeching: "blue", + seeding: "green", + completed: "green", + processing: "cyan", + queued: "gray", + paused: "yellow", + stalled: "orange", + failed: "red", + unknown: "gray", +}; + +const rowBgAlpha: Partial> = { + failed: "rgba(255, 0, 0, 0.04)", + paused: "rgba(255, 200, 0, 0.03)", +}; + +const columnVisibilityChecks: Partial boolean>> = { + upSpeed: (ctx) => ctx.hasTorrents && ctx.size.showSpeedColumns, + ratio: (ctx) => ctx.hasTorrents, + sent: (ctx) => ctx.hasTorrents, + integration: (ctx) => ctx.hasMultipleClients, + type: (ctx) => ctx.hasMultipleTypes, + downSpeed: (ctx) => ctx.size.showSpeedColumns, + time: (ctx) => ctx.size.showTimeColumn, + state: (ctx) => ctx.size.showStateColumn, +}; + +const speedColumnConfig = { + down: { Icon: IconDownload, color: "blue" as const }, + up: { Icon: IconUpload, color: "green" as const }, +} as const; + +function getSizeConfig(width: number): SizeConfig { + for (const { maxWidth, config } of SIZE_BREAKPOINTS) { + if (width < maxWidth) return config; + } + return DEFAULT_SIZE_CONFIG; +} + +function progressColor(state: DownloadState, progress: number): string { + if (state === "paused") return "yellow"; + if (progress >= 1) return "green"; + return "blue"; +} + +function parseJsonOption(value: string | undefined, fallback: T): T { + if (!value) return fallback; + try { + return JSON.parse(value) as T; + } catch { + return fallback; + } +} + +function toCategoryArray(category: string | string[]): string[] { + if (Array.isArray(category)) return category; + return [category]; +} + +function matchesCategoryFilter( + category: string | string[] | undefined, + categoryFilter: string[], + filterIsWhitelist: boolean, +): boolean { + if (categoryFilter.length === 0) return true; + const matches = categoryFilter.some((filter) => toCategoryArray(category ?? "").includes(filter)); + return filterIsWhitelist === matches; +} + +function formatCategoryDisplay(category: string | string[] | undefined): string | undefined { + if (!category) return undefined; + if (Array.isArray(category)) return category.join(", "); + return category; +} + +function formatRatio(ratio: number): string { + if (ratio >= 100) return ratio.toFixed(0); + if (ratio >= 10) return ratio.toFixed(1); + return ratio.toFixed(2); +} + +function showCompletedItem( + item: Pick, + options: WidgetComponentProps<"downloads">["options"], +): boolean { + if (item.progress < 1) return true; + if (item.type === "torrent") { + return options.showCompletedTorrent && (item.upSpeed ?? 0) >= Number(options.activeTorrentThreshold) * 1024; + } + if (item.type === "usenet") return options.showCompletedUsenet; + return options.showCompletedHttp; +} + +function shouldIncludeColumn(accessor: string, ctx: ColumnContext): boolean { + if (!ctx.optionsColumnSet.has(accessor)) return false; + const check = columnVisibilityChecks[accessor]; + if (check && !check(ctx)) return false; + return true; +} + +function toggleArrayItem(array: T[], value: T): T[] { + if (array.includes(value)) return array.filter((entry) => entry !== value); + return [...array, value]; +} + +function truncateText(text: string, maxLength: number): string { + if (text.length <= maxLength) return text; + return `${text.slice(0, maxLength)}…`; +} + +function getSortMultiplier(direction: DataTableSortStatus["direction"]): number { + if (direction === "desc") return -1; + return 1; +} + +function compareSortValues( + accessor: keyof ExtendedDownloadClientItem, + aVal: ExtendedDownloadClientItem[keyof ExtendedDownloadClientItem], + bVal: ExtendedDownloadClientItem[keyof ExtendedDownloadClientItem], + multiplier: number, +): number { + if (accessor === "time") { + let aTime = aVal as number; + let bTime = bVal as number; + if (aTime === 0) aTime = Infinity; + if (bTime === 0) bTime = Infinity; + return (aTime - bTime) * multiplier; + } + if (typeof aVal === "string" && typeof bVal === "string") return aVal.localeCompare(bVal) * multiplier; + if (typeof aVal === "number" && typeof bVal === "number") return (aVal - bVal) * multiplier; + return 0; +} + +function buildProgressTooltip(record: ExtendedDownloadClientItem): string { + const parts = [`${formatBytes(record.received)} / ${formatBytes(record.size)}`]; + if (record.downSpeed) parts.push(`↓ ${formatByteRate(record.downSpeed)}`); + if (record.time !== 0) parts.push(`ETA: ${dayjs().add(record.time, "milliseconds").fromNow(true)}`); + return parts.join(" · "); +} + +function SpeedCell({ + speed, + fontSize, + direction, +}: { + speed: number | undefined; + fontSize: SizeConfig["fontSize"]; + direction: keyof typeof speedColumnConfig; +}) { + if (!speed) return null; + const { Icon, color } = speedColumnConfig[direction]; + return ( + + + + {formatByteRate(speed)} + + + ); +} + export default function DownloadClientsWidget({ isEditMode, integrationIds, options, setOptions, + boardId, + itemId, + width, }: WidgetComponentProps<"downloads">) { - const integrationsWithInteractions = useIntegrationsWithInteractAccess().flatMap(({ id }) => - integrationIds.includes(id) ? [id] : [], + const allInteractAccess = useIntegrationsWithInteractAccess(); + const integrationInteractSet = useMemo( + () => new Set(allInteractAccess.filter(({ id }) => integrationIds.includes(id)).map(({ id }) => id)), + [allInteractAccess, integrationIds], ); - const { data: currentItems = [] } = clientApi.widget.downloads.getJobsAndStatuses.useQuery({ + const { + data: currentItems = [], + isFetching, + isError, + } = clientApi.widget.downloads.getJobsAndStatuses.useQuery({ integrationIds, limitPerIntegration: options.limitPerIntegration, }); const t = useScopedI18n("widget.downloads"); - const tCommon = useScopedI18n("common"); - //Item modal state and selection - const [clickedIndex, setClickedIndex] = useState(0); - const [opened, { open, close }] = useDisclosure(false); - - //User quick settings for filters - const [quickFilters, setQuickFilters] = useState({ integrationKinds: [], statuses: [] }); - const availableStatuses = useMemo(() => { - //Redefine list of available statuses from current items - const statuses = Array.from(new Set(currentItems.flatMap(({ data }) => data.items.map(({ state }) => state)))); - //Reset user filters accordingly to remove unavailable statuses - setQuickFilters(({ integrationKinds: names, statuses: prevStatuses }) => { - return { integrationKinds: names, statuses: prevStatuses.filter((status) => statuses.includes(status)) }; - }); - return statuses; - }, [currentItems]); + const [clientFilter, setClientFilter] = useState([]); + const [statusFilter, setStatusFilter] = useState([]); + const [contextMenu, setContextMenu] = useState(null); + const [showStats, { toggle: toggleStats }] = useDisclosure(false); const utils = clientApi.useUtils(); - const invalidateDownloads = { onSettled: () => void utils.widget.downloads.getJobsAndStatuses.invalidate() }; - const { mutate: mutateResumeItem } = clientApi.widget.downloads.resumeItem.useMutation(invalidateDownloads); - const { mutate: mutatePauseItem } = clientApi.widget.downloads.pauseItem.useMutation(invalidateDownloads); - const { mutate: mutateDeleteItem } = clientApi.widget.downloads.deleteItem.useMutation(invalidateDownloads); - - //Flatten Data array for which each element has its integration, data (base + calculated) and actions - const data = useMemo( - () => - currentItems - //Insure it is only using selected integrations - .filter(({ integration }) => integrationIds.includes(integration.id)) - //Construct normalized items list - .flatMap((pair) => - //Apply user white/black list - pair.data.items - .filter( - ({ category }) => - options.filterIsWhitelist === - options.categoryFilter.some((filter) => - (Array.isArray(category) ? category : [category]).includes(filter), - ), - ) - //Filter completed items following widget option - .filter( - ({ type, progress, upSpeed }) => - (type === "torrent" && - ((progress === 1 && - options.showCompletedTorrent && - (upSpeed ?? 0) >= Number(options.activeTorrentThreshold) * 1024) || - progress !== 1)) || - (type === "usenet" && ((progress === 1 && options.showCompletedUsenet) || progress !== 1)) || - (type === "miscellaneous" && ((progress === 1 && options.showCompletedHttp) || progress !== 1)), - ) - //Filter following user quick setting - .filter( - ({ state }) => - (quickFilters.integrationKinds.length === 0 || - quickFilters.integrationKinds.includes(pair.integration.name)) && - (quickFilters.statuses.length === 0 || quickFilters.statuses.includes(state)), - ) - //Add extrapolated data and actions if user is allowed interaction - .map((item): ExtendedDownloadClientItem => { - const received = item.received ?? Math.floor(item.size * item.progress); - const integrationIds = [pair.integration.id]; - return { - integration: pair.integration, - ...item, - category: item.category !== undefined && item.category.length > 0 ? item.category : undefined, - received, - ratio: item.sent !== undefined ? item.sent / item.size : undefined, - //Only add if permission to use mutations - actions: integrationsWithInteractions.includes(pair.integration.id) - ? { - resume: () => mutateResumeItem({ integrationIds, item }), - pause: () => mutatePauseItem({ integrationIds, item }), - delete: ({ fromDisk }) => mutateDeleteItem({ integrationIds, item, fromDisk }), - } - : undefined, - }; - }), - ) - //flatMap already sorts by integration by nature, add sorting by integration type (usenet | torrent) - .sort(({ type: typeA }, { type: typeB }) => typeA.length - typeB.length), - [ - currentItems, - integrationIds, - integrationsWithInteractions, - mutateDeleteItem, - mutatePauseItem, - mutateResumeItem, - options.activeTorrentThreshold, - options.categoryFilter, - options.filterIsWhitelist, - options.showCompletedTorrent, - options.showCompletedUsenet, - options.showCompletedHttp, - quickFilters, - ], - ); - - //Flatten Clients Array for which each elements has the integration and general client infos. - const clients = useMemo( - () => - currentItems - .filter(({ integration }) => integrationIds.includes(integration.id)) - .flatMap(({ integration, data }): ExtendedClientStatus => { - const interact = integrationsWithInteractions.includes(integration.id); - const isTorrent = getIntegrationKindsByCategory("torrent").some((kind) => kind === integration.kind); - /** Derived from current items */ - const { totalUp, totalDown } = data.items - .filter( - ({ category }) => - !options.applyFilterToRatio || - !data.status.types.includes("torrent") || - options.filterIsWhitelist === - options.categoryFilter.some((filter) => - (Array.isArray(category) ? category : [category]).includes(filter), - ), - ) - .reduce( - ({ totalUp, totalDown }, { sent, size, progress }) => ({ - totalUp: isTorrent ? (totalUp ?? 0) + (sent ?? 0) : undefined, - totalDown: totalDown + size * progress, - }), - { totalDown: 0, totalUp: isTorrent ? 0 : undefined }, - ); - return { - integration, - interact, - status: { - totalUp, - totalDown, - ratio: totalUp === undefined ? undefined : totalUp / totalDown, - ...data.status, - }, - }; - }) - .sort( - ({ status: statusA }, { status: statusB }) => - (statusA?.types.length ?? Infinity) - (statusB?.types.length ?? Infinity), - ), - [ - currentItems, - integrationIds, - integrationsWithInteractions, - options.applyFilterToRatio, - options.categoryFilter, - options.filterIsWhitelist, - ], - ); - - //Check existing types between torrents and usenet - const integrationTypes: ExtendedDownloadClientItem["type"][] = []; - - if (data.some(({ type }) => type === "torrent")) integrationTypes.push("torrent"); - if (data.some(({ type }) => type === "usenet")) integrationTypes.push("usenet"); - if (data.some(({ type }) => type === "miscellaneous")) integrationTypes.push("miscellaneous"); - - //Set the visibility of columns depending on widget settings and available data/integrations. - const columnVisibility: MRT_VisibilityState = { - id: options.columns.includes("id"), - actions: options.columns.includes("actions") && integrationsWithInteractions.length > 0, - added: options.columns.includes("added"), - category: options.columns.includes("category"), - downSpeed: options.columns.includes("downSpeed"), - index: options.columns.includes("index"), - integration: options.columns.includes("integration") && clients.length > 1, - name: options.columns.includes("name"), - progress: options.columns.includes("progress"), - ratio: options.columns.includes("ratio") && integrationTypes.includes("torrent"), - received: options.columns.includes("received"), - sent: options.columns.includes("sent") && integrationTypes.includes("torrent"), - size: options.columns.includes("size"), - state: options.columns.includes("state"), - time: options.columns.includes("time"), - type: options.columns.includes("type") && integrationTypes.length > 1, - upSpeed: options.columns.includes("upSpeed") && integrationTypes.includes("torrent"), - } satisfies Record; - - //Default styling behavior for stopping interaction when editing. (Applied everywhere except the table header) - const editStyle: MantineStyleProp = { - pointerEvents: isEditMode ? "none" : undefined, + const mutationOptions = { + onSettled: () => void utils.widget.downloads.getJobsAndStatuses.invalidate(), + onError: () => showErrorNotification({ title: t("errors.actionFailed"), message: t("errors.actionFailedMessage") }), }; + const { mutate: mutateResumeItem } = clientApi.widget.downloads.resumeItem.useMutation(mutationOptions); + const { mutate: mutatePauseItem } = clientApi.widget.downloads.pauseItem.useMutation(mutationOptions); + const { mutate: mutateDeleteItem } = clientApi.widget.downloads.deleteItem.useMutation(mutationOptions); + const { mutate: mutateResumeQueue } = clientApi.widget.downloads.resume.useMutation(mutationOptions); + const { mutate: mutatePauseQueue } = clientApi.widget.downloads.pause.useMutation(mutationOptions); - //Base element in common with all columns - const columnsDefBase = useCallback( - ({ - key, - showHeader, - }: { - key: keyof ExtendedDownloadClientItem; - showHeader: boolean; - }): MRT_ColumnDef => { - return { - id: key, - accessorKey: key, - header: key, - size: columnsRatios[key], - Header: () => - showHeader ? ( - - {t(`items.${key}.columnTitle`)} - - ) : null, - }; - }, - [t], - ); - - //Make columns and cell elements, Memoized to data with deps on data and EditMode - const columns = useMemo[]>( - () => [ - { - ...columnsDefBase({ key: "actions", showHeader: false }), - enableSorting: false, - Cell: ({ cell, row }) => { - const actions = cell.getValue(); - const pausedAction = row.original.state === "paused" ? "resume" : "pause"; - const [opened, { open, close }] = useDisclosure(false); - - return actions ? ( - - - - {pausedAction === "resume" ? : } - - - - - - - - - - - - - - - - ) : ( - - - - ); - }, - }, - { - ...columnsDefBase({ key: "added", showHeader: true }), - sortUndefined: "last", - Cell: ({ cell }) => { - const added = cell.getValue(); - return {added !== undefined ? dayjs(added).fromNow() : "unknown"}; - }, - }, - { - ...columnsDefBase({ key: "category", showHeader: false }), - sortUndefined: "last", - Cell: ({ cell }) => { - const category = cell.getValue(); - return ( - category !== undefined && ( - - - - ) - ); - }, - }, - { - ...columnsDefBase({ key: "downSpeed", showHeader: true }), - sortUndefined: "last", - Cell: ({ cell }) => { - const downSpeed = cell.getValue(); - return downSpeed ? {formatByteRate(downSpeed)} : null; - }, - }, - { - ...columnsDefBase({ key: "id", showHeader: false }), - enableSorting: false, - Cell: ({ cell }) => { - const id = cell.getValue(); - return ( - - - - ); - }, - }, - { - ...columnsDefBase({ key: "index", showHeader: true }), - Cell: ({ cell }) => { - const index = cell.getValue(); - return {index}; - }, - }, - { - ...columnsDefBase({ key: "integration", showHeader: false }), - Cell: ({ cell }) => { - const integration = cell.getValue(); - return ( - - - - ); - }, - }, - { - ...columnsDefBase({ key: "name", showHeader: true }), - Cell: ({ cell }) => { - const name = cell.getValue(); - return ( - - {name} - - ); - }, - }, - { - ...columnsDefBase({ key: "progress", showHeader: true }), - Cell: ({ cell, row }) => { - const progress = cell.getValue(); - return ( - - - {new Intl.NumberFormat("en", { - style: "percent", - notation: "compact", - unitDisplay: "narrow", - roundingMode: "floor", - }).format(progress)} - - - - ); - }, - }, - { - ...columnsDefBase({ key: "ratio", showHeader: true }), - sortUndefined: "last", - Cell: ({ cell }) => { - const ratio = cell.getValue(); - return ratio !== undefined && {ratio.toFixed(ratio >= 100 ? 0 : ratio >= 10 ? 1 : 2)}; - }, - }, - { - ...columnsDefBase({ key: "received", showHeader: true }), - Cell: ({ cell }) => { - const received = cell.getValue(); - return {formatBytes(received)}; - }, - }, - { - ...columnsDefBase({ key: "sent", showHeader: true }), - sortUndefined: "last", - Cell: ({ cell }) => { - const sent = cell.getValue(); - return sent && {formatBytes(sent)}; - }, - }, - { - ...columnsDefBase({ key: "size", showHeader: true }), - Cell: ({ cell }) => { - const size = cell.getValue(); - return {formatBytes(size)}; - }, - }, - { - ...columnsDefBase({ key: "state", showHeader: true }), - enableSorting: false, - Cell: ({ cell }) => { - const state = cell.getValue(); - return {t(`states.${state}`)}; - }, - }, - { - ...columnsDefBase({ key: "time", showHeader: true }), - sortingFn: (rowA, rowB) => { - const timeA = rowA.getValue("time"); - const timeB = rowB.getValue("time"); - // Map time values to canonical sort keys: - // positive = ETA in ms (sort as-is, smaller = sooner) - // 0 = stalled/infinite (sort last in ascending = Infinity) - // negative = time since completion in ms (sort first in ascending = very negative) - const toSortKey = (time: number) => (time === 0 ? Infinity : time); - return toSortKey(timeA) - toSortKey(timeB); - }, - Cell: ({ cell }) => { - const time = cell.getValue(); - return time === 0 ? : {dayjs().add(time).fromNow()}; - }, - }, - { - ...columnsDefBase({ key: "type", showHeader: true }), - Cell: ({ cell }) => { - const type = cell.getValue(); - return {type}; - }, - }, - { - ...columnsDefBase({ key: "upSpeed", showHeader: true }), - sortUndefined: "last", - Cell: ({ cell }) => { - const upSpeed = cell.getValue(); - return upSpeed && {formatByteRate(upSpeed)}; - }, - }, - ], - [columnsDefBase, t, tCommon], - ); - - //Table build and config - const table = useMantineReactTable({ - columns, - data, - enablePagination: false, - enableTopToolbar: false, - enableBottomToolbar: false, - enableColumnActions: false, - enableSorting: options.enableRowSorting && !isEditMode, - enableMultiSort: true, - enableStickyHeader: false, - enableColumnOrdering: isEditMode, - enableRowVirtualization: true, - rowVirtualizerOptions: { overscan: 5 }, - mantinePaperProps: { flex: 1, withBorder: false, shadow: undefined, bg: "transparent" }, - mantineTableContainerProps: { style: { height: "100%" } }, - mantineTableProps: { - className: "downloads-widget-table", - }, - mantineTableBodyProps: { style: editStyle }, - mantineTableHeadCellProps: { - p: 4, - }, - mantineTableBodyCellProps: ({ cell, row }) => ({ - onClick: () => { - setClickedIndex(row.index); - if (cell.column.id !== "actions") open(); - }, - p: 4, - }), - onColumnOrderChange: (order) => { - //Order has a tendency to add the disabled column at the end of the the real ordered array - const columnOrder = (order as typeof options.columns).filter((column) => options.columns.includes(column)); - setOptions({ newOptions: { columns: columnOrder } }); - }, - initialState: { - sorting: [{ id: options.defaultSort, desc: options.descendingDefaultSort }], - columnVisibility: { - actions: false, - added: false, - category: false, - downSpeed: false, - id: false, - index: false, - integration: false, - name: false, - progress: false, - ratio: false, - received: false, - sent: false, - size: false, - state: false, - time: false, - type: false, - upSpeed: false, - } satisfies Record, - columnOrder: options.columns, - }, - state: { - columnVisibility, - columnOrder: options.columns, - }, + const { mutate: saveItemOptions } = clientApi.widget.options.saveItemOptions.useMutation({ + onError: () => showErrorNotification({ title: t("errors.actionFailed"), message: t("errors.actionFailedMessage") }), }); + const persistOption = useCallback( + (newOptions: Partial>) => { + setOptions({ newOptions }); + if (boardId && itemId) saveItemOptions({ boardId, itemId, newOptions }); + }, + [setOptions, boardId, itemId, saveItemOptions], + ); - //Used for Global Torrent Ratio - const globalTraffic = clients - .filter(({ integration: { kind } }) => - getIntegrationKindsByCategory("torrent").some((integrationKind) => integrationKind === kind), - ) - .reduce( - ({ up, down }, { status }) => ({ - up: up + (status?.totalUp ?? 0), - down: down + (status?.totalDown ?? 0), - }), - { up: 0, down: 0 }, - ); + const savedOrder = useMemo(() => parseJsonOption(options.columnOrder, [] as string[]), [options.columnOrder]); + const savedWidths = useMemo( + () => parseJsonOption(options.columnWidths, {} as Record), + [options.columnWidths], + ); - if (options.columns.length === 0) + let defaultSortDirection: DataTableSortStatus["direction"] = "asc"; + if (options.descendingDefaultSort) defaultSortDirection = "desc"; + const [sortStatus, setSortStatus] = useState>({ + columnAccessor: options.defaultSort, + direction: defaultSortDirection, + }); + useEffect(() => { + setSortStatus({ columnAccessor: options.defaultSort, direction: defaultSortDirection }); + }, [options.defaultSort, defaultSortDirection]); + + const data = useMemo(() => { + return currentItems + .filter(({ integration }) => integrationIds.includes(integration.id)) + .flatMap((pair) => + pair.data.items + .filter(({ category }) => matchesCategoryFilter(category, options.categoryFilter, options.filterIsWhitelist)) + .filter((item) => showCompletedItem(item, options)) + .filter( + ({ state }) => + (clientFilter.length === 0 || clientFilter.includes(pair.integration.id)) && + (statusFilter.length === 0 || statusFilter.includes(state)), + ) + .map((item): ExtendedDownloadClientItem => { + const received = item.received ?? Math.floor(item.size * item.progress); + const ids = [pair.integration.id]; + let category: string | string[] | undefined = item.category; + if (category !== undefined && category.length === 0) category = undefined; + + let ratio: number | undefined; + if (item.sent !== undefined && item.size > 0) ratio = item.sent / item.size; + + let actions: ExtendedDownloadClientItem["actions"]; + if (integrationInteractSet.has(pair.integration.id)) { + actions = { + resume: () => mutateResumeItem({ integrationIds: ids, item }), + pause: () => mutatePauseItem({ integrationIds: ids, item }), + delete: ({ fromDisk }) => mutateDeleteItem({ integrationIds: ids, item, fromDisk }), + }; + } + + return { integration: pair.integration, ...item, category, received, ratio, actions }; + }), + ); + }, [ + currentItems, + integrationIds, + integrationInteractSet, + mutateDeleteItem, + mutatePauseItem, + mutateResumeItem, + options, + clientFilter, + statusFilter, + ]); + + const sortedData = useMemo(() => { + const accessor = sortStatus.columnAccessor as keyof ExtendedDownloadClientItem; + const multiplier = getSortMultiplier(sortStatus.direction); + return [...data].toSorted((a, b) => { + const aVal = a[accessor] ?? 0; + const bVal = b[accessor] ?? 0; + return compareSortValues(accessor, aVal, bVal, multiplier); + }); + }, [data, sortStatus]); + + const clients = useMemo(() => { + return currentItems + .filter(({ integration }) => integrationIds.includes(integration.id)) + .map(({ integration, data: clientData }): ExtendedClientStatus => { + const interact = integrationInteractSet.has(integration.id); + const isTorrent = getIntegrationKindsByCategory("torrent").some((kind) => kind === integration.kind); + const applyRatioFilter = options.applyFilterToRatio && clientData.status.types.includes("torrent"); + + let initialTotalUp: number | undefined; + if (isTorrent) initialTotalUp = 0; + + const { totalUp, totalDown } = clientData.items + .filter(({ category }) => { + if (!applyRatioFilter) return true; + return matchesCategoryFilter(category, options.categoryFilter, options.filterIsWhitelist); + }) + .reduce( + (acc, { sent, size, progress }) => { + let nextTotalUp: number | undefined; + if (isTorrent) nextTotalUp = (acc.totalUp ?? 0) + (sent ?? 0); + return { + totalUp: nextTotalUp, + totalDown: acc.totalDown + size * progress, + }; + }, + { totalDown: 0, totalUp: initialTotalUp }, + ); + + let ratio: number | undefined; + if (totalUp !== undefined && totalDown !== 0) ratio = totalUp / totalDown; + + return { + integration, + interact, + status: { totalUp, totalDown, ratio, ...clientData.status }, + }; + }); + }, [ + currentItems, + integrationIds, + integrationInteractSet, + options.applyFilterToRatio, + options.categoryFilter, + options.filterIsWhitelist, + ]); + + const hasTorrents = data.some(({ type }) => type === "torrent"); + const hasMultipleClients = clients.length > 1; + const hasMultipleTypes = new Set(data.map(({ type }) => type)).size > 1; + + const size = useMemo(() => getSizeConfig(width), [width]); + const optionsColumnSet = useMemo(() => new Set(options.columns), [options.columns]); + const columnContext = useMemo( + () => ({ optionsColumnSet, hasTorrents, hasMultipleClients, hasMultipleTypes, size }), + [optionsColumnSet, hasTorrents, hasMultipleClients, hasMultipleTypes, size], + ); + + let progressColumnWidth = 120; + if (width < 400) progressColumnWidth = 80; + + const columns = useMemo((): DataTableColumn[] => { + const includeColumn = (accessor: string) => shouldIncludeColumn(accessor, columnContext); + const cols: (DataTableColumn | false)[] = [ + includeColumn("integration") && { + accessor: "integration", + title: "", + width: 36, + render: (record) => ( + + + + ), + }, + includeColumn("name") && { + accessor: "name", + title: t("items.name.columnTitle"), + sortable: true, + ellipsis: true, + render: (record) => ( + + + + + {record.name} + + + + ), + }, + includeColumn("progress") && { + accessor: "progress", + title: t("items.progress.columnTitle"), + sortable: true, + width: progressColumnWidth, + render: (record) => { + const pct = Math.floor(record.progress * 100); + return ( + + + + {`${pct}%`} + + + + + ); + }, + }, + includeColumn("size") && { + accessor: "size", + title: t("items.size.columnTitle"), + sortable: true, + width: 80, + noWrap: true, + render: (record) => {formatBytes(record.size)}, + }, + includeColumn("downSpeed") && { + accessor: "downSpeed", + title: t("items.downSpeed.columnTitle"), + sortable: true, + width: 90, + noWrap: true, + render: (record) => , + }, + includeColumn("upSpeed") && { + accessor: "upSpeed", + title: t("items.upSpeed.columnTitle"), + sortable: true, + width: 90, + noWrap: true, + render: (record) => , + }, + includeColumn("time") && { + accessor: "time", + title: t("items.time.columnTitle"), + sortable: true, + width: 100, + noWrap: true, + render: (record) => { + if (record.time === 0) + return ( + + ∞ + + ); + return {dayjs().add(record.time, "milliseconds").fromNow(true)}; + }, + }, + includeColumn("state") && { + accessor: "state", + title: t("items.state.columnTitle"), + width: 90, + render: (record) => ( + + {t(`states.${record.state}`)} + + ), + }, + includeColumn("added") && { + accessor: "added", + title: t("items.added.columnTitle"), + sortable: true, + width: 90, + noWrap: true, + render: (record) => { + if (!record.added) return —; + return {dayjs(record.added).fromNow()}; + }, + }, + includeColumn("ratio") && { + accessor: "ratio", + title: t("items.ratio.columnTitle"), + sortable: true, + width: 60, + render: (record) => { + if (record.ratio === undefined) return null; + return {formatRatio(record.ratio)}; + }, + }, + includeColumn("received") && { + accessor: "received", + title: t("items.received.columnTitle"), + sortable: true, + width: 80, + noWrap: true, + render: (record) => {formatBytes(record.received)}, + }, + includeColumn("sent") && { + accessor: "sent", + title: t("items.sent.columnTitle"), + sortable: true, + width: 80, + noWrap: true, + render: (record) => { + if (!record.sent) return null; + return {formatBytes(record.sent)}; + }, + }, + includeColumn("category") && { + accessor: "category", + title: t("items.category.columnTitle"), + width: 80, + ellipsis: true, + render: (record) => { + const display = formatCategoryDisplay(record.category); + if (!display) return null; + return ( + + {display} + + ); + }, + }, + includeColumn("index") && { + accessor: "index", + title: t("items.index.columnTitle"), + sortable: true, + width: 40, + render: (record) => {record.index}, + }, + includeColumn("type") && { + accessor: "type", + title: t("items.type.columnTitle"), + sortable: true, + width: 70, + render: (record) => ( + + {record.type} + + ), + }, + ]; + return cols.filter(Boolean) as DataTableColumn[]; + }, [columnContext, t, size, progressColumnWidth]); + + const storeKey = `downloads-${itemId ?? "preview"}-${[...options.columns].toSorted().join(",")}`; + const { effectiveColumns, columnsOrder, columnsWidth, setColumnsOrder, setMultipleColumnWidths } = + useDataTableColumns({ + key: storeKey, + columns, + }); + + const lastStoreKey = useRef(storeKey); + const hydrated = useRef(false); + useEffect(() => { + if (lastStoreKey.current !== storeKey) { + lastStoreKey.current = storeKey; + hydrated.current = false; + } + if (hydrated.current) return; + if (savedOrder.length > 0) setColumnsOrder(savedOrder); + if (Object.keys(savedWidths).length > 0) { + setMultipleColumnWidths(Object.entries(savedWidths).map(([accessor, w]) => ({ accessor, width: w }))); + } + // ponytail: defer hydrated flag so the persist effect skips the restore echo + requestAnimationFrame(() => { + hydrated.current = true; + }); + }, [storeKey, savedOrder, savedWidths, setColumnsOrder, setMultipleColumnWidths]); + + const prevOrder = useRef(columnsOrder); + const prevWidths = useRef(columnsWidth); + useEffect(() => { + if (!hydrated.current) return; + const orderChanged = JSON.stringify(columnsOrder) !== JSON.stringify(prevOrder.current); + const widthsChanged = JSON.stringify(columnsWidth) !== JSON.stringify(prevWidths.current); + prevOrder.current = columnsOrder; + prevWidths.current = columnsWidth; + + if (!orderChanged && !widthsChanged) return; + if (orderChanged) persistOption({ columnOrder: JSON.stringify(columnsOrder) }); + if (widthsChanged) { + const widthMap: Record = {}; + for (const entry of columnsWidth) { + const key = Object.keys(entry)[0]; + if (!key) continue; + const w = entry[key as keyof typeof entry]; + if (typeof w === "number") widthMap[key] = w; + else if (typeof w === "string" && w.endsWith("px")) widthMap[key] = parseInt(w, 10); + } + persistOption({ columnWidths: JSON.stringify(widthMap) }); + } + }, [columnsOrder, columnsWidth, persistOption]); + + const handleContextMenu = useCallback( + ({ record, event }: { record: ExtendedDownloadClientItem; event: React.MouseEvent }) => { + event.preventDefault(); + setContextMenu({ x: event.clientX, y: event.clientY, item: record }); + }, + [], + ); + + const closeContextMenu = useCallback(() => setContextMenu(null), []); + + const totalSpeed = clients.reduce((sum, c) => sum + (c.status?.rates.down ?? 0), 0); + const totalUpSpeed = clients.reduce((sum, c) => sum + (c.status?.rates.up ?? 0), 0); + const globalRatio = useMemo(() => { + const traffic = clients + .filter(({ integration: { kind } }) => getIntegrationKindsByCategory("torrent").some((k) => k === kind)) + .reduce( + ({ up, down }, { status }) => ({ up: up + (status?.totalUp ?? 0), down: down + (status?.totalDown ?? 0) }), + { up: 0, down: 0 }, + ); + if (traffic.down <= 0) return 0; + return traffic.up / traffic.down; + }, [clients]); + + const availableStatuses = useMemo(() => [...new Set(data.map(({ state }) => state))], [data]); + + const queueStats = useMemo(() => { + const stateCounts: Record = {}; + let totalSize = 0; + let completedSize = 0; + for (const item of data) { + stateCounts[item.state] = (stateCounts[item.state] ?? 0) + 1; + totalSize += item.size; + completedSize += item.received ?? item.size * item.progress; + } + return { stateCounts, totalSize, completedSize, totalItems: data.length }; + }, [data]); + + if (options.columns.length === 0) { return (
    {t("errors.noColumns")}
    ); + } + + if (isError && currentItems.length === 0) { + return ( +
    + {t("errors.noCommunications")} +
    + ); + } + + let tablePointerEvents: React.CSSProperties["pointerEvents"]; + if (isEditMode) tablePointerEvents = "none"; + + let rowContextMenuHandler: typeof handleContextMenu | undefined = handleContextMenu; + if (isEditMode) rowContextMenuHandler = undefined; - //The actual widget return ( - - - - {integrationTypes.includes("torrent") && ( - - {`${t("globalRatio")}:`} - {(globalTraffic.up / globalTraffic.down).toFixed(2)} - - )} - + {showStats && ( + - - + )} + + + `${record.integration.id}:${record.id}`} + height="100%" + className="downloads-table" + defaultColumnProps={{ + noWrap: true, + draggable: true, + resizable: true, + cellsStyle: () => ({ padding: `${size.cellPadding}px 8px` }), + }} + scrollAreaProps={{ type: "auto", scrollbarSize: 6 }} + customRowAttributes={(_, index) => ({ "data-row-index": index })} + onRowContextMenu={rowContextMenuHandler} + rowBackgroundColor={(record) => rowBgAlpha[record.state]} + rowExpansion={{ + trigger: "click", + allowMultiple: true, + collapseProps: { + transitionDuration: 200, + animateOpacity: true, + transitionTimingFunction: "ease-out", + }, + content: ({ record, collapse }) => , + }} + onScroll={() => { + if (contextMenu) closeContextMenu(); + }} + /> + + + + + {contextMenu && } ); } -interface ItemInfoModalProps { - items: ExtendedDownloadClientItem[]; - currentIndex: number; - opened: boolean; - onClose: () => void; +function buildHoverTooltip(record: ExtendedDownloadClientItem, t: DownloadsT): React.ReactNode { + const lines: { label: string; value: string }[] = [ + { label: t("items.size.detailsTitle"), value: `${formatBytes(record.received)} / ${formatBytes(record.size)}` }, + { label: t("items.state.detailsTitle"), value: t(`states.${record.state}`) }, + ]; + + if (record.downSpeed) { + lines.push({ label: t("items.downSpeed.detailsTitle"), value: formatByteRate(record.downSpeed) }); + } + if (record.upSpeed) { + lines.push({ label: t("items.upSpeed.detailsTitle"), value: formatByteRate(record.upSpeed) }); + } + if (record.time !== 0) { + lines.push({ label: t("items.time.eta"), value: dayjs().add(record.time, "milliseconds").fromNow() }); + } + if (record.ratio !== undefined) { + lines.push({ label: t("items.ratio.detailsTitle"), value: record.ratio.toFixed(2) }); + } + const categoryDisplay = formatCategoryDisplay(record.category); + if (categoryDisplay) { + lines.push({ label: t("items.category.detailsTitle"), value: categoryDisplay }); + } + + return ( + + + {record.name} + + + {lines.map(({ label, value }) => ( + + + {label} + + + {value} + + + ))} + + ); } -const ItemInfoModal = ({ items, currentIndex, opened, onClose }: ItemInfoModalProps) => { - const item = useMemo(() => items[currentIndex], [items, currentIndex]); - const t = useScopedI18n("widget.downloads.states"); - //The use case for "No item found" should be impossible, hence no translation +function ExpandedRow({ item, collapse }: { item: ExtendedDownloadClientItem; collapse: () => void }) { + const t = useScopedI18n("widget.downloads"); + const progressPercent = Math.floor(item.progress * 100); + const categoryDisplay = formatCategoryDisplay(item.category); + + let timeDisplay = "∞"; + if (item.time !== 0) timeDisplay = dayjs().add(item.time, "milliseconds").fromNow(); + return ( - - {item === undefined ? ( -
    {"No item found"}
    - ) : ( - - {item.name} - - - {`${item.integration.name} (${item.integration.kind})`} + + + {`${progressPercent}%`}} + /> + + + + + + {item.name} + + + {t(`states.${item.state}`)} + - - - - {item.type !== "miscellaneous" && ( - + - )} - - - - {item.type !== "miscellaneous" && ( - - )} - - - - - {item.type !== "miscellaneous" && } - - - + {item.downSpeed !== undefined && item.downSpeed > 0 && ( + } + color="blue" + /> + )} + {item.upSpeed !== undefined && item.upSpeed > 0 && ( + } + color="green" + /> + )} + {item.ratio !== undefined && ( + + )} + + {item.sent !== undefined && ( + + )} + {item.added !== undefined && ( + + )} + {categoryDisplay && } + + - )} -
    + + ); -}; +} -const NormalizedLine = ({ - itemKey, - values, +function DetailPair({ + label, + value, + icon, + color, }: { - itemKey: Exclude; - values?: number | string | string[]; -}) => { - const t = useScopedI18n("widget.downloads.items"); - if (typeof values !== "number" && (values === undefined || values.length === 0)) return null; + label: string; + value: string; + icon?: React.ReactNode; + color?: string; +}) { return ( - - {`${t(`${itemKey}.detailsTitle`)}:`} - {Array.isArray(values) ? ( - - {values.map((value) => ( - {value} - ))} - - ) : ( - {values} - )} + + + {label}: + + + {icon} + + {value} + + ); -}; - -interface ClientsControlProps { - clients: ExtendedClientStatus[]; - filters: QuickFilter; - setFilters: (filters: QuickFilter) => void; - availableStatuses: QuickFilter["statuses"]; } -const ClientsControl = ({ clients, filters, setFilters, availableStatuses }: ClientsControlProps) => { - const integrationsStatuses = clients.reduce( - (acc, { status, integration: { id }, interact }) => - status && interact ? (acc[status.paused ? "paused" : "active"].push(id), acc) : acc, - { paused: [] as string[], active: [] as string[] }, - ); - const someInteract = clients.some(({ interact }) => interact); - const totalSpeed = formatByteRate(clients.reduce((count, { status }) => count + (status?.rates.down ?? 0), 0)); - - const utils = clientApi.useUtils(); - const invalidateDownloads = { onSettled: () => void utils.widget.downloads.getJobsAndStatuses.invalidate() }; - const { mutate: mutateResumeQueue } = clientApi.widget.downloads.resume.useMutation(invalidateDownloads); - const { mutate: mutatePauseQueue } = clientApi.widget.downloads.pause.useMutation(invalidateDownloads); - const [opened, { open, close }] = useDisclosure(false); +function GlobalStatsBar({ + queueStats, + totalSpeed, + totalUpSpeed, + globalRatio, + hasTorrents, + clients, +}: { + queueStats: { stateCounts: Record; totalSize: number; completedSize: number; totalItems: number }; + totalSpeed: number; + totalUpSpeed: number; + globalRatio: number; + hasTorrents: boolean; + clients: ExtendedClientStatus[]; +}) { const t = useScopedI18n("widget.downloads"); + + let overallProgress = 0; + if (queueStats.totalSize > 0) overallProgress = queueStats.completedSize / queueStats.totalSize; + const overallProgressPct = Math.floor(overallProgress * 100); + return ( - - - - - - - - - - {t("items.integration.columnTitle")} - setFilters({ ...filters, integrationKinds: names })} - > - {clients.map(({ integration }) => ( - - {integration.name} - - ))} - - {t("items.state.columnTitle")} - setFilters({ ...filters, statuses: statuses })} - > - {availableStatuses.map((status) => ( - - {t(`states.${status}`)} - - ))} - - - - - - {clients.map((client) => ( - - ))} - - {someInteract && ( - - mutateResumeQueue({ integrationIds: integrationsStatuses.paused })} - > - - - - )} - - {someInteract && ( - - mutatePauseQueue({ integrationIds: integrationsStatuses.active })} - > - - - - )} - - - {clients.map((client) => ( - - - - - - - {client.status ? ( - - - {client.status.rates.up !== undefined ? ( - - - {`↑ ${formatByteRate(client.status.rates.up)}`} - - {"-"} - - {formatBytes(client.status.totalUp ?? 0)} - - - ) : undefined} - - - {`↓ ${formatByteRate(client.status.rates.down)}`} - - {"-"} - - {formatBytes(Math.floor(client.status.totalDown ?? 0))} - - - - - ) : ( - - {t("errors.noCommunications")} - - )} - - - - {client.integration.name} - - - {client.status && client.interact ? ( - - + + + + + {truncateText(item.name, 40)} + + } + onClick={() => { + void navigator.clipboard.writeText(item.name).catch(() => {}); + onClose(); + }} + > + {t("contextMenu.copyName")} + + + {item.id && ( + } + onClick={() => { + void navigator.clipboard.writeText(item.id).catch(() => {}); + onClose(); + }} + > + {t("contextMenu.copyId")} + + )} + + {hasActions && ( + <> + + } + onClick={() => { + pauseResumeInvoke?.(); + onClose(); + }} + > + {pauseResumeLabel} + + + {!showDeleteConfirm && ( + } + onClick={(e) => { + e.stopPropagation(); + openDelete(); + }} + > + {t("actions.item.delete.title")} + + )} + + {showDeleteConfirm && ( + <> + } onClick={() => { - (client.status?.paused ? mutateResumeQueue : mutatePauseQueue)({ - integrationIds: [client.integration.id], - }); + item.actions?.delete({ fromDisk: false }); + onClose(); }} > - {client.status.paused ? : } - - - ) : ( - - - + {t("actions.item.delete.entry")} + + } + onClick={() => { + item.actions?.delete({ fromDisk: true }); + onClose(); + }} + > + {t("actions.item.delete.entryAndFiles")} + + )} - - - ))} - - - + + )} + + + + ); -}; - -interface ClientAvatarProps { - client: ExtendedClientStatus; } -const ClientAvatar = ({ client }: ClientAvatarProps) => { - const isConnected = useIntegrationConnected(client.integration.updatedAt, { timeout: 30000 }); +interface WidgetFooterProps { + clients: ExtendedClientStatus[]; + totalSpeed: number; + totalUpSpeed: number; + globalRatio: number; + hasTorrents: boolean; + clientFilter: string[]; + setClientFilter: (ids: string[]) => void; + statusFilter: string[]; + setStatusFilter: (statuses: string[]) => void; + availableStatuses: ExtendedDownloadClientItem["state"][]; + pauseQueue: (args: { integrationIds: string[] }) => void; + resumeQueue: (args: { integrationIds: string[] }) => void; + showStats: boolean; + toggleStats: () => void; +} + +function WidgetFooter({ + clients, + totalSpeed, + totalUpSpeed, + globalRatio, + hasTorrents, + clientFilter, + setClientFilter, + statusFilter, + setStatusFilter, + availableStatuses, + pauseQueue, + resumeQueue, + showStats, + toggleStats, +}: WidgetFooterProps) { + const t = useScopedI18n("widget.downloads"); + const [filterOpen, { toggle: toggleFilter }] = useDisclosure(false); + const someInteract = clients.some(({ interact }) => interact); + const hasActiveFilter = clientFilter.length > 0 || statusFilter.length > 0; + + const integrationsStatuses = { paused: [] as string[], active: [] as string[] }; + for (const { + status, + integration: { id }, + interact, + } of clients) { + if (!status || !interact) continue; + if (status.paused) integrationsStatuses.paused.push(id); + else integrationsStatuses.active.push(id); + } + + let filterTooltip = t("footer.filter"); + if (hasActiveFilter) filterTooltip = t("contextMenu.clearFilters"); + + let filterIconVariant: "filled" | "subtle" = "subtle"; + if (hasActiveFilter) filterIconVariant = "filled"; + + let statsTooltip = t("stats.show"); + if (showStats) statsTooltip = t("stats.hide"); + + let statsIconVariant: "filled" | "subtle" = "subtle"; + if (showStats) statsIconVariant = "filled"; + + let FilterIcon = IconFilter; + if (hasActiveFilter) FilterIcon = IconFilterOff; + + let StatsIcon = IconChevronDown; + if (showStats) StatsIcon = IconChevronUp; return ( - + + {filterOpen && ( + + + {clients.length > 1 && ( + + + {t("items.integration.columnTitle")}: + + + {clients.map(({ integration }) => { + const active = clientFilter.includes(integration.id); + let variant: "filled" | "light" = "light"; + if (active) variant = "filled"; + return ( + setClientFilter(toggleArrayItem(clientFilter, integration.id))} + > + } + > + {integration.name} + + + ); + })} + + + )} + {availableStatuses.length > 1 && ( + + + {t("items.state.columnTitle")}: + + + {availableStatuses.map((status) => { + const active = statusFilter.includes(status); + let variant: "filled" | "light" = "light"; + if (active) variant = "filled"; + return ( + setStatusFilter(toggleArrayItem(statusFilter, status))} + > + + {t(`states.${status}`)} + + + ); + })} + + + )} + + + )} + + + + + { + if (hasActiveFilter && !filterOpen) { + setClientFilter([]); + setStatusFilter([]); + } else { + toggleFilter(); + } + }} + > + + + + + + + + + + + + {clients.map(({ integration }) => ( + + ))} + + + + + {!showStats && hasTorrents && globalRatio > 0 && ( + {`${t("globalRatio")}: ${globalRatio.toFixed(2)}`} + )} + + + {someInteract && ( + + resumeQueue({ integrationIds: integrationsStatuses.paused })} + > + + + + )} + + {!showStats && ( + + + + {formatByteRate(totalSpeed)} + + {totalUpSpeed > 0 && ( + + + {formatByteRate(totalUpSpeed)} + + )} + + )} + + {someInteract && ( + + pauseQueue({ integrationIds: integrationsStatuses.active })} + > + + + + )} + + + + ); -}; +} + +function ClientIndicator({ integration }: { integration: ExtendedClientStatus["integration"] }) { + const isConnected = useIntegrationConnected(integration.updatedAt, { timeout: 30000 }); + + let tooltipLabel = integration.name; + const t = useScopedI18n("widget.downloads"); + if (!isConnected) tooltipLabel = `${integration.name} ${t("disconnected")}`; + + let avatarFilter: string | undefined; + let avatarOpacity = 1; + if (!isConnected) { + avatarFilter = "grayscale(100%)"; + avatarOpacity = 0.5; + } + + return ( + + + + ); +} diff --git a/packages/widgets/src/downloads/index.ts b/packages/widgets/src/downloads/index.ts index 0d9c66ddd..cc8f9a5b0 100644 --- a/packages/widgets/src/downloads/index.ts +++ b/packages/widgets/src/downloads/index.ts @@ -8,28 +8,37 @@ import { createWidgetDefinition } from "../definition"; import { optionsBuilder } from "../options"; const columnsList = [ - "id", - "actions", - "added", - "category", - "downSpeed", - "index", - "integration", "name", "progress", + "size", + "downSpeed", + "upSpeed", + "time", + "state", + "added", "ratio", "received", "sent", - "size", - "state", - "time", + "category", + "integration", + "index", "type", - "upSpeed", ] as const satisfies (keyof ExtendedDownloadClientItem)[]; -const sortingExclusion = ["actions", "id", "state"] as const satisfies readonly (typeof columnsList)[number][]; -const columnsSort = columnsList.filter((column) => - sortingExclusion.every((exclusion) => exclusion !== column), -) as Exclude; + +const sortColumns = [ + "name", + "progress", + "size", + "downSpeed", + "upSpeed", + "time", + "added", + "ratio", + "received", + "sent", + "index", + "type", +] as const satisfies readonly (typeof columnsList)[number][]; export const { definition, componentLoader } = createWidgetDefinition("downloads", { icon: IconDownload, @@ -38,19 +47,16 @@ export const { definition, componentLoader } = createWidgetDefinition("downloads return optionsBuilder.from( (factory) => ({ columns: factory.multiSelect({ - defaultValue: ["integration", "name", "progress", "time", "actions"], + defaultValue: ["name", "progress", "downSpeed", "time", "state"], options: columnsList.map((value) => ({ value, label: (t) => t(`widget.downloads.items.${value}.columnTitle`), })), searchable: true, }), - enableRowSorting: factory.switch({ - defaultValue: false, - }), defaultSort: factory.select({ - defaultValue: "type", - options: columnsSort.map((value) => ({ + defaultValue: "progress", + options: sortColumns.map((value) => ({ value, label: (t) => t(`widget.downloads.items.${value}.columnTitle`), })), @@ -68,7 +74,6 @@ export const { definition, componentLoader } = createWidgetDefinition("downloads defaultValue: true, }), activeTorrentThreshold: factory.number({ - //in KiB/s validate: z.number().min(0), defaultValue: 0, step: 1, @@ -88,14 +93,12 @@ export const { definition, componentLoader } = createWidgetDefinition("downloads validate: z.number().min(1), withDescription: true, }), + columnOrder: factory.text({ defaultValue: "" }), + columnWidths: factory.text({ defaultValue: "" }), }), { - defaultSort: { - shouldHide: (options) => !options.enableRowSorting, - }, - descendingDefaultSort: { - shouldHide: (options) => !options.enableRowSorting, - }, + columnOrder: { shouldHide: () => true }, + columnWidths: { shouldHide: () => true }, showCompletedUsenet: { shouldHide: (_, integrationKinds) => !getIntegrationKindsByCategory("usenet").some((kinds) => integrationKinds.includes(kinds)), diff --git a/packages/widgets/src/downloads/styles.css b/packages/widgets/src/downloads/styles.css index ae9bee8c1..98991c9f2 100644 --- a/packages/widgets/src/downloads/styles.css +++ b/packages/widgets/src/downloads/styles.css @@ -1,12 +1,52 @@ -/* Make the MantineReactTable transparent so the board card's opacity-controlled - background shows through. MRT defaults to var(--mantine-color-body) which is opaque. */ -.downloads-widget-table, -.downloads-widget-table .mantine-Table-table, -.downloads-widget-table .mantine-Table-thead, -.downloads-widget-table .mantine-Table-tbody, -.downloads-widget-table .mantine-Table-tfoot, -.downloads-widget-table .mantine-Table-tr, -.downloads-widget-table th, -.downloads-widget-table td { +/* Make the DataTable transparent so the board card's opacity-controlled + background shows through. The mantine-datatable defaults to + var(--mantine-color-body) which is opaque. */ +.downloads-table, +.downloads-table .mantine-datatable-table, +.downloads-table .mantine-datatable-table thead, +.downloads-table .mantine-datatable-table tbody, +.downloads-table .mantine-datatable-table tfoot, +.downloads-table th, +.downloads-table td { background-color: transparent !important; } + +.downloads-table .mantine-datatable-table tr { + background-color: transparent; +} + +.downloads-table .mantine-datatable-table tbody tr:hover { + background-color: color-mix(in srgb, var(--mantine-color-default-hover) 40%, transparent) !important; +} + +.downloads-table th { + white-space: nowrap; + background-color: color-mix(in srgb, var(--mantine-color-body) 60%, transparent) !important; + backdrop-filter: blur(8px); +} + +.downloads-table td { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.downloads-table td .mantine-Text-root, +.downloads-table td .mantine-Group-root { + white-space: nowrap; + flex-wrap: nowrap; +} + +.downloads-table .mantine-datatable-header-cell-sortable-icon { + opacity: 0; + transition: opacity 150ms; +} + +.downloads-table th:hover .mantine-datatable-header-cell-sortable-icon { + opacity: 1; +} + +/* Row expansion styling */ +.downloads-table .mantine-datatable-row-expansion-cell { + background-color: color-mix(in srgb, var(--mantine-color-body) 40%, transparent) !important; +} From 2885f7a297edb4d575e2b3bf64016e395c2f2e3e Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 28 Jul 2026 22:18:08 +0200 Subject: [PATCH 09/16] fix(widgets): preserve data on integration failures (#6484) --- packages/api/src/settle-integrations.ts | 26 ++++++++-- .../api/src/test/settle-integrations.spec.ts | 50 +++++++++++++++++++ packages/request-handler/src/media-release.ts | 2 + .../src/test/media-release.spec.ts | 45 +++++++++++++++++ 4 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 packages/api/src/test/settle-integrations.spec.ts create mode 100644 packages/request-handler/src/test/media-release.spec.ts diff --git a/packages/api/src/settle-integrations.ts b/packages/api/src/settle-integrations.ts index 643a3b949..a9dbff5ba 100644 --- a/packages/api/src/settle-integrations.ts +++ b/packages/api/src/settle-integrations.ts @@ -19,8 +19,15 @@ export async function settleIntegrationQueries, ): Promise { const settled = await Promise.allSettled(integrations.map(async (integration) => fn(integration))); - return settled.flatMap((result, index) => { - if (result.status === "fulfilled") return [result.value]; + const results: TResult[] = []; + const errors: unknown[] = []; + + settled.forEach((result, index) => { + if (result.status === "fulfilled") { + results.push(result.value); + return; + } + const integration = integrations[index]; logger.warn( new ErrorWithMetadata( @@ -29,7 +36,18 @@ export async function settleIntegrationQueries 0) { + throw errors[0]; + } + + return results; } diff --git a/packages/api/src/test/settle-integrations.spec.ts b/packages/api/src/test/settle-integrations.spec.ts new file mode 100644 index 000000000..09f80bc31 --- /dev/null +++ b/packages/api/src/test/settle-integrations.spec.ts @@ -0,0 +1,50 @@ +import { describe, expect, test, vi } from "vitest"; + +import { settleIntegrationQueries } from "../settle-integrations"; + +const mocks = vi.hoisted(() => ({ + logger: { warn: vi.fn() }, +})); + +vi.mock("@homarr/core/infrastructure/logs", () => ({ + createLogger: () => mocks.logger, +})); + +vi.mock("@homarr/core/infrastructure/logs/error", () => ({ + ErrorWithMetadata: Error, +})); + +const integrations = [ + { id: "first", name: "First", kind: "plex" }, + { id: "second", name: "Second", kind: "jellyfin" }, +]; + +describe("settleIntegrationQueries", () => { + test("returns an empty result when no integrations are configured", async () => { + await expect(settleIntegrationQueries([], vi.fn())).resolves.toEqual([]); + }); + + test("keeps successful integrations when another integration fails", async () => { + const error = new Error("Plex unavailable"); + + await expect( + settleIntegrationQueries(integrations, (integration) => + integration.id === "first" ? Promise.reject(error) : Promise.resolve(integration.name), + ), + ).resolves.toEqual(["Second"]); + }); + + test("rejects when every integration fails", async () => { + const error = new Error("Integration unavailable"); + + await expect(settleIntegrationQueries(integrations, () => Promise.reject(error))).rejects.toBe(error); + }); + + test("uses configured fallbacks when every integration fails", async () => { + await expect( + settleIntegrationQueries(integrations, () => Promise.reject(new Error("Integration unavailable")), { + fallback: (integration) => integration.name, + }), + ).resolves.toEqual(["First", "Second"]); + }); +}); diff --git a/packages/request-handler/src/media-release.ts b/packages/request-handler/src/media-release.ts index 02209f68f..994214b8e 100644 --- a/packages/request-handler/src/media-release.ts +++ b/packages/request-handler/src/media-release.ts @@ -13,4 +13,6 @@ export const mediaReleaseRequestHandler = createIntegrationRequestHandler< const integrationInstance = await createIntegrationAsync(integration); return await integrationInstance.getMediaReleasesAsync(); }, + cacheTtlMs: 5 * 60 * 1000, + fallbackToStaleOnError: true, }); diff --git a/packages/request-handler/src/test/media-release.spec.ts b/packages/request-handler/src/test/media-release.spec.ts new file mode 100644 index 000000000..825107afd --- /dev/null +++ b/packages/request-handler/src/test/media-release.spec.ts @@ -0,0 +1,45 @@ +import type { MediaRelease } from "@homarr/integrations/types"; +import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; + +import { mediaReleaseRequestHandler } from "../media-release"; + +const mocks = vi.hoisted(() => ({ + createIntegrationAsync: vi.fn(), +})); + +vi.mock("@homarr/integrations", () => ({ + createIntegrationAsync: mocks.createIntegrationAsync, +})); + +const integration = { + id: "plex-integration", + kind: "plex", +} as Parameters[0]; + +describe("mediaReleaseRequestHandler", () => { + beforeEach(() => { + vi.useFakeTimers(); + vi.setSystemTime(new Date("2026-07-28T00:00:00Z")); + mediaReleaseRequestHandler.invalidateCache(); + mocks.createIntegrationAsync.mockReset(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + test("keeps the last successful releases when a refresh fails", async () => { + const releases = [{ id: "release-1" }] as MediaRelease[]; + const getMediaReleasesAsync = vi.fn().mockResolvedValueOnce(releases).mockRejectedValueOnce(new Error("Plex down")); + mocks.createIntegrationAsync.mockResolvedValue({ getMediaReleasesAsync }); + + const handler = mediaReleaseRequestHandler.handler(integration, {}); + const initial = await handler.getDataAsync(); + + vi.advanceTimersByTime(5 * 60 * 1000 + 1); + const fallback = await handler.getDataAsync(); + + expect(fallback).toEqual(initial); + expect(getMediaReleasesAsync).toHaveBeenCalledTimes(2); + }); +}); From 14654acced0b4b7f4cdb0778af71cfa05e5f3a19 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 28 Jul 2026 22:55:32 +0200 Subject: [PATCH 10/16] chore: gate Renovate updates behind dashboard approval (#6485) --- .github/renovate.json5 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 98c7d1693..900c3d97e 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -1,6 +1,6 @@ { $schema: "https://docs.renovatebot.com/renovate-schema.json", - extends: ["config:recommended"], + extends: ["config:recommended", ":dependencyDashboardApproval"], packageRules: [ { matchPackageNames: ["^@homarr/"], @@ -47,7 +47,7 @@ rangeStrategy: "bump", automerge: false, baseBranchPatterns: ["dev"], - dependencyDashboard: false, + dependencyDashboard: true, // prevent special characters in branch names (otherwise git errors occur on windows) branchNameStrict: true, } From ac73b9d891fc5d4f8eb192e53c705738a2bb080b Mon Sep 17 00:00:00 2001 From: Clarkar00 <133609856+Clarkar00@users.noreply.github.com> Date: Tue, 28 Jul 2026 14:12:03 -0700 Subject: [PATCH 11/16] fix(widgets): refetch after render errors (#6399) Remove incompatible persisted widget query data before resetting a crashed widget so it can fetch fresh data instead of re-rendering the same stale payload. --- .../components/board/items/item-content.tsx | 3 +- .../board/items/widget-query-recovery.spec.ts | 54 +++++++++++++++++++ .../board/items/widget-query-recovery.ts | 7 +++ 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 apps/nextjs/src/components/board/items/widget-query-recovery.spec.ts create mode 100644 apps/nextjs/src/components/board/items/widget-query-recovery.ts diff --git a/apps/nextjs/src/components/board/items/item-content.tsx b/apps/nextjs/src/components/board/items/item-content.tsx index d869538e4..ad0f3a305 100644 --- a/apps/nextjs/src/components/board/items/item-content.tsx +++ b/apps/nextjs/src/components/board/items/item-content.tsx @@ -19,6 +19,7 @@ import { useItemActions } from "./item-actions"; import itemContentClasses from "./item-content.module.css"; import { BoardItemMenu } from "./item-menu"; import { WidgetContextMenu } from "./widget-context-menu"; +import { removePersistedWidgetQueries } from "./widget-query-recovery"; interface BoardItemContentProps { item: SectionItem; @@ -112,7 +113,7 @@ const InnerContent = ({ item, ...dimensions }: InnerContentProps) => { {({ reset }) => ( { - void queryClient.invalidateQueries({ queryKey: [["widget"]] }); + removePersistedWidgetQueries(queryClient); reset(); }} fallbackRender={({ resetErrorBoundary, error }) => ( diff --git a/apps/nextjs/src/components/board/items/widget-query-recovery.spec.ts b/apps/nextjs/src/components/board/items/widget-query-recovery.spec.ts new file mode 100644 index 000000000..b666df4e9 --- /dev/null +++ b/apps/nextjs/src/components/board/items/widget-query-recovery.spec.ts @@ -0,0 +1,54 @@ +import { QueryClient } from "@tanstack/react-query"; +import { describe, expect, test } from "vitest"; + +import { removePersistedWidgetQueries } from "./widget-query-recovery"; + +describe("removePersistedWidgetQueries", () => { + test("removes stale widget queries and allows fresh data to be fetched", async () => { + const queryClient = new QueryClient(); + const crashedWidgetQueryKey = [["widget", "mediaServer", "getCurrentStreams"], { input: {} }]; + const unrelatedQueryKey = [["user", "me"], { input: {} }]; + + queryClient.setQueryData(crashedWidgetQueryKey, "stale"); + queryClient.setQueryData(unrelatedQueryKey, "unrelated"); + + removePersistedWidgetQueries(queryClient); + + expect(queryClient.getQueryData(crashedWidgetQueryKey)).toBeUndefined(); + expect(queryClient.getQueryData(unrelatedQueryKey)).toBe("unrelated"); + await expect( + queryClient.fetchQuery({ queryKey: crashedWidgetQueryKey, queryFn: () => Promise.resolve("fresh") }), + ).resolves.toBe("fresh"); + }); + + test("removes persisted queries outside the widget router", () => { + const queryClient = new QueryClient(); + const dockerQueryKey = [["docker", "getContainers"], { input: {} }]; + const appQueryKey = [["app", "byId"], { input: {} }]; + const unrelatedQueryKey = [["user", "me"], { input: {} }]; + + queryClient.setQueryData(dockerQueryKey, "stale"); + queryClient.setQueryData(appQueryKey, "stale"); + queryClient.setQueryData(unrelatedQueryKey, "unrelated"); + + removePersistedWidgetQueries(queryClient); + + expect(queryClient.getQueryData(dockerQueryKey)).toBeUndefined(); + expect(queryClient.getQueryData(appQueryKey)).toBeUndefined(); + expect(queryClient.getQueryData(unrelatedQueryKey)).toBe("unrelated"); + }); + + test("removes persisted widget queries when the widget kind and query path differ", () => { + const queryClient = new QueryClient(); + const crashedWidgetQueryKey = [["widget", "anchorNotes", "getNote"], { input: {} }]; + const unrelatedQueryKey = [["user", "me"], { input: {} }]; + + queryClient.setQueryData(crashedWidgetQueryKey, "stale"); + queryClient.setQueryData(unrelatedQueryKey, "unrelated"); + + removePersistedWidgetQueries(queryClient); + + expect(queryClient.getQueryData(crashedWidgetQueryKey)).toBeUndefined(); + expect(queryClient.getQueryData(unrelatedQueryKey)).toBe("unrelated"); + }); +}); diff --git a/apps/nextjs/src/components/board/items/widget-query-recovery.ts b/apps/nextjs/src/components/board/items/widget-query-recovery.ts new file mode 100644 index 000000000..800614bf4 --- /dev/null +++ b/apps/nextjs/src/components/board/items/widget-query-recovery.ts @@ -0,0 +1,7 @@ +import type { QueryClient } from "@tanstack/react-query"; + +import { isPersistableWidgetQueryKey } from "@homarr/api/query-cache"; + +export const removePersistedWidgetQueries = (queryClient: QueryClient) => { + queryClient.removeQueries({ predicate: (query) => isPersistableWidgetQueryKey(query.queryKey) }); +}; From 49d0f1a141c72c21bafef778d8faa035d92317c3 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 29 Jul 2026 16:53:29 +0200 Subject: [PATCH 12/16] docs: explain Podman socket setup (#6487) * docs: explain Podman socket setup * docs: clarify Podman runtime requirements * docs: complete Podman compose examples --- .../advanced/environment-variables/index.mdx | 6 +- apps/docs/docs/integrations/docker/index.mdx | 68 +++++++++++++++++++ 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/apps/docs/docs/advanced/environment-variables/index.mdx b/apps/docs/docs/advanced/environment-variables/index.mdx index f1a70b371..ad249e734 100644 --- a/apps/docs/docs/advanced/environment-variables/index.mdx +++ b/apps/docs/docs/advanced/environment-variables/index.mdx @@ -55,9 +55,9 @@ A random secret can be generated by using the following command: `openssl rand - | Environment Variable | Description | Possible values | Default | | ------------------------ | ----------- | --------------- | ------- | -| ``DOCKER_HOSTNAMES`` | Comma seperated list of hostnames to connect to | For example `localhost,docker.example.com` | - | -| ``DOCKER_PORTS`` | Comma seperated list of ports to connect to | For example `2375,2376` | - | -| ``DOCKER_SOCKET_PATHS`` | Comma seperated list of paths to sockets | For example `/var/run/docker.sock,/run/user/1000/podman/podman.sock` | - | +| ``DOCKER_HOSTNAMES`` | Comma-separated list of hostnames to connect to | For example `localhost,docker.example.com` | - | +| ``DOCKER_PORTS`` | Comma-separated list of ports to connect to | For example `2375,2376` | - | +| ``DOCKER_SOCKET_PATHS`` | Comma-separated list of mounted Docker-compatible socket paths. See the [Docker and Podman integration guide](/docs/integrations/docker) | For example `/var/run/docker.sock,/var/run/podman.sock` | - | ## Database | Environment Variable | Description | Possible values | Default | diff --git a/apps/docs/docs/integrations/docker/index.mdx b/apps/docs/docs/integrations/docker/index.mdx index e48c46e9b..2af43c67e 100644 --- a/apps/docs/docs/integrations/docker/index.mdx +++ b/apps/docs/docs/integrations/docker/index.mdx @@ -55,6 +55,74 @@ services: With docker run, add this parameter: `-v /var/run/docker.sock:/var/run/docker.sock`. In Windows, you'll need to adjust the slashes: `-v //var/run/docker.sock:/var/run/docker.sock` +### Using Podman + +On Linux, Homarr can connect to Podman's [Docker-compatible API](https://docs.podman.io/en/latest/markdown/podman-system-service.1.html). +The Podman API socket must be running and mounted into the Homarr container. +The socket grants full access to Podman, including arbitrary code execution as the user running the API, so only mount it into trusted containers. + +For rootless Podman, enable the socket for the user that runs Homarr: + +```bash +systemctl --user enable --now podman.socket +``` + +The rootless socket is located at `$XDG_RUNTIME_DIR/podman/podman.sock` (usually `/run/user//podman/podman.sock`). +You can confirm the path with: + +```bash +podman info --format '{{.Host.RemoteSocket.Path}}' +``` + +Mount that socket into the Homarr container and point `DOCKER_SOCKET_PATHS` to its path **inside** the container: + +```yaml +services: + homarr: + container_name: homarr + image: ghcr.io/homarr-labs/homarr:latest + restart: unless-stopped + volumes: + - ${XDG_RUNTIME_DIR}/podman/podman.sock:/var/run/podman.sock + - ./homarr/appdata:/appdata + environment: + SECRET_ENCRYPTION_KEY: your_64_character_hex_string + DOCKER_SOCKET_PATHS: /var/run/podman.sock + ports: + - "7575:7575" +``` + +Start Homarr with `podman compose up -d`. +Run the compose project as the same user that owns the rootless Podman socket so `$XDG_RUNTIME_DIR` resolves to the correct path. +To keep the user socket available after logout and across reboots, enable lingering with `loginctl enable-linger `. + +For rootful Podman, enable the system socket with `sudo systemctl enable --now podman.socket`. +Its default path is `/run/podman/podman.sock`; mount that path instead and start Homarr with `sudo podman compose up -d`. + +:::note SELinux +On systems with SELinux enabled, Podman's documentation recommends disabling label separation for a container that accesses the API socket. +Add the following to the Homarr service: + +```yaml +security_opt: + - label=disable +``` + +::: + +You can connect Homarr to multiple Docker-compatible sockets by mounting each socket and listing their in-container paths, separated by commas: + +```yaml +services: + homarr: + image: ghcr.io/homarr-labs/homarr:latest + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ${XDG_RUNTIME_DIR}/podman/podman.sock:/var/run/podman.sock + environment: + DOCKER_SOCKET_PATHS: /var/run/docker.sock,/var/run/podman.sock +``` + ### Managing your Docker containers within Homarr Homarr allows you to interact with Docker containers running on your system. Each container row has an action menu with the following options: From 06d9c07d2226343f5de244dd3e09f9664a0ddc6b Mon Sep 17 00:00:00 2001 From: Matt Van Horn Date: Fri, 31 Jul 2026 04:30:44 -0700 Subject: [PATCH 13/16] feat: expose Navidrome as a media-server (now-playing) integration (#6070) --- .../docs/integrations/navidrome/index.mdx | 6 +- apps/docs/docs/widgets/media-server/index.mdx | 5 +- apps/docs/docs/widgets/media-server/index.ts | 2 +- .../api/src/router/widgets/media-server.ts | 2 +- packages/definitions/src/integration.ts | 2 +- .../src/navidrome/navidrome-integration.ts | 27 +++- .../test/navidrome-integration.spec.ts | 129 +++++++++++++++++- .../src/audio-stats/audio-stats-content.tsx | 61 +-------- packages/widgets/src/audio-stats/index.ts | 12 -- packages/widgets/src/audio-stats/shared.ts | 3 - 10 files changed, 166 insertions(+), 83 deletions(-) diff --git a/apps/docs/docs/integrations/navidrome/index.mdx b/apps/docs/docs/integrations/navidrome/index.mdx index 664e6fc58..6a9f4059e 100644 --- a/apps/docs/docs/integrations/navidrome/index.mdx +++ b/apps/docs/docs/integrations/navidrome/index.mdx @@ -10,19 +10,21 @@ import { AddingIntegration } from '@site/src/components/integrations/adding'; import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; import { navidromeIntegration } from '.'; import { audioStatsWidget } from '@site/docs/widgets/audio-stats'; +import { mediaServerWidget } from '@site/docs/widgets/media-server'; -Navidrome provides music library statistics including artist, album, and song counts, as well as now playing information via the Subsonic API. +Navidrome provides music library statistics including artist, album, and song counts, as well as now playing audio streams via the Subsonic API. ### Widgets & Capabilities diff --git a/apps/docs/docs/widgets/media-server/index.mdx b/apps/docs/docs/widgets/media-server/index.mdx index accd83f8e..8fb0c857c 100644 --- a/apps/docs/docs/widgets/media-server/index.mdx +++ b/apps/docs/docs/widgets/media-server/index.mdx @@ -14,6 +14,7 @@ import TabItem from '@theme/TabItem'; import { mediaServerWidget } from '.'; import { embyIntegration } from '@site/docs/integrations/emby'; import { jellyfinIntegration } from '@site/docs/integrations/jellyfin'; +import { navidromeIntegration } from '@site/docs/integrations/navidrome'; import { plexIntegration } from '@site/docs/integrations/plex'; @@ -39,6 +40,9 @@ import mediaTable from './img/table.png'; integration: embyIntegration, }, { integration: jellyfinIntegration, +}, { + integration: navidromeIntegration, + note: "Will always show only currently playing audio streams, not all active sessions." }, { integration: plexIntegration, note: "Will always show only currently playing streams, not all active sessions." @@ -50,4 +54,3 @@ import mediaTable from './img/table.png'; ### Configuration - diff --git a/apps/docs/docs/widgets/media-server/index.ts b/apps/docs/docs/widgets/media-server/index.ts index b9f5ec76f..419f860a1 100644 --- a/apps/docs/docs/widgets/media-server/index.ts +++ b/apps/docs/docs/widgets/media-server/index.ts @@ -10,7 +10,7 @@ export const mediaServerWidget: WidgetDefinition = { items: [ { name: "Show only currently playing", - description: "Disabling this will not work for plex.", + description: "Plex and Navidrome always show only currently playing streams.", values: { type: "boolean" }, defaultValue: "yes", }, diff --git a/packages/api/src/router/widgets/media-server.ts b/packages/api/src/router/widgets/media-server.ts index 3e3e64a4f..591d58d2b 100644 --- a/packages/api/src/router/widgets/media-server.ts +++ b/packages/api/src/router/widgets/media-server.ts @@ -17,7 +17,7 @@ export const mediaServerRouter = createTRPCRouter({ mcp: { enabled: true, description: - "Get currently active streams from Plex/Jellyfin/Emby media servers. REQUIRED: integrationIds (array of media server integration IDs from integration_all), showOnlyPlaying (boolean — true to filter to actively playing streams only)", + "Get currently active streams from Plex/Jellyfin/Emby/Navidrome media servers. REQUIRED: integrationIds (array of media server integration IDs from integration_all), showOnlyPlaying (boolean — true to filter to actively playing streams only)", }, }) .concat(createMediaServerIntegrationMiddleware("query")) diff --git a/packages/definitions/src/integration.ts b/packages/definitions/src/integration.ts index 2116cf4da..88c6a7088 100644 --- a/packages/definitions/src/integration.ts +++ b/packages/definitions/src/integration.ts @@ -418,7 +418,7 @@ export const integrationDefs = { name: "Navidrome", secretKinds: [["username", "password"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/navidrome.svg", - category: ["mediaLibrary"], + category: ["mediaLibrary", "mediaService"], documentationUrl: null, defaultPort: 4533, }, diff --git a/packages/integrations/src/navidrome/navidrome-integration.ts b/packages/integrations/src/navidrome/navidrome-integration.ts index 4d7609ea0..733fa92a0 100644 --- a/packages/integrations/src/navidrome/navidrome-integration.ts +++ b/packages/integrations/src/navidrome/navidrome-integration.ts @@ -6,6 +6,8 @@ import type { IntegrationTestingInput } from "../base/integration"; import { Integration } from "../base/integration"; import { TestConnectionError } from "../base/test-connection/test-connection-error"; import type { TestingResult } from "../base/test-connection/test-connection-service"; +import type { IMediaServerIntegration } from "../interfaces/media-server/media-server-integration"; +import type { CurrentSessionsInput, StreamSession } from "../interfaces/media-server/media-server-types"; import type { NavidromeDashboardData, NavidromeNowPlayingEntry, SubsonicResponseBody } from "./navidrome-types"; import { subsonicResponseSchema } from "./navidrome-types"; @@ -22,7 +24,7 @@ const subsonicAuthErrorCodes = new Set([40, 41]); const asArray = (value: TValue | TValue[] | undefined): TValue[] => [value].flat().filter((item): item is TValue => item !== undefined); -export class NavidromeIntegration extends Integration { +export class NavidromeIntegration extends Integration implements IMediaServerIntegration { protected async testingAsync(input: IntegrationTestingInput): Promise { const url = this.url("/rest/ping.view", this.getAuthParams()); const response = await input.fetchAsync(url); @@ -67,6 +69,29 @@ export class NavidromeIntegration extends Integration { }; } + public async getCurrentSessionsAsync(_options: CurrentSessionsInput): Promise { + const nowPlaying = await this.getNowPlayingAsync(); + + return nowPlaying.map((entry): StreamSession => ({ + sessionId: `${entry.username}-${entry.playerName}`, + sessionName: entry.playerName, + user: { + userId: entry.username, + username: entry.username, + profilePictureUrl: null, + }, + currentlyPlaying: { + type: "audio", + name: entry.title, + seasonName: entry.artist || undefined, + episodeName: null, + albumName: entry.album, + episodeCount: null, + metadata: null, + }, + })); + } + private async getArtistCountAsync(): Promise { const response = await this.subsonicRequestAsync("/rest/getArtists.view", {}, { tolerateEmptyLibrary: true }); return asArray(response.artists?.index).reduce((count, index) => count + asArray(index.artist).length, 0); diff --git a/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts b/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts index 921169b1a..b3fa10141 100644 --- a/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts +++ b/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts @@ -34,9 +34,9 @@ const subsonicOk = >(data: T) => "subsonic-response": { status: "ok", version: "1.16.1", ...data }, }); -const subsonicFailed = (message: string) => +const subsonicFailed = (message: string, code = 70) => JSON.stringify({ - "subsonic-response": { status: "failed", error: { code: 70, message } }, + "subsonic-response": { status: "failed", error: { code, message } }, }); beforeEach(() => { @@ -199,3 +199,128 @@ describe("NavidromeIntegration.getDashboardDataAsync", () => { }); }); }); + +describe("NavidromeIntegration.getCurrentSessionsAsync", () => { + test("maps now playing entries to stream sessions", async () => { + mockFetch.mockImplementation((url) => { + const urlStr = toUrlString(url); + + if (urlStr.includes("getNowPlaying")) { + return Promise.resolve( + new Response( + subsonicOk({ + nowPlaying: { + entry: [ + { + title: "Song", + artist: "Band", + album: "LP", + username: "user1", + playerName: "Chrome", + }, + { + title: "Second Song", + artist: "Second Artist", + album: "Second Album", + username: "user2", + playerName: "Mobile", + }, + ], + }, + }), + { status: 200 }, + ), + ) as unknown as ReturnType; + } + + return Promise.resolve(new Response(subsonicOk({}), { status: 200 })) as unknown as ReturnType< + typeof fetchWithTrustedCertificatesAsync + >; + }); + + const integration = createIntegration(); + const result = await integration.getCurrentSessionsAsync({ showOnlyPlaying: true }); + + expect(result).toEqual([ + { + sessionId: "user1-Chrome", + sessionName: "Chrome", + user: { + userId: "user1", + username: "user1", + profilePictureUrl: null, + }, + currentlyPlaying: { + type: "audio", + name: "Song", + seasonName: "Band", + episodeName: null, + albumName: "LP", + episodeCount: null, + metadata: null, + }, + }, + { + sessionId: "user2-Mobile", + sessionName: "Mobile", + user: { + userId: "user2", + username: "user2", + profilePictureUrl: null, + }, + currentlyPlaying: { + type: "audio", + name: "Second Song", + seasonName: "Second Artist", + episodeName: null, + albumName: "Second Album", + episodeCount: null, + metadata: null, + }, + }, + ]); + }); + + test("returns an empty array when there are no now playing entries", async () => { + mockFetch.mockImplementation((url) => { + const urlStr = toUrlString(url); + + if (urlStr.includes("getNowPlaying")) { + return Promise.resolve(new Response(subsonicOk({ nowPlaying: {} }), { status: 200 })) as unknown as ReturnType< + typeof fetchWithTrustedCertificatesAsync + >; + } + + return Promise.resolve(new Response(subsonicOk({}), { status: 200 })) as unknown as ReturnType< + typeof fetchWithTrustedCertificatesAsync + >; + }); + + const integration = createIntegration(); + const result = await integration.getCurrentSessionsAsync({ showOnlyPlaying: false }); + + expect(result).toEqual([]); + }); + + test("throws on subsonic auth failure", async () => { + mockFetch.mockImplementation((url) => { + const urlStr = toUrlString(url); + + if (urlStr.includes("getNowPlaying")) { + return Promise.resolve( + new Response(subsonicFailed("Wrong username or password", 40), { status: 200 }), + ) as unknown as ReturnType; + } + + return Promise.resolve(new Response(subsonicOk({}), { status: 200 })) as unknown as ReturnType< + typeof fetchWithTrustedCertificatesAsync + >; + }); + + const integration = createIntegration(); + + await expect(integration.getCurrentSessionsAsync({ showOnlyPlaying: true })).rejects.toThrow( + "Wrong username or password", + ); + }); +}); diff --git a/packages/widgets/src/audio-stats/audio-stats-content.tsx b/packages/widgets/src/audio-stats/audio-stats-content.tsx index 3b17223b8..b6824a1fe 100644 --- a/packages/widgets/src/audio-stats/audio-stats-content.tsx +++ b/packages/widgets/src/audio-stats/audio-stats-content.tsx @@ -1,8 +1,7 @@ "use client"; import type { CSSProperties } from "react"; -import { Badge, Text } from "@mantine/core"; -import { IconHeadphones } from "@tabler/icons-react"; +import { Text } from "@mantine/core"; import type { AudiobookshelfDashboardData, NavidromeDashboardData } from "@homarr/integrations/types"; import { useScopedI18n } from "@homarr/translation/client"; @@ -40,29 +39,6 @@ export function AudioStatsContent({ backend, stats, options, width }: AudioStats const gridCols = getGridCols(width, visibleStats.length, options.compactMode ?? false); const iconSize = getIconSize(width, options.compactMode ?? false); - const navidromeStatsByBackend: Record = { - navidrome: stats as NavidromeDashboardData, - audiobookshelf: null, - }; - const navidromeStats = navidromeStatsByBackend[backend]; - const showNowPlayingSection = - navidromeStats !== null && Boolean(options.showNowPlaying) && navidromeStats.nowPlaying.length > 0; - - const nowPlayingLimitByListVisibility = { - true: options.maxNowPlayingItems ?? 3, - false: 0, - } as const; - - const nowPlayingTracks = - navidromeStats?.nowPlaying.slice( - 0, - nowPlayingLimitByListVisibility[ - String(options.showNowPlayingList) as keyof typeof nowPlayingLimitByListVisibility - ], - ) ?? []; - - const hasContent = visibleStats.length > 0 || showNowPlayingSection; - return (
    {visibleStats.length > 0 && ( @@ -80,40 +56,7 @@ export function AudioStatsContent({ backend, stats, options, width }: AudioStats
    )} - {showNowPlayingSection && navidromeStats && ( -
    -
    - - {t("nowPlaying" as never)} - {!options.showNowPlayingList && ( - - {(t as unknown as (key: string, params?: { count: number }) => string)("nowPlayingCount", { - count: navidromeStats.nowPlaying.length, - })} - - )} -
    - {options.showNowPlayingList && ( -
    - {nowPlayingTracks.map((track, index) => ( -
    -
    - {track.title} - - {[track.artist, track.album].filter(Boolean).join(" · ")} - -
    - - {track.username || track.playerName} - -
    - ))} -
    - )} -
    - )} - - {!hasContent && ( + {visibleStats.length === 0 && (
    — diff --git a/packages/widgets/src/audio-stats/index.ts b/packages/widgets/src/audio-stats/index.ts index 25af0bdaf..ffcd2dd93 100644 --- a/packages/widgets/src/audio-stats/index.ts +++ b/packages/widgets/src/audio-stats/index.ts @@ -1,5 +1,4 @@ import { IconHeadphones, IconServerOff } from "@tabler/icons-react"; -import { z } from "zod/v4"; import { createWidgetDefinition } from "../definition"; import { optionsBuilder } from "../options"; @@ -23,14 +22,6 @@ export const { definition, componentLoader } = createWidgetDefinition("audioStat showArtists: factory.switch({ defaultValue: true, withDescription: true }), showAlbums: factory.switch({ defaultValue: true, withDescription: true }), showSongs: factory.switch({ defaultValue: true, withDescription: true }), - showNowPlaying: factory.switch({ defaultValue: true, withDescription: true }), - showNowPlayingList: factory.switch({ defaultValue: true, withDescription: true }), - maxNowPlayingItems: factory.number({ - defaultValue: 3, - validate: z.number().min(1).max(5), - step: 1, - withDescription: true, - }), showLibraryCount: factory.switch({ defaultValue: true, withDescription: true }), showAudiobooks: factory.switch({ defaultValue: true, withDescription: true }), showPodcasts: factory.switch({ defaultValue: true, withDescription: true }), @@ -42,9 +33,6 @@ export const { definition, componentLoader } = createWidgetDefinition("audioStat showArtists: hideUnlessNavidrome, showAlbums: hideUnlessNavidrome, showSongs: hideUnlessNavidrome, - showNowPlaying: hideUnlessNavidrome, - showNowPlayingList: hideUnlessNavidrome, - maxNowPlayingItems: hideUnlessNavidrome, showLibraryCount: hideUnlessAudiobookshelf, showAudiobooks: hideUnlessAudiobookshelf, showPodcasts: hideUnlessAudiobookshelf, diff --git a/packages/widgets/src/audio-stats/shared.ts b/packages/widgets/src/audio-stats/shared.ts index 39fc9b0b6..d4b79c72c 100644 --- a/packages/widgets/src/audio-stats/shared.ts +++ b/packages/widgets/src/audio-stats/shared.ts @@ -19,9 +19,6 @@ export interface NavidromeDisplayOptions { showArtists: boolean; showAlbums: boolean; showSongs: boolean; - showNowPlaying: boolean; - showNowPlayingList: boolean; - maxNowPlayingItems: number; compactMode?: boolean; } From 6a3cee81077f8de9c4eae7f33b7962257ae3eac1 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 31 Jul 2026 13:53:06 +0200 Subject: [PATCH 14/16] fix(navidrome): complete media server session data (#6492) --- .../src/navidrome/navidrome-integration.ts | 44 +++++++++++-------- .../test/navidrome-integration.spec.ts | 12 +++++ 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/packages/integrations/src/navidrome/navidrome-integration.ts b/packages/integrations/src/navidrome/navidrome-integration.ts index 733fa92a0..6f1e7b1b7 100644 --- a/packages/integrations/src/navidrome/navidrome-integration.ts +++ b/packages/integrations/src/navidrome/navidrome-integration.ts @@ -72,24 +72,32 @@ export class NavidromeIntegration extends Integration implements IMediaServerInt public async getCurrentSessionsAsync(_options: CurrentSessionsInput): Promise { const nowPlaying = await this.getNowPlayingAsync(); - return nowPlaying.map((entry): StreamSession => ({ - sessionId: `${entry.username}-${entry.playerName}`, - sessionName: entry.playerName, - user: { - userId: entry.username, - username: entry.username, - profilePictureUrl: null, - }, - currentlyPlaying: { - type: "audio", - name: entry.title, - seasonName: entry.artist || undefined, - episodeName: null, - albumName: entry.album, - episodeCount: null, - metadata: null, - }, - })); + return nowPlaying.map( + (entry): StreamSession => ({ + sessionId: `${entry.username}-${entry.playerName}`, + sessionName: entry.playerName, + user: { + userId: entry.username, + username: entry.username, + profilePictureUrl: null, + }, + currentlyPlaying: { + type: "audio", + name: entry.title, + seasonName: entry.artist || undefined, + episodeName: null, + albumName: entry.album, + episodeCount: null, + playback: { + state: null, + positionMs: null, + durationMs: null, + }, + location: null, + metadata: null, + }, + }), + ); } private async getArtistCountAsync(): Promise { diff --git a/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts b/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts index b3fa10141..3300f7003 100644 --- a/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts +++ b/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts @@ -257,6 +257,12 @@ describe("NavidromeIntegration.getCurrentSessionsAsync", () => { episodeName: null, albumName: "LP", episodeCount: null, + playback: { + state: null, + positionMs: null, + durationMs: null, + }, + location: null, metadata: null, }, }, @@ -275,6 +281,12 @@ describe("NavidromeIntegration.getCurrentSessionsAsync", () => { episodeName: null, albumName: "Second Album", episodeCount: null, + playback: { + state: null, + positionMs: null, + durationMs: null, + }, + location: null, metadata: null, }, }, From 61128ddcc8e631f89fe656848b8d2ee846b9bef0 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 31 Jul 2026 14:20:51 +0200 Subject: [PATCH 15/16] fix(navidrome): clean up audio stats integration (#6493) --- apps/docs/docs/widgets/audio-stats/index.mdx | 46 +++++----- apps/docs/docs/widgets/audio-stats/index.ts | 18 ---- .../src/navidrome/navidrome-integration.ts | 4 +- .../src/navidrome/navidrome-types.ts | 1 - .../test/navidrome-integration.spec.ts | 68 +-------------- packages/translation/src/lang/en.json | 14 --- .../audio-stats/audio-stats-shared.spec.ts | 1 - .../src/audio-stats/component.module.css | 86 ------------------- 8 files changed, 29 insertions(+), 209 deletions(-) diff --git a/apps/docs/docs/widgets/audio-stats/index.mdx b/apps/docs/docs/widgets/audio-stats/index.mdx index f37a4eb83..50f32f5ec 100644 --- a/apps/docs/docs/widgets/audio-stats/index.mdx +++ b/apps/docs/docs/widgets/audio-stats/index.mdx @@ -1,43 +1,45 @@ --- -title: 'Audio Stats' -description: 'Displays library statistics from Navidrome or Audiobookshelf, adapting its display based on the linked integration.' +title: "Audio Stats" +description: "Displays library statistics from Navidrome or Audiobookshelf, adapting its display based on the linked integration." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { audioStatsWidget } from '.'; -import { navidromeIntegration } from '@site/docs/integrations/navidrome'; -import { audiobookshelfIntegration } from '@site/docs/integrations/audiobookshelf'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { audioStatsWidget } from "."; +import { navidromeIntegration } from "@site/docs/integrations/navidrome"; +import { audiobookshelfIntegration } from "@site/docs/integrations/audiobookshelf"; - - + This widget adapts its display based on the linked integration: -- **Navidrome**: Shows artist, album, and song counts, plus a now playing section with active streams +- **Navidrome**: Shows artist, album, and song counts - **Audiobookshelf**: Shows library count, audiobook/podcast totals, listening time, and active sessions Only options relevant to your linked integration are shown in the configuration panel. ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/audio-stats/index.ts b/apps/docs/docs/widgets/audio-stats/index.ts index ab9bd7f2f..21ef8714d 100644 --- a/apps/docs/docs/widgets/audio-stats/index.ts +++ b/apps/docs/docs/widgets/audio-stats/index.ts @@ -27,24 +27,6 @@ export const audioStatsWidget: WidgetDefinition = { values: { type: "boolean" }, defaultValue: "yes", }, - { - name: "Show now playing", - description: "Displays currently playing tracks (Navidrome only)", - values: { type: "boolean" }, - defaultValue: "yes", - }, - { - name: "Show now playing list", - description: "Displays a detailed list of now playing tracks (Navidrome only)", - values: { type: "boolean" }, - defaultValue: "yes", - }, - { - name: "Max now playing items", - description: "Maximum number of now playing tracks to display (Navidrome only)", - values: "Number (1-5)", - defaultValue: "3", - }, { name: "Show library count", description: "Displays the number of libraries (Audiobookshelf only)", diff --git a/packages/integrations/src/navidrome/navidrome-integration.ts b/packages/integrations/src/navidrome/navidrome-integration.ts index 6f1e7b1b7..ebbff6611 100644 --- a/packages/integrations/src/navidrome/navidrome-integration.ts +++ b/packages/integrations/src/navidrome/navidrome-integration.ts @@ -55,17 +55,15 @@ export class NavidromeIntegration extends Integration implements IMediaServerInt } public async getDashboardDataAsync(): Promise { - const [artistCount, libraryCounts, nowPlaying] = await Promise.all([ + const [artistCount, libraryCounts] = await Promise.all([ this.getArtistCountAsync(), this.getAlbumAndSongCountsAsync(), - this.getNowPlayingAsync(), ]); return { artistCount, albumCount: libraryCounts.albumCount, songCount: libraryCounts.songCount, - nowPlaying, }; } diff --git a/packages/integrations/src/navidrome/navidrome-types.ts b/packages/integrations/src/navidrome/navidrome-types.ts index a9e5067f2..53f930d93 100644 --- a/packages/integrations/src/navidrome/navidrome-types.ts +++ b/packages/integrations/src/navidrome/navidrome-types.ts @@ -67,5 +67,4 @@ export interface NavidromeDashboardData { artistCount: number; albumCount: number; songCount: number; - nowPlaying: NavidromeNowPlayingEntry[]; } diff --git a/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts b/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts index 3300f7003..33912b395 100644 --- a/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts +++ b/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts @@ -84,12 +84,6 @@ describe("NavidromeIntegration.getDashboardDataAsync", () => { >; } - if (urlStr.includes("getNowPlaying")) { - return Promise.resolve(new Response(subsonicOk({ nowPlaying: {} }), { status: 200 })) as unknown as ReturnType< - typeof fetchWithTrustedCertificatesAsync - >; - } - return Promise.resolve(new Response(subsonicOk({}), { status: 200 })) as unknown as ReturnType< typeof fetchWithTrustedCertificatesAsync >; @@ -101,7 +95,6 @@ describe("NavidromeIntegration.getDashboardDataAsync", () => { expect(result.albumCount).toBe(700); expect(result.songCount).toBe(500 * 10 + 200 * 5); expect(result.artistCount).toBe(1); - expect(result.nowPlaying).toEqual([]); }); test("handles empty library gracefully", async () => { @@ -120,12 +113,6 @@ describe("NavidromeIntegration.getDashboardDataAsync", () => { ) as unknown as ReturnType; } - if (urlStr.includes("getNowPlaying")) { - return Promise.resolve( - new Response(subsonicFailed("Library not found or empty"), { status: 200 }), - ) as unknown as ReturnType; - } - return Promise.resolve(new Response(subsonicOk({}), { status: 200 })) as unknown as ReturnType< typeof fetchWithTrustedCertificatesAsync >; @@ -137,7 +124,6 @@ describe("NavidromeIntegration.getDashboardDataAsync", () => { expect(result.artistCount).toBe(0); expect(result.albumCount).toBe(0); expect(result.songCount).toBe(0); - expect(result.nowPlaying).toEqual([]); }); test("throws on non-empty-library subsonic error", async () => { @@ -151,53 +137,6 @@ describe("NavidromeIntegration.getDashboardDataAsync", () => { const integration = createIntegration(); await expect(integration.getDashboardDataAsync()).rejects.toThrow(); }); - - test("now playing maps entries correctly", async () => { - mockFetch.mockImplementation((url) => { - const urlStr = toUrlString(url); - - if (urlStr.includes("getNowPlaying")) { - return Promise.resolve( - new Response( - subsonicOk({ - nowPlaying: { - entry: { title: "Song", artist: "Band", album: "LP", username: "user1", playerName: "Chrome" }, - }, - }), - { status: 200 }, - ), - ) as unknown as ReturnType; - } - - if (urlStr.includes("getArtists")) { - return Promise.resolve(new Response(subsonicOk({ artists: {} }), { status: 200 })) as unknown as ReturnType< - typeof fetchWithTrustedCertificatesAsync - >; - } - - if (urlStr.includes("getAlbumList2")) { - return Promise.resolve(new Response(subsonicOk({ albumList2: {} }), { status: 200 })) as unknown as ReturnType< - typeof fetchWithTrustedCertificatesAsync - >; - } - - return Promise.resolve(new Response(subsonicOk({}), { status: 200 })) as unknown as ReturnType< - typeof fetchWithTrustedCertificatesAsync - >; - }); - - const integration = createIntegration(); - const result = await integration.getDashboardDataAsync(); - - expect(result.nowPlaying).toHaveLength(1); - expect(result.nowPlaying[0]).toEqual({ - title: "Song", - artist: "Band", - album: "LP", - username: "user1", - playerName: "Chrome", - }); - }); }); describe("NavidromeIntegration.getCurrentSessionsAsync", () => { @@ -331,8 +270,9 @@ describe("NavidromeIntegration.getCurrentSessionsAsync", () => { const integration = createIntegration(); - await expect(integration.getCurrentSessionsAsync({ showOnlyPlaying: true })).rejects.toThrow( - "Wrong username or password", - ); + await expect(integration.getCurrentSessionsAsync({ showOnlyPlaying: true })).rejects.toMatchObject({ + message: "An unknown error occured while executing Integration method", + cause: { message: "Wrong username or password" }, + }); }); }); diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index 388dc4186..de211bf66 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -3768,18 +3768,6 @@ "label": "Show songs", "description": "Show the total number of songs in your music library (Navidrome)" }, - "showNowPlaying": { - "label": "Show now playing", - "description": "Show tracks currently being played (Navidrome)" - }, - "showNowPlayingList": { - "label": "Show now playing list", - "description": "Show individual tracks instead of only the active stream count (Navidrome)" - }, - "maxNowPlayingItems": { - "label": "Max now playing items", - "description": "Maximum number of tracks to show in the now playing list (Navidrome)" - }, "showLibraryCount": { "label": "Show library count", "description": "Show the number of libraries on your instance (Audiobookshelf)" @@ -3813,8 +3801,6 @@ "podcasts": "Podcasts", "listeningTime": "Listening Time", "activeSessions": "Active Sessions", - "nowPlaying": "Now Playing", - "nowPlayingCount": "{count, plural, one {# stream} other {# streams}}", "error": { "internalServerError": "Failed to fetch audio stats data" } diff --git a/packages/widgets/src/audio-stats/audio-stats-shared.spec.ts b/packages/widgets/src/audio-stats/audio-stats-shared.spec.ts index 3aab75060..406562f66 100644 --- a/packages/widgets/src/audio-stats/audio-stats-shared.spec.ts +++ b/packages/widgets/src/audio-stats/audio-stats-shared.spec.ts @@ -42,7 +42,6 @@ describe("getVisibleStats", () => { artistCount: 100, albumCount: 200, songCount: 3000, - nowPlaying: [], }; const audiobookshelfStats: AudiobookshelfDashboardData = { diff --git a/packages/widgets/src/audio-stats/component.module.css b/packages/widgets/src/audio-stats/component.module.css index f665c8028..84b3a447c 100644 --- a/packages/widgets/src/audio-stats/component.module.css +++ b/packages/widgets/src/audio-stats/component.module.css @@ -87,92 +87,6 @@ font-size: clamp(11px, 4cqi, 16px); } -.nowPlaying { - display: flex; - flex-direction: column; - gap: clamp(3px, 1.2cqi, 5px); - flex: 1; - min-height: 0; - overflow: hidden; -} - -.nowPlayingHeader { - display: flex; - align-items: center; - gap: clamp(4px, 1.5cqi, 6px); - font-size: clamp(10px, 2.8cqi, 12px); - font-weight: 600; - flex-shrink: 0; - min-width: 0; -} - -.nowPlayingTitle { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.nowPlayingCount { - flex-shrink: 0; - margin-inline-start: auto; -} - -.nowPlayingList { - display: flex; - flex-direction: column; - gap: clamp(2px, 0.8cqi, 4px); - flex: 1; - min-height: 0; - overflow: hidden; -} - -.nowPlayingItem { - display: flex; - align-items: center; - justify-content: space-between; - gap: clamp(4px, 1.5cqi, 6px); - padding: clamp(3px, 1.2cqi, 6px) clamp(4px, 1.5cqi, 8px); - border-radius: var(--mantine-radius-sm); - background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6)); - min-width: 0; - flex-shrink: 0; -} - -.trackInfo { - display: flex; - flex-direction: column; - gap: 1px; - min-width: 0; - flex: 1; -} - -.trackTitle { - font-size: clamp(9px, 2.6cqi, 12px); - font-weight: 500; - line-height: 1.2; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.trackArtist { - font-size: clamp(8px, 2.2cqi, 10px); - color: var(--mantine-color-dimmed); - line-height: 1.2; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.trackUser { - flex-shrink: 0; - max-width: clamp(40px, 22cqi, 88px); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - .emptyState { display: flex; flex: 1; From ade640dceac375d398b2969c51167dd9e3f8ff70 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 31 Jul 2026 14:39:11 +0200 Subject: [PATCH 16/16] test(navidrome): complete cleanup review (#6494) * test(navidrome): hoist album fixture helper * test(navidrome): address coderabbit cleanup feedback --- apps/docs/docs/widgets/audio-stats/index.mdx | 2 +- .../test/navidrome-integration.spec.ts | 24 ++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/apps/docs/docs/widgets/audio-stats/index.mdx b/apps/docs/docs/widgets/audio-stats/index.mdx index 50f32f5ec..88fa87f79 100644 --- a/apps/docs/docs/widgets/audio-stats/index.mdx +++ b/apps/docs/docs/widgets/audio-stats/index.mdx @@ -1,6 +1,6 @@ --- title: "Audio Stats" -description: "Displays library statistics from Navidrome or Audiobookshelf, adapting its display based on the linked integration." +description: "Displays media and listening statistics from Navidrome or Audiobookshelf, adapting its display based on the linked integration." hide_title: true --- diff --git a/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts b/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts index 33912b395..08c66ad2a 100644 --- a/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts +++ b/packages/integrations/src/navidrome/test/navidrome-integration.spec.ts @@ -1,6 +1,12 @@ +// @vitest-environment node import { Response } from "undici"; import { beforeEach, describe, expect, test, vi } from "vitest"; +vi.hoisted(() => { + process.env.SKIP_ENV_VALIDATION = "true"; + process.env.SECRET_ENCRYPTION_KEY = "0".repeat(64); +}); + import { fetchWithTrustedCertificatesAsync } from "@homarr/core/infrastructure/http"; import type { IntegrationSecret } from "../../base/types"; @@ -39,19 +45,19 @@ const subsonicFailed = (message: string, code = 70) => "subsonic-response": { status: "failed", error: { code, message } }, }); +const makeAlbums = (count: number, songCount: number) => + Array.from({ length: count }, (_, index) => ({ + id: `album-${index}`, + name: `Album ${index}`, + songCount, + })); + beforeEach(() => { mockFetch.mockReset(); }); describe("NavidromeIntegration.getDashboardDataAsync", () => { test("paginates album list and counts songs", async () => { - const makeAlbums = (count: number, songCount: number) => - Array.from({ length: count }, (_, i) => ({ - id: `album-${i}`, - name: `Album ${i}`, - songCount, - })); - mockFetch.mockImplementation((url) => { const urlStr = toUrlString(url); @@ -84,7 +90,7 @@ describe("NavidromeIntegration.getDashboardDataAsync", () => { >; } - return Promise.resolve(new Response(subsonicOk({}), { status: 200 })) as unknown as ReturnType< + return Promise.reject(new Error(`Unexpected dashboard request: ${urlStr}`)) as unknown as ReturnType< typeof fetchWithTrustedCertificatesAsync >; }); @@ -113,7 +119,7 @@ describe("NavidromeIntegration.getDashboardDataAsync", () => { ) as unknown as ReturnType; } - return Promise.resolve(new Response(subsonicOk({}), { status: 200 })) as unknown as ReturnType< + return Promise.reject(new Error(`Unexpected dashboard request: ${urlStr}`)) as unknown as ReturnType< typeof fetchWithTrustedCertificatesAsync >; });