Compare commits

..

13 Commits

Author SHA1 Message Date
Crowdin Bot
81758d0b2b New Crowdin translations by GitHub Action 2025-10-05 12:11:58 +00:00
shamoon
837717461f Fix: count only error status as failures in backrest (#5844) 2025-10-04 07:37:22 -07:00
dependabot[bot]
effedc28ed Chore(deps-dev): Bump @tailwindcss/postcss from 4.0.9 to 4.1.14 (#5832)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-01 18:12:24 +00:00
dependabot[bot]
76b477572e Chore(deps): Bump gamedig from 5.3.1 to 5.3.2 (#5831)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-01 17:51:03 +00:00
dependabot[bot]
6c6660b91b Chore(deps): Bump i18next from 24.2.3 to 25.5.3 (#5833)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-01 17:38:29 +00:00
dependabot[bot]
6886040798 Chore(deps): Bump raw-body from 3.0.0 to 3.0.1 (#5834)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-01 17:21:12 +00:00
dependabot[bot]
1fb4850bef Chore(deps-dev): Bump eslint-plugin-prettier from 5.5.1 to 5.5.4 (#5835)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-01 10:11:32 -07:00
shamoon
06cf76d724 Fix: restore bg image to body again (#5828) 2025-09-30 09:07:20 -07:00
Kulana Kryoseu
7aeda56af4 Documentation: clarify proxmox.yaml key must match Proxmox node name (#5823)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2025-09-30 06:19:25 +00:00
Kulana Kryoseu
2058b7fcae Documentation: add Kubernetes config file mounting instructions (#5825) 2025-09-29 23:11:03 -07:00
Matszwe02
1e06e93e47 Fix: specify color-scheme meta for darkreader (#5819) 2025-09-27 11:55:29 -07:00
AdamWHY2K
8f756d4084 Enhancement: Add size of torrent(s) in leechProgress list to qbittorrent widget (#5803) 2025-09-26 23:28:15 -07:00
Yevhen Kuzmovych
02089a35ee Feature: Your spotify widget (#5813)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2025-09-24 21:08:15 -07:00
60 changed files with 1608 additions and 1126 deletions

View File

@@ -178,3 +178,32 @@ See [ClusterRole and ClusterRoleBinding](../installation/k8s.md#clusterrole-and-
## Caveats
Similarly to Docker service discovery, there currently is no rigid ordering to discovered services and discovered services will be displayed above those specified in the `services.yaml`.
## Adding extra configuration files
Some Homepage features (for example, [Proxmox](../configs/proxmox.md)) require additional configuration files such as `proxmox.yaml`.
When running Homepage on Kubernetes, these files must be provided via a `ConfigMap` and mounted into the container at `/app/config`.
### ConfigMap example
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: homepage
data:
proxmox.yaml: |
pve:
url: https://proxmox.host.or.ip:8006
token: username@pam!Token ID
secret: secret
```
Mount the file into `/app/config` by updating the `Deployment`:
```yaml
volumeMounts:
- mountPath: /app/config/proxmox.yaml
name: homepage-config
subPath: proxmox.yaml
```

View File

@@ -4,10 +4,10 @@ description: Proxmox Configuration
---
The Proxmox connection is configured in the `proxmox.yaml` file. See [Create token](#create-token) section below for details on how to generate the required API token.
You can configure multiple nodes - be sure to use the exact `proxmoxNode` identifier!
To configure multiple nodes, ensure the key name in the `proxmox.yaml` matches the `proxmoxNode` field used in your service configuration.
```yaml
pve:
pve: # must match your actual Proxmox node name
url: https://proxmox.host.or.ip:8006
token: username@pam!Token ID
secret: secret

View File

@@ -16,4 +16,5 @@ widget:
username: username
password: password
enableLeechProgress: true # optional, defaults to false
enableLeechSize: true # optional, defaults to false
```

View File

@@ -0,0 +1,28 @@
---
title: Your Spotify
description: Your Spotify Widget Configuration
---
Learn more about [Your Spotify](https://github.com/Yooooomi/your_spotify).
Find your API key under `Settings > Account > Public token`, click `Generate` if not yet generated, copy key after
`?token=`.
Allowed fields: `["songs", "time", "artists"]`.
```yaml
widget:
type: yourspotify
url: http://your-spotify-server.host.or.ip # if using lsio image, add /api/
key: apikeyapikeyapikeyapikeyapikey
interval: month # optional, defaults to week
```
#### Interval
Allowed values for `interval`: `day`, `week`, `month`, `year`, `all`.
!!! note
`interval` is different from predefined intervals you see in `Your Spotify`'s UI.
For example, `This week` in UI means _from the start of this week_, here `week` means _past 7 days_.

View File

@@ -176,6 +176,7 @@ nav:
- widgets/services/wgeasy.md
- widgets/services/whatsupdocker.md
- widgets/services/xteve.md
- widgets/services/yourspotify.md
- widgets/services/zabbix.md
- "Information Widgets":
- widgets/info/index.md

View File

@@ -17,8 +17,8 @@
"compare-versions": "^6.1.1",
"dockerode": "^4.0.7",
"follow-redirects": "^1.15.11",
"gamedig": "^5.3.1",
"i18next": "^24.2.3",
"gamedig": "^5.3.2",
"i18next": "^25.5.3",
"ical.js": "^2.1.0",
"js-yaml": "^4.1.0",
"json-rpc-2.0": "^1.7.0",
@@ -29,7 +29,7 @@
"next-i18next": "^12.1.0",
"ping": "^0.4.4",
"pretty-bytes": "^6.1.1",
"raw-body": "^3.0.0",
"raw-body": "^3.0.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-i18next": "^15.5.3",
@@ -44,13 +44,13 @@
},
"devDependencies": {
"@tailwindcss/forms": "^0.5.10",
"@tailwindcss/postcss": "^4.0.9",
"@tailwindcss/postcss": "^4.1.14",
"eslint": "^9.25.1",
"eslint-config-next": "^15.2.4",
"eslint-config-prettier": "^10.1.1",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-prettier": "^5.5.1",
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-hooks": "^5.2.0",
"postcss": "^8.5.6",

562
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Slaag",
"num_failure_latest": "Mislukking",
"bytes_added_30": "Grepe bygevoeg"
},
"yourspotify": {
"songs": "Liedjies",
"time": "Tyd",
"artists": "Kunstenaars"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -276,7 +276,7 @@
"pending": "Wartend",
"approved": "Genehmigt",
"available": "Verfügbar",
"issues": "Open Issues"
"issues": "Offene Issues"
},
"overseerr": {
"pending": "Wartend",
@@ -1086,33 +1086,38 @@
"nextRenewingSubscription": "Nächste Zahlung"
},
"unraid": {
"STARTED": "Started",
"STOPPED": "Stopped",
"NEW_ARRAY": "New Array",
"RECON_DISK": "Reconstructing Disk",
"DISABLE_DISK": "Disk Disabled",
"SWAP_DSBL": "Swap Disable",
"INVALID_EXPANSION": "Invalid Expansion",
"STARTED": "Gestartet",
"STOPPED": "Angehalten",
"NEW_ARRAY": "Neues Array",
"RECON_DISK": "Festplatte wird neu aufgebaut",
"DISABLE_DISK": "Festplatte deaktiviert",
"SWAP_DSBL": "Swap deaktivieren",
"INVALID_EXPANSION": "Üngültige Erweiterung",
"PARITY_NOT_BIGGEST": "Parity Not Biggest",
"TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
"NEW_DISK_TOO_SMALL": "New Disk Too Small",
"NO_DATA_DISKS": "No Data Disks",
"notifications": "Notifications",
"TOO_MANY_MISSING_DISKS": "Zu viele fehlende Festplatten",
"NEW_DISK_TOO_SMALL": "Neue Festplatte zu klein",
"NO_DATA_DISKS": "Keine Datenträger",
"notifications": "Mitteilungen",
"status": "Status",
"cpu": "CPU",
"memoryUsed": "Memory Used",
"memoryAvailable": "Memory Available",
"arrayUsed": "Array Used",
"arrayFree": "Array Free",
"poolUsed": "{{pool}} Used",
"poolFree": "{{pool}} Free"
"memoryUsed": "Speichernutzung",
"memoryAvailable": "Verfügbarer Speicher",
"arrayUsed": "Array verwendet",
"arrayFree": "Array frei",
"poolUsed": "{{pool}} verwendet",
"poolFree": "{{pool}} frei"
},
"backrest": {
"num_plans": "Plans",
"num_success_30": "Successes",
"num_failure_30": "Failures",
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
"num_plans": "Pläne",
"num_success_30": "Erfolgreich",
"num_failure_30": "Fehlerhaft",
"num_success_latest": "Erfolgreich",
"num_failure_latest": "Fehlgeschlagen",
"bytes_added_30": "Bytes hinzugefügt"
},
"yourspotify": {
"songs": "Titel",
"time": "Zeit",
"artists": "Künstler"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1098,10 +1098,10 @@
"NEW_DISK_TOO_SMALL": "New Disk Too Small",
"NO_DATA_DISKS": "No Data Disks",
"notifications": "Notifications",
"status": "Status",
"cpu": "CPU",
"memoryUsed": "Memory Used",
"memoryAvailable": "Memory Available",
"status": "État",
"cpu": "UCT",
"memoryUsed": "Mémoire Utilisé",
"memoryAvailable": "Mémoire Disponible",
"arrayUsed": "Array Used",
"arrayFree": "Array Free",
"poolUsed": "{{pool}} Used",
@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -61,16 +61,16 @@
"wlan_devices": "WLAN Eszközök",
"lan_users": "LAN Felhasználók",
"wlan_users": "WLAN Felhasználók",
"up": "UP",
"up": "FUT",
"down": "ÁLL",
"wait": "Please wait",
"wait": "Kérjük várjon",
"empty_data": "Az alrendszer állapota ismeretlen"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"cpu": "Processzor",
"running": "Futó",
"offline": "Nem elérhető",
"error": "Hiba",
@@ -93,8 +93,8 @@
"http_status": "HTTP állapot",
"error": "Hiba",
"response": "Válasz",
"down": "Down",
"up": "Up",
"down": "Leállt",
"up": "Fut",
"not_available": "Nem elérhető"
},
"emby": {
@@ -108,10 +108,10 @@
"songs": "Zeneszám"
},
"esphome": {
"offline": "Offline",
"offline_alt": "Offline",
"offline": "Nem elérhető",
"offline_alt": "Nem elérhető",
"online": "Csatlakozva",
"total": "Total",
"total": "Összes",
"unknown": "Ismeretlen"
},
"evcc": {
@@ -133,7 +133,7 @@
"unread": "Olvasatlan"
},
"fritzbox": {
"connectionStatus": "Status",
"connectionStatus": "Státusz",
"connectionStatusUnconfigured": "Nem beállított",
"connectionStatusConnecting": "Kapcsolódás",
"connectionStatusAuthenticating": "Hitelesítés",
@@ -141,16 +141,16 @@
"connectionStatusDisconnecting": "Kapcsolat bontása",
"connectionStatusDisconnected": "Kapcsolat bontva",
"connectionStatusConnected": "Csatlakozva",
"uptime": "Uptime",
"uptime": "Működési idő",
"maxDown": "Max let.",
"maxUp": "Max felt.",
"down": "Down",
"up": "Up",
"down": "Leállt",
"up": "Fut",
"received": "Fogadott",
"sent": "Küldött",
"externalIPAddress": "Külső IP cím",
"externalIPv6Address": "Ext. IPv6",
"externalIPv6Prefix": "Ext. IPv6-Prefix"
"externalIPv6Address": "Küls. IPv6",
"externalIPv6Prefix": "Küls. IPv6-Prefix"
},
"caddy": {
"upstreams": "Upstreamek",
@@ -168,17 +168,17 @@
"passes": "Engedélyek"
},
"tautulli": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"playing": "Lejátszás",
"transcoding": "Transzkódolás",
"bitrate": "Bitráta",
"no_active": "Nincs aktív lejátszás",
"plex_connection_error": "Plex kapcsolat ellenőrzése"
},
"omada": {
"connectedAp": "Csatlakoztatott AP-k",
"activeUser": "Aktív eszközök",
"alerts": "Riasztások",
"connectedGateways": "Connected gateways",
"connectedGateways": "Csatlakoztatott gateway-ek",
"connectedSwitches": "Csatlakoztatott switch-ek"
},
"nzbget": {
@@ -189,11 +189,11 @@
"plex": {
"streams": "Aktív Stream-ek",
"albums": "Albumok",
"movies": "Movies",
"movies": "Filmek",
"tv": "TV műsorok"
},
"sabnzbd": {
"rate": "Rate",
"rate": "Ráta",
"queue": "Sor",
"timeleft": "Hátralévő idő"
},
@@ -233,34 +233,34 @@
"cachemissbytes": "Gyorsítótárban Hibás Bitek"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"download": "Letöltés",
"upload": "Feltöltés",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Keresett",
"queued": "Sorban áll",
"series": "Series",
"queue": "Queue",
"unknown": "Unknown"
"series": "Sorozatok",
"queue": "Várólista",
"unknown": "Ismeretlen"
},
"radarr": {
"wanted": "Wanted",
"wanted": "Keresett",
"missing": "Hiányzik",
"queued": "Queued",
"movies": "Movies",
"queue": "Queue",
"unknown": "Unknown"
"queued": "Sorban áll",
"movies": "Filmek",
"queue": "Várólista",
"unknown": "Ismeretlen"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"wanted": "Keresett",
"queued": "Sorban áll",
"artists": "Előadók"
},
"readarr": {
"wanted": "Wanted",
"queued": "Queued",
"wanted": "Keresett",
"queued": "Sorban áll",
"books": "Könyvek"
},
"bazarr": {
@@ -273,20 +273,20 @@
"available": "Elérhető"
},
"jellyseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"issues": "Open Issues"
"pending": "Függőben lévő",
"approved": "Jóváhagyott",
"available": "Elérhető",
"issues": "Nyitott problémák"
},
"overseerr": {
"pending": "Pending",
"pending": "Függőben lévő",
"processing": "Feldolgozás",
"approved": "Approved",
"available": "Available"
"approved": "Jóváhagyott",
"available": "Elérhető"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
"total": "Összes",
"connected": "Csatlakoztatott",
"new_devices": "Új eszközök",
"down_alerts": "Leállási riasztások"
},
@@ -297,26 +297,26 @@
"gravity": "Gravitáció"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"queries": "Lekérdezések",
"blocked": "Blokkolt",
"filtered": "Szűrt",
"latency": "Késleltetés"
},
"speedtest": {
"upload": "Upload",
"download": "Download",
"upload": "Feltöltés",
"download": "Letöltés",
"ping": "Ping"
},
"portainer": {
"running": "Running",
"running": "Folyamatban",
"stopped": "Megállított",
"total": "Total"
"total": "Összes"
},
"suwayomi": {
"download": "Downloaded",
"download": "Letöltött",
"nondownload": "Nem Letöltött",
"read": "Read",
"unread": "Unread",
"read": "Olvasott",
"unread": "Olvasatlan",
"downloadedread": "Letöltött & Olvasott",
"downloadedunread": "Letöltött & Olvasatlan",
"nondownloadedread": "Nem Letöltött & Olvasatlan",
@@ -337,7 +337,7 @@
"ago": "{{value}} Ezelőtt"
},
"technitium": {
"totalQueries": "Queries",
"totalQueries": "Lekérdezések",
"totalNoError": "Sikerek",
"totalServerFailure": "Hibák",
"totalNxDomain": "NX Domainek",
@@ -345,12 +345,12 @@
"totalAuthoritative": "Irányadó",
"totalRecursive": "Rekurzív",
"totalCached": "Gyorsítótárazott",
"totalBlocked": "Blocked",
"totalBlocked": "Blokkolt",
"totalDropped": "Eldobott",
"totalClients": "Kliensek"
},
"tdarr": {
"queue": "Queue",
"queue": "Várólista",
"processed": "Feldolgozott",
"errored": "Hibás",
"saved": "Mentett"
@@ -361,19 +361,19 @@
"middleware": "Közvetítő"
},
"trilium": {
"version": "Version",
"notesCount": "Notes",
"dbSize": "Database Size",
"unknown": "Unknown"
"version": "Verzió",
"notesCount": "Jegyzetek",
"dbSize": "Adatbázis mérete",
"unknown": "Ismeretlen"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"nothing_streaming": "Nincs aktív lejátszás",
"please_wait": "Kérjük Várjon"
},
"npm": {
"enabled": "Bekapcsolva",
"disabled": "Kikapcsolva",
"total": "Total"
"total": "Összes"
},
"coinmarketcap": {
"configure": "Állíts be egy vagy több Cryptovalutát a követéshez",
@@ -384,73 +384,73 @@
},
"gotify": {
"apps": "Applikációk",
"clients": "Clients",
"clients": "Kliensek",
"messages": "Üzenetek"
},
"prowlarr": {
"enableIndexers": "Indexerek",
"numberOfGrabs": "Fogott",
"numberOfQueries": "Queries",
"numberOfQueries": "Lekérdezések",
"numberOfFailGrabs": "Hibás fogások",
"numberOfFailQueries": "Hibás lekérdezések"
},
"jackett": {
"configured": "Beállított",
"errored": "Errored"
"errored": "Hibák"
},
"strelaysrv": {
"numActiveSessions": "Munkamenetek",
"numConnections": "Csatlakozások",
"dataRelayed": "Átirányított",
"transferRate": "Rate"
"transferRate": "Ráta"
},
"mastodon": {
"user_count": "Users",
"user_count": "Felhasználók",
"status_count": "Posztok",
"domain_count": "Domainek"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
"wanted": "Keresett",
"queued": "Sorban áll",
"series": "Sorozatok"
},
"minecraft": {
"players": "Lejátszók",
"version": "Verzió",
"status": "Status",
"up": "Online",
"down": "Offline"
"status": "Státusz",
"up": "Kapcsolódva",
"down": "Nem elérhető"
},
"miniflux": {
"read": "Olvasott",
"unread": "Unread"
"unread": "Olvasatlan"
},
"authentik": {
"users": "Users",
"users": "Felhasználók",
"loginsLast24H": "Bejelentkezések (24 óra)",
"failedLoginsLast24H": "Sikertelen bejelentkezések (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"cpu": "Processzor",
"lxc": "LXC-k",
"vms": "VM-ek"
},
"glances": {
"cpu": "CPU",
"load": "Load",
"wait": "Please wait",
"temp": "TEMP",
"cpu": "Processzor",
"load": "Terhelés",
"wait": "Kérem várjon",
"temp": "HŐM",
"_temp": "Hőmérséklet",
"warn": "Figyelmeztet",
"uptime": "UP",
"total": "Total",
"free": "Free",
"used": "Used",
"days": "d",
"hours": "h",
"uptime": "FUT",
"total": "Összes",
"free": "Szabad",
"used": "Felhasznált",
"days": "n",
"hours": "ó",
"crit": "Kritikus",
"read": "Read",
"read": "Olvasott",
"write": "Írás",
"gpu": "GPU",
"mem": "Memória",
@@ -471,57 +471,57 @@
"1-day": "Többnyire napos",
"1-night": "Többnyire derült",
"2-day": "Részben felhős",
"2-night": "Partly Cloudy",
"2-night": "Részben felhős",
"3-day": "Felhős",
"3-night": "Cloudy",
"3-night": "Felhős",
"45-day": "Ködös",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"45-night": "Ködös",
"48-day": "Ködös",
"48-night": "Ködös",
"51-day": "Enyhe szitálás",
"51-night": "Light Drizzle",
"51-night": "Enyhe szitálás",
"53-day": "Szitálás",
"53-night": "Drizzle",
"53-night": "Szitálás",
"55-day": "Erős szitálás",
"55-night": "Heavy Drizzle",
"55-night": "Erős szitálás",
"56-day": "Enyhe fagyos szitálás",
"56-night": "Light Freezing Drizzle",
"56-night": "Enyhe fagyos szitálás",
"57-day": "Fagyos szitálás",
"57-night": "Freezing Drizzle",
"57-night": "Fagyos szitálás",
"61-day": "Enyhe eső",
"61-night": "Light Rain",
"61-night": "Enyhe eső",
"63-day": "Eső",
"63-night": "Rain",
"63-night": "Eső",
"65-day": "Heves eső",
"65-night": "Heavy Rain",
"65-night": "Heves eső",
"66-day": "Ónos eső",
"66-night": "Freezing Rain",
"67-day": "Freezing Rain",
"67-night": "Freezing Rain",
"66-night": "Ónos eső",
"67-day": "Ónos eső",
"67-night": "Ónos eső",
"71-day": "Enyhe havazás",
"71-night": "Light Snow",
"71-night": "Enyhe havazás",
"73-day": "Hó",
"73-night": "Snow",
"73-night": "Havazás",
"75-day": "Erős havazás",
"75-night": "Heavy Snow",
"75-night": "Erős havazás",
"77-day": "Hódara",
"77-night": "Snow Grains",
"77-night": "Hódara",
"80-day": "Enyhe záporok",
"80-night": "Light Showers",
"80-night": "Enyhe záporok",
"81-day": "Záporok",
"81-night": "Showers",
"81-night": "Záporok",
"82-day": "Heves záporok",
"82-night": "Heavy Showers",
"82-night": "Heves záporok",
"85-day": "Hózáporok",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"85-night": "Hózáporok",
"86-day": "Hózáporok",
"86-night": "Hózáporok",
"95-day": "Zivatar",
"95-night": "Thunderstorm",
"95-night": "Vihar",
"96-day": "Zivatar jégesővel",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail",
"99-night": "Thunderstorm With Hail"
"96-night": "Zivatar jégesővel",
"99-day": "Zivatar jégesővel",
"99-night": "Zivatar jégesővel"
},
"homebridge": {
"available_update": "Rendszer",
@@ -530,17 +530,17 @@
"up_to_date": "Naprakész",
"child_bridges": "Gyerek Hidak",
"child_bridges_status": "{{ok}}/{{total}}",
"up": "Up",
"pending": "Pending",
"down": "Down"
"up": "Fut",
"pending": "Függőben lévő",
"down": "Leállt"
},
"healthchecks": {
"new": "Új",
"up": "Up",
"up": "Fut",
"grace": "Türelmi idő alatt",
"down": "Down",
"down": "Leállt",
"paused": "Szünetel",
"status": "Status",
"status": "Státusz",
"last_ping": "Legutóbbi Ping",
"never": "Még nincsenek ping-ek"
},
@@ -550,21 +550,21 @@
"containers_failed": "Sikertelen"
},
"autobrr": {
"approvedPushes": "Approved",
"approvedPushes": "Jóváhagyott",
"rejectedPushes": "Elutasított",
"filters": "Szűrők",
"indexers": "Indexers"
"indexers": "Indexerek"
},
"tubearchivist": {
"downloads": "Queue",
"downloads": "Várólista",
"videos": "Videók",
"channels": "Csatornák",
"playlists": "Lejátszási listák"
},
"truenas": {
"load": "Rendszerterhelés",
"uptime": "Uptime",
"alerts": "Alerts"
"uptime": "Működési idő",
"alerts": "Figyelmeztetések"
},
"pyload": {
"speed": "Sebesség",
@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "성공 중",
"num_failure_latest": "실패 중",
"bytes_added_30": "추가된 용량"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -955,7 +955,7 @@
"invalidConfiguration": "Invalid Configuration"
},
"frigate": {
"cameras": "Cameras",
"cameras": "Kamery",
"uptime": "Dostupnosť",
"version": "Verzia"
},
@@ -966,7 +966,7 @@
},
"zabbix": {
"unclassified": "Not classified",
"information": "Information",
"information": "Informácie",
"warning": "Warning",
"average": "Average",
"high": "High",
@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Успевајући",
"num_failure_latest": "Неуспешно",
"bytes_added_30": "Додати бајтови"
},
"yourspotify": {
"songs": "Песме",
"time": "Време",
"artists": "Извођачи"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -735,7 +735,7 @@
"size": "Boyut",
"lastrun": "Son Çalışma",
"nextrun": "Sonraki Çalışma",
"failed": "Failed"
"failed": "Başarısız"
},
"unmanic": {
"active_workers": "Etkin kullanıcılar",
@@ -798,7 +798,7 @@
"buildId": "Yapı Kimliği",
"succeeded": "Başarılı",
"notStarted": "Henüz Başlamadı",
"failed": "Failed",
"failed": "Başarısız",
"canceled": "İptal edildi",
"inProgress": "Sürüyor",
"totalPrs": "Toplam Çekme İstekleri",
@@ -835,7 +835,7 @@
"running": "Çalışıyor",
"stopped": "Durdu",
"passed": "Passed",
"failed": "Failed"
"failed": "Başarısız"
},
"openwrt": {
"uptime": "Çalışma süresi",
@@ -876,7 +876,7 @@
"totalfilesize": "Toplam Kapasite"
},
"mailcow": {
"domains": "Domains",
"domains": "Alan Adları",
"mailboxes": "Posta kutuları",
"mails": "Postalar",
"storage": "Depolama"
@@ -988,7 +988,7 @@
},
"headscale": {
"name": "Ad",
"address": "Address",
"address": "Adres",
"last_seen": "Last Seen",
"status": "Durum",
"online": "Çevrimiçi",
@@ -1002,21 +1002,21 @@
"paused": "Durduruldu",
"pending": "Pending",
"status": "Durum",
"updated": "Updated",
"updated": "Güncellendi",
"cpu": "İşlemci",
"memory": "Bellek",
"disk": "Disk",
"network": "NET"
},
"argocd": {
"apps": "Apps",
"apps": "Uygulamalar",
"synced": "Synced",
"outOfSync": "Out Of Sync",
"healthy": "Sağlıklı",
"degraded": "Degraded",
"progressing": "Progressing",
"missing": "Eksik",
"suspended": "Suspended"
"suspended": "Askıya Alındı"
},
"spoolman": {
"loading": "Yükleniyor"
@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -14,20 +14,20 @@
"date": "{{value, date}}",
"relativeDate": "{{value, relativeDate}}",
"duration": "{{value, duration}}",
"months": "mo",
"days": "d",
"hours": "h",
"minutes": "m",
"seconds": "s"
"months": "tháng",
"days": "ngày",
"hours": "giờ",
"minutes": "phút",
"seconds": "giây"
},
"widget": {
"missing_type": "Thiếu loại Widget: {{type}}",
"api_error": "Lỗi API",
"information": "Information",
"information": "Thông tin",
"status": "Trạng thái",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
"raw_error": "Lỗi thô",
"response_data": "Dữ liệu phản hồi"
},
"weather": {
"current": "Vị trí hiện tại",
@@ -44,106 +44,106 @@
"total": "Tổng",
"free": "Dư",
"used": "Đã dùng",
"load": "Load",
"load": "\n",
"temp": "TEMP",
"max": "Max",
"max": "Tối đa",
"uptime": "UP"
},
"unifi": {
"users": "Users",
"uptime": "Uptime",
"days": "Days",
"users": "Người dùng",
"uptime": "Thời gian hoạt động",
"days": "Ngày",
"wan": "WAN",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Devices",
"lan_devices": "LAN Devices",
"wlan_devices": "WLAN Devices",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"devices": "Thiết bị",
"lan_devices": "Thiết bị trong mạng LAN",
"wlan_devices": "Thiết bị trong mạng WLAN",
"lan_users": "Người dùng mạng LAN",
"wlan_users": "Người dùng mạng WLAN",
"up": "UP",
"down": "DOWN",
"wait": "Please wait",
"empty_data": "Subsystem status unknown"
"wait": "Vui lòng chờ",
"empty_data": "Trạng thái hệ thống phụ không xác định"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"mem": "Bộ nhớ",
"cpu": "CPU",
"running": "Running",
"running": "Đang hoạt động",
"offline": "Ngoại tuyến",
"error": "Error",
"unknown": "Unknown",
"healthy": "Healthy",
"starting": "Starting",
"unhealthy": "Unhealthy",
"not_found": "Not Found",
"error": "Lỗi",
"unknown": "Không xác định",
"healthy": "Ổn định",
"starting": "Đang bắt đầu",
"unhealthy": "Bất thường",
"not_found": "Không tìm thấy",
"exited": "Exited",
"partial": "Partial"
},
"ping": {
"error": "Error",
"error": "Lỗi",
"ping": "Ping",
"down": "Down",
"up": "Up",
"not_available": "Không khả dụng"
},
"siteMonitor": {
"http_status": "HTTP status",
"error": "Error",
"response": "Response",
"http_status": "Trạng thái HTTP",
"error": "Lỗi",
"response": "Phản hồi",
"down": "Down",
"up": "Up",
"not_available": "Not Available"
"not_available": "Không có sẵn"
},
"emby": {
"playing": "Đang chơi",
"transcoding": "Chuyển định dạng",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"movies": "Phim ảnh",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"songs": "Bài hát"
},
"esphome": {
"offline": "Offline",
"offline_alt": "Offline",
"online": "Online",
"total": "Total",
"unknown": "Unknown"
"unknown": "Không xác định"
},
"evcc": {
"pv_power": "Production",
"battery_soc": "Battery",
"grid_power": "Grid",
"battery_soc": "Pin",
"grid_power": "Lưới",
"home_power": "Consumption",
"charge_power": "Charger",
"charge_power": "Bộ sạc",
"kilowatt": "kW"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"download": "Tải xuống",
"upload": "Tải lên",
"leech": "",
"seed": "Seed"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
"subscriptions": "Đăng ký",
"unread": "Chưa đọc"
},
"fritzbox": {
"connectionStatus": "Status",
"connectionStatusUnconfigured": "Unconfigured",
"connectionStatusConnecting": "Connecting",
"connectionStatusAuthenticating": "Authenticating",
"connectionStatusPendingDisconnect": "Pending Disconnect",
"connectionStatusDisconnecting": "Disconnecting",
"connectionStatusDisconnected": "Disconnected",
"connectionStatusConnected": "Connected",
"uptime": "Uptime",
"maxDown": "Max. Down",
"maxUp": "Max. Up",
"connectionStatus": "Trạng thái",
"connectionStatusUnconfigured": "Chưa được cấu hình",
"connectionStatusConnecting": "Đang kết nối",
"connectionStatusAuthenticating": "Đang uỷ quyền",
"connectionStatusPendingDisconnect": "Đang chờ ngắt kết nối",
"connectionStatusDisconnecting": "Đang ngắt kết nối",
"connectionStatusDisconnected": "Đã ngắt kết nối",
"connectionStatusConnected": "Đã kết nối",
"uptime": "Thời gian hoạt động",
"maxDown": "Tải xuống tối đa",
"maxUp": "Tải lên tối đa",
"down": "Down",
"up": "Up",
"received": "Received",
@@ -999,64 +999,64 @@
"systems": "Systems",
"up": "Up",
"down": "Down",
"paused": "Paused",
"pending": "Pending",
"status": "Status",
"updated": "Updated",
"paused": "Đã tạm dừng",
"pending": "Đang xử lý",
"status": "Trạng thái",
"updated": "Đã cập nhật",
"cpu": "CPU",
"memory": "MEM",
"disk": "Disk",
"disk": "Ổ đĩa",
"network": "NET"
},
"argocd": {
"apps": "Apps",
"apps": "Ứng dụng",
"synced": "Synced",
"outOfSync": "Out Of Sync",
"healthy": "Healthy",
"healthy": "Ổn định",
"degraded": "Degraded",
"progressing": "Progressing",
"missing": "Missing",
"missing": "Bị thiếu",
"suspended": "Suspended"
},
"spoolman": {
"loading": "Loading"
"loading": "Đang tải"
},
"gitlab": {
"groups": "Groups",
"issues": "Issues",
"merges": "Merge Requests",
"projects": "Projects"
"groups": "Nhóm",
"issues": "Vấn đề",
"merges": "Yêu cầu Hợp nhất",
"projects": "Dự án"
},
"apcups": {
"status": "Status",
"load": "Load",
"bcharge": "Battery Charge",
"timeleft": "Time Left"
"status": "Trạng thái",
"load": "Đang tải\n",
"bcharge": "Sạc pin",
"timeleft": "Thời gian còn lại"
},
"karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
"bookmarks": "Dấu trang",
"favorites": "Mục yêu thích",
"archived": "Đã lưu trữ",
"highlights": "Tâm điểm",
"lists": "Danh sách",
"tags": "Thẻ"
},
"slskd": {
"slskStatus": "Network",
"connected": "Connected",
"disconnected": "Disconnected",
"updateStatus": "Update",
"update_yes": "Available",
"update_no": "Up to Date",
"downloads": "Downloads",
"uploads": "Uploads",
"sharedFiles": "Files"
"slskStatus": "Mạng",
"connected": "Đã kết nối",
"disconnected": "Mất kết nối",
"updateStatus": "Cập nhật",
"update_yes": "Khả dụng",
"update_no": "Đã cập nhật",
"downloads": "Tải xuống",
"uploads": "Tải lên",
"sharedFiles": "Tập tin"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"other": "Other"
"songs": "Bài hát",
"movies": "Phim ảnh",
"episodes": "Tập",
"other": "Khác"
},
"checkmk": {
"serviceErrors": "Service issues",
@@ -1067,8 +1067,8 @@
"running": "Running",
"stopped": "Stopped",
"down": "Down",
"unhealthy": "Unhealthy",
"unknown": "Unknown",
"unhealthy": "Không ổn định",
"unknown": "Không xác định",
"servers": "Servers",
"stacks": "Stacks",
"containers": "Containers"
@@ -1076,18 +1076,18 @@
"filebrowser": {
"available": "Available",
"used": "Used",
"total": "Total"
"total": "Tổng"
},
"wallos": {
"activeSubscriptions": "Subscriptions",
"thisMonthlyCost": "This Month",
"nextMonthlyCost": "Next Month",
"previousMonthlyCost": "Prev. Month",
"nextRenewingSubscription": "Next Payment"
"activeSubscriptions": "Đăng ký",
"thisMonthlyCost": "Tháng này",
"nextMonthlyCost": "Tháng sau",
"previousMonthlyCost": "Tháng trước",
"nextRenewingSubscription": "Lần thanh toán kế tiếp"
},
"unraid": {
"STARTED": "Started",
"STOPPED": "Stopped",
"STARTED": "Đã bắt đầu",
"STOPPED": "Đã dừng",
"NEW_ARRAY": "New Array",
"RECON_DISK": "Reconstructing Disk",
"DISABLE_DISK": "Disk Disabled",
@@ -1096,9 +1096,9 @@
"PARITY_NOT_BIGGEST": "Parity Not Biggest",
"TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
"NEW_DISK_TOO_SMALL": "New Disk Too Small",
"NO_DATA_DISKS": "No Data Disks",
"notifications": "Notifications",
"status": "Status",
"NO_DATA_DISKS": "Không có dữ liệu ổ đĩa",
"notifications": "Thông báo",
"status": "Trạng thái",
"cpu": "CPU",
"memoryUsed": "Memory Used",
"memoryAvailable": "Memory Available",
@@ -1108,11 +1108,16 @@
"poolFree": "{{pool}} Free"
},
"backrest": {
"num_plans": "Plans",
"num_success_30": "Successes",
"num_failure_30": "Failures",
"num_plans": "Các kế hoạch",
"num_success_30": "Thành công",
"num_failure_30": "Thất bại",
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Bài hát",
"time": "Thời gian",
"artists": "Nghệ sĩ"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1114,5 +1114,10 @@
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
}
}

View File

@@ -1,4 +1,4 @@
export default function QueueEntry({ title, activity, timeLeft, progress }) {
export default function QueueEntry({ title, activity, timeLeft, progress, size }) {
return (
<div className="text-theme-700 dark:text-theme-200 relative h-5 rounded-md bg-theme-200/50 dark:bg-theme-900/20 m-1 px-1 flex">
<div
@@ -11,6 +11,7 @@ export default function QueueEntry({ title, activity, timeLeft, progress }) {
<div className="absolute w-full whitespace-nowrap text-ellipsis overflow-hidden text-left">{title}</div>
</div>
<div className="self-center text-xs flex justify-end mr-1.5 pl-1 z-10 text-ellipsis overflow-hidden whitespace-nowrap">
{size && `${size} - `}
{timeLeft ? `${activity} - ${timeLeft}` : activity}
</div>
</div>

View File

@@ -417,6 +417,7 @@ function Home({ initialSettings }) {
)}
<meta name="msapplication-TileColor" content={themes[settings.color || "slate"][settings.theme || "dark"]} />
<meta name="theme-color" content={themes[settings.color || "slate"][settings.theme || "dark"]} />
<meta name="color-scheme" content="dark light"></meta>
</Head>
<Script src="/api/config/custom.js" />
@@ -539,38 +540,48 @@ export default function Wrapper({ initialSettings, fallback }) {
html.classList.add(desiredThemeClass);
}
// Remove any previously applied inline styles
body.style.backgroundImage = "";
body.style.backgroundColor = "";
body.style.backgroundAttachment = "";
if (backgroundImage) {
const safeBackgroundImage = backgroundImage.replace(/'/g, "\\'");
body.style.backgroundImage = `linear-gradient(rgb(var(--bg-color) / ${opacity}), rgb(var(--bg-color) / ${opacity})), url('${safeBackgroundImage}')`;
body.style.backgroundSize = "cover";
body.style.backgroundPosition = "center";
body.style.backgroundAttachment = "fixed";
body.style.backgroundRepeat = "no-repeat";
body.style.backgroundColor = "";
} else {
body.style.backgroundImage = "none";
body.style.backgroundColor = "rgb(var(--bg-color))";
body.style.backgroundSize = "";
body.style.backgroundPosition = "";
body.style.backgroundAttachment = "";
body.style.backgroundRepeat = "";
}
return () => {
body.style.backgroundImage = "";
body.style.backgroundColor = "";
body.style.backgroundSize = "";
body.style.backgroundPosition = "";
body.style.backgroundAttachment = "";
body.style.backgroundRepeat = "";
};
}, [backgroundImage, opacity, theme, color, initialSettings.color]);
return (
<>
{backgroundImage && (
<div
id="background"
aria-hidden="true"
style={{
backgroundImage: `linear-gradient(rgb(var(--bg-color) / ${opacity}), rgb(var(--bg-color) / ${opacity})), url('${backgroundImage}')`,
}}
/>
)}
<div id="page_wrapper" className="relative h-full">
<div
id="inner_wrapper"
tabIndex="-1"
className={classNames(
"w-full h-full overflow-auto",
backgroundBlur &&
`backdrop-blur${initialSettings.background.blur?.length ? `-${initialSettings.background.blur}` : ""}`,
backgroundSaturate && `backdrop-saturate-${initialSettings.background.saturate}`,
backgroundBrightness && `backdrop-brightness-${initialSettings.background.brightness}`,
)}
>
<Index initialSettings={initialSettings} fallback={fallback} />
</div>
<div id="page_wrapper" className="relative min-h-screen">
<div
id="inner_wrapper"
tabIndex="-1"
className={classNames(
"w-full min-h-screen overflow-auto",
backgroundBlur &&
`backdrop-blur${initialSettings.background.blur?.length ? `-${initialSettings.background.blur}` : ""}`,
backgroundSaturate && `backdrop-saturate-${initialSettings.background.saturate}`,
backgroundBrightness && `backdrop-brightness-${initialSettings.background.brightness}`,
)}
>
<Index initialSettings={initialSettings} fallback={fallback} />
</div>
</>
</div>
);
}

View File

@@ -30,18 +30,6 @@ body,
height: 100%;
margin: 0;
padding: 0;
background-color: rgb(var(--bg-color));
}
#background {
position: fixed;
inset: 0;
z-index: 0;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
background-attachment: scroll;
pointer-events: none;
}
html,

View File

@@ -284,6 +284,7 @@ export function cleanServiceGroups(groups) {
// deluge, qbittorrent
enableLeechProgress,
enableLeechSize,
// diskstation
volume,
@@ -408,6 +409,9 @@ export function cleanServiceGroups(groups) {
// wgeasy
threshold,
// yourspotify
interval,
// technitium
range,
@@ -490,6 +494,7 @@ export function cleanServiceGroups(groups) {
}
if (["deluge", "qbittorrent"].includes(type)) {
if (enableLeechProgress !== undefined) widget.enableLeechProgress = JSON.parse(enableLeechProgress);
if (enableLeechSize !== undefined) widget.enableLeechSize = JSON.parse(enableLeechSize);
}
if (["opnsense", "pfsense"].includes(type)) {
if (wan) widget.wan = wan;
@@ -623,6 +628,11 @@ export function cleanServiceGroups(groups) {
if (pool3) widget.pool3 = pool3;
if (pool4) widget.pool4 = pool4;
}
if (type === "yourspotify") {
if (interval !== undefined) {
widget.interval = interval;
}
}
return widget;
});
return cleanedService;

View File

@@ -24,10 +24,11 @@ function buildResponse(plans) {
plans.forEach((plan) => {
const statuses = plan?.recentBackups?.status;
// See https://github.com/garethgeorge/backrest/blob/4357295a17cb2e71639473c9929a060c4dd1b624/proto/v1/operations.proto#L78-L87
if (Array.isArray(statuses) && statuses.length > 0) {
if (statuses[0] === "STATUS_SUCCESS") {
numSuccessLatest++;
} else {
} else if (statuses[0] === "STATUS_ERROR") {
numFailureLatest++;
}
}

View File

@@ -150,6 +150,7 @@ const components = {
wgeasy: dynamic(() => import("./wgeasy/component")),
whatsupdocker: dynamic(() => import("./whatsupdocker/component")),
xteve: dynamic(() => import("./xteve/component")),
yourspotify: dynamic(() => import("./yourspotify/component")),
zabbix: dynamic(() => import("./zabbix/component")),
};

View File

@@ -80,6 +80,11 @@ export default function Component({ service }) {
timeLeft={t("common.duration", { value: queueEntry.eta })}
title={queueEntry.name}
activity={queueEntry.state}
size={
widget?.enableLeechSize
? t("common.bbytes", { value: queueEntry.size, maximumFractionDigits: 1 })
: undefined
}
key={`${queueEntry.name}-${queueEntry.amount_left}`}
/>
))}

View File

@@ -141,6 +141,7 @@ import watchtower from "./watchtower/widget";
import wgeasy from "./wgeasy/widget";
import whatsupdocker from "./whatsupdocker/widget";
import xteve from "./xteve/widget";
import yourspotify from "./yourspotify/widget";
import zabbix from "./zabbix/widget";
const widgets = {
@@ -291,6 +292,7 @@ const widgets = {
wgeasy,
whatsupdocker,
xteve,
yourspotify,
zabbix,
};

View File

@@ -0,0 +1,76 @@
import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next";
import { useMemo } from "react";
import useWidgetAPI from "utils/proxy/use-widget-api";
function getStartDate(interval) {
const d = new Date();
switch (interval) {
case "day":
d.setDate(d.getDate() - 1);
break;
case "week":
d.setDate(d.getDate() - 7);
break;
case "month":
d.setMonth(d.getMonth() - 1);
break;
case "year":
d.setFullYear(d.getFullYear() - 1);
break;
}
return d.toISOString();
}
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const interval = widget?.interval || "week";
const date = useMemo(() => {
return interval === "all" ? "2006-04-23T00:00:00.000Z" : getStartDate(interval);
}, [interval]);
const params = {
timeSplit: "all",
start: date,
};
const { data: songsListened, error: songsError } = useWidgetAPI(widget, "songs", params);
const { data: timeListened, error: timeError } = useWidgetAPI(widget, "time", params);
const { data: artistsListened, error: artistsError } = useWidgetAPI(widget, "artists", params);
if (songsError || timeError || artistsError) {
return <Container service={service} error={songsError ?? timeError ?? artistsError} />;
}
if (isNaN(songsListened) || isNaN(timeListened) || isNaN(artistsListened)) {
return (
<Container service={service}>
<Block label="yourspotify.songs" />
<Block label="yourspotify.time" />
<Block label="yourspotify.artists" />
</Container>
);
}
return (
<Container service={service}>
<Block label="yourspotify.songs" value={t("common.number", { value: songsListened })} />
<Block
label="yourspotify.time"
value={t(
timeListened > 0 ? "common.duration" : "common.number", // Display 0 if duration is 0
{
value: timeListened / 1000,
},
)}
/>
<Block label="yourspotify.artists" value={t("common.number", { value: artistsListened })} />
</Container>
);
}

View File

@@ -0,0 +1,27 @@
import { asJson } from "utils/proxy/api-helpers";
import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/spotify/{endpoint}?token={key}",
proxyHandler: genericProxyHandler,
mappings: {
songs: {
endpoint: "songs_per",
params: ["start", "timeSplit"],
map: (data) => asJson(data)[0]?.count || 0,
},
time: {
endpoint: "time_per",
params: ["start", "timeSplit"],
map: (data) => asJson(data)[0]?.count || 0,
},
artists: {
endpoint: "different_artists_per",
params: ["start", "timeSplit"],
map: (data) => asJson(data)[0]?.artists?.length || 0,
},
},
};
export default widget;