feat: stream-keys
This commit is contained in:
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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(),
|
||||
|
Reference in New Issue
Block a user