[banshee] Fixed compilation metadata reading and writing (bgo#563283)
- From: Alexander Kojevnikov <alexk src gnome org>
- To: svn-commits-list gnome org
- Subject: [banshee] Fixed compilation metadata reading and writing (bgo#563283)
- Date: Tue, 2 Jun 2009 23:20:07 -0400 (EDT)
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]