s-tyd
Notes
←ノート

2026.10.15 · Android · 2分で読めます

Twitch の公式アプリが合わなかったので、Android の専ブラ twiview を作った

経緯

公式Twitchのアプリが全然使えないのでつくった。

・横画面にするとチャットが映像にかぶるか、映像が小さくなるかのどっちか
・そもそもセーフエリア無視して表示させてくれ
・あとコメント文字がでかすぎる
・コメントの名前とか基本いらないから消させてくれ
・見るアプリなのにとにかく見ることの設定が少なすぎ
・マルチビューもない(これは仕方ないが)

なので自分で作った

とりあえず使いたい人は

https://github.com/s-tyd/twiview/releases

ここから APK を入れれば使えます(ログインしたい人はClientIDを登録する必要あり)
非公式アプリなので、Twitch 側が何か変えたらある日急に動かなくなるかもしれないので自己責任でおねがいします

作ったもの

左が公式、右が twiview

左が公式、右が twiview。上から一覧と縦画面、横画面、弾幕、マルチビュー

公式の再生まわり(倍速、音声のみ、スリープタイマー、バックグラウンド再生、続きから再生、PiP)はもちろん全部入ってる上に、公式にないものを足した

あとログインなしで使えるお気に入りとか、ワードとユーザーのブロックとか、チャンネルポイントのボーナス自動受け取りとか

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見るときとか、体験めっちゃ改善された。

Shoya Toyodaアプリ開発を軸にしたソフトウェアエンジニア。技術支援などのお仕事をお受けしています。

相談する