Bugfix stream editor
This commit is contained in:
2023-08-01 15:35:11 +01:00
parent 82dc5615c2
commit 7ca87a6181
20 changed files with 561 additions and 93 deletions

View File

@ -61,8 +61,7 @@ public class StreamEventBuilder
tags.Add(new("recording", new Uri(_config.DataHost, $"recording/{stream.Id}.m3u8").ToString()));
}
foreach (var tag in !string.IsNullOrEmpty(user.Tags) ?
user.Tags.Split(",", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) : Array.Empty<string>())
foreach (var tag in user.SplitTags())
{
tags.Add(new("t", tag));
}

View File

@ -9,6 +9,12 @@ public interface IStreamManager
/// </summary>
/// <returns></returns>
UserStream GetStream();
/// <summary>
/// Test if streaming is allowed for this user, otherwise throw
/// </summary>
/// <exception cref="Exception">Throws if cant stream</exception>
void TestCanStream();
/// <summary>
/// Stream ingress check on srs-edge
@ -35,17 +41,6 @@ public interface IStreamManager
/// <returns></returns>
Task ConsumeQuota(double duration);
/// <summary>
/// Update stream details
/// </summary>
/// <param name="title"></param>
/// <param name="summary"></param>
/// <param name="image"></param>
/// <param name="tags"></param>
/// <param name="contentWarning"></param>
/// <returns></returns>
Task PatchEvent(string? title, string? summary, string? image, string[]? tags, string? contentWarning);
/// <summary>
/// Update viewer count
/// </summary>

View File

@ -1,4 +1,3 @@
using System.Text.RegularExpressions;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using Nostr.Client.Json;
@ -14,15 +13,16 @@ public class NostrStreamManager : IStreamManager
private readonly StreamEventBuilder _eventBuilder;
private readonly IDvrStore _dvrStore;
private readonly ThumbnailService _thumbnailService;
private readonly Config _config;
public NostrStreamManager(ILogger<NostrStreamManager> logger, StreamManagerContext context,
StreamEventBuilder eventBuilder, IDvrStore dvrStore, ThumbnailService thumbnailService)
public NostrStreamManager(ILogger<NostrStreamManager> logger, StreamManagerContext context, IServiceProvider serviceProvider)
{
_logger = logger;
_context = context;
_eventBuilder = eventBuilder;
_dvrStore = dvrStore;
_thumbnailService = thumbnailService;
_eventBuilder = serviceProvider.GetRequiredService<StreamEventBuilder>();
_dvrStore = serviceProvider.GetRequiredService<IDvrStore>();
_thumbnailService = serviceProvider.GetRequiredService<ThumbnailService>();
_config = serviceProvider.GetRequiredService<Config>();
}
public UserStream GetStream()
@ -30,13 +30,22 @@ public class NostrStreamManager : IStreamManager
return _context.UserStream;
}
public Task<List<string>> OnForward()
public void TestCanStream()
{
if (_context.User.Balance <= 0)
{
throw new LowBalanceException("User balance empty");
}
if (_context.User.TosAccepted == null || _context.User.TosAccepted < _config.TosDate)
{
throw new Exception("TOS not accepted");
}
}
public Task<List<string>> OnForward()
{
TestCanStream();
return Task.FromResult(new List<string>
{
$"rtmp://127.0.0.1:1935/{_context.UserStream.Endpoint.App}/{_context.User.StreamKey}?vhost={_context.UserStream.Endpoint.Forward}"
@ -46,12 +55,7 @@ public class NostrStreamManager : IStreamManager
public async Task StreamStarted()
{
_logger.LogInformation("Stream started for: {pubkey}", _context.User.PubKey);
if (_context.User.Balance <= 0)
{
throw new Exception("User balance empty");
}
TestCanStream();
await UpdateStreamState(UserStreamState.Live);
#pragma warning disable CS4014
@ -95,31 +99,6 @@ public class NostrStreamManager : IStreamManager
}
}
public async Task PatchEvent(string? title, string? summary, string? image, string[]? tags, string? contentWarning)
{
var user = _context.User;
await _context.Db.Users
.Where(a => a.PubKey == _context.User.PubKey)
.ExecuteUpdateAsync(o => o.SetProperty(v => v.Title, title)
.SetProperty(v => v.Summary, summary)
.SetProperty(v => v.Image, image)
.SetProperty(v => v.Tags, tags != null ? string.Join(",", tags) : null)
.SetProperty(v => v.ContentWarning, contentWarning));
user.Title = title;
user.Summary = summary;
user.Image = image;
user.Tags = tags != null ? string.Join(",", tags) : null;
user.ContentWarning = contentWarning;
var ev = _eventBuilder.CreateStreamEvent(user, _context.UserStream);
await _context.Db.Streams.Where(a => a.Id == _context.UserStream.Id)
.ExecuteUpdateAsync(o => o.SetProperty(v => v.Event, JsonConvert.SerializeObject(ev, NostrSerializer.Settings)));
_eventBuilder.BroadcastEvent(ev);
}
public async Task AddGuest(string pubkey, string role, decimal zapSplit)
{
_context.Db.Guests.Add(new()

View File

@ -2,7 +2,6 @@ using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using Nostr.Client.Json;
using NostrStreamer.Database;
using NostrStreamer.Services.Dvr;
namespace NostrStreamer.Services.StreamManager;
@ -12,18 +11,16 @@ public class StreamManagerFactory
private readonly ILoggerFactory _loggerFactory;
private readonly StreamEventBuilder _eventBuilder;
private readonly IServiceProvider _serviceProvider;
private readonly IDvrStore _dvrStore;
private readonly ThumbnailService _thumbnailService;
private readonly Config _config;
public StreamManagerFactory(StreamerContext db, ILoggerFactory loggerFactory, StreamEventBuilder eventBuilder,
IServiceProvider serviceProvider, IDvrStore dvrStore, ThumbnailService thumbnailService)
IServiceProvider serviceProvider, Config config)
{
_db = db;
_loggerFactory = loggerFactory;
_eventBuilder = eventBuilder;
_serviceProvider = serviceProvider;
_dvrStore = dvrStore;
_thumbnailService = thumbnailService;
_config = config;
}
public async Task<IStreamManager> CreateStream(StreamInfo info)
@ -47,7 +44,12 @@ public class StreamManagerFactory
if (user.Balance <= 0)
{
throw new Exception("Cannot start stream with empty balance");
throw new LowBalanceException("Cannot start stream with empty balance");
}
if (user.TosAccepted == null || user.TosAccepted < _config.TosDate)
{
throw new Exception("TOS not accepted");
}
var stream = new UserStream
@ -82,7 +84,7 @@ public class StreamManagerFactory
EdgeApi = new SrsApi(_serviceProvider.GetRequiredService<HttpClient>(), new Uri($"http://{stream.EdgeIp}:1985"))
};
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _dvrStore, _thumbnailService);
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _serviceProvider);
}
public async Task<IStreamManager> ForStream(Guid id)
@ -102,7 +104,7 @@ public class StreamManagerFactory
EdgeApi = new SrsApi(_serviceProvider.GetRequiredService<HttpClient>(), new Uri($"http://{stream.EdgeIp}:1985"))
};
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _dvrStore, _thumbnailService);
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _serviceProvider);
}
public async Task<IStreamManager> ForCurrentStream(string pubkey)
@ -122,7 +124,7 @@ public class StreamManagerFactory
EdgeApi = new SrsApi(_serviceProvider.GetRequiredService<HttpClient>(), new Uri($"http://{stream.EdgeIp}:1985"))
};
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _dvrStore, _thumbnailService);
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _serviceProvider);
}
public async Task<IStreamManager> ForStream(StreamInfo info)
@ -150,6 +152,6 @@ public class StreamManagerFactory
EdgeApi = new SrsApi(_serviceProvider.GetRequiredService<HttpClient>(), new Uri($"http://{stream.EdgeIp}:1985"))
};
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _dvrStore, _thumbnailService);
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _serviceProvider);
}
}

View File

@ -1,5 +1,6 @@
using Microsoft.EntityFrameworkCore;
using Nostr.Client.Utils;
using NostrStreamer.ApiModel;
using NostrStreamer.Database;
namespace NostrStreamer.Services;
@ -69,4 +70,23 @@ public class UserService
return await _db.Users.AsNoTracking()
.SingleOrDefaultAsync(a => a.PubKey.Equals(pubkey));
}
public async Task AcceptTos(string pubkey)
{
var change = await _db.Users.Where(a => a.PubKey.Equals(pubkey))
.ExecuteUpdateAsync(o => o.SetProperty(v => v.TosAccepted, DateTime.UtcNow));
if (change != 1) throw new Exception($"Failed to accept TOS, {change} rows updated.");
}
public async Task UpdateStreamInfo(string pubkey, PatchEvent req)
{
await _db.Users
.Where(a => a.PubKey == pubkey)
.ExecuteUpdateAsync(o => o.SetProperty(v => v.Title, req.Title)
.SetProperty(v => v.Summary, req.Summary)
.SetProperty(v => v.Image, req.Image)
.SetProperty(v => v.Tags, req.Tags.Length > 0 ? string.Join(",", req.Tags) : null)
.SetProperty(v => v.ContentWarning, req.ContentWarning));
}
}