mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2025-05-03 09:39:47 +00:00
107 lines
3.8 KiB
C#
107 lines
3.8 KiB
C#
|
using System.Formats.Tar;
|
||
|
using System.IO.Compression;
|
||
|
|
||
|
using SharedTools;
|
||
|
|
||
|
namespace Build.Commands;
|
||
|
|
||
|
public static class Pdfium
|
||
|
{
|
||
|
public static async Task InstallAsync(RID rid, string version)
|
||
|
{
|
||
|
Console.Write($"- Installing Pdfium {version} for {rid.ToUserFriendlyName()} ...");
|
||
|
|
||
|
var cwd = Environment.GetRustRuntimeDirectory();
|
||
|
var pdfiumTmpDownloadPath = Path.GetTempFileName();
|
||
|
var pdfiumTmpExtractPath = Directory.CreateTempSubdirectory();
|
||
|
var pdfiumUrl = GetPdfiumDownloadUrl(rid, version);
|
||
|
|
||
|
//
|
||
|
// Download the file:
|
||
|
//
|
||
|
Console.Write(" downloading ...");
|
||
|
using (var client = new HttpClient())
|
||
|
{
|
||
|
var response = await client.GetAsync(pdfiumUrl);
|
||
|
if (!response.IsSuccessStatusCode)
|
||
|
{
|
||
|
Console.WriteLine($" failed to download Pdfium {version} for {rid.ToUserFriendlyName()}");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
await using var fileStream = File.Create(pdfiumTmpDownloadPath);
|
||
|
await response.Content.CopyToAsync(fileStream);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Extract the downloaded file:
|
||
|
//
|
||
|
Console.Write(" extracting ...");
|
||
|
await using(var tgzStream = File.Open(pdfiumTmpDownloadPath, FileMode.Open, FileAccess.Read, FileShare.Read))
|
||
|
{
|
||
|
await using var uncompressedStream = new GZipStream(tgzStream, CompressionMode.Decompress);
|
||
|
await TarFile.ExtractToDirectoryAsync(uncompressedStream, pdfiumTmpExtractPath.FullName, true);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Copy the library to the target directory:
|
||
|
//
|
||
|
Console.Write(" deploying ...");
|
||
|
var library = GetLibraryPath(rid);
|
||
|
if (string.IsNullOrEmpty(library.Path))
|
||
|
{
|
||
|
Console.WriteLine($" failed to find the library path for {rid.ToUserFriendlyName()}");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var pdfiumLibSourcePath = Path.Join(pdfiumTmpExtractPath.FullName, library.Path);
|
||
|
var pdfiumLibTargetPath = Path.Join(cwd, "resources", "libraries", library.Filename);
|
||
|
if (!File.Exists(pdfiumLibSourcePath))
|
||
|
{
|
||
|
Console.WriteLine($" failed to find the library file '{pdfiumLibSourcePath}'");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Directory.CreateDirectory(Path.Join(cwd, "resources", "libraries"));
|
||
|
if (File.Exists(pdfiumLibTargetPath))
|
||
|
File.Delete(pdfiumLibTargetPath);
|
||
|
|
||
|
File.Copy(pdfiumLibSourcePath, pdfiumLibTargetPath);
|
||
|
|
||
|
//
|
||
|
// Cleanup:
|
||
|
//
|
||
|
Console.Write(" cleaning up ...");
|
||
|
File.Delete(pdfiumTmpDownloadPath);
|
||
|
Directory.Delete(pdfiumTmpExtractPath.FullName, true);
|
||
|
|
||
|
Console.WriteLine(" done.");
|
||
|
}
|
||
|
|
||
|
private static Library GetLibraryPath(RID rid) => rid switch
|
||
|
{
|
||
|
RID.LINUX_ARM64 or RID.LINUX_X64 => new(Path.Join("lib", "libpdfium.so"), "libpdfium.so"),
|
||
|
RID.OSX_ARM64 or RID.OSX_X64 => new(Path.Join("lib", "libpdfium.dylib"), "libpdfium.dylib"),
|
||
|
RID.WIN_ARM64 or RID.WIN_X64 => new(Path.Join("bin", "pdfium.dll"), "pdfium.dll"),
|
||
|
|
||
|
_ => new(string.Empty, string.Empty),
|
||
|
};
|
||
|
|
||
|
private static string GetPdfiumDownloadUrl(RID rid, string version)
|
||
|
{
|
||
|
var baseUrl = $"https://github.com/bblanchon/pdfium-binaries/releases/download/chromium%2F{version}/pdfium-";
|
||
|
return rid switch
|
||
|
{
|
||
|
RID.LINUX_ARM64 => $"{baseUrl}linux-arm64.tgz",
|
||
|
RID.LINUX_X64 => $"{baseUrl}linux-x64.tgz",
|
||
|
|
||
|
RID.OSX_ARM64 => $"{baseUrl}mac-arm64.tgz",
|
||
|
RID.OSX_X64 => $"{baseUrl}mac-x64.tgz",
|
||
|
|
||
|
RID.WIN_ARM64 => $"{baseUrl}win-arm64.zip",
|
||
|
RID.WIN_X64 => $"{baseUrl}win-x64.zip",
|
||
|
|
||
|
_ => string.Empty,
|
||
|
};
|
||
|
}
|
||
|
}
|