public void AddFootage(string footageSource, Footage footage) { if (!Footage.Keys.Contains(footageSource)) { Footage.Add(footageSource, new List <Footage>()); } Footage[footageSource].Add(footage); }
static public Footage Factory(FileInfo path) { switch (path.Extension.ToUpper()) { case ".MP4": { Footage footage = null; var v = Program.GetInfo(path.FullName); var s = v.streams?.Where(vv => vv.codec_type == "video").FirstOrDefault(); if (s != null) { var cd = s.Tags["creation_time"]; if (path.FullName.Contains("pixel")) { footage = new Footage { FileName = path.FullName, CreateDate = Convert.ToDateTime(cd), Duration = s.duration }; } else { footage = new Footage { FileName = path.FullName, CreateDate = Convert.ToDateTime(cd).AddHours(5), // gopro always returns UTC // Duration = s.duration }; } } return(footage); } case ".AVI": { Footage footage = null; var v = Program.GetAviDuration(path.FullName); //var s = v.streams?.Where(vv => vv.codec_type == "video").FirstOrDefault(); if (v > 0) { var cd = path.LastWriteTime; footage = new Footage { FileName = path.FullName, CreateDate = Convert.ToDateTime(cd), Duration = v }; } return(footage); } default: return(null); } }
public bool CheckAddFootage(string footageSource, Footage footage) { if (footage.Within(CreateDate)) { AddFootage(footageSource, footage); return(true); } return(false); }
static void ProcessFolder(string folder) { // output each trigger and which footage files that contain it // output lists of footage folders in chronological order // output list of everything in chronological order var triggers = new List <Trigger>(); var footageList = new Dictionary <string, IList <Footage> >(); var clipList = new List <Clip>(); var combineComps = new List <string>(); foreach (var d in Directory.EnumerateDirectories(folder)) { Console.WriteLine(d); if (d.Contains("iPhone") || d.Contains("Android")) { // load triggers foreach (var f in (new DirectoryInfo(d)).EnumerateFiles()) { if (f.Extension.ToUpper() == ".JPG") { var pu = new RandomWayfarer.Pictures.PictureUtils(); var pic = pu.GetJpegPicture(f.FullName); if (pic != null) { triggers.Add(new Trigger { CreateDate = pic.DateTime, FileName = f.FullName }); } else { Console.WriteLine($"Invalid {f.FullName}"); } } else if (f.Extension.ToUpper() == ".MOV") { var v = GetInfo(f.FullName); var s = v.streams.Where(vv => vv.codec_type == "video").First(); var cd = s.Tags["creation_time"]; triggers.Add(new Trigger { FileName = f.FullName, CreateDate = Convert.ToDateTime(cd) }); } } } else { var footage = new List <Footage>(); var ff = Path.GetFullPath(d); var footageSourceName = ff.Split('\\').Reverse().First(); footageList.Add(footageSourceName, footage); // load footage files foreach (var ext in new string[] { "*.mp4", "*.avi", "*.mov" }) { foreach (var f in (new DirectoryInfo(d)).EnumerateFiles(ext))//.mp4 { var foot = Footage.Factory(f); if (foot != null) { footage.Add(foot); } else { Console.WriteLine($"INVALID : {f.FullName}"); } } } } } //each camera for a single trigger makes a "clip." clips can be made of multiple vids foreach (var trig in triggers) { trig.ParamStart = trig.CreateDate - new TimeSpan(0, 0, before); trig.ParamEnd = trig.CreateDate + new TimeSpan(0, 0, after); foreach (var camera in footageList) { var clip = new Clip { InitTrigger = trig, CameraName = camera.Key, OutputName = "output", StartTime = trig.ParamStart, EndTime = trig.ParamEnd, NecessaryFiles = new List <Footage>() }; foreach (var vid in camera.Value) { if (vid.Contains(clip.StartTime) || vid.Contains(clip.EndTime)) { clip.NecessaryFiles.Add(vid); } else if (clip.Contains(vid.CreateDate)) { clip.NecessaryFiles.Add(vid); } } if (clip.NecessaryFiles.Count > 0) { clipList.Add(clip); } } } //makes each clip from source footage, 2 files if necessary, might work with 3+, does it need to? var clipNum = 0; foreach (var clip in clipList) { string endOutput = ""; clipNum++; clip.SplitParameters = new SplitParameters( clip.NecessaryFiles.FirstOrDefault().FileName, ((clip.InitTrigger.CreateDate - clip.NecessaryFiles.FirstOrDefault().CreateDate) - tsBefore), tsBefore + tsAfter, $"( {clipNum.ToString()} )" + clip.InitTrigger.OutputPrefix + clip.CameraName ); if (clip.NecessaryFiles.Count == 1) { endOutput = Split(clip.SplitParameters); } else if (clip.NecessaryFiles.Count == 0) { //delete clip } else { int fileNum = 0; foreach (var vid in clip.NecessaryFiles) { fileNum++; vid.SplitParameters = new SplitParameters( vid.FileName, ((clip.InitTrigger.CreateDate - vid.CreateDate) - tsBefore), tsBefore + tsAfter, $"( {fileNum.ToString()} )" + vid.OutputPrefix ); if (vid.Contains(clip.InitTrigger.ParamStart)) { vid.SplitParameters.Duration = vid.EndDate - clip.InitTrigger.ParamStart; } if (vid.Contains(clip.InitTrigger.ParamEnd)) { if (vid.Contains(clip.InitTrigger.ParamStart)) /*error I don't think this should happen */ Console {