shibafu528/Yukari

TimelineStatusに別サーバのDonStatusをマージするとメディアURLが変わる問題

Opened this issue · 3 comments

TimelineStatusに別サーバのDonStatusをマージすると、DonStatus同士の優先度判定が発生する。判定の結果、表示に使われるDonStatusが変わることがある。

表示に使われるDonStatusが変わると、その中に含まれるUser avatarや添付メディアのURLが変わる可能性がある。それによって、メディアの読み込みが中断されて最初からやり直しになってしまう。

特にモバイル回線では、中断による帯域・時間・課金クォータの浪費が無視できない。

TimelineStatus内にプロキシクラスを仕込んで、最初に着信したDonStatusのメディアURLを応答するのを試してみたが、ListViewのAdapter側がアンラップして中身のDonStatusを直接Viewにバインドする実装だったので無意味だった。

Mastodon固有の表示内容を実装したViewクラスが、固有のプロパティを読むためにDonStatusを直接触りたいみたいな感じ。

参照する全てのプロパティがインターフェース化されていて、それで通信先サービス固有のものも切り分けて表現されていたとしても、TimelineStatusが全てを実装した化け物になってしまうことが想像されて、ちょっと微妙か。

ImageLoaderのレイヤーが頑張れば何とかなりそうな気がする。

特にサムネイル用であれば何処からでも読み込めればそれでいいので、通信サーバに依存しないようなキャッシュキーを作ってロード、その結果を共有すれば良さそう。

雰囲気

cache = {
  # アバター : ユーザーURLをキーにする。account entityにオリジンを指すURLは無い。
  ["avatar", "https://ertona.net/@shibafu528"]
    => Bitmap("https://media.ertona.net/accounts/avatars/000/000/001/original/5a74fab7645ee733.png"),
  # 添付メディアサムネイル : リモートURLをキーとする。これは基本的に一意なオリジンのURLである。
  ["thumbnail", "https://media.ertona.net/media_attachments/files/111/244/736/374/840/296/original/eb88ec193776f153.png"]
    => Bitmap("https://media.ertona.net/media_attachments/files/111/244/736/374/840/296/small/eb88ec193776f153.png")
}

新しいImageLoader (#350) で何とかした。ImageLoader.loadProfileIconを使うことで、キャッシュキーがユーザーURLになる。

添付サムネイルについては元からそうだったので気にしない。