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(".flac")) { TagLib.File file = TagLib.File.Create(fi.FullName); TagLib.Ogg.XiphComment tag = (TagLib.Ogg.XiphComment)file.GetTag(TagLib.TagTypes.Xiph); string[] strings = tag.ToArray(); string joined = String.Join("\n", strings); MessageBox.Show(joined); 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\\flac.exe"; processStartInfo.Arguments = String.Format("-8 \"{0}\"", wavFile.FullName); processStartInfo.WorkingDirectory = wavFile.Directory.FullName; Process? process = Process.Start(processStartInfo); process.WaitForExit(); FileInfo flacFile = new FileInfo(Path.ChangeExtension(wavFile.FullName, ".flac")); if (!flacFile.Exists) { MessageBox.Show("Failed to generate FLAC file."); return; } TagLib.File taglibFile = TagLib.File.Create(flacFile.FullName); TagLib.Ogg.XiphComment tag2 = (TagLib.Ogg.XiphComment)taglibFile.GetTag(TagLib.TagTypes.Xiph); bool cueSet = false; foreach (FileInfo fi in fileInfos) { string extension = Path.GetExtension(fi.FullName).ToLowerInvariant(); switch (extension) { case ".cue": string v = File.ReadAllText(fi.FullName); if (!cueSet) { tag2.SetField("CUESHEET", v); tag2.SetField("AZUSA_CLEAN_CUE", v); cueSet = true; } else { tag2.SetField("AZUSA_ALT_CUE", v); } break; case ".md5": string v1 = File.ReadAllText(fi.FullName); tag2.SetField("AZUSA_MD5", v1); break; case ".ibg": string v2 = File.ReadAllText(fi.FullName); tag2.SetField("AZUSA_IBG", v2); break; case ".log": string v3 = File.ReadAllText(fi.FullName); tag2.SetField("AZUSA_LOG", v3); break; default: MessageBox.Show(String.Format("Don't know what to do with a {0} file.", fi.FullName)); return; } } 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; tag2.SetField("AZUPACK", new AzupackMeta().ToString()); 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; } } }