経緯
公式Twitchのアプリが全然使えないのでつくった。
・横画面にするとチャットが映像にかぶるか、映像が小さくなるかのどっちか
・そもそもセーフエリア無視して表示させてくれ
・あとコメント文字がでかすぎる
・コメントの名前とか基本いらないから消させてくれ
・見るアプリなのにとにかく見ることの設定が少なすぎ
・マルチビューもない(これは仕方ないが)
なので自分で作った
とりあえず使いたい人は
https://github.com/s-tyd/twiview/releases
ここから APK を入れれば使えます(ログインしたい人はClientIDを登録する必要あり)
非公式アプリなので、Twitch 側が何か変えたらある日急に動かなくなるかもしれないので自己責任でおねがいします
作ったもの
左が公式、右が twiview

公式の再生まわり(倍速、音声のみ、スリープタイマー、バックグラウンド再生、続きから再生、PiP)はもちろん全部入ってる上に、公式にないものを足した
- 一覧を詰めた、1画面にけっこう並ぶ
- チャットの見た目をほぼ全部いじれる
- 弾幕、エモートもそのまま流れる
- 横画面でチャットを残したまま映像をフィットさせて表示
- 低遅延モード
- マルチビュー、最大4配信(まだ実験的)
あとログインなしで使えるお気に入りとか、ワードとユーザーのブロックとか、チャンネルポイントのボーナス自動受け取りとか
UI は10言語、Twitch のユーザーが多い上位14か国はカバーしてる(はず)
中身
Kotlin + Jetpack Compose、再生は Media3(ExoPlayer)
再生や検索は Twitch の Web 版が使ってる非公開の API をそのまま叩いてる
フォロー一覧だけ公式の API なので、自分で Twitch に Client ID を登録してアプリに入れる必要がある
遅延が4秒から縮まらない
低遅延モードを作ったのに、4秒くらいから全然縮まらなかった
調べたら、Media3 はプレイリストが更新されると TARGETDURATION(Twitch だと5〜6秒)待ってから次を読みに行くらしい
なので作りかけの区切りの予告(#EXT-X-TWITCH-PREFETCH)が載ってる配信だけ、TARGETDURATION を2秒に書き換えて1〜2秒ごとに読み直させた(ごり押し)
// LowLatencyPlaylist.kt
} else if (line.startsWith(TARGET_DURATION)) {
append(TARGET_DURATION).append(LOW_LATENCY_TARGET_DURATION).append('\n')
}
これで低遅延の配信なら2.6〜2.7秒くらいまで詰まった。
マルチビューで映像だけ止まる
大きい窓を切り替えると映像だけ止まる
音は鳴ってるし、エラーも出ない
Compose が画面の位置で部品を使い回すせいで、映像の表示面に別のプレイヤーが付け替えられてた
Media3 1.8 と Android 15 以降の組み合わせだと、一回付け替えるともうフレームが来なくなるらしい
窓ごとにキーを固定して、切り替えは並べ方だけ変えるようにして回避した
非公開 API のクセ
アーカイブ一覧を続きから取ろうとすると「failed integrity check」で怒られるので、取れる最大の100件を一発で取ってます
最後に
ほぼ自分用に作ったので、細かいところはわりと適当です。
ボーナスの自動受け取りも入れてるけどできてるかちゃんと見てない
欲しい機能や動かないところがあれば、GitHub の Issue まで。
寝ながらTwitch見るときとか、体験めっちゃ改善された。