Index: ChangeLog
===================================================================
--- ChangeLog	(revision 3922)
+++ ChangeLog	(working copy)
@@ -1,3 +1,37 @@
+2008-05-17  Andres G. Aragoneses <aaragoneses@novell.com>
+
+	[ Fix for bug#528493 and part of bgo#499650 ]
+
+	* src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs:
+	rather bind to the Display* properties in order to get the meta information.
+	* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs:
+	don't include Unknown Albums in the Albums view, and track column rename.
+	* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs:
+	don't include Unknown Artists in the Artists view, and track column rename.
+	* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs,
+	src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs,
+	src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs:
+	We now don't fake the real names/titles with 'Unknown' meta-information if they
+	are empty (but to keep this content searchable, we introduce them in the ToSort
+	DB column).
+	* src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs: Changed
+	columns named *Lowered to *ToSort (because before ToLower() was the only algorithm
+	to correct the order but now it changed since we have article supression, and 
+	because anyway this could have been done with 'ORDER BY NAME COLLATE NOCASE;'
+	instead of adding a new column).
+	* src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs: track column rename,
+	add a new clause for ordering but bringing the unknown strings to the last
+	positions instead of the first ones (suggested by hyperair).
+	* src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs: Use NameConversionHelper
+	in order to reuse this behaviour. Here we introduce the article removal requested
+	on BGO#499650.
+	* src/Core/Banshee.Core/Banshee.Collection/NameConversionHelper.cs: New file that
+	has the constant string for null values. This also adds a "[{0}]" prefix and
+	suffix (to 'Unknown' strings) because this is meta-information (not real
+	information).
+	* src/Core/Banshee.Core/Makefile.am,
+	src/Core/Banshee.Core/Banshee.Core.mdp: Added NameConversionHelper.cs.
+
 2008-05-17  Aaron Bockover  <abock@gnome.org>
 
 	* src/Libraries/Hyena/Hyena.Collections/RangeCollection.cs: Fixed the 
Index: src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs
===================================================================
--- src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs	(revision 3922)
+++ src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs	(working copy)
@@ -93,19 +93,19 @@
         }
         
         private SortableColumn title_column = new SortableColumn (Catalog.GetString ("Title"), 
-            new ColumnCellText ("TrackTitle", true), 0.25, "Title", true);
+            new ColumnCellText ("DisplayTrackTitle", true), 0.25, "Title", true);
         public SortableColumn TitleColumn {
             get { return title_column; }
         }
         
         private SortableColumn artist_column = new SortableColumn (Catalog.GetString ("Artist"), 
-            new ColumnCellText ("ArtistName", true), 0.225, "Artist", true);
+            new ColumnCellText ("DisplayArtistName", true), 0.225, "Artist", true);
         public SortableColumn ArtistColumn {
             get { return artist_column; }
         }
         
         private SortableColumn album_column = new SortableColumn (Catalog.GetString ("Album"), 
-            new ColumnCellText ("AlbumTitle", true), 0.225, "Album", true);
+            new ColumnCellText ("DisplayAlbumTitle", true), 0.225, "Album", true);
         public SortableColumn AlbumColumn {
             get { return album_column; }
         }
Index: src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs	(revision 3922)
+++ src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs	(working copy)
@@ -35,6 +35,7 @@
 
 using Banshee.Database;
 using Banshee.ServiceStack;
+using Banshee.Collection;
 
 namespace Banshee.Collection.Database
 {
@@ -78,7 +79,7 @@
             }
 
             if (String.IsNullOrEmpty (album.Title) || album.Title.Trim () == String.Empty) {
-                album.Title = Catalog.GetString ("Unknown Album");
+                album.Title = String.Empty;
             }
 
             using (IDataReader reader = ServiceManager.DbConnection.Query (select_command, artist.DbId, album.Title)) {
@@ -165,8 +166,8 @@
         }
         
         [DatabaseColumn(Select = false)]
-        protected string TitleLowered {
-            get { return Title == null ? null : Title.ToLower (); }
+        protected string TitleToSort {
+            get { return NameConversionHelper.SortableAlbum (Title); }
         }
 
         [VirtualDatabaseColumn("Name", "CoreArtists", "ArtistID", "ArtistID")]
Index: src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs	(revision 3922)
+++ src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs	(working copy)
@@ -86,10 +86,11 @@
 
             reload_fragment = String.Format (@"
                 FROM CoreAlbums INNER JOIN CoreArtists ON CoreAlbums.ArtistID = CoreArtists.ArtistID
-                    {0} {1} {2} {3} ORDER BY CoreAlbums.TitleLowered, CoreArtists.NameLowered",
+                    {0} {1} {2} {3} ORDER BY CoreAlbums.TitleToSort, CoreArtists.NameToSort",
                 either ? "WHERE" : null,
                 track_model == null ? null :
                     String.Format (@"
+                        CoreAlbums.Title NOT LIKE '' AND
                         CoreAlbums.AlbumID IN
                             (SELECT CoreTracks.AlbumID FROM CoreTracks, CoreCache{1}
                                 WHERE CoreCache.ModelID = {0} AND
Index: src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs	(revision 3922)
+++ src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs	(working copy)
@@ -41,6 +41,7 @@
 using Banshee.Sources;
 using Banshee.ServiceStack;
 using Banshee.Streaming;
+using Banshee.Collection;
 
         using System.Diagnostics;
 // Disabling "is never used" warnings here because there are a lot
@@ -139,8 +140,11 @@
                 // TODO get rid of unused artists/albums
             }
             
+            if (String.IsNullOrEmpty (TrackTitle) || TrackTitle.Trim () == String.Empty) {
+                TrackTitle = String.Empty;
+            }
+
             DateUpdated = DateTime.Now;
-
             bool is_new = (TrackId == 0);
             if (is_new) DateAdded = DateUpdated;
 
@@ -295,8 +299,8 @@
         }
         
         [DatabaseColumn(Select = false)]
-        protected string TitleLowered {
-            get { return TrackTitle == null ? null : TrackTitle.ToLower (); }
+        protected string TitleToSort {
+            get { return NameConversionHelper.SortableTitle (TrackTitle); }
         }
         
         [DatabaseColumn]
Index: src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs	(revision 3922)
+++ src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs	(working copy)
@@ -76,7 +76,7 @@
             }
 
             if (String.IsNullOrEmpty (artist.Name) || artist.Name.Trim () == String.Empty) {
-                artist.Name = Catalog.GetString ("Unknown Artist");
+                artist.Name = String.Empty;
             }
 
             using (IDataReader reader = ServiceManager.DbConnection.Query (select_command, artist.Name)) {
@@ -144,13 +144,14 @@
         }
         
         [DatabaseColumn(Select = false)]
-        protected string NameLowered {
-            get { return Name == null ? null : Name.ToLower (); }
+        protected string NameToSort {
+            get { return NameConversionHelper.SortableArtist (Name); }
         }
 
         public override string ToString ()
         {
             return String.Format ("DatabaseArtistInfo<DbId: {0}, Name: {1}>", DbId, Name);
         }
+
     }
 }
Index: src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs	(revision 3922)
+++ src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs	(working copy)
@@ -75,9 +75,10 @@
         internal void Reload (bool notify)
         {
             reload_fragment = String.Format (
-                "FROM CoreArtists {0} ORDER BY NameLowered",
+                "FROM CoreArtists {0} ORDER BY NameToSort",
                 track_model == null ? null : String.Format (@"
-                    WHERE CoreArtists.ArtistID IN
+                    WHERE CoreArtists.Name NOT LIKE ''
+                      AND CoreArtists.ArtistID IN
                         (SELECT CoreTracks.ArtistID FROM CoreTracks, CoreCache{1}
                             WHERE CoreCache.ModelID = {0} AND
                                   CoreCache.ItemID = {2})",
Index: src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs	(revision 3922)
+++ src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs	(working copy)
@@ -290,14 +290,15 @@
         [DatabaseVersion (5)]
         private bool Migrate_5 ()
         {
-            Execute ("ALTER TABLE CoreTracks ADD COLUMN TitleLowered TEXT");
-            Execute ("ALTER TABLE CoreArtists ADD COLUMN NameLowered TEXT");
-            Execute ("ALTER TABLE CoreAlbums ADD COLUMN TitleLowered TEXT");
+            Execute ("ALTER TABLE CoreTracks ADD COLUMN TitleToSort TEXT");
+            Execute ("ALTER TABLE CoreArtists ADD COLUMN NameToSort TEXT");
+            Execute ("ALTER TABLE CoreAlbums ADD COLUMN TitleToSort TEXT");
 
             // Set default so sorting isn't whack while we regenerate
-            Execute ("UPDATE CoreTracks SET TitleLowered = lower(Title)");
-            Execute ("UPDATE CoreArtists SET NameLowered = lower(Name)");
-            Execute ("UPDATE CoreAlbums SET TitleLowered = lower(Title)");
+            //FIXME: add NameConversionHelper call here
+            Execute ("UPDATE CoreTracks SET TitleToSort = lower(Title)");
+            Execute ("UPDATE CoreArtists SET NameToSort = lower(Name)");
+            Execute ("UPDATE CoreAlbums SET TitleToSort = lower(Title)");
 
             // Drop old indexes
             Execute ("DROP INDEX IF EXISTS CoreTracksPrimarySourceIndex");
@@ -318,8 +319,8 @@
 
             // Create new indexes
             Execute ("CREATE INDEX IF NOT EXISTS CoreTracksIndex ON CoreTracks(ArtistID, AlbumID, PrimarySourceID, Disc, TrackNumber, Uri)");
-            Execute ("CREATE INDEX IF NOT EXISTS CoreArtistsIndex ON CoreArtists(NameLowered)");
-            Execute ("CREATE INDEX IF NOT EXISTS CoreAlbumsIndex       ON CoreAlbums(ArtistID, TitleLowered)");
+            Execute ("CREATE INDEX IF NOT EXISTS CoreArtistsIndex ON CoreArtists(NameToSort)");
+            Execute ("CREATE INDEX IF NOT EXISTS CoreAlbumsIndex       ON CoreAlbums(ArtistID, TitleToSort)");
             Execute ("CREATE INDEX IF NOT EXISTS CoreSmartPlaylistEntriesIndex ON CoreSmartPlaylistEntries(SmartPlaylistID, TrackID)");
             Execute ("CREATE INDEX IF NOT EXISTS CorePlaylistEntriesIndex ON CorePlaylistEntries(PlaylistID, TrackID)");
             
@@ -439,7 +440,7 @@
                     LastStreamError     INTEGER DEFAULT {1},
                     
                     Title               TEXT,
-                    TitleLowered        TEXT,
+                    TitleToSort         TEXT,
                     TrackNumber         INTEGER,
                     TrackCount          INTEGER,
                     Disc                INTEGER,
@@ -472,7 +473,7 @@
                     MusicBrainzID       TEXT,
 
                     Title               TEXT,
-                    TitleLowered        TEXT,
+                    TitleToSort         TEXT,
 
                     ReleaseDate         INTEGER,
                     Duration            INTEGER,
@@ -481,7 +482,7 @@
                     Rating              INTEGER
                 )
             ");
-            Execute("CREATE INDEX CoreAlbumsIndex       ON CoreAlbums(ArtistID, TitleLowered)");
+            Execute("CREATE INDEX CoreAlbumsIndex       ON CoreAlbums(ArtistID, TitleToSort)");
 
             Execute(@"
                 CREATE TABLE CoreArtists (
@@ -489,11 +490,11 @@
                     TagSetID            INTEGER,
                     MusicBrainzID       TEXT,
                     Name                TEXT,
-                    NameLowered         TEXT,
+                    NameToSort          TEXT,
                     Rating              INTEGER
                 )
             ");
-            Execute("CREATE INDEX CoreArtistsIndex ON CoreArtists(NameLowered)");
+            Execute("CREATE INDEX CoreArtistsIndex ON CoreArtists(NameToSort)");
             
             Execute(@"
                 CREATE TABLE CorePlaylists (
Index: src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs	(revision 3922)
+++ src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs	(working copy)
@@ -74,14 +74,14 @@
         };
 
         public static QueryField ArtistField = new QueryField (
-            "artist", Catalog.GetString ("Artist"), "CoreArtists.NameLowered", true,
+            "artist", Catalog.GetString ("Artist"), "CoreArtists.NameToSort", true,
             // Translators: These are unique search fields.  Please, no spaces. Blank ok.
             Catalog.GetString ("artist"), Catalog.GetString ("by"), Catalog.GetString ("artists"),
             "by", "artist", "artists"
         );
 
         public static QueryField AlbumField = new QueryField (
-            "album", Catalog.GetString ("Album"), "CoreAlbums.TitleLowered", true,
+            "album", Catalog.GetString ("Album"), "CoreAlbums.TitleToSort", true,
             // Translators: These are unique search fields.  Please, no spaces. Blank ok.
             Catalog.GetString ("album"), Catalog.GetString ("on"), Catalog.GetString ("from"),
             "on", "album", "from", "albumtitle"
@@ -95,7 +95,7 @@
         );
 
         public static QueryField TitleField = new QueryField (
-            "title", Catalog.GetString ("Track Title"), "CoreTracks.TitleLowered", true,
+            "title", Catalog.GetString ("Track Title"), "CoreTracks.TitleToSort", true,
             // Translators: These are unique search fields.  Please, no spaces. Blank ok.
             Catalog.GetString ("title"), Catalog.GetString ("titled"), Catalog.GetString ("name"), Catalog.GetString ("named"),
             "title", "titled", "name", "named"
@@ -208,7 +208,7 @@
             DateAddedField, PlaylistField, SmartPlaylistField
         );
 
-        private const string default_sort = "CoreArtists.NameLowered ASC, CoreAlbums.TitleLowered ASC, CoreTracks.Disc ASC, CoreTracks.TrackNumber ASC, CoreTracks.Uri ASC";
+        private const string default_sort = "CoreArtists.NameToSort ASC, CoreAlbums.TitleToSort ASC, CoreTracks.Disc ASC, CoreTracks.TrackNumber ASC, CoreTracks.Uri ASC";
 
         public static string GetSort (string key)
         {
@@ -222,33 +222,39 @@
             switch(key) {
                 case "Track":
                     sort_query = String.Format (@"
-                        CoreArtists.NameLowered ASC, 
-                        CoreAlbums.TitleLowered ASC, 
+                        CoreArtists.NameToSort ASC, 
+                        CoreAlbums.TitleToSort ASC, 
                         CoreTracks.TrackNumber {0}", ascDesc); 
                     break;
 
                 case "Artist":
                     sort_query = String.Format (@"
-                        CoreArtists.NameLowered {0}, 
-                        CoreAlbums.TitleLowered ASC,
+                        CoreArtists.Name = '' {0},
+                        CoreArtists.NameToSort {0}, 
+                        CoreAlbums.TitleToSort ASC,
                         CoreTracks.Disc ASC,
                         CoreTracks.TrackNumber ASC,
-                        CoreTracks.Uri ASC", ascDesc); 
+                        CoreTracks.Uri ASC",
+                        ascDesc); 
                     break;
 
                 case "Album":
                     sort_query = String.Format (@"
-                        CoreAlbums.TitleLowered {0},
+                        CoreAlbums.Title = '' {0},
+                        CoreAlbums.TitleToSort {0},
                         CoreTracks.Disc ASC,
                         CoreTracks.TrackNumber ASC,
-                        CoreTracks.Uri ASC", ascDesc); 
+                        CoreTracks.Uri ASC", 
+                        ascDesc); 
                     break;
 
                 case "Title":
                     sort_query = String.Format (@"
-                        CoreTracks.TitleLowered {0},
-                        CoreArtists.NameLowered ASC, 
-                        CoreAlbums.TitleLowered ASC", ascDesc); 
+                        CoreTracks.Title = '' {0},
+                        CoreTracks.TitleToSort {0},
+                        CoreArtists.NameToSort ASC, 
+                        CoreAlbums.TitleToSort ASC", 
+                        ascDesc); 
                     break;
 
                 case "Random":
Index: src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
===================================================================
--- src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs	(revision 3922)
+++ src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs	(working copy)
@@ -29,7 +29,6 @@
 using System;
 using System.IO;
 using System.Collections.Generic;
-using Mono.Unix;
 
 using Hyena;
 using Hyena.Data;
@@ -171,28 +170,19 @@
         
         public string DisplayArtistName { 
             get {
-                string name = ArtistName == null ? null : ArtistName.Trim ();
-                return String.IsNullOrEmpty (name)
-                    ? Catalog.GetString ("Unknown Artist") 
-                    : name; 
+                return NameConversionHelper.DisplayArtist (ArtistName);
             } 
         }
 
         public string DisplayAlbumTitle { 
             get { 
-                string title = AlbumTitle == null ? null : AlbumTitle.Trim ();
-                return String.IsNullOrEmpty (title) 
-                    ? Catalog.GetString ("Unknown Album") 
-                    : title; 
+                return NameConversionHelper.DisplayAlbum (AlbumTitle);
             } 
         }
 
         public string DisplayTrackTitle { 
             get { 
-                string title = TrackTitle == null ? null : TrackTitle.Trim ();
-                return String.IsNullOrEmpty (title) 
-                    ? Catalog.GetString ("Unknown Title") 
-                    : title; 
+                return NameConversionHelper.DisplayTitle (TrackTitle);
             } 
         }     
         
@@ -308,7 +298,7 @@
             get { return media_attributes; }
             set { media_attributes = value; }
         }
-        
+
         // Generates a{sv} of self according to http://wiki.xmms2.xmms.se/index.php/Media_Player_Interfaces#.22Metadata.22
         public IDictionary<string, object> GenerateExportable ()
         {
Index: src/Core/Banshee.Core/Banshee.Collection/NameConversionHelper.cs
===================================================================
--- src/Core/Banshee.Core/Banshee.Collection/NameConversionHelper.cs	(revision 0)
+++ src/Core/Banshee.Core/Banshee.Collection/NameConversionHelper.cs	(revision 0)
@@ -0,0 +1,126 @@
+//
+// NameConversionHelper.cs
+//
+// Author:
+//   Andres G. Aragoneses <aaragoneses@novell.com>
+//
+// Copyright (C) 2006-2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+
+using Mono.Unix;
+
+namespace Banshee.Collection
+{
+    public static class NameConversionHelper
+    {   
+        public static string DisplayArtist (string orig_name)
+        {
+            return Name (orig_name, DisplayType.Artist);
+        }
+        
+        public static string DisplayAlbum (string orig_name)
+        {
+            return Name (orig_name, DisplayType.Album);
+        }
+        
+        public static string DisplayTitle (string orig_name)
+        {
+            return Name (orig_name, DisplayType.Title);
+        }
+
+        //FIXME: disabled until someone makes it configurable via GUI
+        //see http://bugzilla.gnome.org/show_bug.cgi?id=499650
+        private static bool article_supression = false;
+
+        public static string SortableArtist (string orig_name)
+        {
+            string name_to_sort = DisplayArtist (orig_name).ToLower ();
+            
+            if (article_supression)
+                name_to_sort = ArticleFilter (name_to_sort);
+
+            return name_to_sort;
+        }
+        
+        public static string SortableAlbum (string orig_name)
+        {
+            return DisplayAlbum (orig_name).ToLower ();
+        }
+
+        public static string SortableTitle (string orig_name)
+        {
+            return DisplayTitle (orig_name).ToLower ();
+        }
+
+        private enum DisplayType {
+            Artist, 
+            Album,
+            Title
+        }
+        
+        private static string Name (string orig_name, DisplayType type)
+        {
+            string name = orig_name == null ? null : orig_name.Trim ();
+            return String.IsNullOrEmpty (name)
+                ? MetaString (name, type) 
+                : name; 
+        }
+        
+        private static string MetaString (string str, DisplayType type)
+        {
+            switch(type){
+            case DisplayType.Album:
+                str = Catalog.GetString ("Unknown Album");
+                break;
+            case DisplayType.Artist:
+                str = Catalog.GetString ("Unknown Artist");
+                break;
+            case DisplayType.Title:
+                str = Catalog.GetString ("Unknown Title");
+                break;
+            }
+            return String.Format ("[ {0} ]", str);
+        }
+
+        private static string ArticleFilter (string name)
+        {
+            //FIXME: add all possible articles from all possible languages?
+            List <string> articles = new List <string>();
+            articles.Add ("the");
+
+            foreach(string article in articles)
+            {
+                int len = article.Length + 1;
+                if (len >= name.Length)
+                    continue;
+                if (name.Substring (0, len) == (article + " ")) {
+                    return name.Substring (len);
+                }
+            }
+
+            return name;
+        }
+    }
+}
Index: src/Core/Banshee.Core/Makefile.am
===================================================================
--- src/Core/Banshee.Core/Makefile.am	(revision 3922)
+++ src/Core/Banshee.Core/Makefile.am	(working copy)
@@ -19,6 +19,7 @@
 	Banshee.Collection/FileTrackInfo.cs \
 	Banshee.Collection/IBasicTrackInfo.cs \
 	Banshee.Collection/ITrackInfo.cs \
+	Banshee.Collection/NameConversionHelper.cs \
 	Banshee.Collection/SampleTrackInfo.cs \
 	Banshee.Collection/TrackAttributes.cs \
 	Banshee.Collection/TrackFilterType.cs \
Index: src/Core/Banshee.Core/Banshee.Core.mdp
===================================================================
--- src/Core/Banshee.Core/Banshee.Core.mdp	(revision 3922)
+++ src/Core/Banshee.Core/Banshee.Core.mdp	(working copy)
@@ -67,6 +67,7 @@
     <File name="Banshee.Core.addin.xml" subtype="Code" buildaction="EmbedAsResource" />
     <File name="Banshee.Collection/TrackMediaAttributes.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Base/XdgBaseDirectorySpec.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Collection/NameConversionHelper.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Project" localcopy="False" refto="Hyena" />
