using System.Buffers.Text; using System.Diagnostics; namespace azupack_flac { internal class Program { static void Main(string[] args) { if (args.Length == 0) { MessageBox.Show("Hey, gimme something to work with!"); return; } if (args.Length == 1) { FileInfo fi = new FileInfo(args[0]); string fileExtension = Path.GetExtension(fi.Name); if (fileExtension.ToLower().Equals(".mp3")) { TagLib.File file = TagLib.File.Create(fi.FullName); TagLib.Id3v2.Tag tag = (TagLib.Id3v2.Tag)file.GetTag(TagLib.TagTypes.Id3v2); return; } else { MessageBox.Show("What am I supposed to do with a single FLAC file?"); return; } } List fileInfos = args.Select(x => new FileInfo(x)).ToList(); if (!fileInfos.Any(x => Path.GetExtension(x.Name).ToLower().Equals(".wav"))) { MessageBox.Show("No wav file!"); return; } FileInfo wavFile = fileInfos.Find(x => Path.GetExtension(x.Name).ToLower().Equals(".wav")); fileInfos.Remove(wavFile); List jpgFiles = fileInfos.Where(x => Path.GetExtension(x.FullName).ToLower().Equals(".jpg")).ToList(); jpgFiles.Sort((x, y) => x.Name.CompareTo(y.Name)); fileInfos.RemoveAll(x => jpgFiles.Contains(x)); ProcessStartInfo processStartInfo = new ProcessStartInfo(); processStartInfo.FileName = "C:\\FT\\lame.exe"; processStartInfo.Arguments = String.Format("\"{0}\"", wavFile.FullName); processStartInfo.WorkingDirectory = wavFile.Directory.FullName; Process? process = Process.Start(processStartInfo); process.WaitForExit(); FileInfo flacFile = new FileInfo(Path.ChangeExtension(wavFile.FullName, ".mp3")); if (!flacFile.Exists) { MessageBox.Show("Failed to generate MP3 file."); return; } TagLib.File taglibFile = TagLib.File.Create(flacFile.FullName); TagLib.Id3v2.Tag tag2 = (TagLib.Id3v2.Tag)taglibFile.GetTag(TagLib.TagTypes.Id3v2); foreach (FileInfo fi in fileInfos) { string extension = Path.GetExtension(fi.FullName).ToLowerInvariant(); TagLib.Id3v2.UserTextInformationFrame frame; switch (extension) { case ".cue": frame = new TagLib.Id3v2.UserTextInformationFrame("AZUSA_CLEAN_CUE"); frame.Text = new string[] { File.ReadAllText(fi.FullName) }; break; case ".md5": frame = new TagLib.Id3v2.UserTextInformationFrame("AZUSA_MD5"); frame.Text = new string[] { File.ReadAllText(fi.FullName) }; break; case ".ibg": frame = new TagLib.Id3v2.UserTextInformationFrame("AZUSA_IBG"); frame.Text = new string[] { File.ReadAllText(fi.FullName) }; break; case ".cdt": byte[] ibgBytes = File.ReadAllBytes(fi.FullName); frame = new TagLib.Id3v2.UserTextInformationFrame("AZUSA_CDT"); frame.Text = new string[] { Convert.ToBase64String(ibgBytes) }; break; default: MessageBox.Show(String.Format("Don't know what to do with a {0} file.", fi.FullName)); return; } frame.TextEncoding = TagLib.StringType.UTF8; tag2.AddFrame(frame); } TagLib.PictureType[] types = new TagLib.PictureType[] { TagLib.PictureType.FrontCover, TagLib.PictureType.BackCover, TagLib.PictureType.Artist, TagLib.PictureType.Media, TagLib.PictureType.FileIcon }; TagLib.Picture[] pictures = new TagLib.Picture[jpgFiles.Count]; for (int i = 0; i < jpgFiles.Count; i++) { TagLib.Picture picture = new TagLib.Picture(jpgFiles[i].FullName); picture.MimeType = "image/jpeg"; picture.Type = types[i]; pictures[i] = picture; } taglibFile.Tag.Pictures = pictures; TagLib.Id3v2.UserTextInformationFrame azupackFrame = new TagLib.Id3v2.UserTextInformationFrame("AZUPACK"); azupackFrame.Flags = TagLib.Id3v2.FrameFlags.None; azupackFrame.Text = new string[] { new AzupackMeta().ToString() }; tag2.AddFrame(azupackFrame); uint? cdNumber = GetCdNumber(flacFile.FullName); if (cdNumber != null) { taglibFile.Tag.Disc = cdNumber.Value; } taglibFile.Save(); } private static uint? GetCdNumber(string name) { for (uint i = 99; i > 0; i--) { string fname = String.Format("CD{0}", i); if (name.Contains(fname)) return i; } return null; } } }