This commit is contained in:
2023-07-29 17:43:19 +01:00
parent 4f690b114d
commit c5c9c54518
24 changed files with 985 additions and 12 deletions

View File

@ -66,4 +66,11 @@ public interface IStreamManager
/// <param name="pubkey"></param>
/// <returns></returns>
Task RemoveGuest(string pubkey);
/// <summary>
/// When a new DVR segment is available
/// </summary>
/// <param name="segment"></param>
/// <returns></returns>
Task OnDvr(Uri segment);
}

View File

@ -1,7 +1,9 @@
using System.Text.RegularExpressions;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using Nostr.Client.Json;
using NostrStreamer.Database;
using NostrStreamer.Services.Dvr;
namespace NostrStreamer.Services.StreamManager;
@ -11,21 +13,23 @@ public class NostrStreamManager : IStreamManager
private readonly StreamManagerContext _context;
private readonly StreamEventBuilder _eventBuilder;
private readonly SrsApi _srsApi;
private readonly IDvrStore _dvrStore;
public NostrStreamManager(ILogger<NostrStreamManager> logger, StreamManagerContext context,
StreamEventBuilder eventBuilder, SrsApi srsApi)
StreamEventBuilder eventBuilder, SrsApi srsApi, IDvrStore dvrStore)
{
_logger = logger;
_context = context;
_eventBuilder = eventBuilder;
_srsApi = srsApi;
_dvrStore = dvrStore;
}
public UserStream GetStream()
{
return _context.UserStream;
}
public Task<List<string>> OnForward()
{
if (_context.User.Balance <= 0)
@ -132,6 +136,22 @@ public class NostrStreamManager : IStreamManager
.ExecuteDeleteAsync();
}
public async Task OnDvr(Uri segment)
{
var matches = new Regex("\\.(\\d+)\\.[\\w]{2,4}$").Match(segment.AbsolutePath);
var result = await _dvrStore.UploadRecording(segment);
_context.Db.Recordings.Add(new()
{
UserStreamId = _context.UserStream.Id,
Url = result.Result.ToString(),
Duration = result.Duration,
Timestamp = DateTimeOffset.FromUnixTimeMilliseconds(long.Parse(matches.Groups[1].Value)).UtcDateTime
});
await _context.Db.SaveChangesAsync();
}
public async Task UpdateViewers()
{
if (_context.UserStream.State is not UserStreamState.Live) return;

View File

@ -2,6 +2,7 @@ using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using Nostr.Client.Json;
using NostrStreamer.Database;
using NostrStreamer.Services.Dvr;
namespace NostrStreamer.Services.StreamManager;
@ -11,14 +12,16 @@ public class StreamManagerFactory
private readonly ILoggerFactory _loggerFactory;
private readonly StreamEventBuilder _eventBuilder;
private readonly SrsApi _srsApi;
private readonly IDvrStore _dvrStore;
public StreamManagerFactory(StreamerContext db, ILoggerFactory loggerFactory, StreamEventBuilder eventBuilder,
SrsApi srsApi)
SrsApi srsApi, IDvrStore dvrStore)
{
_db = db;
_loggerFactory = loggerFactory;
_eventBuilder = eventBuilder;
_srsApi = srsApi;
_dvrStore = dvrStore;
}
public async Task<IStreamManager> ForStream(Guid id)
@ -27,6 +30,7 @@ public class StreamManagerFactory
.AsNoTracking()
.Include(a => a.User)
.Include(a => a.Endpoint)
.Include(a => a.Recordings)
.FirstOrDefaultAsync(a => a.Id == id);
if (currentStream == default) throw new Exception("No live stream");
@ -37,15 +41,16 @@ public class StreamManagerFactory
UserStream = currentStream
};
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _srsApi);
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _srsApi, _dvrStore);
}
public async Task<IStreamManager> ForCurrentStream(string pubkey)
{
var currentStream = await _db.Streams
.AsNoTracking()
.Include(a => a.User)
.Include(a => a.Endpoint)
.Include(a => a.Recordings)
.FirstOrDefaultAsync(a => a.PubKey.Equals(pubkey) && a.State == UserStreamState.Live);
if (currentStream == default) throw new Exception("No live stream");
@ -56,7 +61,7 @@ public class StreamManagerFactory
UserStream = currentStream
};
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _srsApi);
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _srsApi, _dvrStore);
}
public async Task<IStreamManager> ForStream(StreamInfo info)
@ -65,6 +70,7 @@ public class StreamManagerFactory
.AsNoTracking()
.Include(a => a.User)
.Include(a => a.Endpoint)
.Include(a => a.Recordings)
.FirstOrDefaultAsync(a =>
a.ClientId.Equals(info.ClientId) &&
a.User.StreamKey.Equals(info.StreamKey) &&
@ -118,6 +124,6 @@ public class StreamManagerFactory
UserStream = stream
};
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _srsApi);
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _srsApi, _dvrStore);
}
}