feat: конфигурация Glance с виджетами и скриптами развертывания
- Главная конфигурация home.yml и виджеты (countdown, qbittorrent) - PowerShell и Bash скрипты для автоматической загрузки на сервер - Обновлен README с документацией
This commit is contained in:
187
widgets/qbittorrent.yml
Normal file
187
widgets/qbittorrent.yml
Normal file
@@ -0,0 +1,187 @@
|
||||
- type: custom-api
|
||||
title: qBittorrent
|
||||
cache: 10s
|
||||
options:
|
||||
view: "basic" # "basic" or "detailed"
|
||||
mode: "default" # "default" or "upload"
|
||||
subrequests:
|
||||
transfer:
|
||||
url: http://192.168.50.108:8080/api/v2/transfer/info
|
||||
seeding:
|
||||
url: http://192.168.50.108:8080/api/v2/torrents/info
|
||||
parameters:
|
||||
filter: seeding
|
||||
leeching:
|
||||
url: http://192.168.50.108:8080/api/v2/torrents/info
|
||||
parameters:
|
||||
filter: downloading
|
||||
template: |
|
||||
{{ $transfer := .Subrequest "transfer" }}
|
||||
{{ $seeding := .Subrequest "seeding" }}
|
||||
{{ $leeching := .Subrequest "leeching" }}
|
||||
|
||||
{{ if and (eq $transfer.Response.StatusCode 200) (eq $seeding.Response.StatusCode 200) (eq $leeching.Response.StatusCode 200) }}
|
||||
|
||||
{{ $isDetailed := eq (.Options.StringOr "view" "detailed") "detailed" }}
|
||||
{{ $mode := .Options.StringOr "mode" "default" }}
|
||||
|
||||
{{ if $isDetailed }}
|
||||
<!-- Detailed View -->
|
||||
<div class="list" style="--list-gap: 15px;">
|
||||
<div class="flex justify-between text-center">
|
||||
<div>
|
||||
{{ $dlSpeed := $transfer.JSON.Float "dl_info_speed" }}
|
||||
{{ if eq $mode "upload" }}
|
||||
<div class="color-highlight size-h3">{{ printf "%.1f MB/s" (div $dlSpeed 1000000.0) }}</div>
|
||||
{{ else }}
|
||||
{{ if lt $dlSpeed 1048576.0 }}
|
||||
<div class="color-highlight size-h3">{{ printf "%.0f KiB/s" (div $dlSpeed 1024.0) }}</div>
|
||||
{{ else }}
|
||||
<div class="color-highlight size-h3">{{ printf "%.1f MiB/s" (div $dlSpeed 1048576.0) }}</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
<div class="size-h6">DOWNLOADING</div>
|
||||
</div>
|
||||
|
||||
{{ if eq $mode "upload" }}
|
||||
<div>
|
||||
{{ $ulSpeed := $transfer.JSON.Float "up_info_speed" }}
|
||||
<div class="color-highlight size-h3">{{ printf "%.1f MB/s" (div $ulSpeed 1000000.0) }}</div>
|
||||
<div class="size-h6">UPLOADING</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
<div>
|
||||
<div class="color-highlight size-h3">{{ len ($seeding.JSON.Array "") }}</div>
|
||||
<div class="size-h6">SEEDING</div>
|
||||
</div>
|
||||
|
||||
{{ if eq $mode "default" }}
|
||||
<div>
|
||||
<div class="color-highlight size-h3">{{ len ($leeching.JSON.Array "") }}</div>
|
||||
<div class="size-h6">LEECHING</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
<!-- Downloading list -->
|
||||
{{ $downloadingTorrents := $leeching.JSON.Array "" }}
|
||||
{{ if gt (len $downloadingTorrents) 0 }}
|
||||
<div style="margin-top: 15px;">
|
||||
<ul class="list collapsible-container" data-collapse-after="0" style="--list-gap: 15px;">
|
||||
{{ range $t := $downloadingTorrents }}
|
||||
{{ $state := $t.String "state" }}
|
||||
{{ $icon := "?" }}
|
||||
{{ if ge ($t.Int "completed") ($t.Int "size") }}{{ $icon = "✔" }}
|
||||
{{ else if eq $state "downloading" "forcedDL" }}{{ $icon = "↓" }}
|
||||
{{ else if eq $state "pausedDL" "stoppedDL" "pausedUP" "stalledDL" "stalledUP" "queuedDL" "queuedUP" }}{{ $icon = "❚❚" }}
|
||||
{{ else if eq $state "error" "missingFiles" }}{{ $icon = "!" }}
|
||||
{{ else if eq $state "checkingDL" "checkingUP" "allocating" }}{{ $icon = "…" }}
|
||||
{{ else if eq $state "checkingResumeData" }}{{ $icon = "⟳" }}
|
||||
{{ end }}
|
||||
|
||||
<li class="flex items-center" style="gap: 10px;">
|
||||
<div class="size-h4" style="flex-shrink: 0;">{{ $icon }}</div>
|
||||
<div style="flex-grow: 1; min-width: 0;">
|
||||
<div class="text-truncate color-highlight">{{ $t.String "name" }}</div>
|
||||
<div title="{{ $t.Float "progress" | mul 100 | printf "%.1f" }}%" style="background: rgba(128, 128, 128, 0.2); border-radius: 5px; height: 6px; margin-top: 5px; overflow: hidden;">
|
||||
<div style="width: {{ $t.Float "progress" | mul 100 }}%; background-color: var(--color-positive); height: 100%; border-radius: 5px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="flex-shrink: 0; text-align: right; width: 80px;">
|
||||
{{ $dlSpeed := $t.Float "dlspeed" }}
|
||||
<div class="size-sm color-paragraph">
|
||||
{{ if eq $mode "upload" }}
|
||||
{{ if lt $dlSpeed 1000.0 }}--{{ else }}{{ printf "%.1f MB/s" (div $dlSpeed 1000000.0) }}{{ end }}
|
||||
{{ else }}
|
||||
{{ if lt $dlSpeed 1024.0 }}--{{ else if lt $dlSpeed 1048576.0 }}{{ printf "%.0f KiB/s" (div $dlSpeed 1024.0) }}{{ else }}{{ printf "%.1f MiB/s" (div $dlSpeed 1048576.0) }}{{ end }}
|
||||
{{ end }}
|
||||
</div>
|
||||
{{ $eta := $t.Int "eta" }}
|
||||
<div class="size-sm color-paragraph">
|
||||
{{ if eq $eta 8640000 }}∞
|
||||
{{ else if gt $eta 3600 }}{{ printf "%dh %dm" (div $eta 3600) (mod (div $eta 60) 60) }}
|
||||
{{ else if gt $eta 0 }}{{ printf "%dm" (div $eta 60) }}
|
||||
{{ else }}--{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
<!-- Seeding list -->
|
||||
{{ if eq $mode "upload" }}
|
||||
{{ $seedingTorrents := $seeding.JSON.Array "" }}
|
||||
{{ if gt (len $seedingTorrents) 0 }}
|
||||
<div style="margin-top: 20px;">
|
||||
<ul class="list collapsible-container" data-collapse-after="0" style="--list-gap: 15px;">
|
||||
{{ range $t := $seedingTorrents }}
|
||||
{{ $state := $t.String "state" }}
|
||||
{{ $icon := "↑" }}
|
||||
{{ if eq $state "pausedUP" "stoppedUP" "stalledUP" "queuedUP" }}{{ $icon = "❚❚" }}
|
||||
{{ else if eq $state "error" "missingFiles" }}{{ $icon = "!" }}
|
||||
{{ else if eq $state "checkingUP" }}{{ $icon = "…" }}
|
||||
{{ else if eq $state "checkingResumeData" }}{{ $icon = "⟳" }}
|
||||
{{ end }}
|
||||
|
||||
<li class="flex items-center" style="gap: 10px;">
|
||||
<div class="size-h4" style="flex-shrink: 0;">{{ $icon }}</div>
|
||||
<div style="flex-grow: 1; min-width: 0;">
|
||||
<div class="text-truncate color-highlight">{{ $t.String "name" }}</div>
|
||||
<div class="size-sm color-paragraph">
|
||||
Ratio: {{ printf "%.2f" ($t.Float "ratio") }} |
|
||||
Size: {{ printf "%.1f GB" (div ($t.Float "size") 1073741824.0) }}
|
||||
</div>
|
||||
</div>
|
||||
<div style="flex-shrink: 0; text-align: right; width: 80px;">
|
||||
{{ $ulSpeed := $t.Float "upspeed" }}
|
||||
<div class="size-sm color-paragraph">
|
||||
{{ if lt $ulSpeed 1000.0 }}--{{ else }}{{ printf "%.1f MB/s" (div $ulSpeed 1000000.0) }}{{ end }}
|
||||
</div>
|
||||
<div class="size-sm color-paragraph">Upload</div>
|
||||
</div>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
</div>
|
||||
|
||||
{{ else }}
|
||||
<!-- Basic View -->
|
||||
<div class="flex justify-between text-center">
|
||||
<div>
|
||||
{{ $dlSpeed := $transfer.JSON.Float "dl_info_speed" }}
|
||||
<div class="color-highlight size-h3">{{ printf "%.1f MB/s" (div $dlSpeed 1000000.0) }}</div>
|
||||
<div class="size-h6">DOWNLOADING</div>
|
||||
</div>
|
||||
{{ if eq $mode "upload" }}
|
||||
<div>
|
||||
{{ $ulSpeed := $transfer.JSON.Float "up_info_speed" }}
|
||||
<div class="color-highlight size-h3">{{ printf "%.1f MB/s" (div $ulSpeed 1000000.0) }}</div>
|
||||
<div class="size-h6">UPLOADING</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
<div>
|
||||
<div class="color-highlight size-h3">{{ len ($seeding.JSON.Array "") }}</div>
|
||||
<div class="size-h6">SEEDING</div>
|
||||
</div>
|
||||
{{ if eq $mode "default" }}
|
||||
<div>
|
||||
<div class="color-highlight size-h3">{{ len ($leeching.JSON.Array "") }}</div>
|
||||
<div class="size-h6">LEECHING</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
{{ else }}
|
||||
<div class="color-negative text-center">
|
||||
<p>Error fetching qBittorrent data.</p>
|
||||
<p class="size-sm">Check URL and authentication bypass settings.</p>
|
||||
</div>
|
||||
{{ end }}
|
||||
Reference in New Issue
Block a user