38 lines
1.6 KiB
C#
38 lines
1.6 KiB
C#
using System.Net;
|
|||
|
|
using System.Net.Http.Headers;
|
||
|
|
|
||
|
|
using collAnon.Client.Services;
|
||
|
|
|
||
|
|
using decePubClient.Extensions;
|
||
|
|
using decePubClient.Models;
|
||
|
|
using decePubClient.Models.Mastodon;
|
||
|
|
|
||
|
|
using PrivaPub.ClientModels;
|
||
|
|
|
||
|
|
namespace decePubClient.Services
|
||
|
|
{
|
||
|
|
/// <summary>Uploads a picked file to PrivaPub (/api/v2/media, multipart) before the post that uses it.</summary>
|
||
|
|
public class MediaService(IHttpService httpService, CoalescingStringLocalizer localizer)
|
||
|
|
{
|
||
|
|
/// <summary>The uploaded attachment as Data; its id goes in the post's media_ids.</summary>
|
||
|
|
public async Task<WebResult> Upload(UploadMedia media, CancellationToken cancellationToken = default)
|
||
|
|
{
|
||
|
|
using var response = await httpService.Post(APIs.Mastodon.POST_Media, (Func<HttpContent>)(() =>
|
||
|
|
{
|
||
|
|
var file = new ByteArrayContent(media.Blob);
|
||
|
|
file.Headers.ContentType = MediaTypeHeaderValue.Parse(media.ContentType);
|
||
|
|
var content = new MultipartFormDataContent { { file, "file", media.FileName } };
|
||
|
|
if (media.AltText is { Length: > 0 } description)
|
||
|
|
content.Add(new StringContent(description), "description");
|
||
|
|
return content;
|
||
|
|
}), cancellationToken: cancellationToken);
|
||
|
|
if (!response.IsSuccessStatusCode)
|
||
|
|
return await response.Content.ReadWebResult(response.StatusCode, localizer, cancellationToken);
|
||
|
|
|
||
|
|
var attachment = await response.MastodonReadFromJsonAsync<MediaAttachment>(cancellationToken);
|
||
|
|
return attachment?.Id is null
|
||
|
|
? new WebResult().Invalidate(localizer["The server sent an invalid response."], (int)HttpStatusCode.BadGateway)
|
||
|
|
: new WebResult { Data = attachment };
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|