- name: Services columns: - size: full widgets: - type: monitor cache: 1m title: My Services sites: - title: Plex url: "${PLEX_URL}/web/index.html#!/" icon: si:plex - title: Immich url: https://immich.sirblob.co icon: si:immich - title: MCSManager url: http://panel.sirblob.co/ icon: mdi:server - title: Coder url: "${CODER_APP_URL}" icon: mdi:code-braces - title: Yamtrack url: https://tbd.sirblob.co/ icon: mdi:bug - title: Excalidraw url: https://draw.sirblob.co/ icon: mdi:draw - title: qBittorrent url: https://torr.sirblob.co/ icon: si:qbittorrent - title: Gitea url: https://git.sirblob.co/ icon: si:gitea - title: Nginx Proxy Manager # Added NPM url: https://npm.sirblob.co/ icon: si:nginxproxymanager - title: OpenWeb url: https://openweb.sirblob.co/ icon: mdi:chat - title: SeaAnime url: https://sea.sirblob.co/ icon: mdi:television - type: docker-containers title: Docker Containers cache: 30s hide-by-default: false format-container-names: true sock-path: /var/run/docker.sock running-only: false - type: custom-api title: Immich stats cache: 10m url: https://immich.sirblob.co/api/server/statistics headers: x-api-key: ${IMMICH_API_KEY} Accept: application/json template: |
{{ .JSON.Int "players.online" | formatNumber }}/{{ .JSON.Int "players.max" | formatNumber }} players
0 players
Error fetching qBittorrent data.
Check URL and authentication bypass settings.
{{ . }}
{{ end }} {{ if or (eq $mediaServer "") (eq $baseURL "") (eq $apiKey "") }} {{ template "errorMsg" "Some required options are not set" }} {{ else }} {{ $isSmallColumn := .Options.BoolOr "small-column" false }} {{ $isCompact := .Options.BoolOr "compact" true }} {{ $playState := .Options.StringOr "play-state" "indicator" }} {{ $showThumbnail := .Options.BoolOr "show-thumbnail" false }} {{ $fullThumbnail := .Options.BoolOr "full-thumbnail" false }} {{ $showPaused := .Options.BoolOr "show-paused" false }} {{ $showProgressBar := .Options.BoolOr "show-progress-bar" false }} {{ $showProgressInfo := .Options.BoolOr "show-progress-info" true }} {{ $timeFormat := .Options.StringOr "time-format" "15:04" }} {{ $userID := "" }} {{ $sessionsRequestURL := "" }} {{ $sessionsCall := "" }} {{ $sessions := "" }} {{ $activeSessions := 0 }} {{ if eq $mediaServer "plex" }} {{ $sessionsRequestURL = concat $baseURL "/status/sessions" }} {{ $sessionsCall = newRequest $sessionsRequestURL | withHeader "Accept" "application/json" | withHeader "X-Plex-Token" $apiKey | getResponse }} {{ if $sessionsCall.JSON.Exists "MediaContainer" }} {{ $sessions = $sessionsCall.JSON.Array "MediaContainer.Metadata" }} {{ $activeSessions = len $sessions }} {{ else }} {{ template "errorMsg" (concat "Could not fetch " $mediaServer " API.") }} {{ end }} {{ else if eq $mediaServer "tautulli" }} {{ $sessionsRequestURL = concat $baseURL "/api/v2" }} {{ $sessionsCall = newRequest $sessionsRequestURL | withParameter "apikey" $apiKey | withParameter "cmd" "get_activity" | withHeader "Accept" "application/json" | getResponse }} {{ if eq $sessionsCall.Response.StatusCode 200 }} {{ $sessions = $sessionsCall.JSON.Array "response.data.sessions" }} {{ $activeSessions = len $sessions }} {{ else }} {{ template "errorMsg" (concat "Could not fetch " $mediaServer " API.") }} {{ end }} {{ else if or (eq $mediaServer "jellyfin") (eq $mediaServer "emby") }} {{ $sessionsRequestURL = concat $baseURL "/Sessions" }} {{ $sessionsCall = newRequest $sessionsRequestURL | withParameter "api_key" $apiKey | withParameter "activeWithinSeconds" "30" | withHeader "Accept" "application/json" | getResponse }} {{ if eq $sessionsCall.Response.StatusCode 200 }} {{ $sessions = $sessionsCall.JSON.Array "" }} {{ if eq $mediaServer "emby" }} {{ range $session := $sessions }} {{ if $session.Bool "PlayState.CanSeek" }} {{ $activeSessions = 1 }} {{ break }} {{ end }} {{ end }} {{ else }} {{ $activeSessions = len $sessions }} {{ end }} {{ else }} {{ template "errorMsg" (concat "Could not fetch " $mediaServer " API.") }} {{ end }} {{ end }} {{ if and (eq $sessionsCall.Response.StatusCode 200) (eq $activeSessions 0) }}Nothing is playing right now.
{{ else if $sessionsCall.JSON.Exists "MediaContainer" }}{{ if and (not $isCompact) (not $isSmallColumn) }} ends at {{ end }} {{ $endTime }}
{{ end }}{{ . }}
{{ end }} {{ if or (eq $mediaServer "") (eq $baseURL "") (eq $apiKey "") (and (eq $mediaServer "jellyfin") (eq $userName "")) }} {{ template "errorMsg" "Some required options are not set" }} {{ else }} {{ $historyLength := .Options.StringOr "history-length" "10" }} {{ $mediaTypes := .Options.StringOr "media-types" "" }} {{ if eq $mediaServer "tautulli" }} {{ $mediaTypes = .Options.StringOr "media-types" "movie,episode,track" }} {{ else if or (eq $mediaServer "jellyfin") (eq $mediaServer "emby") }} {{ $mediaTypes = .Options.StringOr "media-types" "Movie,Episode,Audio" }} {{ end }} {{ $isSmallColumn := .Options.BoolOr "small-column" false }} {{ $isCompact := .Options.BoolOr "compact" true }} {{ $showThumbnail := .Options.BoolOr "show-thumbnail" false }} {{ $thumbAspectRatio := .Options.StringOr "thumbnail-aspect-ratio" "" }} {{ $showUser := .Options.BoolOr "show-user" true }} {{ $timeAbsolute := .Options.BoolOr "time-absolute" false }} {{ $timeFormat := .Options.StringOr "time-format" "Jan 02 15:04" }} {{ $userID := "" }} {{ $historyRequestURL := "" }} {{ $usersRequestURL := "" }} {{ $historyCall := "" }} {{ $usersCall := "" }} {{ $history := "" }} {{ $users := "" }} {{ if eq $mediaServer "plex" }} {{ $historyRequestURL = concat $baseURL "/status/sessions/history/all" }} {{ $historyCall = newRequest $historyRequestURL | withParameter "limit" $historyLength | withParameter "sort" "viewedAt:desc" | withHeader "Accept" "application/json" | withHeader "X-Plex-Token" $apiKey | getResponse }} {{ if $historyCall.JSON.Exists "MediaContainer" }} {{ $history = $historyCall.JSON.Array "MediaContainer.Metadata" }} {{ else }} {{ template "errorMsg" (concat "Could not fetch " $mediaServer " API.") }} {{ end }} {{ $usersRequestURL = concat $baseURL "/accounts" }} {{ $usersCall = newRequest $usersRequestURL | withHeader "Accept" "application/json" | withHeader "X-Plex-Token" $apiKey | getResponse }} {{ $users = $usersCall.JSON.Array "MediaContainer.Account" }} {{ else if eq $mediaServer "tautulli" }} {{ $historyRequestURL = concat $baseURL "/api/v2" }} {{ $historyCall = newRequest $historyRequestURL | withParameter "apikey" $apiKey | withParameter "cmd" "get_history" | withParameter "length" $historyLength | withParameter "media_type" $mediaTypes | withHeader "Accept" "application/json" | getResponse }} {{ if eq $historyCall.Response.StatusCode 200 }} {{ $history = $historyCall.JSON.Array "response.data.data" }} {{ else }} {{ template "errorMsg" (concat "Could not fetch " $mediaServer " API.") }} {{ end }} {{ else if or (eq $mediaServer "jellyfin") (eq $mediaServer "emby") }} {{ $usersRequestURL = concat $baseURL "/Users" }} {{ $usersCall = newRequest $usersRequestURL | withParameter "api_key" $apiKey | withHeader "Accept" "application/json" | getResponse }} {{ $usersList := $usersCall.JSON.Array "" }} {{ range $i, $user := $usersList }} {{ if eq ($user.String "Name") $userName }} {{ $userID = $user.String "Id" }} {{ break }} {{ end }} {{ end }} {{ if eq $userID "" }} {{ template "errorMsg" (concat "User '" $userName "' not found.") }} {{ end }} {{ $historyRequestURL = concat $baseURL "/Users/" $userID "/Items" }} {{ $historyCall = newRequest $historyRequestURL | withParameter "api_key" $apiKey | withParameter "Limit" $historyLength | withParameter "IncludeItemTypes" $mediaTypes | withParameter "Recursive" "true" | withParameter "isPlayed" "true" | withParameter "sortBy" "DatePlayed" | withParameter "sortOrder" "Descending" | withParameter "Fields" "UserDataLastPlayedDate" | withHeader "Accept" "application/json" | getResponse }} {{ $history = $historyCall.JSON.Array "Items" }} {{ end }} {{ if and (eq $historyCall.Response.StatusCode 200) (eq (len $history) 0) }}Nothing has been played. Start streaming something!
{{ else if $historyCall.JSON.Exists "MediaContainer" }}