diff options
Diffstat (limited to 'Utilities/LibMatrix.HomeserverEmulator/Services/MediaStore.cs')
-rw-r--r-- | Utilities/LibMatrix.HomeserverEmulator/Services/MediaStore.cs | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/Utilities/LibMatrix.HomeserverEmulator/Services/MediaStore.cs b/Utilities/LibMatrix.HomeserverEmulator/Services/MediaStore.cs new file mode 100644 index 0000000..00f2a42 --- /dev/null +++ b/Utilities/LibMatrix.HomeserverEmulator/Services/MediaStore.cs @@ -0,0 +1,64 @@ +using System.Text.Json; +using LibMatrix.Services; + +namespace LibMatrix.HomeserverEmulator.Services; + +public class MediaStore { + private readonly HSEConfiguration _config; + private readonly HomeserverResolverService _hsResolver; + private List<MediaInfo> index = new(); + + public MediaStore(HSEConfiguration config, HomeserverResolverService hsResolver) { + _config = config; + _hsResolver = hsResolver; + if (config.StoreData) { + var path = Path.Combine(config.DataStoragePath, "media"); + if (!Directory.Exists(path)) Directory.CreateDirectory(path); + if (File.Exists(Path.Combine(path, "index.json"))) + index = JsonSerializer.Deserialize<List<MediaInfo>>(File.ReadAllText(Path.Combine(path, "index.json"))); + } + else + Console.WriteLine("Data storage is disabled, not loading rooms from disk"); + } + + // public async Task<object> UploadMedia(string userId, string mimeType, Stream stream, string? filename = null) { + // var mediaId = $"mxc://{Guid.NewGuid().ToString()}"; + // var path = Path.Combine(_config.DataStoragePath, "media", mediaId); + // if (!Directory.Exists(path)) Directory.CreateDirectory(path); + // var file = Path.Combine(path, filename ?? "file"); + // await using var fs = File.Create(file); + // await stream.CopyToAsync(fs); + // index.Add(new() { }); + // return media; + // } + + public async Task<Stream> GetRemoteMedia(string serverName, string mediaId) { + if (_config.StoreData) { + var path = Path.Combine(_config.DataStoragePath, "media", serverName, mediaId); + if (!File.Exists(path)) { + var mediaUrl = await _hsResolver.ResolveMediaUri(serverName, $"mxc://{serverName}/{mediaId}"); + if (mediaUrl is null) + throw new MatrixException() { + ErrorCode = "M_NOT_FOUND", + Error = "Media not found" + }; + using var client = new HttpClient(); + var stream = await client.GetStreamAsync(mediaUrl); + await using var fs = File.Create(path); + await stream.CopyToAsync(fs); + } + return new FileStream(path, FileMode.Open); + } + else { + var mediaUrl = await _hsResolver.ResolveMediaUri(serverName, $"mxc://{serverName}/{mediaId}"); + if (mediaUrl is null) + throw new MatrixException() { + ErrorCode = "M_NOT_FOUND", + Error = "Media not found" + }; + using var client = new HttpClient(); + return await client.GetStreamAsync(mediaUrl); + } + } + public class MediaInfo { } +} \ No newline at end of file |