summaryrefslogtreecommitdiff
path: root/Media.cs
blob: dc2f6237de2f489a429808686c0061c2b6320454 (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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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!;
    }

    public async Task<TagDefinition[]> GetTagsAsync(Guid mediaId) =>
        (await session.HttpClient.GetFromJsonAsync<TagDefinition[]>($"/api/media/{mediaId}/tags"))!;

    public async Task<TagDefinition[]> AddTagsAsync(Guid mediaId, Guid[] tagIds) {
        var response = await session.HttpClient.PatchAsJsonAsync($"/api/media/{mediaId}/tags", tagIds);
        return (await response.Content.ReadFromJsonAsync<TagDefinition[]>())!;
    }

    public async Task<TagDefinition[]> ReplaceTagsAsync(Guid mediaId, Guid[] tagIds) {
        var response = await session.HttpClient.PutAsJsonAsync($"/api/media/{mediaId}/tags", tagIds);
        return (await response.Content.ReadFromJsonAsync<TagDefinition[]>())!;
    }

    public async Task<TagDefinition[]> DeleteTagsAsync(Guid mediaId, Guid[] tagIds) {
        var response = await session.HttpClient.PatchAsJsonAsync($"/api/media/{mediaId}/tags/delete", tagIds);
        return (await response.Content.ReadFromJsonAsync<TagDefinition[]>())!;
    }
}