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[]>())!;
}
}
|