new approach getting data for transcode manager
This commit is contained in:
@@ -19,8 +19,9 @@
|
|||||||
# Permissions drift → fix silently
|
# Permissions drift → fix silently
|
||||||
# Emby not running → skip threshold checks, verify symlink only
|
# Emby not running → skip threshold checks, verify symlink only
|
||||||
#
|
#
|
||||||
# Session display shows active Emby streams with per-session storage location —
|
# Session display shows active Emby streams with storage state.
|
||||||
# useful during flip events when sessions are split across ramdisk and SSD.
|
# Split state detected when sessions exist on both ramdisk and SSD simultaneously —
|
||||||
|
# this happens naturally when symlink flips mid-session.
|
||||||
#
|
#
|
||||||
# All configuration in Master.conf under Transcode Manager section.
|
# All configuration in Master.conf under Transcode Manager section.
|
||||||
# Supports --dry-run and --status.
|
# Supports --dry-run and --status.
|
||||||
@@ -147,7 +148,6 @@ increment_flip_count() {
|
|||||||
echo "$current_count"
|
echo "$current_count"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Query Emby API
|
|
||||||
emby_api() {
|
emby_api() {
|
||||||
local endpoint="$1"
|
local endpoint="$1"
|
||||||
[[ -z "$EMBY_API_KEY" ]] && return 1
|
[[ -z "$EMBY_API_KEY" ]] && return 1
|
||||||
@@ -157,41 +157,19 @@ emby_api() {
|
|||||||
"${EMBY_URL}/${endpoint}" 2>/dev/null
|
"${EMBY_URL}/${endpoint}" 2>/dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
# Determine which storage location a session is using
|
|
||||||
# Handles both short hex IDs (live TV) and long UUID format (standard transcodes)
|
|
||||||
get_session_location() {
|
|
||||||
local session_id="$1"
|
|
||||||
local transcode_temp="transcoding-temp"
|
|
||||||
local short_id="${session_id:0:6}" # Emby uses short 6-char IDs for live TV sessions
|
|
||||||
|
|
||||||
# Check ramdisk — exact match first, then short ID prefix match for live TV
|
|
||||||
if [[ -d "$RAMDISK_PATH/$transcode_temp/$session_id" ]] || \
|
|
||||||
ls -d "$RAMDISK_PATH/$transcode_temp/${short_id}"* 2>/dev/null | grep -q .; then
|
|
||||||
echo "ramdisk"
|
|
||||||
# Check SSD — same pattern
|
|
||||||
elif [[ -d "$TRANSCODE_SSD/$transcode_temp/$session_id" ]] || \
|
|
||||||
ls -d "$TRANSCODE_SSD/$transcode_temp/${short_id}"* 2>/dev/null | grep -q .; then
|
|
||||||
echo "ssd"
|
|
||||||
else
|
|
||||||
echo "unknown"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Map Emby media type to readable label
|
|
||||||
get_media_type_label() {
|
get_media_type_label() {
|
||||||
local type="$1"
|
local type="$1"
|
||||||
case "$type" in
|
case "$type" in
|
||||||
LiveTv) echo "Live TV" ;;
|
LiveTv) echo "Live TV" ;;
|
||||||
|
TvChannel) echo "Live TV" ;;
|
||||||
Episode) echo "TV Show" ;;
|
Episode) echo "TV Show" ;;
|
||||||
Movie) echo "Movie" ;;
|
Movie) echo "Movie" ;;
|
||||||
Audio) echo "Music" ;;
|
Audio) echo "Music" ;;
|
||||||
MusicVideo) echo "Music Video" ;;
|
MusicVideo) echo "Music Video" ;;
|
||||||
TvChannel) echo "Live TV" ;;
|
|
||||||
*) echo "$type" ;;
|
*) echo "$type" ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
# Map Emby play method to readable label
|
|
||||||
get_play_method_label() {
|
get_play_method_label() {
|
||||||
local method="$1"
|
local method="$1"
|
||||||
case "$method" in
|
case "$method" in
|
||||||
@@ -327,6 +305,11 @@ FLIP_COUNT=$(get_flip_count)
|
|||||||
echo ""
|
echo ""
|
||||||
echo "━━━ $ICON_EMBY Active Emby Sessions ━━━"
|
echo "━━━ $ICON_EMBY Active Emby Sessions ━━━"
|
||||||
|
|
||||||
|
TOTAL_SESSIONS=0
|
||||||
|
LIVE_TV=0
|
||||||
|
TRANSCODING=0
|
||||||
|
DIRECT=0
|
||||||
|
|
||||||
if [[ -z "$EMBY_API_KEY" ]]; then
|
if [[ -z "$EMBY_API_KEY" ]]; then
|
||||||
info "EMBY_API_KEY not set in Master.conf — skipping session display"
|
info "EMBY_API_KEY not set in Master.conf — skipping session display"
|
||||||
elif [[ "$EMBY_RUNNING" == false ]]; then
|
elif [[ "$EMBY_RUNNING" == false ]]; then
|
||||||
@@ -341,46 +324,54 @@ else
|
|||||||
TOTAL_SESSIONS=$(echo "$SESSION_DATA" | \
|
TOTAL_SESSIONS=$(echo "$SESSION_DATA" | \
|
||||||
jq '[.[] | select(.NowPlayingItem != null)] | length' 2>/dev/null || echo 0)
|
jq '[.[] | select(.NowPlayingItem != null)] | length' 2>/dev/null || echo 0)
|
||||||
LIVE_TV=$(echo "$SESSION_DATA" | \
|
LIVE_TV=$(echo "$SESSION_DATA" | \
|
||||||
jq '[.[] | select(.NowPlayingItem != null) | select(.NowPlayingItem.Type == "LiveTv" or .NowPlayingItem.Type == "TvChannel")] | length' 2>/dev/null || echo 0)
|
jq '[.[] | select(.NowPlayingItem != null) | select(.NowPlayingItem.Type == "LiveTv" or .NowPlayingItem.Type == "TvChannel")] | length' \
|
||||||
|
2>/dev/null || echo 0)
|
||||||
TRANSCODING=$(echo "$SESSION_DATA" | \
|
TRANSCODING=$(echo "$SESSION_DATA" | \
|
||||||
jq '[.[] | select(.NowPlayingItem != null) | select(.TranscodingInfo != null)] | length' 2>/dev/null || echo 0)
|
jq '[.[] | select(.NowPlayingItem != null) | select(.PlayState.PlayMethod == "Transcode")] | length' \
|
||||||
|
2>/dev/null || echo 0)
|
||||||
DIRECT=$(echo "$SESSION_DATA" | \
|
DIRECT=$(echo "$SESSION_DATA" | \
|
||||||
jq '[.[] | select(.NowPlayingItem != null) | select(.TranscodingInfo == null)] | length' 2>/dev/null || echo 0)
|
jq '[.[] | select(.NowPlayingItem != null) | select(.PlayState.PlayMethod != "Transcode")] | 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 " $ICON_EMBY Total: $TOTAL_SESSIONS | $ICON_RAM Live TV: $LIVE_TV | $ICON_SYNC Transcoding: $TRANSCODING | $ICON_DONE Direct: $DIRECT"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
if [[ "$TOTAL_SESSIONS" -gt 0 ]]; then
|
if [[ "$TOTAL_SESSIONS" -gt 0 ]]; then
|
||||||
# Parse each active session
|
|
||||||
|
# Storage state — count session folders on each location
|
||||||
|
# Emby folder names don't match API session IDs — per-session location not possible
|
||||||
|
# Split state shows when symlink has flipped mid-session
|
||||||
|
TRANSCODE_TEMP="transcoding-temp"
|
||||||
|
RAM_SESSION_COUNT=$(find "$RAMDISK_PATH/$TRANSCODE_TEMP" \
|
||||||
|
-mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)
|
||||||
|
SSD_SESSION_COUNT=$(find "$TRANSCODE_SSD/$TRANSCODE_TEMP" \
|
||||||
|
-mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)
|
||||||
|
|
||||||
|
if [[ "$RAM_SESSION_COUNT" -gt 0 && "$SSD_SESSION_COUNT" -gt 0 ]]; then
|
||||||
|
warn "$ICON_WARN Split state — $RAM_SESSION_COUNT folder(s) on ramdisk / $SSD_SESSION_COUNT on SSD"
|
||||||
|
warn "Older sessions remain on original location until they end naturally"
|
||||||
|
echo " $ICON_LINK Storage: $ICON_RAM ramdisk ($RAM_SESSION_COUNT) + $ICON_DISK SSD ($SSD_SESSION_COUNT)"
|
||||||
|
elif [[ "$RAM_SESSION_COUNT" -gt 0 ]]; then
|
||||||
|
echo " $ICON_LINK Storage: $ICON_RAM ramdisk"
|
||||||
|
elif [[ "$SSD_SESSION_COUNT" -gt 0 ]]; then
|
||||||
|
echo " $ICON_LINK Storage: $ICON_DISK SSD"
|
||||||
|
else
|
||||||
|
echo " $ICON_LINK Storage: $ICON_INFO no transcode folders found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# List each active session
|
||||||
while IFS= read -r session; do
|
while IFS= read -r session; do
|
||||||
USER=$(echo "$session" | jq -r '.UserName // "Unknown"' 2>/dev/null)
|
USER=$(echo "$session" | jq -r '.UserName // "Unknown"' 2>/dev/null)
|
||||||
TITLE=$(echo "$session" | jq -r '.NowPlayingItem.Name // "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)
|
MEDIA_TYPE=$(echo "$session" | jq -r '.NowPlayingItem.Type // "Unknown"' 2>/dev/null)
|
||||||
SESSION_ID=$(echo "$session" | jq -r '.Id // ""' 2>/dev/null)
|
PLAY_METHOD=$(echo "$session" | jq -r '.PlayState.PlayMethod // "Unknown"' 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")
|
MEDIA_LABEL=$(get_media_type_label "$MEDIA_TYPE")
|
||||||
METHOD_LABEL=$(get_play_method_label "$PLAY_METHOD")
|
METHOD_LABEL=$(get_play_method_label "$PLAY_METHOD")
|
||||||
|
|
||||||
# Determine storage location for transcoding sessions
|
echo " $ICON_EMBY $(printf '%-12s' "$USER") — $(printf '%-30s' "$TITLE") — $(printf '%-10s' "$MEDIA_LABEL") — $METHOD_LABEL"
|
||||||
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" | \
|
done < <(echo "$SESSION_DATA" | \
|
||||||
jq -c '.[] | select(.NowPlayingItem != null)' 2>/dev/null)
|
jq -c '.[] | select(.NowPlayingItem != null)' 2>/dev/null)
|
||||||
@@ -489,7 +480,7 @@ echo "$ICON_GEAR Mode: $TRANSCODE_MANAGER_MODE"
|
|||||||
echo "$ICON_RAM Ramdisk: ${RAMDISK_USED_GB}GB used / ${RAMDISK_AVAIL_GB}GB available"
|
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 Symlink: $TRANSCODE_LINK → $CURRENT_TARGET"
|
||||||
echo "$ICON_LINK Flips: $FLIP_COUNT this hour (warn at $TRANSCODE_FLIP_WARN)"
|
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_EMBY Streams: ${TOTAL_SESSIONS} total | Live TV: ${LIVE_TV} | Transcoding: ${TRANSCODING} | Direct: ${DIRECT}"
|
||||||
echo "$ICON_TIME Duration: $(format_duration $((END - START)))"
|
echo "$ICON_TIME Duration: $(format_duration $((END - START)))"
|
||||||
echo "$ICON_DONE Status: $ICON_SUCCESS DONE"
|
echo "$ICON_DONE Status: $ICON_SUCCESS DONE"
|
||||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||||
Reference in New Issue
Block a user