feat: stream-keys

This commit is contained in:
2024-08-28 10:02:49 +01:00
parent 015b75f894
commit 97e43c8cbd
27 changed files with 1723 additions and 87 deletions

View File

@ -27,10 +27,12 @@ public class NostrController : Controller
private readonly IClipService _clipService;
private readonly ILogger<NostrController> _logger;
private readonly PushSender _pushSender;
private readonly StreamEventBuilder _eventBuilder;
public NostrController(StreamerContext db, Config config, StreamManagerFactory streamManager,
UserService userService,
IClipService clipService, ILogger<NostrController> logger, PushSender pushSender)
IClipService clipService, ILogger<NostrController> logger, PushSender pushSender,
StreamEventBuilder eventBuilder)
{
_db = db;
_config = config;
@ -39,6 +41,7 @@ public class NostrController : Controller
_clipService = clipService;
_logger = logger;
_pushSender = pushSender;
_eventBuilder = eventBuilder;
}
[HttpGet("account")]
@ -57,15 +60,6 @@ public class NostrController : Controller
var account = new Account
{
Event = new PatchEvent()
{
Title = user.Title ?? "",
Summary = user.Summary ?? "",
Image = user.Image ?? "",
ContentWarning = user.ContentWarning,
Tags = user.SplitTags(),
Goal = user.Goal
},
Endpoints = endpoints.Select(a => new AccountEndpoint
{
Name = a.Name,
@ -100,9 +94,9 @@ public class NostrController : Controller
var pubkey = GetPubKey();
if (string.IsNullOrEmpty(pubkey)) return Unauthorized();
await _userService.UpdateStreamInfo(pubkey, req);
try
{
await _userService.UpdateStreamInfo(pubkey, req);
var streamManager = await _streamManagerFactory.ForCurrentStream(pubkey);
await streamManager.UpdateEvent();
}
@ -404,6 +398,91 @@ public class NostrController : Controller
}
}
[HttpGet("keys")]
public async Task<IActionResult> ListStreamKeys([FromQuery] int page = 0, [FromQuery] int pageSize = 100)
{
var userPubkey = GetPubKey();
if (string.IsNullOrEmpty(userPubkey))
return BadRequest();
try
{
var keys = await _db.StreamKeys
.AsNoTracking()
.Include(a => a.UserStream)
.Where(a => a.UserPubkey == userPubkey)
.Skip(page * pageSize)
.Take(pageSize)
.Select(a =>
new
{
a.Id,
a.Created,
a.Key,
a.Expires,
Stream = a.UserStream.Event
})
.ToListAsync();
return Json(new
{
items = keys,
page, pageSize
});
}
catch (Exception e)
{
return Json(new
{
error = e.Message
});
}
}
[HttpPost("keys")]
public async Task<IActionResult> CreateStreamKey([FromBody] CreateStreamKeyRequest req)
{
var userPubkey = GetPubKey();
if (string.IsNullOrEmpty(userPubkey))
return BadRequest();
try
{
var newStream = new UserStream()
{
PubKey = userPubkey,
State = UserStreamState.Planned,
};
newStream.PatchStream(req.Event);
var ev = _eventBuilder.CreateStreamEvent(newStream);
newStream.Event = NostrJson.Serialize(ev) ?? "";
var newKey = new UserStreamKey()
{
Expires = req.Expires,
Key = Guid.NewGuid().ToString(),
StreamId = newStream.Id,
UserPubkey = userPubkey
};
_db.Streams.Add(newStream);
_db.StreamKeys.Add(newKey);
await _db.SaveChangesAsync();
return Json(new
{
newKey.Key,
newStream.Event
});
}
catch (Exception e)
{
return Json(new
{
error = e.Message
});
}
}
private async Task<User?> GetUser()
{
var pk = GetPubKey();

View File

@ -41,7 +41,7 @@ public class PlaylistController : Controller
var streamManager = await _streamManagerFactory.ForStream(id);
var userStream = streamManager.GetStream();
var path = $"/{userStream.Endpoint.App}/{variant}/{userStream.User.StreamKey}.m3u8";
var path = $"/{userStream.Endpoint.App}/{variant}/{userStream.Key}.m3u8";
var ub = new UriBuilder(_config.SrsHttpHost)
{
Path = path,
@ -130,7 +130,7 @@ public class PlaylistController : Controller
foreach (var variant in userStream.Endpoint.GetVariants().OrderBy(a => a.Bandwidth))
{
var stream = streams.FirstOrDefault(a =>
a.Name == userStream.User.StreamKey && a.App == $"{userStream.Endpoint.App}/{variant.SourceName}");
a.Name == userStream.Key && a.App == $"{userStream.Endpoint.App}/{variant.SourceName}");
var resArg = stream?.Video != default ? $"RESOLUTION={stream.Video?.Width}x{stream.Video?.Height}" :
variant.ToResolutionArg();
@ -171,7 +171,7 @@ public class PlaylistController : Controller
var streamManager = await _streamManagerFactory.ForStream(id);
var userStream = streamManager.GetStream();
var path = $"/{userStream.Endpoint.App}/{variant}/{userStream.User.StreamKey}-{segment}";
var path = $"/{userStream.Endpoint.App}/{variant}/{userStream.Key}-{segment}";
await ProxyRequest(path);
}
catch
@ -253,7 +253,7 @@ public class PlaylistController : Controller
private async Task<string?> GetHlsCtx(UserStream stream)
{
var path = $"/{stream.Endpoint.App}/source/{stream.User.StreamKey}.m3u8";
var path = $"/{stream.Endpoint.App}/source/{stream.Key}.m3u8";
var ub = new Uri(_config.SrsHttpHost, path);
var req = CreateProxyRequest(ub);
using var rsp = await _client.SendAsync(req);

View File

@ -29,8 +29,8 @@ public class PodcastController(StreamerContext db, Config config) : Controller
pod.LiveItem = new()
{
Guid = stream.Id,
Title = stream.User.Title ?? "",
Description = stream.User.Summary,
Title = stream.Title ?? "",
Description = stream.Summary,
Status = stream.State.ToString().ToLower(),
Start = stream.Starts,
End = stream.Ends ?? new DateTime(),