Files
zap-stream-api/NostrStreamer/Services/Background/BackgroundStreamManager.cs
2023-08-01 23:08:57 +01:00

60 lines
2.1 KiB
C#

using Microsoft.EntityFrameworkCore;
using NostrStreamer.Database;
using NostrStreamer.Services.StreamManager;
namespace NostrStreamer.Services.Background;
public class BackgroundStreamManager : BackgroundService
{
private readonly ILogger<BackgroundStreamManager> _logger;
private readonly IServiceScopeFactory _scopeFactory;
public BackgroundStreamManager(ILogger<BackgroundStreamManager> logger, IServiceScopeFactory scopeFactory)
{
_logger = logger;
_scopeFactory = scopeFactory;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
using var scope = _scopeFactory.CreateScope();
var streamManager = scope.ServiceProvider.GetRequiredService<StreamManagerFactory>();
var db = scope.ServiceProvider.GetRequiredService<StreamerContext>();
var srs = scope.ServiceProvider.GetRequiredService<SrsApi>();
var recentlyEnded = DateTime.UtcNow.Subtract(TimeSpan.FromMinutes(5));
var liveStreams = await db.Streams
.AsNoTracking()
.Where(a => a.State == UserStreamState.Live || a.Ends > recentlyEnded)
.Select(a => a.Id)
.ToListAsync(cancellationToken: stoppingToken);
foreach (var id in liveStreams)
{
var manager = await streamManager.ForStream(id);
var client = await srs.GetStream(manager.GetStream().StreamId);
if (client != default)
{
await manager.UpdateViewers();
}
else
{
await manager.StreamStopped();
}
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to run");
}
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
}
}
}