using System.Text.Json; using LibMatrix.Services; namespace LibMatrix.HomeserverEmulator.Services; public class MediaStore { private readonly HSEConfiguration _config; private readonly HomeserverResolverService _hsResolver; private List 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>(File.ReadAllText(Path.Combine(path, "index.json"))); } else Console.WriteLine("Data storage is disabled, not loading rooms from disk"); } // public async Task 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 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 { } }