using AZKiServer.Models; using AZKiServer.RPC; using Google.Protobuf; using Grpc.Core; namespace AZKiServer.Services; public class AZKiRpcService(MediaService mediaService) : RPC.AZKi.AZKiBase { public override async Task GetMediaEntriesInRange(MediaRangeRequest request, ServerCallContext context) { var from = request.From.ToDateTime(); var to = request.To.ToDateTime(); var items = await mediaService.GetEntriesInRangeAsync(request.Type.FromRpc(), from, to); var result = new MediaList(); result.Entries.AddRange(items.Select(e => e.ToRpc())); return result; } public override async Task GetMediaPlayback(MediaPlaybackRequest request, ServerCallContext context) { var from = request.Date.ToDateTime().Date; var to = request.Date.ToDateTime().Date.AddDays(1); var items = await mediaService.GetEntriesInRangeAsync(Models.MediaType.All, from, to); var channels = items.GroupBy(i => i.CameraId).Select(c => { var images = c.Where(m => m.Type == Models.MediaType.Image).Select(m => m.ToRpc()); var videos = c.Where(m => m.Type == Models.MediaType.Video).Select(m => m.ToRpc()); var result = new MediaChannel { CameraId = c.Key, }; result.Images.AddRange(images); result.Videos.AddRange(videos); return result; }); var playback = new PlaybackInfo { Date = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(from), }; playback.Channels.AddRange(channels); return playback; } }