using MaybeError; using MaybeError.Errors; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using System.Text.RegularExpressions; namespace AZKiServer.Models; public partial class MediaEntry { public const int CUR_VERSION = 1; [BsonId] public ObjectId Id { get; set; } public int Version { get; set; } public MediaType Type { get; set; } public required string Filepath { get; set; } public DateTime Date { get; set; } public DateTime EndDate { get; set; } public int CameraId { get; set; } public required MediaMetadata Metadata { get; set; } public static Maybe Parse(string relativePath, MediaMetadata metadata) { var filename = Path.GetFileName(relativePath); var match = FileParser().Match(filename); if (!match.Success) return new Error("Failed to parse file name"); try { var src = match.Groups["src"]; var cam = match.Groups["cam"]; var date = match.Groups["date"]; var ext = match.Groups["ext"]; var startDate = ParseDate(date.Value); return new MediaEntry { Version = CUR_VERSION, CameraId = int.Parse(cam.Value), Filepath = relativePath, Date = startDate, EndDate = startDate.AddSeconds(metadata.Duration), Metadata = metadata, Type = ext.Value switch { "mp4" => MediaType.Video, _ => MediaType.Image } }; }catch(Exception ex) { return ex; } } private static DateTime ParseDate(string dateString) { var year = dateString[0..4]; var month = dateString[4..6]; var day = dateString[6..8]; var hour = dateString[8..10]; var minute = dateString[10..12]; var sec = dateString[12..]; return new DateTime(int.Parse(year), int.Parse(month), int.Parse(day), int.Parse(hour), int.Parse(minute), int.Parse(sec), DateTimeKind.Local); } [GeneratedRegex("(?'src'.+)_(?'cam'\\d+)_(?'date'\\d+).(?'ext'\\w+)")] private static partial Regex FileParser(); } public record MediaMetadata(int Duration, int Height, int Width); [Flags] public enum MediaType { None = 0, Video = 1, Image = 2, All = Video | Image }