WMAファイルのID3タグを取得する

動機

楽天の期間限定ポイントの期限が切れそうだったのでサクラクエストのサントラCDを購入した。
音楽をパソコンに取り込んだがID3タグが付いていなかったのでGroove Musicのアルバム情報検索で自動設定した。
タグは更新されたが、ファイル名はトラック1,2,3...のままなのでファイル名をID3タグのタイトルにリネームしたい。
80曲ほどあるので手動ではやりたくない。

環境

・Windows10 Pro
Visual Studio Community 2017
・.NET4.6.1

実装

参考にしたサイト:
MP3ファイルからタイトルやアーティスト名などを取得するには?[C#、VB] - @IT

上記のコードをコピペしただけではエラーが発生して実行できなかったので以下の2点を修正した。
・Shell32の参照プロパティの相互運用型の埋め込みをfalseに設定
・ShellClassの型をdynamicに変更

コード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Shell32;
using System.Runtime.InteropServices;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic shell = new ShellClass();
            try
            {
                foreach (var dir in args)
                {
                    if (!Directory.Exists(dir))
                    {
                        Console.WriteLine($"Not exists : {dir}");
                        continue;
                    }
                    Console.WriteLine($"Directory : {dir}");
                    var folder = shell.NameSpace(dir);
                    try
                    {
                        foreach (var filename in Directory.GetFiles(dir))
                        {
                            var ext = Path.GetExtension(filename);
                            if (ext.ToUpper() != ".WMA")
                            {
                                continue;
                            }

                            var fi = folder.ParseName(Path.GetFileName(filename));
                            try
                            {
                                //21がタイトル情報
                                var title = folder.GetDetailsOf(fi, 21);
                                var renamed = Path.Combine(dir, title + ext);
                                File.Move(filename, renamed);
                                Console.WriteLine($"Rename {filename} {renamed}");
                            }
                            finally
                            {
                                Marshal.ReleaseComObject(fi);
                            }
                        }
                    }
                    finally
                    {
                        Marshal.ReleaseComObject(folder);
                    }
                }

            }
            finally
            {
                Marshal.ReleaseComObject(shell);
            }
        }
    }
}

まとめ

最高なので買いましょう。

www.amazon.co.jp