summaryrefslogtreecommitdiff
path: root/Media.cs
blob: 794e5f286023591abc8ca4bb6388a46bc3d88102 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using HyperBooru.ApiModels;
using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Security.Cryptography;
using System.Text.Json;

namespace HyperBooru.ApiClient;

public class Media {
    private HBSession session;

    internal Media(HBSession session) =>
        this.session = session;

    public async Task<ApiModels.Media> GetAsync(Guid mediaId) =>
        (await session.HttpClient.GetFromJsonAsync<ApiModels.Media>($"/api/media/{mediaId}"))!;

    public async Task<ApiModels.UploadedFile[]> GetUploadedFilesAsync(Guid mediaId) =>
        (await session.HttpClient.GetFromJsonAsync<ApiModels.UploadedFile[]>($"/api/media/{mediaId}/files"))!;

    public async Task<ApiModels.Media> UploadAsync(
        string path,
        Guid[]? tagIds,
        bool isIngest = true) {

        var formData = new MultipartFormDataContent();

        FileInfo fileInfo = new FileInfo(path);

        Stream fileData = File.OpenRead(path);

        var hash = BitConverter
            .ToString(MD5.Create().ComputeHash(fileData))
            .Replace("-", "")
            .ToLower();
        fileData.Seek(0, SeekOrigin.Begin);

        var fileContent = new StreamContent(fileData) {
            Headers = {
                ContentLength = fileData.Length,
                ContentType   = new MediaTypeHeaderValue("image/png")
            }
        };

        var metadata = new MediaUploadRequest() {
            Checksum       = hash,
            LastAccessTime = fileInfo.LastAccessTimeUtc,
            LastWriteTime  = fileInfo.LastWriteTimeUtc,
            CreateTime     = fileInfo.CreationTimeUtc,
            Path           = fileInfo.Directory?.FullName,
            PathType       = fileInfo.Directory is null ? null : Util.CurrentOSPathType,
            Tags           = tagIds,
            IsIngest       = isIngest
        };

        fileContent.Headers.Add("X-HyperBooru-Metadata", JsonSerializer.Serialize(metadata));

        formData.Add(
            fileContent,
            "file",
            Path.GetFileName(path));

        Guid mediaId = Guid.Empty;

        var response        = await session.HttpClient.PostAsync("/api/media", formData);
        var responseContent = await response.Content.ReadFromJsonAsync<ApiModels.Media>();

        fileData.Close();

        return responseContent!;
    }
}