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
- From: scottp svn gnome org
- To: svn-commits-list gnome org
- Subject: 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
- Date: Thu, 21 Feb 2008 08:24:45 +0000 (GMT)
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]