void AddEntry(KeyValuePairXCol <string, string> trg, XElement src, XName attrName, string propName) { string vl = src.GetAttributeValue(attrName); if (!string.IsNullOrEmpty(vl)) { trg.Add(propName, vl); } }
public KeyValuePairXCol <string, string> GetMetadataShell(MediaFile source) { KeyValuePairXCol <string, string> rz = new KeyValuePairXCol <string, string>(); Shell32.Shell shell = new Shell32.Shell(); Shell32.Folder objFolder; var srcFolder = Path.GetDirectoryName(source.FullName); string val; objFolder = shell.NameSpace(srcFolder); List <string> arrHeaders = new List <string>(); for (int i = 0; i < short.MaxValue; i++) { string header = objFolder.GetDetailsOf(null, i); if (String.IsNullOrEmpty(header)) { break; } arrHeaders.Add(header); } foreach (Shell32.FolderItem2 item in objFolder.Items()) { if (string.Compare(item.Name, source.Title, true) == 0) { rz.AddRange(GetXProp(item, "Bitrate", "Frame rate", "Duration")); for (int i = 0; i < arrHeaders.Count; i++) { val = objFolder.GetDetailsOf(item, i); if (!string.IsNullOrWhiteSpace(val)) { rz.Add(arrHeaders[i], val); } //System.Diagnostics.Debug.WriteLine("{0}\t{1}: {2}", i, arrHeaders[i], objFolder.GetDetailsOf(item, i)); } break; } } return(rz); }
public static KeyValuePairXCol <string, string> GetMetadata(ExifReader xfr, ImageFile mf = null) { KeyValuePairXCol <string, string> rz = new KeyValuePairXCol <string, string>(); object tmp; string ts; UInt32 tw, th; DateTime dt; StringBuilder sb; UInt16 un16; double td; object otm; //CodeValueList mats = (mf==null) ? null : mf.MediaAttributesSafe; try { sb = new StringBuilder(); if (xfr.GetTagValue(ExifTags.Make, out ts)) { sb.Append(ts); } if (xfr.GetTagValue(ExifTags.Model, out ts)) { if (sb.Length > 0) { sb.Append(' '); } sb.Append(ts); } if (sb.Length > 0) { rz.Add("Camera", ts = sb.ToString()); if (mf != null) { mf.Camera = ts; } } if (xfr.GetTagValue(ExifTags.LensModel, out ts)) { rz.Add("Lens", ts); if (mf != null) { mf.Lens = ts; } } if (xfr.GetTagValue(ExifTags.XPSubject, out ts)) { rz.Add("Subject", ts); } if (xfr.GetTagValue(ExifTags.XPTitle, out ts)) { rz.Add("Title", ts); } if (xfr.GetTagValue(ExifTags.ImageDescription, out ts)) { rz.Add("Description", ts); } if (xfr.GetTagValue(ExifTags.XPKeywords, out otm)) { byte[] bsrc = otm as byte[]; if (bsrc != null) { //Should be Unicode rz.Add("Keywords", Encoding.Unicode.GetString(bsrc)); } else { rz.Add("Keywords", otm.ToString()); } } if (xfr.GetTagValue(ExifTags.ImageRating, out otm)) { rz.Add("Rating", otm.ToString()); } if (xfr.GetTagValue(ExifTags.ImageRatingPct, out otm)) { rz.Add("Rating [%]", otm.ToString()); } //if (xfr.GetTagValue(Constants.ExifTagId.SonyLens, out ts)) { // rz.Add("Lens", ts); //} ImageDim dm = GetImgDim(xfr); if (dm != null) { if (mf != null) { mf.Dimensions = dm; } rz.Add("Dimension [px]", dm.ToString()); } //if (xfr.GetTagValue(ExifTags.ImageWidth, out tw)&& xfr.GetTagValue(ExifTags.ImageLength, out th)) { // ImageDim dm = new ImageDim() { Width = tw, Height = th }; // rz.Add("Dimension [px]", dm.ToString()); //} //else if (xfr.GetTagValue(Constants.ExifTagId.WidthPix, out tw) && xfr.GetTagValue(Constants.ExifTagId.HeightPix, out th)) { // ImageDim dm = new ImageDim() { Width = tw, Height = th }; // rz.Add("Dimension [px]", dm.ToString()); //} if (xfr.GetTagValue(ExifTags.Orientation, out un16)) { rz.Add("Orientation", un16.ToString()); } if (xfr.GetTagValue(ExifTags.DateTimeDigitized, out dt)) { rz.Add("Date taken", dt.ToString("yyyy-MM-dd HH:mm:ss")); if (mf != null) { mf.Timestamp = dt; } } if (xfr.GetTagValue(ExifTags.FNumber, out td)) { rz.Add("FNumber", td.ToString()); if (mf != null) { mf.FNumber = td; } } if (xfr.GetTagValue(ExifTags.ApertureValue, out otm)) { rz.Add("Apperture", otm.ToString()); } if (xfr.GetTagValue(ExifTags.ExposureTime, out otm)) { rz.Add("Exposure", ts = otm.ToString()); if (mf != null) { mf.Exposure = ToDblN(ts); } } if (xfr.GetTagValue(ExifTags.ISOSpeed, out otm)) { rz.Add("ISO Speed", otm.ToString()); if (mf != null) { mf.Iso = ToIntN(otm); } } else if (xfr.GetTagValue(ExifTags.PhotographicSensitivity, out otm)) { rz.Add("ISO Speed", ts = otm.ToString()); if (mf != null) { mf.Iso = ToIntN(otm); } } if (xfr.GetTagValue(ExifTags.FocalLength, out otm)) { rz.Add("Focal length", otm.ToString()); } if (xfr.GetTagValue(ExifTags.WhiteBalance, out otm)) { rz.Add("White Balance", otm.ToString()); } if (xfr.GetTagValue(ExifTags.WhitePoint, out otm)) { rz.Add("White Point", otm.ToString()); } //BitmapMetadata mData = imgData as BitmapMetadata; //if (mData != null) { // rz.Add("Application", mData.ApplicationName); // rz.Add("Date taken", mData.DateTaken); // rz.Add("Format", mData.Format); // rz.Add("Title", mData.Title); // rz.Add("Subject", mData.Subject); // rz.Add("Location", mData.Location); // rz.Add("Rating", mData.Rating.ToString()); // if (mData.Keywords != null) { // rz.Add("Keywords", string.Join(", ", mData.Keywords)); // } // rz.Add("Comment", mData.Comment); // //foreach (var ms in mData) { // // rz.Add("", ms); // //} // //object tmp= mData.GetQuery("/app1/ifd/exif/{ushort=37378}") ?? mData.GetQuery("/xmp/exif:ApertureValue"); // //object tmp = mData.GetQuery("System.Photo.Aperture"); // //if (null != (tmp = mData.GetQuery("System.Photo.FNumber"))) // // rz.Add("FNumber", tmp.ToString()); // //if (null != (tmp = mData.GetQuery("System.Photo.Aperture"))) // // rz.Add("Apperture", tmp.ToString()); // //if (null!=(tmp= mData.GetQuery("/app1/ifd/exif/{ushort=33434}") ?? mData.GetQuery("/xmp/exif:ExposureTime"))) // //if (null != (tmp = mData.GetQuery("System.Photo.ExposureTime"))) // // rz.Add("Exposure", tmp.ToString()); // if (null != (tmp = mData.GetQuery("System.Photo.SubjectDistance"))) // rz.Add("Distance", tmp.ToString()); // if (null != (tmp = mData.GetQuery("System.Photo.WhiteBalance"))) // rz.Add("White balance", tmp.ToString()); // //if (null != (tmp = mData.GetQuery("System.Photo.Orientation"))) // // rz.Add("Orientation", tmp.ToString()); // //if (null != (tmp = mData.GetQuery("System.Photo.ISOSpeed"))) // // rz.Add("ISO Speed", tmp.ToString()); // //if (null != (tmp = mData.GetQuery("System.Photo.FocalLength"))) // // rz.Add("Focal Length", tmp.ToString()); // //if (null != (tmp = mData.GetQuery("System.Photo.FocalLengthInFilm"))) // // rz.Add("35mm Focal Length", tmp.ToString()); // //DumpMeta(mData); //} } catch (Exception x) { throw new BizException(string.Format("Failed to extract properties. {0}: {1}", x.GetType().Name, x.Message)); } return(rz); }
/// <summary> /// Gets the metadata. /// </summary> /// <param name="sourcePath">The source path.</param> /// <returns></returns> /// <exception cref="Ops.NetCoe.LightFrame.BizException"></exception> public KeyValuePairXCol <string, string> GetMetadata(string sourcePath) { KeyValuePairXCol <string, string> rz = new KeyValuePairXCol <string, string>(); //StringBuilder sout = new StringBuilder(1024), serr = new StringBuilder(512); //string args = string.Format("-i \"{0}\" -print_format xml -sexagesimal -show_error -show_format -show_streams", sourcePath); string action = null; string xtmp = null; try { XElement xff = GetFFProbeXml(sourcePath); XElement xe = xff.Element("format"); //XAttribute xa; if (xe != null) { AddEntry(rz, xe, "format_name", cnMediaFormat); AddEntry(rz, xe, "duration", cnDuration); AddEntry(rz, xe, "bit_rate", cnBitrate); AddEntry(rz, xe, "size", "Size"); } string codecType = null; //, pfx=null; foreach (var xs in xff.XPathSelectElements("streams/stream")) { codecType = xs.GetAttributeValue("codec_type"); //pfx = null; switch (codecType) { case "video": { //pfx = "Video"; AddEntry(rz, xs, "codec_name", "Video Codec"); AddEntry(rz, xs, "height", "Height"); AddEntry(rz, xs, "width", "Width"); AddEntry(rz, xs, "display_aspect_ratio", "Aspect Ratio"); AddEntry(rz, xs, "pix_fmt", "Pixel Format"); AddEntry(rz, xs, "r_frame_rate", "Frame Rate"); //AddEntry(rz, xs, "duration", "Duration"); } break; case "audio": { //pfx = "Audio"; AddEntry(rz, xs, "codec_name", "Audio Codec"); AddEntry(rz, xs, "bit_rate", "Audio Bit Rate"); AddEntry(rz, xs, "channels", "Channels"); } break; //case "subtitle": { // pfx = "Subtitle"; // } // break; //default: // AppContext.Current.LogTechError(string.Format("Failed to recognise stream type '{0}' in the file \"{1}\"", this.FfProbePath, args), null); // break; } } action = string.Format("Get FileInfo for \"{0}\"", sourcePath); var fi = new FileInfo(sourcePath); if (fi != null) { rz.Add("Size", fi.Length.ToString("##,#")); rz.Add("Created", fi.CreationTime.ToString("yyyy-MM-dd HH:mm:ss")); rz.Add("Type", fi.Extension); } else { rz.Add("Type", Path.GetExtension(sourcePath)); } } catch (BizException x) { throw; } catch (Exception x) { AppContext.Current.LogTechError(string.Format("Failed to {0}", action), x); System.Diagnostics.Debug.WriteLine(xtmp); throw new BizException(x.ToShortMsg(action)); } return(rz); }