メインコンテンツまでスキップ

メディアアップロード

client.media API はファイルアップロードを扱い、クライアント側の待機期限を追加せずに サーバーの非同期処理状態を公開します。

メディアのアップロード​

import 'dart:io';

final bytes = await File('photo.jpg').readAsBytes();
final attachment = await client.media.upload(
bytes,
'photo.jpg',
description: 'アクセシビリティ用の代替テキスト',
);

print(attachment.id);
print(attachment.url);

サムネイル付きアップロード​

final thumbnailBytes = await File('thumb.jpg').readAsBytes();

final attachment = await client.media.upload(
videoBytes,
'video.mp4',
description: '短いクリップ',
thumbnail: thumbnailBytes,
thumbnailFilename: 'thumb.jpg',
);

フォーカルポイント​

フォーカルポイントは、画像がクロップされた際にどの部分が表示されるかを決定します。両軸とも -1.0 から 1.0 の範囲で指定します。

final attachment = await client.media.upload(
bytes,
'photo.jpg',
focus: '0.0,-0.5', // 水平方向中央、上半分
);

非同期処理​

サーバーが HTTP 202 を返した場合、upload() は url が null の添付情報を直ちに返します。 アプリケーションで状態確認が必要になった時点で fetchById() を呼び出してください。HTTP 206 は 処理中、HTTP 200 は最新の添付情報を取得できたことを示します。ライブラリはポーリングや処理期限の 設定を行いません。

Mastodon が HTTP 422 を返した場合、fetchById() は通常の例外変換経路を通じて処理失敗を MastodonValidationException として通知します。

final attachment = await client.media.upload(bytes, 'large-video.mp4');
if (attachment.url == null) {
// アプリケーション側の方針に従って後で確認
final current = await client.media.fetchById(attachment.id);
print(current.url == null ? '処理中' : current.url);
}

メディア属性の更新​

投稿に添付する前に代替テキスト、サムネイル、フォーカルポイントを更新できます。

final updated = await client.media.update(
attachment.id,
description: '更新された代替テキスト',
focus: '0.5,0.0',
);

未添付メディアの削除​

投稿にまだ添付されていないメディアのみ削除できます。

await client.media.delete(attachment.id);

API バージョンフォールバック​

ライブラリは POST /api/v2/media を優先し、v2 をサポートしないサーバー(HTTP 404, 405, 501)では自動的に POST /api/v1/media にフォールバックします。これは透過的に処理されます。

投稿への添付​

final attachment = await client.media.upload(bytes, 'photo.jpg',
description: '美しい景色',
);

final result = await client.statuses.create(
MastodonStatusCreateRequest(
status: 'この景色を見てください!',
mediaIds: [attachment.id],
),
);

1つの投稿には最大4枚の画像、または1つの動画/音声を添付できます(サーバー依存)。