Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        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");
                    }
                }
            }
        }