- name: Home columns: - size: small widgets: - type: calendar first-day-of-week: sunday - type: clock # Added Clock widget hour-format: 12h # Assuming 12h based on weather widget preference timezones: - timezone: America/Los_Angeles # San Francisco uses this timezone label: San Francisco - timezone: America/New_York label: New York - timezone: Europe/London label: London - timezone: Europe/Amsterdam label: Amsterdam - timezone: Asia/Kolkata # New Delhi uses this timezone label: New Delhi - timezone: Asia/Tokyo label: Tokyo - type: custom-api title: Astronomy Picture of the Day cache: 1d url: https://api.nasa.gov/planetary/apod?api_key=${NASA_API_KEY} headers: Accept: application/json template: | {{- if eq (.JSON.String "media_type") "image" -}}
{{- else -}}No image available today.
{{- end }} - size: full widgets: - type: search search-engine: google bangs: # Added bangs section - title: YouTube shortcut: "!yt" url: https://www.youtube.com/results?search_query={QUERY} - title: Wikipedia shortcut: "!w" url: https://en.wikipedia.org/wiki/Special:Search?search={QUERY} - title: Amazon shortcut: "!a" url: https://www.amazon.com/s?k={QUERY} - title: Reddit shortcut: "!r" url: https://www.reddit.com/search/?q={QUERY} - title: GitHub shortcut: "!gh" url: https://github.com/search?q={QUERY} - type: bookmarks # Rewritten Quick Links widget title: Quick Links groups: - links: - title: Google url: https://www.google.com/ icon: si:google - title: GMail url: https://mail.google.com/ icon: si:gmail - title: GDrive url: https://drive.google.com/ icon: si:googledrive - links: - title: GCal url: https://calendar.google.com/ icon: si:googlecalendar - title: Youtube url: https://www.youtube.com/ icon: si:youtube - title: Amazon url: https://www.amazon.com/ icon: si:amazon - links: - title: Github url: https://github.com/ icon: si:github - title: LinkedIn url: https://www.linkedin.com/ icon: si:linkedin - title: Plex url: https://app.plex.tv/ icon: si:plex - links: - title: MCSManager url: http://panel.sirblob.co/ icon: mdi:server - title: Gitea url: https://git.sirblob.co/ icon: si:gitea - title: Coder url: https://mcbugj8flucdg.pit-1.try.coder.app icon: mdi:code-braces - links: - title: qBittorrent url: https://torr.sirblob.co/ icon: si:qbittorrent - title: Excalidraw url: https://draw.sirblob.co/ icon: mdi:draw - title: Immich url: https://immich.sirblob.co/ icon: si:immich - links: - title: Canvas url: https://canvas.gmu.edu/ icon: si:instructure # Instructure is the company behind Canvas - title: Mason360 url: https://mason360.gmu.edu/ icon: mdi:school # Using a generic school icon - title: Nginx Proxy Manager # Added NPM url: https://npm.sirblob.co/ icon: si:nginxproxymanager - type: monitor cache: 1m title: My Services sites: - title: Plex url: https://plex1.sirblob.co/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: https://mcbugj8flucdg.pit-1.try.coder.app icon: mdi:code-braces - 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 - type: group widgets: - type: custom-api title: mason.sirblob.co cache: 30s url: https://api.mcstatus.io/v2/status/java/mason.sirblob.co template: &minecraft-widget-template |{{ .JSON.Int "players.online" | formatNumber }}/{{ .JSON.Int "players.max" | formatNumber }} players
0 players
Difficulty: {{ .JSON.String "data.activeDailyCodingChallengeQuestion.question.difficulty" }}
Topics:
This is a Premium question
{{ end }}{{ .String "description" }}
Error fetching Epic Games data.
{{ end }}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" }}