Saturday 14 March 2015

Getting and Setting File Tag Meta Information in C# and ASP.NET - With TagLib and DsoFile Examples


The Problem
I recently developed a video content management system, and rather than store hidden files to track versioning and movement of physical files, I wanted to modify the internal file meta information of the videos themselves. I planned to stuff a database ID into the comment tag within each video file, but this proved to be very challenging given the very disoraganised way in which various operating system handled different file types.

Possible Solutions
MediaInfo - http://sourceforge.net/projects/mediainfo/. Cool API, updated a lot, but there is no support for setting file meta information. The entire API is READ ONLY!

TagLib - https://taglib.github.io/. Again, good API with scope to set file tag meta information. So I decided to try this API out and see how far I could get with it. I started hitting it's limits when I couldn't set file meta information for a LOT of video file types: MKV, MOV, 3GP, ASF and more.

DsoFile - http://support.microsoft.com/en-gb/kb/224351. Microsoft's answer to tagging Microsoft Office file tag information. It's able to set Office file tags but also totally new custom properties within each file. You cannot see these values in Windows Explorer without a handy Powershell script plugin, but it works for ALL file types, not just office documents. It's written in C++ and includes the source code also. The downside is that it's a COM component, 32bit and no longer supported. However, somebody compiled a 64bit version here

The Ideal Solution
DsoFile seems like a great solution to the problem. TagLib works hard to achieve an ideal solution, but there are too many file types out there ever changing and the library finds it hard to keep up. I decided to use DsoFile for my project for the time being. I have provided some sample code below so you can see how TagLib and DsoFile libraries modify file meta tag information.

TagLib Sample Code - How to Get and Set the Comment File Meta Tag Field
Code Snippet
  1. using System;
  2. using TagLib;
  3.  
  4. /// <summary>
  5. /// (c) GinkoSolutions.com
  6. /// This sample class enables you to set meta file information within physical files.
  7. /// This is similar to EXIF information for picture files.
  8. /// TagLib doesn't seem to work for a lot of file types: MKV, MOV etc
  9. /// It seems to work ok for MP4 files though.
  10. /// </summary>
  11. public static class TagLibExample
  12. {
  13.     /// <summary>
  14.     /// Gets the comment tag from a files meta information
  15.     /// </summary>
  16.     /// <param name="filename">Path to the file</param>
  17.     /// <returns>Our custom value stored in the files comment tag</returns>
  18.     public static string GetCommentField(string filename)
  19.     {
  20.         string comment = string.Empty;
  21.         TagLib.File file = null;
  22.  
  23.         try
  24.         {
  25.             file = TagLib.File.Create(filename);
  26.             comment = file.Tag.Comment;
  27.         }
  28.         catch (Exception ex)
  29.         {
  30.             // This library works with limited file types, so unsupported file types are
  31.             // thrown here when trying to use "TagLib.File.Create()"
  32.         }
  33.         finally
  34.         {
  35.             if (file != null) file.Dispose(); // Clean up
  36.         }
  37.  
  38.         return comment;
  39.     }
  40.  
  41.     /// <summary>
  42.     /// Sets the comment tag within a files meta information
  43.     /// </summary>
  44.     /// <param name="filename">Path to the file</param>
  45.     /// <param name="value">Value to store in the comment tag</param>
  46.     public static void SetCommentField(string filename, string value)
  47.     {
  48.         TagLib.File file = null;
  49.  
  50.         try
  51.         {
  52.             file = TagLib.File.Create(filename);
  53.  
  54.             // Set comment tag
  55.             // NOTE: file.Tag.Comment cannot be an empty string, it defaults to null if empty
  56.             file.Tag.Comment = GetCommentField;
  57.             file.Save();
  58.  
  59.             // Check comment was added successfully.
  60.             // For some reason, TagLib won't throw an error if the property doesnt save
  61.             // for certain file types, yet they appear to be supported.
  62.             // So we have to check it actually worked...
  63.             file = TagLib.File.Create(filename);
  64.  
  65.             if (file.Tag.Comment != value)
  66.                 throw new Exception("Could not set comment tag. This file format is not supported.");
  67.         }
  68.         catch (Exception ex)
  69.         {
  70.             // Handle errors here
  71.         }
  72.         finally // Always called, even when throwing in Exception block
  73.         {
  74.             if (file != null) file.Dispose(); // Clean up
  75.         }
  76.     }
  77. }
  78.  
End of Code Snippet


DsoFile Sample Code - How to Store a Value into a Custom Property and Get it back!
Code Snippet
  1. using System;
  2. using DSOFile;
  3.  
  4. /// <summary>
  5. /// (c) GinkoSolutions.com
  6. /// This sample class enables you to set meta file information within physical files.
  7. /// This is similar to EXIF information for picture files.
  8. /// DSOFile works for every file type, not just office files.
  9. ///
  10. /// NOTE
  11. /// DsoFile is an unmnaged 32bit dll. We need to compile in x86 mode or we get 'class not registered exception'
  12. /// There is a third party 64bit version available online, or recompile the C++ source manually.
  13. /// </summary>
  14. public static class DSOFileExample
  15. {
  16.     /// <summary>
  17.     /// A property name that this sample code uses to store tag information.
  18.     /// </summary>
  19.     private static string FILE_PROPERTY = "CustomFileTag";
  20.  
  21.     /// <summary>
  22.     /// Gets value stored in a custom tag
  23.     /// </summary>
  24.     /// <param name="filename">Path to the file</param>
  25.     /// <returns>Our custom value stored in the custom file tag</returns>
  26.     public static string GetCustomPropertyValue(string filename)
  27.     {
  28.         string comment = string.Empty;
  29.         OleDocumentProperties file = new DSOFile.OleDocumentProperties();
  30.  
  31.         try
  32.         {
  33.             // Open file
  34.             file.Open(filename, false, DSOFile.dsoFileOpenOptions.dsoOptionDefault);
  35.             comment = GetTagField(file);
  36.         }
  37.         catch (Exception ex)
  38.         {
  39.             // Handle errors here
  40.         }
  41.         finally
  42.         {
  43.             if (file != null) file.Close(); // Clean up
  44.         }
  45.  
  46.         return comment;
  47.     }
  48.  
  49.     /// <summary>
  50.     /// Sets value stored in a files custom tag
  51.     /// </summary>
  52.     /// <param name="filename">Path to the file</param>
  53.     /// <param name="value">Value to store in the custom file tag</param>
  54.     public static void SetCustomPropertyValue(string filename, string value)
  55.     {
  56.         OleDocumentProperties file = new DSOFile.OleDocumentProperties();
  57.  
  58.         try
  59.         {
  60.             file.Open(filename, false, DSOFile.dsoFileOpenOptions.dsoOptionDefault);
  61.             SetTagField(file, value);
  62.         }
  63.         catch (Exception ex)
  64.         {
  65.             // Handle errors here
  66.         }
  67.         finally // Always called, even when throwing in Exception block
  68.         {
  69.             if (file != null) file.Close(); // Clean up
  70.         }
  71.     }
  72.  
  73.     /// <summary>
  74.     /// Gets the value of the file tag property
  75.     /// </summary>
  76.     /// <param name="file">Ole Document File</param>
  77.     /// <returns>Contents of the file tag property. Can be null or empty.</returns>
  78.     private static string GetTagField(DSOFile.OleDocumentProperties file)
  79.     {
  80.         string result = string.Empty;
  81.         foreach (DSOFile.CustomProperty property in file.CustomProperties)
  82.         {
  83.             if (property.Name == FILE_PROPERTY) // Check property exists
  84.             {
  85.                 result = property.get_Value();
  86.                 break;
  87.             }
  88.         }
  89.         return result;
  90.     }
  91.  
  92.     /// <summary>
  93.     /// Sets the value of the file tag property
  94.     /// </summary>
  95.     /// <param name="file">Ole Document File</param>
  96.     /// <param name="value">Value to set as the property value</param>
  97.     /// <param name="saveDocument">Saves document if set to true</param>
  98.     /// <param name="closeDocument">Closes the document if set to true</param>
  99.     private static void SetTagField(DSOFile.OleDocumentProperties file, string value, bool saveDocument = true, bool closeDocument = true)
  100.     {
  101.         bool found = false;
  102.         foreach (DSOFile.CustomProperty property in file.CustomProperties)
  103.         {
  104.             if (property.Name == FILE_PROPERTY) // Check property exists
  105.             {
  106.                 property.set_Value(value);
  107.                 found = true;
  108.                 break;
  109.             }
  110.         }
  111.  
  112.         if (!found)
  113.             file.CustomProperties.Add(FILE_PROPERTY, value);
  114.  
  115.         if (saveDocument)
  116.             file.Save();
  117.  
  118.         if (closeDocument)
  119.             file.Close();
  120.     }
  121. }
  122.  
End of Code Snippet

17 comments:

Unknown said...

Congratulations! Extremely useful... I'll try to do that in my project too... Do you no if its possible to add a read only tag... Avoiding future modifications on tags?

Manoj Kumar M said...

Nice information. Is it or windows filesystem, I mean, if we set a metadata of a video file in windows and copy it to Linux, does the metadata show up there too?.

Anonymous said...

Delhi Escorts, VIP escorts Delhi
Escorts in Delhi, Delhi Escorts
High profile Escorts in Delhi
Escorts Service in Delhi
Escorts Service in Delhi
Dwarka Escorts, Escorts in Dwarka
http://www.thecallgirlsdelhi.com/
Escorts Service in Delhi

michaelwaung said...


Thanks for sharing this informative blog. Such a useful Blog. I hope to keep sharing this type of blog.

Website Meta Tag Extractor

teo said...

Thanks for this!
any sample of the "handy Powershell script plugin" to see these values in Windows Explorer?
:-)

Janu said...

Good job in presenting the correct content with the clear explanation. The content looks real with valid information.




Dot Net Training in Chennai | Dot Net Training in anna nagar | Dot Net Training in omr | Dot Net Training in porur | Dot Net Training in tambaram | Dot Net Training in velachery




G Plus said...

Interesting topic I might say this is good and everybody should aware of it.
Dehradun escorts

garmin updates said...

If you are one of those who don’t know how to update the Garmin map, below are some of the ways by which you can update it. You just need to use the Garmin Express application in the matter of getting the Garmin Map updates. With the help of Garmin Express, you will be able to update your Garmin Map by downloading it from the official website of Garmin.


garmin updates
garmin map updates
garmin gps updates
garmin nuvi updates
garmin express updates

magellan gps update said...

When it comes to talking about its features, this Magellan device or Magellan GPS updates are loaded; with various sorts of exciting features. Once you start using this great device, you’ll learn about the traffic alerts, weather conditions, and a lot more. While using it, you’ll get to know which road route you should choose and which you should avoid. As many GPS devices are available in the market, one can opt for Magellan to make traveling easy and smooth. It will happen only just because of this advanced and modified device. But there is the thing about it that it needs updates from time to time. Simply put, you will need to update this device to have a comfortable experience of your journey.




magellan gps update
tomtom gps update
magellan gps updates
tomtom gps updates

Call Girls in Chennai said...

Hello everyone, Delhi Escort is giving you a high profile Female Escort Service in Delhi for Vip men if you are looking for memorable experience then most welcome to you. Book here Call Girls in Chennai
.

independentmumbaiescorts said...

Mumbai Escort Service offering hot greater Mumbai escorts. for meet me VIP escorts in Mumbai, online call girls in Mumbai and independent call girls Mumbai.
Mumbai Escort Agency
independent Mumbai Escort
Escort in Goregaon
Escort in Versova

Anonymous said...

Hi Class Verity of Independent Gurgaon Escort Service Real and Fair Deal Cash on Delivery No Advance we have Good Looking Independent Call Girls in Gurgaon. Full Satisfaction Guarantee With Body Massage Spa and All Services Available 24X7 Full Facilities. Hotel, Home and Hotels. Very Frank and Friendly Behavior with Very Trustable Your Privacy is My Privacy Thanks.


Very Knowledgeable and Helpful Content Best Activity in Your Post:- https://apsaraofindia.com/escorts-in-gurgaon.html

gfriders.com said...

I am less praised by your writing way keep writing

Mumbai Escort
Call girl
Mumbai Call girl
Andheri Escort

Russian Escorts said...

No.1 Trusted call girls and escort services provider in connaught place nearby hotel. Dear if you have confirm hotel booking contact us for service.
Russian Escort
Russian Escorts in Delhi
Connaught Place Escort
Aerocity Place Escort
Mahipalpur Place Escort

dwaka escorts said...

Our services have remained unaffected by the rising prices of everything around. We have emphasized maintaining nominal prices of everDWARKA ESCORTS as we believe that everyone has the right to content himself. Prices on the other hand are kept fixed for the basic duration or number of shots, which rises proportionately with the rise in duration of hire or shots.

our locations

KAROL BAGH ESCORTS
GK PART-1 ESCORTS
GK PART-2 ESCORTS
MAHIPALPUR ESCORTS
AEROCITY ESCORTS
FARIDABAD ESCORTS
DWARKA ESCORTS
VASANT KUNJ ESCORTS
PAHAR GANJ ESCORTS
GURGAON ESCORTS

Girls Gurugram said...

Thank you so much, nice to see such a post to write such a beautiful post, and when I saw this post of yours, I was very happy to see its design and when I read it, I love to appreciate it. Because those who write such a beautiful post must get credit for it.
Real Girl Number Gurugram
Real Photos Girl Gurugram
Gurugram Girl Number
Hyderabad Party Girl
College Girl Gurugram
VIP girl mahipalpur
college girl aerocity
Gurugram Girls Number
Golden Girls service Gurugram

Family tree maker online said...


Family Tree Maker 2019 Move to New Computer
Family Tree Maker has become a new-generation tool where an individual can keep track of their past and future generations without any hassle digitally. It is user-friendly software and with ease, you can move it from one device to the other.

Transferring FTM from one computer to another You can easily export FTM both Family Tree Maker 2019 altogether safely. This is because while you are moving from one computer to another, the file will still remain in your old device. It happens because you will be making a new folder to transfer.
visit us on:familytreemaker2019movetonewcomputer