44 lines
3.5 KiB
Bash
Executable File
44 lines
3.5 KiB
Bash
Executable File
#!/bin/bash
|
||
# Helpers for driving the test TV over adb. Usage: source tools/tv/env.sh
|
||
# TV_ADB: адрес из «Беспроводной отладки» (порт меняется после перезагрузки ТВ).
|
||
export JAVA_HOME=${JAVA_HOME:-$HOME/.jdks/jdk-21.0.12.1+1}
|
||
TV_ADB=${TV_ADB:-192.168.1.20:5555}
|
||
A="$HOME/Android/Sdk/platform-tools/adb -s $TV_ADB"
|
||
OUT=${OUT:-/tmp/movies-tv}; mkdir -p "$OUT"
|
||
k() { for x in "$@"; do $A shell input keyevent "$x"; sleep 0.7; done; }
|
||
shot() { $A exec-out screencap -p > "$OUT/$1.png"; echo "$OUT/$1.png"; }
|
||
install_debug() { ./gradlew :app:assembleDebug -q && $A install -r app/build/outputs/apk/debug/app-debug.apk; }
|
||
# Открыть карточку (и сразу играть, если указан движок или play=1): play <itemId> [exo|vlc]
|
||
play() {
|
||
if [ -n "$2" ]; then $A shell am start -S -n ru.stenfredd.movies/.MainActivity --es item "$1" --es engine "$2" >/dev/null
|
||
else $A shell am start -S -n ru.stenfredd.movies/.MainActivity --es item "$1" --ez play true >/dev/null; fi
|
||
}
|
||
# Журнал решений сессии воспроизведения
|
||
plog() { $A logcat -d | grep -E " (I|W|E) PlaybackSession" | sed 's/^.*PlaybackSession: //' | cut -c1-300; }
|
||
# Токен с ТВ (только debug-сборка: run-as читает DataStore приложения)
|
||
tv_token() { $A exec-out run-as ru.stenfredd.movies cat files/datastore/jellyfin_session.preferences_pb | strings -n 30 | grep -oE '[0-9a-f]{32}' | head -1; }
|
||
# Что играет на ТВ по данным сервера: название, позиция (с), PlayMethod. X-Emby-Token сервер 12.x не принимает.
|
||
sess() {
|
||
curl -s -H "Authorization: MediaBrowser Token=\"${TV_TOKEN:=$(tv_token)}\"" "http://192.168.1.10:8096/Sessions?activeWithinSeconds=60" |
|
||
python3 -c 'import json,sys
|
||
for s in json.load(sys.stdin):
|
||
n=s.get("NowPlayingItem")
|
||
if n and s.get("Client","").startswith("Movies"): print(n["Name"], round(s["PlayState"].get("PositionTicks",0)/1e7,1), s["PlayState"].get("PlayMethod"), "paused" if s["PlayState"].get("IsPaused") else "")'
|
||
}
|
||
# Реально ли звук уходит на выход: потоки AudioFlinger, число записей и активные треки
|
||
aout() { $A shell dumpsys media.audio_flinger | grep -E "^Output thread|Total writes|Tracks of which"; }
|
||
# Журнал локального прокси VLC (диапазоны, кэш, сколько скачано с сервера)
|
||
vproxy() { $A logcat -d | grep "VLC proxy" | sed -E 's/^[0-9-]+ ([0-9:.]+).*VLC proxy/\1/' | cut -c1-170; }
|
||
# Замер плавности интерфейса (только на release-сборке!): ui_bench [right|down] [N]
|
||
# Листает ряд (или экран) вперёд и назад N раз и печатает перцентили кадра и GPU, затем разбивку по фазам.
|
||
ui_bench() {
|
||
local dir=${1:-right} n=${2:-8} back P=ru.stenfredd.movies
|
||
[ "$dir" = right ] && back=left || back=up
|
||
$A shell dumpsys gfxinfo $P reset >/dev/null
|
||
for i in $(seq 1 $n); do $A shell input keyevent DPAD_${dir^^}; sleep 0.35; done
|
||
for i in $(seq 1 $n); do $A shell input keyevent DPAD_${back^^}; sleep 0.35; done
|
||
$A shell dumpsys gfxinfo $P | grep -E 'Janky frames:|50th percentile|90th percentile|99th percentile|50th gpu|90th gpu'
|
||
$A shell dumpsys gfxinfo $P framestats | python3 tools/tv/framestats.py
|
||
}
|
||
install_release() { ./gradlew :app:assembleRelease -q && $A install -r app/build/outputs/apk/release/app-release.apk; }
|