banshee r3292 - in trunk/banshee: . src/Core/Banshee.Services src/Core/Banshee.Services/Banshee.Library src/Core/Banshee.Services/Banshee.PlayerMigration src/Core/Banshee.ThickClient src/Core/Banshee.Widgets src/Extensions/Banshee.Lastfm



Author: scottp
Date: Thu Feb 21 08:24:45 2008
New Revision: 3292
URL: http://svn.gnome.org/viewvc/banshee?rev=3292&view=rev

Log:
This commit begins to port the player migration namespace from stable into trunk.
I've only done the Amarok importer as a proof-of-concept and I haven't tested it. This
commit is more about laying out the namespace/object design for the player migration
stuff for critique. What is presented here in this patch is subject to change if anyone
wants to massage it a little more. Otherwise I'll go ahead with porting/testing the other
player migrators. So please provide feedback!

* src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs:
  Added a base class for IImportSources which will perform a
  single-method import operation in a ThreadPool thread.

* src/Core/Banshee.Services/Banshee.Library/ImportSourceManager.cs:
  Added Amarok importer to import sources.

* src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs:
  Created a new public method AddTrackToLibrary, which contains the
  logic for adding a track to the library and hooking up the related
  Artist and Album infos.

* src/Core/Banshee.Services/Banshee.PlayerMigration/AmarokPlayerImportSource.cs:
  Ported the Amarok importer from stable. NOTE: I don't have Amarok -
  and it's 3am - so I haven't tested this. It needs testing! SOMEONE
  TEST THIS!!!

Added:
   trunk/banshee/src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.PlayerMigration/
   trunk/banshee/src/Core/Banshee.Services/Banshee.PlayerMigration/AmarokPlayerImportSource.cs
Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Core/Banshee.Services/Banshee.Library/ImportSourceManager.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Services.mdp
   trunk/banshee/src/Core/Banshee.Services/Makefile.am
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.mdp
   trunk/banshee/src/Core/Banshee.Widgets/Banshee.Widgets.mdp
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.mdp

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Library/ImportSourceManager.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Library/ImportSourceManager.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Library/ImportSourceManager.cs	Thu Feb 21 08:24:45 2008
@@ -31,6 +31,7 @@
 using System.Collections.Generic;
 using Mono.Addins;
 
+using Banshee.PlayerMigration;
 using Banshee.ServiceStack;
 
 namespace Banshee.Library
@@ -48,6 +49,10 @@
             if (import_sources == null) {
                 import_sources = new List<IImportSource> ();
                 import_sources.Add (new HomeDirectoryImportSource ());
+                
+                if (AmarokPlayerImportSource.StaticCanImport) {
+                    import_sources.Add (new AmarokPlayerImportSource ());
+                }
             
                 foreach (IImportSource source in AddinManager.GetExtensionObjects ("/Banshee/Library/ImportSource")) {
                     if (source.CanImport) {

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs	Thu Feb 21 08:24:45 2008
@@ -100,36 +100,7 @@
             }
             
             try {            
-                SafeUri uri = new SafeUri (path);
-
-                DatabaseTrackInfo track = null;
-                
-                /*if (DatabaseTrackInfo.ContainsUri (uri)) {
-                    IncrementProcessedCount (null);
-                    return;
-                }*/
-
-                TagLib.File file = StreamTagger.ProcessUri (uri);
-                track = new DatabaseTrackInfo ();
-                StreamTagger.TrackInfoMerge (track, file);
-                
-                SafeUri newpath = track.CopyToLibrary ();
-                if (newpath != null) {
-                    track.Uri = newpath;
-                }
-
-                ThreadAssist.ProxyToMain (delegate {
-                    track.DateAdded = DateTime.Now;
-                    LibraryArtistInfo artist = new LibraryArtistInfo (track.ArtistName);
-                    track.ArtistId = artist.DbId;
-                    track.AlbumId = new LibraryAlbumInfo (artist, track.AlbumTitle).DbId;
-
-                    artist.Save ();
-
-                    track.SourceId = library_source_id;
-                    track.Save ();
-                    ServiceManager.SourceManager.Library.Reload (200);
-                });
+                DatabaseTrackInfo track = AddTrackToLibrary (path);
                 
                 if (track != null && track.DbId > 0) {
                     IncrementProcessedCount (String.Format ("{0} - {1}", track.DisplayArtistName, track.DisplayTrackTitle));
@@ -139,6 +110,45 @@
                 IncrementProcessedCount (null);
             }
         }
+        
+        public DatabaseTrackInfo AddTrackToLibrary (string path)
+        {
+            return AddTrackToLibrary (new SafeUri (path));
+        }
+        
+        public DatabaseTrackInfo AddTrackToLibrary (SafeUri uri)
+        {
+            DatabaseTrackInfo track = null;
+            
+            /*if (DatabaseTrackInfo.ContainsUri (uri)) {
+                IncrementProcessedCount (null);
+                return;
+            }*/
+
+            TagLib.File file = StreamTagger.ProcessUri (uri);
+            track = new DatabaseTrackInfo ();
+            StreamTagger.TrackInfoMerge (track, file);
+            
+            SafeUri newpath = track.CopyToLibrary ();
+            if (newpath != null) {
+                track.Uri = newpath;
+            }
+
+            ThreadAssist.ProxyToMain (delegate {
+                track.DateAdded = DateTime.Now;
+                LibraryArtistInfo artist = new LibraryArtistInfo (track.ArtistName);
+                track.ArtistId = artist.DbId;
+                track.AlbumId = new LibraryAlbumInfo (artist, track.AlbumTitle).DbId;
+
+                artist.Save ();
+
+                track.SourceId = library_source_id;
+                track.Save ();
+                ServiceManager.SourceManager.Library.Reload (200);
+            });
+            
+            return track;
+        }
 
         private void LogError (string path, Exception e)
         {

Added: trunk/banshee/src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Library/ThreadPoolImportSource.cs	Thu Feb 21 08:24:45 2008
@@ -0,0 +1,148 @@
+//
+// ThreadPoolImportSource.cs
+//
+// Author:
+//   Scott Peterson <lunchtimemama gmail com>
+//
+// Copyright (C) 2008 Scott Peterson
+//
+// 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.IO;
+using System.Threading;
+
+using Hyena;
+using Mono.Unix;
+
+using Banshee.ServiceStack;
+using Banshee.Sources;
+
+namespace Banshee.Library
+{
+    public abstract class ThreadPoolImportSource : IImportSource
+    {
+        private bool importing;
+        private UserJob user_job;
+        private readonly object user_job_mutex = new object ();
+        
+        private void CreateUserJob ()
+        {
+            lock (user_job_mutex) {
+                if(user_job != null) {
+                    return;
+                }
+                
+                user_job = new UserJob (UserJobTitle, UserJobTitle, Catalog.GetString ("Importing Songs"));
+                user_job.IconNames = IconNames;
+                user_job.CancelMessage = CancelMessage;
+                user_job.CanCancel = CanCancel;
+                user_job.Register ();
+            }
+        }
+        
+        private void DestroyUserJob ()
+        {
+            lock(user_job_mutex) {
+                if(user_job == null) {
+                    return;
+                }
+                
+                user_job.Finish ();
+                user_job = null;
+            }
+        }
+        
+        protected void UpdateUserJob (int processed, int count, string artist, string title)
+        {
+            user_job.Title = String.Format(
+                Catalog.GetString("Importing {0} of {1}"),
+                processed, count);
+            user_job.Status = String.Format("{0} - {1}", artist, title);
+            user_job.Progress = processed / (double)count;
+        }
+        
+        protected void LogError (string path, Exception e)
+        {
+            LogError (path, e.Message);
+        }
+
+        protected void LogError (string path, string msg)
+        {
+            ErrorSource error_source = ServiceManager.SourceManager.Library.ErrorSource;
+            error_source.AddMessage (Path.GetFileName (path), msg);
+            
+            Log.Error (path, msg, false);
+        }
+        
+        protected bool CheckForCanceled ()
+        {
+            lock(user_job_mutex) {
+                return user_job != null && user_job.IsCancelRequested;
+            }
+        }
+        
+        protected virtual string UserJobTitle {
+            get { return String.Format (Catalog.GetString ("Importing Songs from {0}"), Name); }
+        }
+        
+        protected virtual string CancelMessage {
+            get { return Catalog.GetString ("The import process is currently running. Would you like to stop it?"); }
+        }
+    
+        protected virtual bool CanCancel {
+            get { return true; }
+        }
+        
+#region IImportSource
+        
+    	public abstract string Name { get; }
+
+    	public abstract string[] IconNames { get; }
+
+    	public virtual bool CanImport {
+    	    get { return true; }
+    	}
+
+        public void Import ()
+        {
+            if (importing) {
+                return;
+            }
+            
+            importing = true;
+            CreateUserJob ();
+            ThreadPool.QueueUserWorkItem (DoImport);
+            DestroyUserJob ();
+            importing = false;
+        }
+        
+#endregion
+        
+        private void DoImport (object o)
+        {
+            DoImport ();
+        }
+        
+        protected abstract void DoImport ();
+        
+    }
+}

Added: trunk/banshee/src/Core/Banshee.Services/Banshee.PlayerMigration/AmarokPlayerImportSource.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.PlayerMigration/AmarokPlayerImportSource.cs	Thu Feb 21 08:24:45 2008
@@ -0,0 +1,229 @@
+//
+// AmarokPlayerImportSource.cs
+//
+// Author:
+//   Sebastian DrÃge <slomo circular-chaos org>
+//   Scott Peterson <lunchtimemama gmail com>
+//
+// Copyright (C) 2006 Sebastian DrÃge, Scott Peterson
+//
+// 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.Data;
+using System.IO;
+
+using Mono.Data.Sqlite;
+using Mono.Unix;
+
+using Banshee.Base;
+using Banshee.Collection.Database;
+using Banshee.Library;
+using Banshee.ServiceStack;
+
+namespace Banshee.PlayerMigration
+{
+    public sealed class AmarokPlayerImportSource : ThreadPoolImportSource
+    {
+        private static readonly string library_path = Path.Combine ( Path.Combine (Path.Combine (Path.Combine (Path.Combine (
+                                                 Environment.GetFolderPath(Environment.SpecialFolder.Personal),
+                                                 ".kde"),
+                                                 "share"),
+                                                 "apps"),
+                                                 "amarok"),
+                                                 "collection.db");
+
+        protected override void DoImport ()
+        {
+            LibraryImportManager import_manager = ServiceManager.Get<LibraryImportManager> ("LibraryImportManager");
+            IDbConnection conn;
+
+            try {
+                conn = new SqliteConnection ("Version=3,URI=file://" + library_path);
+                conn.Open ();
+            } catch (Exception e) {
+                LogError (library_path, String.Format (
+                    "Unable to open Amarok database: {0}", e.Message));
+                return;
+            }
+            
+            int count = 0;
+            try {
+                IDbCommand cmd = conn.CreateCommand ();
+                cmd.CommandText = @"
+                                    SELECT COUNT(*)
+                                    FROM tags";
+                count = Convert.ToInt32 (cmd.ExecuteScalar ());
+            } catch (Exception) {}
+
+            try {
+                IDbCommand cmd = conn.CreateCommand ();
+                cmd.CommandText = @"
+                                    CREATE TEMP TABLE devices_tmp
+                                           (id INTEGER PRIMARY KEY,
+                                            lastmountpoint VARCHAR(255));
+                                    INSERT INTO devices_tmp (id, lastmountpoint)
+                                           SELECT devices.id,
+                                                  devices.lastmountpoint
+                                           FROM devices;
+                                    INSERT OR IGNORE INTO devices_tmp (id, lastmountpoint)
+                                           VALUES (-1, '/');";
+                cmd.ExecuteNonQuery ();
+                
+                cmd = conn.CreateCommand ();
+                cmd.CommandText = @"
+                                    SELECT DISTINCT
+                                           devices_tmp.lastmountpoint,
+                                           tags.url,
+                                           tags.title,
+                                           artist.name,
+                                           genre.name,
+                                           album.name,
+                                           year.name,
+                                           tags.track,
+                                           tags.length,
+                                           tags.deviceid
+                                     FROM  tags,
+                                           devices_tmp,
+                                           artist,
+                                           album,
+                                           genre,
+                                           year
+                                     WHERE tags.deviceid = devices_tmp.id
+                                       AND tags.artist = artist.id
+                                       AND tags.album = album.id
+                                       AND tags.genre = genre.id
+                                       AND tags.year = year.id";
+
+                 IDataReader reader = cmd.ExecuteReader ();
+                 int processed = 0;
+
+                 while (reader.Read ()) {
+                     if (CheckForCanceled ())
+                         break;
+
+                     processed++;
+
+                     try {
+                         string mountpoint = (string) reader[0], path = (string) reader[1];
+                         SafeUri uri = null;
+                         if (path.StartsWith ("./")) {
+                             uri = new SafeUri (Path.Combine (mountpoint, path.Substring (2)));
+                         } else if (path.StartsWith ("/")) {
+                             uri = new SafeUri (path);
+                         } else {
+                             continue;
+                         }
+
+                         string title = (string) reader[2];
+                         string artist = (string) reader[3];
+                         
+                         // the following fields are not critical and can be skipped if something goes wrong
+                         string genre = reader[4] as string;
+                         string album = reader[5] as string;
+                         int year = 0, rating = 0, playcount = 0;
+                         uint track_number = 0;
+                         TimeSpan duration = TimeSpan.Zero;
+
+                         try {
+                             year = Int32.Parse ((string) reader[6]);
+                         } catch (Exception) {}
+
+                         try {
+                             track_number = Convert.ToUInt32 ((long) reader[7]);
+                         } catch (Exception) {}
+
+                         try {
+                             duration = TimeSpan.FromSeconds ((int) reader[8]);
+                         } catch (Exception) {}
+
+                         // Try to read stats
+                         try {
+                             int deviceid = Convert.ToInt32 (reader [9]);
+
+                             IDbCommand stats_cmd = conn.CreateCommand ();
+                             stats_cmd.CommandText = @"
+                                                     SELECT DISTINCT
+                                                            statistics.percentage,
+                                                            statistics.playcounter
+                                                     FROM   statistics
+                                                     WHERE  statistics.url = :path
+                                                       AND  statistics.deviceid = :deviceid";
+                             stats_cmd.Parameters.Add (new SqliteParameter ("path", path));
+                             stats_cmd.Parameters.Add (new SqliteParameter ("deviceid", deviceid));
+
+                             IDataReader stats_reader = stats_cmd.ExecuteReader ();
+
+                             while (stats_reader.Read ()) {
+                                 rating = (int) Math.Round (5.0 * (Convert.ToDouble (stats_reader[0]) / 100.0));
+                                 playcount = Convert.ToInt32 (stats_reader[1]);
+                             }
+                             stats_reader.Close ();
+                         } catch (Exception) {}
+
+                         UpdateUserJob (processed, count, artist, title);
+                     
+                         try {
+                             DatabaseTrackInfo track = import_manager.AddTrackToLibrary (uri);
+                            
+                             if (track == null) {
+                                 throw new Exception (String.Format ("Unable to import track: {0}", uri.AbsoluteUri));
+                             }
+                            
+                             track.Rating = rating;
+                             track.PlayCount = playcount;
+                             track.Save ();
+                         } catch (Exception e) {
+                             LogError (SafeUri.UriToFilename (uri), e);
+                         }
+                     } catch (Exception) {
+                         // something went wrong, skip entry
+                     }
+                 }
+
+                 try {
+                     reader.Close ();
+                     conn.Close ();
+                 } catch (Exception) {}
+            } catch (Exception e) {
+                LogError (library_path, "Importing from Amarok database failed");
+            }
+        }
+        
+        public static bool StaticCanImport
+        {
+            get { return File.Exists (library_path); }
+        }
+        
+        public override string Name
+        {
+            get { return Catalog.GetString ("Amarok"); }
+        }
+
+        public override string [] IconNames {
+            get { return new string [] { "system-search" }; }
+        }
+        
+        public override bool CanImport {
+            get { return StaticCanImport; }
+        }
+    }
+}
\ No newline at end of file

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Services.mdp
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Services.mdp	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Services.mdp	Thu Feb 21 08:24:45 2008
@@ -122,6 +122,9 @@
     <File name="Banshee.Query/SmartPlaylistQueryValue.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Query/YearQueryValue.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.MediaEngine/NullPlayerEngine.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.PlayerMigration" subtype="Directory" buildaction="Compile" />
+    <File name="Banshee.PlayerMigration/AmarokPlayerImportSource.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Library/ThreadPoolImportSource.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
@@ -146,4 +149,4 @@
     <AsmRefVar />
     <ProjectRefVar />
   </MonoDevelop.Autotools.MakefileInfo>
-</Project>
+</Project>
\ No newline at end of file

Modified: trunk/banshee/src/Core/Banshee.Services/Makefile.am
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Makefile.am	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Makefile.am	Thu Feb 21 08:24:45 2008
@@ -12,9 +12,9 @@
 	Banshee.Base/ThreadAssist.cs \
 	Banshee.Collection.Database/AlbumListDatabaseModel.cs \
 	Banshee.Collection.Database/ArtistListDatabaseModel.cs \
+	Banshee.Collection.Database/DatabaseTrackInfo.cs \
 	Banshee.Collection.Database/LibraryAlbumInfo.cs \
 	Banshee.Collection.Database/LibraryArtistInfo.cs \
-	Banshee.Collection.Database/DatabaseTrackInfo.cs \
 	Banshee.Collection.Database/TrackListDatabaseModel.cs \
 	Banshee.Collection/AlbumListModel.cs \
 	Banshee.Collection/ArtistListModel.cs \
@@ -39,6 +39,7 @@
 	Banshee.Library/ImportSourceManager.cs \
 	Banshee.Library/LibraryImportManager.cs \
 	Banshee.Library/LibrarySource.cs \
+	Banshee.Library/ThreadPoolImportSource.cs \
 	Banshee.MediaEngine/IEqualizer.cs \
 	Banshee.MediaEngine/IPlayerEngineService.cs \
 	Banshee.MediaEngine/NullPlayerEngine.cs \
@@ -68,6 +69,7 @@
 	Banshee.PlaybackController/PlaybackControllerService.cs \
 	Banshee.PlaybackController/PlaybackRepeatMode.cs \
 	Banshee.PlaybackController/PlaybackShuffleMode.cs \
+	Banshee.PlayerMigration/AmarokPlayerImportSource.cs \
 	Banshee.Playlist/AbstractPlaylistSource.cs \
 	Banshee.Playlist/PlaylistFileUtil.cs \
 	Banshee.Playlist/PlaylistSource.cs \

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.mdp
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.mdp	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.mdp	Thu Feb 21 08:24:45 2008
@@ -93,6 +93,7 @@
     <File name="Banshee.Sources.Gui/CompositeTrackSourceContents.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Sources.Gui/ISourceContents.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Sources.Gui/ObjectListSourceContents.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Playlist.Gui/PlaylistExportDialog.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Project" localcopy="False" refto="Hyena.Gui" />

Modified: trunk/banshee/src/Core/Banshee.Widgets/Banshee.Widgets.mdp
==============================================================================
--- trunk/banshee/src/Core/Banshee.Widgets/Banshee.Widgets.mdp	(original)
+++ trunk/banshee/src/Core/Banshee.Widgets/Banshee.Widgets.mdp	Thu Feb 21 08:24:45 2008
@@ -42,6 +42,7 @@
     <File name="Banshee.Widgets/GenericToolItem.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Widgets/CustomActionProxy.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Widgets/RatingActionProxy.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Widgets/MenuTile.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="gtk-sharp, Version=2.8.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />

Modified: trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.mdp	Thu Feb 21 08:24:45 2008
@@ -50,4 +50,4 @@
   <DeploymentInformation strategy="File">
     <excludeFiles />
   </DeploymentInformation>
-</Project>
+</Project>
\ No newline at end of file



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