[banshee] Fixed compilation metadata reading and writing (bgo#563283)



commit c8a4973e4269e829ebcf8ebc84e9040b8c3a31b0
Author: Alexander Kojevnikov <alexander kojevnikov com>
Date:   Wed Jun 3 13:18:22 2009 +1000

    Fixed compilation metadata reading and writing (bgo#563283)
    
    Original patches from Travis Glenn Hansen and Tobias Mueller, unit tests by me.
---
 .../Banshee.Base/Tests/TaglibReadWriteTests.cs     |  107 ++++++++++++++++---
 .../Banshee.Core/Banshee.Streaming/StreamTagger.cs |   53 ++++++----
 2 files changed, 121 insertions(+), 39 deletions(-)

diff --git a/src/Core/Banshee.Core/Banshee.Base/Tests/TaglibReadWriteTests.cs b/src/Core/Banshee.Core/Banshee.Base/Tests/TaglibReadWriteTests.cs
index 453bf72..bc3e699 100644
--- a/src/Core/Banshee.Core/Banshee.Base/Tests/TaglibReadWriteTests.cs
+++ b/src/Core/Banshee.Core/Banshee.Base/Tests/TaglibReadWriteTests.cs
@@ -63,16 +63,29 @@ namespace Banshee.Base.Tests
         public void TestSystemIO ()
         {
             Banshee.IO.Provider.SetProvider (new Banshee.IO.SystemIO.Provider ());
-            WriteMetadata (files, "My Genre");
+            WriteMetadata (files, ChangeTrack, VerifyTrack);
         }
     
         [Test]
         public void TestUnixIO ()
         {
             Banshee.IO.Provider.SetProvider (CreateUnixIOProvider ());
-            WriteMetadata (files, "My Genre");
+            WriteMetadata (files, ChangeTrack, VerifyTrack);
         }
-    
+
+        [Test]
+        public void TestGenre ()
+        {
+            Banshee.IO.Provider.SetProvider (CreateUnixIOProvider ());
+            WriteMetadata (files, delegate (TrackInfo track) {
+                ChangeTrack (track);
+                track.Genre = "My Genre";
+            }, delegate (TrackInfo track) {
+                VerifyTrack (track);
+                Assert.AreEqual ("My Genre", track.Genre);
+            });
+        }
+
         [Test]
         public void TestNullGenreBug ()
         {
@@ -81,10 +94,62 @@ namespace Banshee.Base.Tests
             // (see http://forum.taglib-sharp.com/viewtopic.php?f=5&t=239 )
             // This tests our workaround.
             Banshee.IO.Provider.SetProvider (CreateUnixIOProvider ());
-            WriteMetadata (files, null);
+            WriteMetadata (files, delegate (TrackInfo track) {
+                ChangeTrack (track);
+                track.Genre = null;
+            }, delegate (TrackInfo track) {
+                VerifyTrack (track);
+                Assert.IsNull (track.Genre);
+            });
         }
-    
-        private void WriteMetadata (string [] files, string genre)
+
+        [Test]
+        public void TestIsCompilation ()
+        {
+            Banshee.IO.Provider.SetProvider (CreateUnixIOProvider ());
+            WriteMetadata (files, delegate (TrackInfo track) {
+                ChangeTrack (track);
+                // bgo#563283: IsCompilation was reset if AlbumArtist == Artist
+                track.AlbumArtist = track.ArtistName;
+                track.IsCompilation = true;
+            }, delegate (TrackInfo track) {
+                VerifyTrack (track);
+                Assert.AreEqual (track.ArtistName, track.AlbumArtist);
+                Assert.IsTrue (track.IsCompilation);
+            });
+        }
+
+        [Test]
+        public void TestIsNotCompilation ()
+        {
+            Banshee.IO.Provider.SetProvider (CreateUnixIOProvider ());
+            WriteMetadata (files, delegate (TrackInfo track) {
+                ChangeTrack (track);
+                track.AlbumArtist = track.ArtistName;
+                track.IsCompilation = false;
+            }, delegate (TrackInfo track) {
+                VerifyTrack (track);
+                Assert.AreEqual (track.ArtistName, track.AlbumArtist);
+                Assert.IsFalse (track.IsCompilation);
+            });
+        }
+
+        [Test]
+        public void TestIsCompilationAndAlbumArtist ()
+        {
+            Banshee.IO.Provider.SetProvider (CreateUnixIOProvider ());
+            WriteMetadata (files, delegate (TrackInfo track) {
+                ChangeTrack (track);
+                track.AlbumArtist = "My Album Artist";
+                track.IsCompilation = true;
+            }, delegate (TrackInfo track) {
+                VerifyTrack (track);
+                Assert.AreEqual ("My Album Artist", track.AlbumArtist);
+                Assert.IsTrue (track.IsCompilation);
+            });
+        }
+
+        private void WriteMetadata (string [] files, Action<TrackInfo> change, Action<TrackInfo> verify)
         {
             SafeUri newuri = null;
             bool write_metadata = LibrarySchema.WriteMetadata.Get();
@@ -96,7 +161,7 @@ namespace Banshee.Base.Tests
     
                     Banshee.IO.File.Copy (new SafeUri (uri), newuri, true);
     
-                    ChangeAndVerify (newuri, genre);
+                    ChangeAndVerify (newuri, change, verify);
                 });
             } finally {
                 LibrarySchema.WriteMetadata.Set (write_metadata);
@@ -105,20 +170,14 @@ namespace Banshee.Base.Tests
             }
         }
     
-        private void ChangeAndVerify (SafeUri uri, string genre)
+        private void ChangeAndVerify (SafeUri uri, Action<TrackInfo> change, Action<TrackInfo> verify)
         {
             TagLib.File file = StreamTagger.ProcessUri (uri);
             TrackInfo track = new TrackInfo ();
             StreamTagger.TrackInfoMerge (track, file);
     
             // Make changes
-            track.TrackTitle = "My Title";
-            track.ArtistName = "My Artist";
-            track.AlbumTitle = "My Album";
-            track.Genre = genre;
-            track.TrackNumber = 4;
-            track.DiscNumber = 4;
-            track.Year = 1999;
+            change (track);
     
             // Save changes
             bool saved = StreamTagger.SaveToFile (track);
@@ -130,15 +189,29 @@ namespace Banshee.Base.Tests
             StreamTagger.TrackInfoMerge (track, file);
     
             // Verify changes
+            verify (track);
+        }
+
+        private void ChangeTrack (TrackInfo track)
+        {
+            track.TrackTitle = "My Title";
+            track.ArtistName = "My Artist";
+            track.AlbumTitle = "My Album";
+            track.TrackNumber = 4;
+            track.DiscNumber = 4;
+            track.Year = 1999;
+        }
+
+        private void VerifyTrack (TrackInfo track)
+        {
             Assert.AreEqual ("My Title", track.TrackTitle);
             Assert.AreEqual ("My Artist", track.ArtistName);
             Assert.AreEqual ("My Album", track.AlbumTitle);
-            Assert.AreEqual (genre, track.Genre);
             Assert.AreEqual (4, track.TrackNumber);
             Assert.AreEqual (4, track.DiscNumber);
             Assert.AreEqual (1999, track.Year);
         }
-        
+
         private Type unix_io_type;
     
         private Banshee.IO.IProvider CreateUnixIOProvider ()
diff --git a/src/Core/Banshee.Core/Banshee.Streaming/StreamTagger.cs b/src/Core/Banshee.Core/Banshee.Streaming/StreamTagger.cs
index c58a740..81a0981 100644
--- a/src/Core/Banshee.Core/Banshee.Streaming/StreamTagger.cs
+++ b/src/Core/Banshee.Core/Banshee.Streaming/StreamTagger.cs
@@ -145,7 +145,7 @@ namespace Banshee.Streaming
                 track.AlbumTitleSort = Choose (file.Tag.AlbumSort, track.AlbumTitleSort, preferTrackInfo);
                 track.AlbumArtist = Choose (file.Tag.FirstAlbumArtist, track.AlbumArtist, preferTrackInfo);
                 track.AlbumArtistSort = Choose (file.Tag.FirstAlbumArtistSort, track.AlbumArtistSort, preferTrackInfo);
-                track.IsCompilation = IsCompilation (file.Tag);
+                track.IsCompilation = IsCompilation (file);
                 
                 track.TrackTitle = Choose (file.Tag.Title, track.TrackTitle, preferTrackInfo);
                 track.TrackTitleSort = Choose (file.Tag.TitleSort, track.TrackTitleSort, preferTrackInfo);
@@ -187,39 +187,48 @@ namespace Banshee.Streaming
             // TODO these ideas could also be done in an extension that collects such hacks
         }
             
-        private static bool IsCompilation (TagLib.Tag tag)
+        private static bool IsCompilation (TagLib.File file)
         {
-            TagLib.Id3v2.Tag id3v2_tag = tag as TagLib.Id3v2.Tag;
-            if (id3v2_tag != null && id3v2_tag.IsCompilation)
-                return true;
+            try {
+                TagLib.Id3v2.Tag id3v2_tag = file.GetTag(TagLib.TagTypes.Id3v2, true) as TagLib.Id3v2.Tag;
+                if (id3v2_tag != null && id3v2_tag.IsCompilation)
+                    return true;
+            } catch {}
 
-            TagLib.Mpeg4.AppleTag apple_tag = tag as TagLib.Mpeg4.AppleTag;
-            if (apple_tag != null && apple_tag.IsCompilation)
-                return true;
+            try {
+                TagLib.Mpeg4.AppleTag apple_tag = file.GetTag(TagLib.TagTypes.Apple,true) as TagLib.Mpeg4.AppleTag;
+                if (apple_tag != null && apple_tag.IsCompilation)
+                    return true;
+            } catch {}
             
             // FIXME the FirstAlbumArtist != FirstPerformer check might return true for half the
             // tracks on a compilation album, but false for some
             // TODO checked for 'Soundtrack' (and translated) in the title?
-            if (tag.Performers.Length > 0 && tag.AlbumArtists.Length > 0 &&
-                (tag.Performers.Length != tag.AlbumArtists.Length || tag.FirstAlbumArtist != tag.FirstPerformer)) {
+            if (file.Tag.Performers.Length > 0 && file.Tag.AlbumArtists.Length > 0 &&
+                (file.Tag.Performers.Length != file.Tag.AlbumArtists.Length ||
+                file.Tag.FirstAlbumArtist != file.Tag.FirstPerformer)) {
                 return true;
             }
             return false;
         }
 
-        private static void SaveIsCompilation (TagLib.Tag tag, bool is_compilation)
+        private static void SaveIsCompilation (TagLib.File file, bool is_compilation)
         {
-            TagLib.Id3v2.Tag id3v2_tag = tag as TagLib.Id3v2.Tag;
-            if (id3v2_tag != null) {
-                id3v2_tag.IsCompilation = is_compilation;
-                return;
-            }
+            try {
+                TagLib.Id3v2.Tag id3v2_tag = file.GetTag(TagLib.TagTypes.Id3v2, true) as TagLib.Id3v2.Tag;
+                if (id3v2_tag != null) {
+                    id3v2_tag.IsCompilation = is_compilation;
+                    return;
+                }
+            } catch {}
 
-            TagLib.Mpeg4.AppleTag apple_tag = tag as TagLib.Mpeg4.AppleTag;
-            if (apple_tag != null) {
-                apple_tag.IsCompilation = is_compilation;
-                return;
-            }
+            try {
+                TagLib.Mpeg4.AppleTag apple_tag = file.GetTag(TagLib.TagTypes.Apple,true) as TagLib.Mpeg4.AppleTag;
+                if (apple_tag != null) {
+                    apple_tag.IsCompilation = is_compilation;
+                    return;
+                }
+            } catch {}
         }
 
         public static bool SaveToFile (TrackInfo track)
@@ -261,7 +270,7 @@ namespace Banshee.Streaming
             file.Tag.Year = (uint)track.Year;
             file.Tag.BeatsPerMinute = (uint)track.Bpm;
             
-            SaveIsCompilation (file.Tag, track.IsCompilation);
+            SaveIsCompilation (file, track.IsCompilation);
             file.Save ();
 
             track.FileSize = Banshee.IO.File.GetSize (track.Uri);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]