5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

マストドンの画像URL仕様

Last updated at Posted at 2017-04-20

なにげに地雷体質のえふしんです。
他のインスタンスでは問題ないのに、うちだけリモートフォローしたアカウントのアイコンがうまく表示されてないのに気がついたので調査中メモ(2017/4/21時点の情報です)

これがアイコンのURL
https://s3-ap-northeast-1.amazonaws.com/mstdn-fm-image/accounts/avatars/000/000/194/original/7c6f3433b2115421.png?1492614141

accountsテーブルに入ってる該当ユーザーの情報

mastodon=# select id,username,domain,created_at, display_name,avatar_file_name,avatar_content_type,avatar_file_size,avatar_updated_at from accounts where id = 194;

id | username | domain | created_at | display_name | avatar_file_name | avatar_content_type | avatar_file_size | avatar_updated_at
-----+----------+-----------+----------------------------+--------------+----------------------+---------------------+------------------+----------------------------
194 | **** | pawoo.net | 2017-04-19 15:02:21.665211 | | 7c6f3433b2115421.png | image/png | 2645 | 2017-04-19 15:02:21.793892

まぁ見れば、何が対応してるのか大体予測つきますよね。

/:class/:attachment/:id_partition/:style/:filename

id_partitionとは、paperclipの仕様で、12 would be converted to 000000012という処理をされて3桁ずつ分けたのがパスになるようです。

マストドンはリモートフォローすると、アイコン画像をローカルにダウンロードしてるんですね。avatar_updated_atってのがあるので、おそらく一定周期で最新データを拾ってくれる、、のかな。(ソースコード読みましょうね)

ということでアイコンが表示されないのは、S3へのアイコンのコピーが失敗しているようですね。ファイルサイズは把握してるわけだから、アップロードに失敗しているらしい。何故だ...(続く)

つづき 1:

画像をアップするところは、ここらへんかな?
https://github.com/tootsuite/mastodon/blob/b155e6ccf55bbd0e2b07d6e06349849dd1f06f0a/app/models/account.rb

  # Avatar upload
  has_attached_file :avatar, styles: ->(f) { avatar_styles(f) }, convert_options: { all: '-quality 80 -strip' }
  validates_attachment_content_type :avatar, content_type: IMAGE_MIME_TYPES
  validates_attachment_size :avatar, less_than: 2.megabytes

すごいなー。これでPaperclip経由でファイルがアップロードされちゃうんだー。Railsすごいな。

つづき 2:
fetch_remote_account_service.rbを改造して、irb経由で、無理やりアカウント情報を更新してアイコンを更新してました。

で、思ったんだけど、ここ間違ってると思うんですよね。

fetch_remote_account_service.rb
UpdateRemoteProfileService.new.call(xml, account) unless account.nil?

ではなくて、

fetch_remote_account_service.rb
UpdateRemoteProfileService.new.call(body, account) unless account.nil?

じゃないと、うまくいかない。

このパスでリモートフォローしにいったらプロフィールの取得に失敗するんじゃないかなぁ。ちゃんと調べてないから問題があるのかまではわからないのだけど。とりあえずプログラム上は間違っている。

別口で、sidekiq経由でUpdateRemoteProfileServiceが呼び出されるパスがあって、そっちが動けばアイコン画像は更新される。どういうきっかけで動くのかまではよくわからない。
https://github.com/tootsuite/mastodon/blob/master/app/workers/remote_profile_update_worker.rb

ただissueとしては、「画像URLわかってるけどS3へのアップロードが失敗している」だからちょっと違うか。まぁ仮にネットワークやサーバ負荷の問題だったらS3アップロード失敗を検知して、次回の何かで更新させて欲しいですね。もう少ししつこく動いてもいいかな。

アイコンの更新は、accountテーブルにavatar_updated_at があるから時間経過で行うつもりなのかなぁ。
ぱっと検索する限り、該当処理が見つからないのが謎。

この辺に深掘りできる方がいらっしゃいましたらpull requestなど投げていただけるとありがたいです。他人任せですいませんw

p.s. ローカルからS3に画像を移したい場合は、この辺のメソッドを再度実行するようなバッチがあれば、一気に更新出来るような気がしますね。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?