added new ux to transcode manager
This commit is contained in:
@@ -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 ━━━
|
||||
# -----------------------------------------------------------------------------------------------
|
||||
@@ -263,6 +316,75 @@ 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 "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
Reference in New Issue
Block a user