public void CopyOpenAddAndSavePicture() { string origFile = @"Data\testfile2.flac"; string newFile = @"Data\testfile2_temp.flac"; byte[] imageData = File.ReadAllBytes(@"Data\testimage.png"); FileHelper.GetNewFile(origFile, newFile); try { using (FlacFile flac = new FlacFile(newFile)) { Picture pict = null; pict = new FlacLibSharp.Picture(); pict.ColorDepth = 24; pict.Data = imageData; pict.Description = "Small picture test ..."; pict.Height = 420; pict.Width = 410; pict.MIMEType = "image/png"; pict.PictureType = PictureType.ArtistLogotype; flac.Metadata.Add(pict); pict = new FlacLibSharp.Picture(); pict.ColorDepth = 24; pict.Description = "Small URL picture test ..."; pict.Height = 768; pict.Width = 1024; pict.MIMEType = "-->"; pict.PictureType = PictureType.BrightColouredFish; pict.URL = "http://38.media.tumblr.com/0e954b0469c281a9a09eb1378daada3e/tumblr_mh0cpm19zR1s3yrubo1_1280.jpg"; flac.Metadata.Add(pict); flac.Save(); } using (FlacFile flac = new FlacFile(newFile)) { List<Picture> pictures = flac.GetAllPictures(); Assert.IsTrue(pictures.Count > 0); bool foundOurImage = false; bool foundOurURL = false; foreach (var pict in pictures) { if (pict.Description == "Small picture test ...") { Assert.AreEqual<uint>(24, pict.ColorDepth); Assert.AreEqual<string>("Small picture test ...", pict.Description); Assert.AreEqual<uint>(420, pict.Height); Assert.AreEqual<uint>(410, pict.Width); Assert.AreEqual<string>("image/png", pict.MIMEType); Assert.AreEqual<PictureType>(PictureType.ArtistLogotype, pict.PictureType); Assert.IsNotNull(pict.Data.Length); Assert.AreEqual<int>(imageData.Length, pict.Data.Length); for (int i = 0; i < imageData.Length; i++) { Assert.AreEqual<byte>(imageData[i], pict.Data[i], "Written picture data does not match read picture data."); } foundOurImage = true; } if (pict.Description == "Small URL picture test ...") { Assert.AreEqual<uint>(24, pict.ColorDepth); Assert.AreEqual<string>("Small URL picture test ...", pict.Description); Assert.AreEqual<uint>(768, pict.Height); Assert.AreEqual<uint>(1024, pict.Width); Assert.AreEqual<string>("-->", pict.MIMEType); Assert.AreEqual<PictureType>(PictureType.BrightColouredFish, pict.PictureType); Assert.AreEqual<string>("http://38.media.tumblr.com/0e954b0469c281a9a09eb1378daada3e/tumblr_mh0cpm19zR1s3yrubo1_1280.jpg", pict.URL); foundOurURL = true; } } Assert.IsTrue(foundOurImage); Assert.IsTrue(foundOurURL); } } finally { if (File.Exists(newFile)) { File.Delete(newFile); } } }
public void CopyOpenAddAndSavePicture() { string origFile = @"Data\testfile2.flac"; string newFile = @"Data\testfile2_temp.flac"; byte[] imageData = File.ReadAllBytes(@"Data\testimage.png"); FileHelper.GetNewFile(origFile, newFile); try { using (FlacFile flac = new FlacFile(newFile)) { Picture pict = null; pict = new FlacLibSharp.Picture(); pict.ColorDepth = 24; pict.Data = imageData; pict.Description = "Small picture test ..."; pict.Height = 420; pict.Width = 410; pict.MIMEType = "image/png"; pict.PictureType = PictureType.ArtistLogotype; flac.Metadata.Add(pict); pict = new FlacLibSharp.Picture(); pict.ColorDepth = 24; pict.Description = "Small URL picture test ..."; pict.Height = 768; pict.Width = 1024; pict.MIMEType = "-->"; pict.PictureType = PictureType.BrightColouredFish; pict.URL = "http://38.media.tumblr.com/0e954b0469c281a9a09eb1378daada3e/tumblr_mh0cpm19zR1s3yrubo1_1280.jpg"; flac.Metadata.Add(pict); flac.Save(); } using (FlacFile flac = new FlacFile(newFile)) { List <Picture> pictures = flac.GetAllPictures(); Assert.IsTrue(pictures.Count > 0); bool foundOurImage = false; bool foundOurURL = false; foreach (var pict in pictures) { if (pict.Description == "Small picture test ...") { Assert.AreEqual <uint>(24, pict.ColorDepth); Assert.AreEqual <string>("Small picture test ...", pict.Description); Assert.AreEqual <uint>(420, pict.Height); Assert.AreEqual <uint>(410, pict.Width); Assert.AreEqual <string>("image/png", pict.MIMEType); Assert.AreEqual <PictureType>(PictureType.ArtistLogotype, pict.PictureType); Assert.IsNotNull(pict.Data.Length); Assert.AreEqual <int>(imageData.Length, pict.Data.Length); for (int i = 0; i < imageData.Length; i++) { Assert.AreEqual <byte>(imageData[i], pict.Data[i], "Written picture data does not match read picture data."); } foundOurImage = true; } if (pict.Description == "Small URL picture test ...") { Assert.AreEqual <uint>(24, pict.ColorDepth); Assert.AreEqual <string>("Small URL picture test ...", pict.Description); Assert.AreEqual <uint>(768, pict.Height); Assert.AreEqual <uint>(1024, pict.Width); Assert.AreEqual <string>("-->", pict.MIMEType); Assert.AreEqual <PictureType>(PictureType.BrightColouredFish, pict.PictureType); Assert.AreEqual <string>("http://38.media.tumblr.com/0e954b0469c281a9a09eb1378daada3e/tumblr_mh0cpm19zR1s3yrubo1_1280.jpg", pict.URL); foundOurURL = true; } } Assert.IsTrue(foundOurImage); Assert.IsTrue(foundOurURL); } } finally { if (File.Exists(newFile)) { File.Delete(newFile); } } }
public static void Execute(IReadOnlyCollection <string> paths, bool recursive, bool fix, int minWidth = 500, int minHeight = 500, bool bookletWarning = false) { // only directories with music content var dirs = paths.DirectoriesContainsExtensions(recursive); foreach (var dir in dirs) { // icon files (from Mac) var icons = dir.GetFiles("Icon*", SearchOption.TopDirectoryOnly); foreach (var icon in icons.Where(x => x.Length == 0)) { Console.WriteLine($"+0ICON {icon.FullName}"); if (fix) { File.Delete(icon.FullName); } } // hidden Linux files var hiddens = dir.GetFiles(".*", SearchOption.TopDirectoryOnly); foreach (var hidden in hiddens.Where(x => x.Length <= (10 * 1024))) { Console.WriteLine($"+HIDDEN {hidden.FullName}"); if (fix) { File.Delete(hidden.FullName); } } // log files var logs = dir.GetFiles("*.log", SearchOption.AllDirectories); foreach (var log in logs) { Console.WriteLine($"+LOG {log.FullName}"); if (fix) { File.Delete(log.FullName); } } // delete duplicity files (non-music files, root first then other directories) var duplicities = dir.GetFiles("*", SearchOption.AllDirectories) .Where(x => x.Extension.ToLowerInvariant() != ".flac") .OrderBy(x => x.FullName.Split(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar).Length) .ThenBy(x => x.FullName); var hashes = new Dictionary <string, string>(); foreach (var duplicity in duplicities) { var hash = BitConverter.ToString(ComputeHash(duplicity.FullName)); if (hashes.ContainsKey(hash)) { Console.WriteLine($"+DUPLIC {duplicity.FullName} [{hashes[hash].Replace(dir.FullName, "")}]"); if (fix) { File.Delete(duplicity.FullName); } } else { hashes.Add(hash, duplicity.FullName); } } // FLAC files var flacs = dir.GetFiles("*.flac", SearchOption.TopDirectoryOnly); // missing folder.jpg|png file var folderImages = dir.GetFiles("folder.*", SearchOption.TopDirectoryOnly); var folderImagesCount = folderImages.Count(x => x.Extension.ToLowerInvariant() == ".png" || x.Extension.ToLowerInvariant() == ".jpg"); // folder image is missing, try find other if (folderImagesCount < 1) { // folder.jpg file var folderImage = Path.Combine(dir.FullName, "folder.jpg"); // cover file var coverFiles = dir.GetFiles("cover.jpg", SearchOption.TopDirectoryOnly); if (coverFiles.Any()) { // fix: rename: cover -> folder.jpg var folderCover = coverFiles.First().FullName; Console.WriteLine($"+PICTURE {dir.FullName}: {Path.GetFileName(folderCover)} -> {Path.GetFileName(folderImage)}"); if (fix) { File.Move(folderCover, folderImage); } } // try get folder.jpg from first FLAC file else if (flacs.Any()) { try { using (var file = new FlacFile(flacs.First().FullName)) { var picture = file.GetAllPictures().FirstOrDefault(); if (picture != null) { Console.WriteLine($"+PICTURE {dir.FullName}: FLAC MIME: {picture.MIMEType} -> {Path.GetFileName(folderImage)}"); if (fix) { using (var input = new MemoryStream(picture.Data)) using (var output = File.OpenWrite(folderImage)) { var f = Image.Load(input); f.SaveAsJpeg(output); } } } } } catch (FlacLibSharpInvalidFormatException) { } } else { Console.WriteLine($"_PICTURE {dir.FullName}: folder.jpg is missing"); } } // folder.jpg sizes folderImages = dir.GetFiles("folder.*", SearchOption.TopDirectoryOnly).Where(x => x.Extension.ToLowerInvariant() == ".jpg" || x.Extension.ToLowerInvariant() == ".png").ToArray(); if (folderImages.Any()) { var fi = new FileInfo(folderImages.First().FullName); var f = Image.Load(folderImages.First().FullName); if (f.Width < minWidth || f.Height < minHeight) { Console.WriteLine($"!PICTURE {folderImages.First().FullName}: [{f.Width}x{f.Height}] {fi.Length.SizeSuffix()}"); } } // exist Art var folderArts = dir.GetDirectories("art*", SearchOption.TopDirectoryOnly); if (folderArts.Any()) { var folderArt = folderArts.First(); var files = folderArt.GetFiles(); foreach (var file in files) { Console.WriteLine($"!ART {file.FullName} [{file.Length.SizeSuffix()}]"); if (fix) { if (file.Name.ToLowerInvariant() == "thumbs.db") { try { File.Delete(file.FullName); } catch (IOException ex) { Console.WriteLine($"!ERROR {ex.Message}"); } } } } if (fix) { if (folderArt.GetFiles("*", SearchOption.AllDirectories).Length == 0) { Directory.Delete(folderArt.FullName); } } } // booklet.pdf file var bookletFile = Path.Combine(dir.FullName, "booklet.pdf"); // booklet var booklets = dir.GetFiles("*.pdf", SearchOption.AllDirectories); if (booklets.Length >= 2) { foreach (var booklet in booklets) { var fi = new FileInfo(booklet.FullName); Console.WriteLine($"+BOOKLET {booklet.FullName}: {fi.Length.SizeSuffix()}"); } } else if (booklets.Length == 1) { var booklet = booklets.First(); if (fix) { if (booklet.Directory.FullName.ToLowerInvariant() != dir.FullName.ToLowerInvariant()) { Console.WriteLine($"+BOOKLET {booklet.FullName} -> {Path.GetFileName(bookletFile)}"); File.Move(booklet.FullName, bookletFile); var files = booklet.Directory.GetFiles(); if (files.Length == 0) { Directory.Delete(booklet.DirectoryName); } else if (files.Length >= 1) { foreach (var file in files) { Console.WriteLine($"!BOOKLET {file.FullName}"); } } } } } else { if (bookletWarning) { Console.WriteLine($"!BOOKLET {bookletFile} not found"); } } } }