From 01bc4cbcc217e2f1bc15d66ae868709984fccccb Mon Sep 17 00:00:00 2001 From: FailedProxy Date: Wed, 15 Apr 2026 18:49:54 -0400 Subject: [PATCH] added new ux to transcode manager --- Transcodes/transcode_manager.sh | 127 +++++++++++++++++++++++++++++++- 1 file changed, 124 insertions(+), 3 deletions(-) diff --git a/Transcodes/transcode_manager.sh b/Transcodes/transcode_manager.sh index 38a44e1..20ca2a7 100644 --- a/Transcodes/transcode_manager.sh +++ b/Transcodes/transcode_manager.sh @@ -19,6 +19,9 @@ # Permissions drift → fix silently # Emby not running → skip threshold checks, verify symlink only # +# Session display shows active Emby streams with per-session storage location — +# useful during flip events when sessions are split across ramdisk and SSD. +# # All configuration in Master.conf under Transcode Manager section. # Supports --dry-run and --status. # ----------------------------------------------------------------------------------------------- @@ -144,6 +147,56 @@ increment_flip_count() { echo "$current_count" } +# Query Emby API +emby_api() { + local endpoint="$1" + [[ -z "$EMBY_API_KEY" ]] && return 1 + curl -sf \ + --max-time 10 \ + -H "X-Emby-Token: $EMBY_API_KEY" \ + "${EMBY_URL}/${endpoint}" 2>/dev/null +} + +# Determine which storage location a session is using +# Checks filesystem for session folder in ramdisk or SSD transcode temp directories +get_session_location() { + local session_id="$1" + local transcode_temp="transcoding-temp" + + if [[ -d "$RAMDISK_PATH/$transcode_temp/$session_id" ]]; then + echo "ramdisk" + elif [[ -d "$TRANSCODE_SSD/$transcode_temp/$session_id" ]]; then + echo "ssd" + else + echo "unknown" + fi +} + +# Map Emby media type to readable label +get_media_type_label() { + local type="$1" + case "$type" in + LiveTv) echo "Live TV" ;; + Episode) echo "TV Show" ;; + Movie) echo "Movie" ;; + Audio) echo "Music" ;; + MusicVideo) echo "Music Video" ;; + TvChannel) echo "Live TV" ;; + *) echo "$type" ;; + esac +} + +# Map Emby play method to readable label +get_play_method_label() { + local method="$1" + case "$method" in + Transcode) echo "Transcode" ;; + DirectStream) echo "Direct Stream" ;; + DirectPlay) echo "Direct Play" ;; + *) echo "$method" ;; + esac +} + # ----------------------------------------------------------------------------------------------- # ━━━ $ICON_RAM Transcode Manager ━━━ # ----------------------------------------------------------------------------------------------- @@ -259,10 +312,79 @@ SSD_SIZE_H=$(du -sh "$TRANSCODE_SSD" 2>/dev/null | cut -f1) info "$ICON_RAM Ramdisk usage: ${RAMDISK_USED_GB}GB used / ${RAMDISK_AVAIL_GB}GB available" info "$ICON_RAM Ramdisk files: ${RAMDISK_FILES:-0} ($RAMDISK_SIZE_H)" -info "$ICON_DISK SSD files: $SSD_FILES ($SSD_SIZE_H)" +info "$ICON_DISK SSD files: $SSD_FILES ($SSD_SIZE_H)" FLIP_COUNT=$(get_flip_count) +# ----------------------------------------------------------------------------------------------- +# ━━━ $ICON_EMBY Active Emby Sessions ━━━ +# ----------------------------------------------------------------------------------------------- +echo "" +echo "━━━ $ICON_EMBY Active Emby Sessions ━━━" + +if [[ -z "$EMBY_API_KEY" ]]; then + info "EMBY_API_KEY not set in Master.conf — skipping session display" +elif [[ "$EMBY_RUNNING" == false ]]; then + info "Emby not running — no sessions" +else + SESSION_DATA=$(emby_api "Sessions" 2>/dev/null) + + if [[ -z "$SESSION_DATA" ]] || ! command -v jq >/dev/null 2>&1; then + warn "Could not retrieve session data — check EMBY_URL and EMBY_API_KEY" + else + # Count sessions + TOTAL_SESSIONS=$(echo "$SESSION_DATA" | \ + jq '[.[] | select(.NowPlayingItem != null)] | length' 2>/dev/null || echo 0) + LIVE_TV=$(echo "$SESSION_DATA" | \ + jq '[.[] | select(.NowPlayingItem != null) | select(.NowPlayingItem.Type == "LiveTv" or .NowPlayingItem.Type == "TvChannel")] | length' 2>/dev/null || echo 0) + TRANSCODING=$(echo "$SESSION_DATA" | \ + jq '[.[] | select(.NowPlayingItem != null) | select(.TranscodingInfo != null)] | length' 2>/dev/null || echo 0) + DIRECT=$(echo "$SESSION_DATA" | \ + jq '[.[] | select(.NowPlayingItem != null) | select(.TranscodingInfo == null)] | length' 2>/dev/null || echo 0) + + echo " $ICON_EMBY Total: $TOTAL_SESSIONS | $ICON_RAM Live TV: $LIVE_TV | $ICON_SYNC Transcoding: $TRANSCODING | $ICON_DONE Direct: $DIRECT" + echo "" + + if [[ "$TOTAL_SESSIONS" -gt 0 ]]; then + # Parse each active session + while IFS= read -r session; do + USER=$(echo "$session" | jq -r '.UserName // "Unknown"' 2>/dev/null) + TITLE=$(echo "$session" | jq -r '.NowPlayingItem.Name // "Unknown"' 2>/dev/null) + MEDIA_TYPE=$(echo "$session" | jq -r '.NowPlayingItem.Type // "Unknown"' 2>/dev/null) + SESSION_ID=$(echo "$session" | jq -r '.Id // ""' 2>/dev/null) + + # Play method + PLAY_METHOD=$(echo "$session" | \ + jq -r '.PlayState.PlayMethod // "Unknown"' 2>/dev/null) + # Check TranscodingInfo for more accurate method + HAS_TRANSCODE=$(echo "$session" | \ + jq '.TranscodingInfo != null' 2>/dev/null || echo "false") + [[ "$HAS_TRANSCODE" == "true" ]] && PLAY_METHOD="Transcode" + + MEDIA_LABEL=$(get_media_type_label "$MEDIA_TYPE") + METHOD_LABEL=$(get_play_method_label "$PLAY_METHOD") + + # Determine storage location for transcoding sessions + if [[ "$HAS_TRANSCODE" == "true" && -n "$SESSION_ID" ]]; then + LOCATION=$(get_session_location "$SESSION_ID") + case "$LOCATION" in + ramdisk) LOC_ICON="$ICON_RAM" LOC_LABEL="ramdisk" ;; + ssd) LOC_ICON="$ICON_DISK" LOC_LABEL="SSD" ;; + *) LOC_ICON="$ICON_INFO" LOC_LABEL="unknown" ;; + esac + echo " $ICON_EMBY $(printf '%-12s' "$USER") — $(printf '%-30s' "$TITLE") — $(printf '%-10s' "$MEDIA_LABEL") — $(printf '%-13s' "$METHOD_LABEL") — $LOC_ICON $LOC_LABEL" + else + echo " $ICON_EMBY $(printf '%-12s' "$USER") — $(printf '%-30s' "$TITLE") — $(printf '%-10s' "$MEDIA_LABEL") — $METHOD_LABEL" + fi + + done < <(echo "$SESSION_DATA" | \ + jq -c '.[] | select(.NowPlayingItem != null)' 2>/dev/null) + else + info "No active streams" + fi + fi +fi + # ----------------------------------------------------------------------------------------------- # MODE LOGIC # ----------------------------------------------------------------------------------------------- @@ -313,7 +435,6 @@ case "$TRANSCODE_MANAGER_MODE" in info "Ramdisk unavailable — staying on SSD until ramdisk recovers" elif [[ "$CURRENT_TARGET" == "$RAMDISK_PATH" ]]; then - # On ramdisk — check if we need to flip to SSD if (( $(awk "BEGIN {print ($RAMDISK_USED_GB >= $RAMDISK_WARN_GB) ? 1 : 0}") )); then if [[ "$SSD_HEALTHY" == false ]]; then error "Ramdisk above threshold but SSD unavailable — cannot flip" @@ -338,7 +459,6 @@ case "$TRANSCODE_MANAGER_MODE" in fi elif [[ "$CURRENT_TARGET" == "$TRANSCODE_SSD" ]]; then - # On SSD — check if we can flip back to ramdisk if (( $(awk "BEGIN {print ($RAMDISK_USED_GB <= $RAMDISK_LOW_GB) ? 1 : 0}") )); then info "$ICON_RAM Ramdisk ${RAMDISK_USED_GB}GB — below ${RAMDISK_LOW_GB}GB, flipping back to ramdisk" flip_symlink "$RAMDISK_PATH" "usage recovered" @@ -364,6 +484,7 @@ echo "$ICON_GEAR Mode: $TRANSCODE_MANAGER_MODE" echo "$ICON_RAM Ramdisk: ${RAMDISK_USED_GB}GB used / ${RAMDISK_AVAIL_GB}GB available" echo "$ICON_LINK Symlink: $TRANSCODE_LINK → $CURRENT_TARGET" echo "$ICON_LINK Flips: $FLIP_COUNT this hour (warn at $TRANSCODE_FLIP_WARN)" +echo "$ICON_EMBY Streams: ${TOTAL_SESSIONS:-0} total | Live TV: ${LIVE_TV:-0} | Transcoding: ${TRANSCODING:-0} | Direct: ${DIRECT:-0}" echo "$ICON_TIME Duration: $(format_duration $((END - START)))" echo "$ICON_DONE Status: $ICON_SUCCESS DONE" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" \ No newline at end of file