101 lines
3.9 KiB
C#
101 lines
3.9 KiB
C#
using Piwigo.Client.Images;
|
|
|
|
namespace Piwigo.Client;
|
|
|
|
public static class PiwigoClientExtensions
|
|
{
|
|
public static async Task<ImageUploaded> UploadImageAsync(this IPiwigoClient client, FileInfo imageToUpload, ImageUpload metaData, CancellationToken cancellationToken = default)
|
|
{
|
|
if (client == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(client));
|
|
}
|
|
|
|
if (imageToUpload == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(imageToUpload));
|
|
}
|
|
|
|
if (metaData == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(metaData));
|
|
}
|
|
|
|
await client.CheckSupportedFileTypeAsync(imageToUpload, cancellationToken);
|
|
await UploadChunksAsync(client, imageToUpload, metaData.OriginalSum, cancellationToken);
|
|
return await client.Image.AddAsync(metaData, cancellationToken);
|
|
}
|
|
|
|
public static async Task<ImageUploaded> UpdateImageAsync(this IPiwigoClient client, int imageId, FileInfo imageToUpload, ImageUpload metaData,
|
|
CancellationToken cancellationToken = default)
|
|
{
|
|
if (client == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(client));
|
|
}
|
|
|
|
if (imageToUpload == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(imageToUpload));
|
|
}
|
|
|
|
if (metaData == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(metaData));
|
|
}
|
|
|
|
await client.CheckSupportedFileTypeAsync(imageToUpload, cancellationToken);
|
|
await UploadChunksAsync(client, imageToUpload, metaData.OriginalSum, cancellationToken);
|
|
return await client.Image.UpdateAsync(imageId, metaData, cancellationToken);
|
|
}
|
|
|
|
public static async Task<ImageUploaded> UploadImageAsync(this IPiwigoClient client, FileInfo imageToUpload, CancellationToken cancellationToken = default)
|
|
{
|
|
if (client == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(client));
|
|
}
|
|
|
|
if (imageToUpload == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(imageToUpload));
|
|
}
|
|
|
|
await client.CheckSupportedFileTypeAsync(imageToUpload, cancellationToken);
|
|
var uploadMd5 = await imageToUpload.CalculateMd5SumAsync(cancellationToken);
|
|
return await client.UploadImageAsync(imageToUpload, new ImageUpload(uploadMd5), cancellationToken);
|
|
}
|
|
|
|
private static async Task CheckSupportedFileTypeAsync(this IPiwigoClient client, FileSystemInfo imageToUpload, CancellationToken cancellationToken)
|
|
{
|
|
if (!imageToUpload.Exists)
|
|
{
|
|
throw new PiwigoException($"Could not find file {imageToUpload.FullName}");
|
|
}
|
|
|
|
var supportedFileTypes = await client.Session.GetSupportedFileTypes(cancellationToken);
|
|
if (!supportedFileTypes.Contains(imageToUpload.Extension.Replace(".", string.Empty).ToLower()))
|
|
{
|
|
throw new PiwigoException(
|
|
$"The file {imageToUpload.Name} has extension {imageToUpload.Extension} which is not supported by the connected piwigo server. Please use one of the following formats {string.Join(",", supportedFileTypes)}");
|
|
}
|
|
}
|
|
|
|
private static async Task UploadChunksAsync(IPiwigoClient client, FileInfo imageToUpload, string uploadMd5, CancellationToken cancellationToken)
|
|
{
|
|
var chunkSizeInKiB = await client.Session.GetUploadChunkSizeAsync(cancellationToken);
|
|
|
|
await using var file = imageToUpload.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
|
|
|
|
var buffer = new byte[chunkSizeInKiB * 1024];
|
|
var totalChunks = (int)imageToUpload.Length / buffer.Length + 1;
|
|
var currentChunk = 0;
|
|
|
|
while (currentChunk < totalChunks)
|
|
{
|
|
var readBytes = await file.ReadAsync(buffer, cancellationToken);
|
|
await client.Image.AddChunkAsync(uploadMd5, currentChunk, buffer[..readBytes], cancellationToken);
|
|
currentChunk++;
|
|
}
|
|
}
|
|
} |