diff --git a/NostrStreamer/Controllers/PlaylistController.cs b/NostrStreamer/Controllers/PlaylistController.cs index 597c7fc..f780d3e 100644 --- a/NostrStreamer/Controllers/PlaylistController.cs +++ b/NostrStreamer/Controllers/PlaylistController.cs @@ -201,9 +201,9 @@ public class PlaylistController : Controller try { var streamManager = await _streamManagerFactory.ForStream(id); - var userStream = streamManager.GetStream(); + var recordings = await streamManager.GetRecordings(); - if (userStream.Recordings.Count == 0) + if (recordings.Count == 0) { Response.StatusCode = 404; return; @@ -219,7 +219,7 @@ public class PlaylistController : Controller await sw.WriteLineAsync("#EXT-X-MEDIA-SEQUENCE:0"); //await sw.WriteLineAsync($"#EXT-X-MAP:URI=\"{id}_init.mp4\""); - foreach (var seg in userStream.Recordings.OrderBy(a => a.Timestamp)) + foreach (var seg in recordings.OrderBy(a => a.Timestamp)) { await sw.WriteLineAsync($"#EXTINF:{seg.Duration},"); await sw.WriteLineAsync($"#EXT-X-PROGRAM-DATE-TIME:{seg.Timestamp:yyyy-MM-ddTHH:mm:ss.fffzzz}"); @@ -240,9 +240,9 @@ public class PlaylistController : Controller try { var streamManager = await _streamManagerFactory.ForStream(id); - var userStream = streamManager.GetStream(); + var recordings = await streamManager.GetRecordings(); - var firstFrag = await _client.GetStreamAsync(userStream.Recordings.First().Url); + var firstFrag = await _client.GetStreamAsync(recordings.First().Url); var tmpFrag = Path.GetTempFileName(); await firstFrag.CopyToAsync(new FileStream(tmpFrag, FileMode.Open, FileAccess.ReadWrite)); diff --git a/NostrStreamer/Database/Configuration/UserStreamRecordingConfiguration.cs b/NostrStreamer/Database/Configuration/UserStreamRecordingConfiguration.cs index d6d40e6..d58de43 100644 --- a/NostrStreamer/Database/Configuration/UserStreamRecordingConfiguration.cs +++ b/NostrStreamer/Database/Configuration/UserStreamRecordingConfiguration.cs @@ -18,7 +18,7 @@ public class UserStreamRecordingConfiguration : IEntityTypeConfiguration a.Stream) - .WithMany(a => a.Recordings) + .WithMany() .HasForeignKey(a => a.UserStreamId); } } diff --git a/NostrStreamer/Database/UserStream.cs b/NostrStreamer/Database/UserStream.cs index d860051..4731158 100644 --- a/NostrStreamer/Database/UserStream.cs +++ b/NostrStreamer/Database/UserStream.cs @@ -39,7 +39,6 @@ public class UserStream public string ForwardClientId { get; set; } = null!; public List Guests { get; init; } = new(); - public List Recordings { get; init; } = new(); } public enum UserStreamState diff --git a/NostrStreamer/Services/StreamManager/IStreamManager.cs b/NostrStreamer/Services/StreamManager/IStreamManager.cs index 33daabd..7477581 100644 --- a/NostrStreamer/Services/StreamManager/IStreamManager.cs +++ b/NostrStreamer/Services/StreamManager/IStreamManager.cs @@ -78,5 +78,11 @@ public interface IStreamManager /// Republish stream event /// /// - public Task UpdateEvent(); + Task UpdateEvent(); + + /// + /// Return a list of recordings segments + /// + /// + Task> GetRecordings(); } \ No newline at end of file diff --git a/NostrStreamer/Services/StreamManager/NostrStreamManager.cs b/NostrStreamer/Services/StreamManager/NostrStreamManager.cs index 98ab273..dc387c6 100644 --- a/NostrStreamer/Services/StreamManager/NostrStreamManager.cs +++ b/NostrStreamer/Services/StreamManager/NostrStreamManager.cs @@ -149,12 +149,19 @@ public class NostrStreamManager : IStreamManager await _context.Db.SaveChangesAsync(); } - + public async Task UpdateEvent() { await UpdateStreamState(_context.UserStream.State); } + public async Task> GetRecordings() + { + return await _context.Db.Recordings.AsNoTracking() + .Where(a => a.UserStreamId == _context.UserStream.Id) + .ToListAsync(); + } + public async Task UpdateViewers() { if (_context.UserStream.State is not UserStreamState.Live) return; diff --git a/NostrStreamer/Services/StreamManager/StreamManagerFactory.cs b/NostrStreamer/Services/StreamManager/StreamManagerFactory.cs index 0477b35..02be31a 100644 --- a/NostrStreamer/Services/StreamManager/StreamManagerFactory.cs +++ b/NostrStreamer/Services/StreamManager/StreamManagerFactory.cs @@ -89,7 +89,6 @@ public class StreamManagerFactory .AsNoTracking() .Include(a => a.User) .Include(a => a.Endpoint) - .Include(a => a.Recordings) .FirstOrDefaultAsync(a => a.Id == id); if (stream == default) throw new Exception("No live stream"); @@ -110,7 +109,6 @@ public class StreamManagerFactory .AsNoTracking() .Include(a => a.User) .Include(a => a.Endpoint) - .Include(a => a.Recordings) .FirstOrDefaultAsync(a => a.PubKey.Equals(pubkey) && a.State == UserStreamState.Live); if (stream == default) throw new Exception("No live stream"); @@ -131,7 +129,6 @@ public class StreamManagerFactory .AsNoTracking() .Include(a => a.User) .Include(a => a.Endpoint) - .Include(a => a.Recordings) .OrderByDescending(a => a.Starts) .FirstOrDefaultAsync(a => a.User.StreamKey.Equals(info.StreamKey) &&