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 GetAsync(Guid mediaId) => (await session.HttpClient.GetFromJsonAsync($"/api/media/{mediaId}"))!; public async Task GetUploadedFilesAsync(Guid mediaId) => (await session.HttpClient.GetFromJsonAsync($"/api/media/{mediaId}/files"))!; public async Task 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(); fileData.Close(); return responseContent!; } public async Task GetTagsAsync(Guid mediaId) => (await session.HttpClient.GetFromJsonAsync($"/api/media/{mediaId}/tags"))!; public async Task AddTagsAsync(Guid mediaId, Guid[] tagIds) { var response = await session.HttpClient.PatchAsJsonAsync($"/api/media/{mediaId}/tags", tagIds); return (await response.Content.ReadFromJsonAsync())!; } public async Task ReplaceTagsAsync(Guid mediaId, Guid[] tagIds) { var response = await session.HttpClient.PutAsJsonAsync($"/api/media/{mediaId}/tags", tagIds); return (await response.Content.ReadFromJsonAsync())!; } public async Task DeleteTagsAsync(Guid mediaId, Guid[] tagIds) { var response = await session.HttpClient.PatchAsJsonAsync($"/api/media/{mediaId}/tags/delete", tagIds); return (await response.Content.ReadFromJsonAsync())!; } }