about summary refs log tree commit diff
path: root/Utilities/LibMatrix.HomeserverEmulator/Services/MediaStore.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Utilities/LibMatrix.HomeserverEmulator/Services/MediaStore.cs')
-rw-r--r--Utilities/LibMatrix.HomeserverEmulator/Services/MediaStore.cs64
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