Files
glance/widgets/qbittorrent.yml
Dokril abd62d8f73 feat: конфигурация Glance с виджетами и скриптами развертывания
- Главная конфигурация home.yml и виджеты (countdown, qbittorrent)
- PowerShell и Bash скрипты для автоматической загрузки на сервер
- Обновлен README с документацией
2025-12-06 09:45:17 +03:00

188 lines
8.4 KiB
YAML

- 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 }}