5,448,416 members and growing! (19,286 online)
Email Password   helpLost your password?
Desktop Development » Shell and IE programming » Shell Programming     Intermediate License: A Public Domain dedication

ID3 Tag Reader Using Shell Functions

By Erhan Hosca

Utility to read ID3 tags from MP3 files using Windows Shell functions.
C#Windows, .NET, .NET 1.1, Win2K, WinXP, Win2003VS.NET2003, Visual Studio, Dev

Posted: 21 Sep 2003
Updated: 21 Sep 2003
Views: 91,927
Bookmarked: 45 times
Announcements
Want a new Job?



Search    
Advanced Search
Sitemap
21 votes for this Article.
Popularity: 5.60 Rating: 4.24 out of 5
5 votes, 23.8%
1
0 votes, 0.0%
2
0 votes, 0.0%
3
3 votes, 14.3%
4
13 votes, 61.9%
5

Introduction

This article describes another alternative for reading and displaying ID3 tags in MP3 files. There are various well documented methods of extracting ID3 tag information from MP3 files available. One of the most useful sites regarding this information is http://www.id3.org. This article will explore the possibility of extracting the same information using Win32 Shell functions.

Background

The Shell32.dll is responsible for a host of functions from launching applications to creating shortcuts and managing printers. You can read more about all the wonderful functionality it offers here. With Windows XP, users get the option of selecting a wide variety of columns to display when Explorer is in "Detail" view. Most of the extra columns are centered around multimedia files such as MP3 tracks and digital pictures. By way of the functionality provided in Shell32.dll, it is possible to display ID3 tag information for MP3 audio files and embedded EXIF information in JPEG picture files.

Using the code

The basic functionality of the ID3 tag reader is implemented as a struct with a single static ReadID3Tags method that returns a user defined MP3File object. It is beneficial to implement legacy COM wrapper functionality in a struct, as struct types get allocated in the heap and hence are exempt from garbage collection. They are also lightweight (compared to object instances), as they relieve the CLR from the task of reference counting.

We begin by adding a reference to Shell32.dll.

The MP3File class is basically a skeleton placeholder for the ID3 information returned from our Shell32 wrapper.

using System;
namespace ShellID3Reader {
    public class MP3File {
        private string fileName;
        private string artistName;
        private string albumName;
        private int trackNumber;
        private string songTitle; 

        public string FileName {
             get{return this.fileName;}
            set{this.fileName = value;}
        }
        public string ArtistName {
            get{return this.artistName;}
            set{this.artistName = value;}
        }
        public string AlbumName {
            get{return this.albumName;}
            set{this.albumName = value;}
        }
        public int TrackNumber {
             get{return this.trackNumber;}
            set{this.trackNumber = value;}
        }
        public string SongTitle {
             get{return this.songTitle;}
            set{this.songTitle = value;}
        }
        public MP3File(){
        }
    }
}

The ShellID3TagReader struct is responsible for reading the ID3 tags from MP3 files. Its takes the full file path and name as an input parameter and returns an instance of MP3File after decorating its properties, with information extracted from the Windows shell.

using System;
namespace ShellID3Reader
{
    public struct ShellID3TagReader
    {
        public static MP3File ReadID3Tags(string FileFullPath){
            MP3File mp3File = new MP3File();

            //parse file name

            string fileName = 
              FileFullPath.Substring(FileFullPath.LastIndexOf("\\")+1);
            //parse file path
            string filePath = 
              FileFullPath.Substring(0,FileFullPath.LastIndexOf("\\"));
            //create shell instance
            Shell32.Shell shell  = new Shell32.ShellClass();
            //set the namespace to file path
            Shell32.Folder folder = shell.NameSpace(filePath);
            //get ahandle to the file
            Shell32.FolderItem folderItem = folder.ParseName(fileName);
            //did we get a handle ?
            if (folderItem !=null){
                mp3File.FileName = fileName;
                //query information from shell regarding file
                mp3File.ArtistName = folder.GetDetailsOf(folderItem,9);
                mp3File.AlbumName = folder.GetDetailsOf(folderItem,17);
                mp3File.SongTitle = folder.GetDetailsOf(folderItem,10);
                mp3File.TrackNumber = 
                  Int32.Parse(folder.GetDetailsOf(folderItem,19));
            }
            //clean ip
            folderItem = null;
            folder = null;
            shell = null;
            //return mp3File instance
            return mp3File;
        }
    }
}

And finally we add the MP3File instance to a ListView for display.

private void cmdReadTags_Click(object sender, System.EventArgs e) {
            
    listViewFiles.Columns.Clear();
    listViewFiles.Items.Clear();
    listViewFiles.Columns.Add("FileName",100,HorizontalAlignment.Left); 
    listViewFiles.Columns.Add("ArtistName",100,HorizontalAlignment.Left); 
    listViewFiles.Columns.Add("AlbumName",100,HorizontalAlignment.Left); 
    listViewFiles.Columns.Add("TrackNumber",100,HorizontalAlignment.Left); 
    listViewFiles.Columns.Add("SongTitle",100,HorizontalAlignment.Left); 
            
    DirectoryInfo dir = new DirectoryInfo(textBoxFilePath.Text);
    FileInfo[] files = dir.GetFiles("*.mp3");
    foreach(FileInfo fi in files){
        MP3File mp3File = ShellID3TagReader.ReadID3Tags(fi.FullName);
        ListViewItem itm = new ListViewItem();
        itm.Text = mp3File.FileName;
        itm.SubItems.Add(mp3File.ArtistName);
        itm.SubItems.Add(mp3File.AlbumName );
        itm.SubItems.Add(mp3File.TrackNumber.ToString()) ;
        itm.SubItems.Add(mp3File.SongTitle);
        listViewFiles.Items.Add(itm);
    }
}

History

  • Sept 23 2003 - Initial version (1.0.0)

License

This article, along with any associated source code and files, is licensed under A Public Domain dedication

About the Author

Erhan Hosca



Occupation: Web Developer
Location: United States United States

Other popular Shell and IE programming articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 25 of 30 (Total in Forum: 30) (Refresh)FirstPrevNext
Subject  Author Date 
GeneralProblem with multiple artistsmemberSoundman32.24:59 28 Aug '08  
GeneralCode that works with Vista and XP, using Shell32memberJavawag7:32 20 Aug '08  
GeneralIs there any way to retrieve the year?membertequilalove1:28 28 Apr '08  
GeneralRe: Is there any way to retrieve the year?memberErhan Hosca16:56 11 May '08  
GeneralIDs seem to have changed in VistamemberDylanV14:41 21 Dec '07  
GeneralVista item indexes.memberDylanV14:40 21 Dec '07  
GeneralA few tipsmemberreinux23:16 26 Oct '06  
QuestionWriting ID3 Tag information Using Shell32membergetprashanthr21:22 15 Dec '05  
GeneralReading ID3 Tag from binary files Using Shell32memberinams19:34 1 Dec '05  
GeneralRe: Reading ID3 Tag from binary files Using Shell32memberErhan Hosca16:58 2 Dec '05  
GeneralHow to read .m4a (aac)membertayspen10:28 21 Oct '05  
Generalread/write audio metadatamemberlaurence fass6:18 20 Sep '05  
QuestionRe: read/write audio metadatamembergetprashanthr21:20 15 Dec '05  
GeneralNot Reading Mp3 Tagsmemberempeyg12:46 15 Jun '05  
GeneralRe: Not Reading Mp3 TagsmemberErhan Hosca16:13 15 Jun '05  
GeneralRe: Not Reading Mp3 TagsmemberStephen Remde (smremde)11:34 11 Aug '06  
GeneralDoesn't seem to work on Windows 2000memberAshley van Gerven19:37 19 Mar '05  
GeneralRe: Doesn't seem to work on Windows 2000memberAR12321:00 20 Apr '05  
GeneralRe: Doesn't seem to work on Windows 2000sussanonymous5:09 28 May '05  
GeneralOther column indexes.. (NT5.1-5.2 ONLY)memberNiels Penneman11:36 19 Feb '04  
GeneralRe: Other column indexes.. (NT5.1-5.2 ONLY)membertayspen18:17 25 Nov '05  
GeneralItem Indexesmemberappwiz16:43 11 Oct '03  
GeneralRe: Item IndexeseditorHeath Stewart4:49 12 Oct '03  
GeneralRe: Item IndexesmemberErhan Hosca15:30 12 Oct '03  
GeneralRe: Item IndexeseditorHeath Stewart16:03 12 Oct '03  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 21 Sep 2003
Editor: Smitha Vijayan
Copyright 2003 by Erhan Hosca
Everything else Copyright © CodeProject, 1999-2008
Web11 | Advertise on the Code Project