banshee r3236 - in trunk/banshee: . build src src/Backends/Banshee.GStreamer/Banshee.GStreamer src/Backends/Banshee.Unix/Banshee.IO.Unix src/Core src/Core/Banshee.Core src/Core/Banshee.Core/Banshee.Base src/Core/Banshee.Core/Banshee.Collection src/Core/Banshee.Core/Banshee.Configuration src/Core/Banshee.Core/Banshee.IO src/Core/Banshee.Services src/Core/Banshee.Services/Banshee.Collection src/Core/Banshee.Services/Banshee.Collection.Database src/Core/Banshee.Services/Banshee.Library src/Core/Banshee.Services/Banshee.MediaEngine src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz src/Core/Banshee.Services/Banshee.Metadata.Rhapsody src/Core/Banshee.Services/Banshee.Networking src/Core/Banshee.Services/Banshee.PlaybackController src/Core/Banshee.Services/Banshee.ServiceStack src/Core/Banshee.Services/Banshee.SmartPlaylist src/Core/Banshee.Services/Banshee.Sources src/Core/Banshee.Services/Banshee.Streaming src/Core/Banshee.Services/Banshee.Web src/Core/Banshee.ThickC lient src/Core/Banshee.ThickClient/Banshee.Collection.Gui src/Core/Banshee.ThickClient/Banshee.Gui src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs src/Core/Banshee.ThickClient/Banshee.Gui.Widgets src/Core/Banshee.ThickClient/Banshee.Sources.Gui src/Core/Banshee.ThickClient/Resources src/Core/Hyena src/Core/Hyena.Gui src/Extensions src/Extensions/Banshee.Lastfm src/Extensions/Banshee.Lastfm/Banshee.Lastfm src/Extensions/Banshee.Lastfm/Resources src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys src/Libraries src/Libraries/Hyena src/Libraries/Hyena.Gui src/Libraries/Hyena/Hyena src/Libraries/Hyena/Hyena.Data src/Libraries/Lastfm src/Libraries/Lastfm.Gui src/Libraries/Lastfm/Lastfm src/Libraries/Mono.Media src/Libraries/Mono.Media/Media.Playlists.Xspf src/Libraries/Mono.Media/Playlists.Xspf



Author: gburt
Date: Thu Feb 14 18:07:56 2008
New Revision: 3236
URL: http://svn.gnome.org/viewvc/banshee?rev=3236&view=rev

Log:
2008-02-14  Gabriel Burt  <gabriel burt gmail com>

	The Last.fm extension can actually play music now.  Still need to port the
	status bar.  Also, moved Hyena and Hyena.Gui out of Core and into Libraries.

	* build/build.environment.mk: Libraries/Lastfm depends on Libraries/Hyena
	for logging.

	* configure.ac:
	* src/Banshee.mds:
	* src/Core/Banshee.Core/Makefile.am:
	* src/Core/Core.mds: Reflect new organization.

	* src/Libraries/Hyena/Makefile.am:
	* src/Libraries/Hyena/Hyena.mdp:
	* src/Core/Banshee.Core/Banshee.Core.mdp:
	* src/Core/Banshee.Core/Banshee.Base/Log.cs:
	* src/Libraries/Hyena/Hyena/Log.cs: Move Log to Hyena, replace
	ApplicationContext dep with Debugging property.

	* src/Core/Banshee.Core/Banshee.Collection/UnknownTrackInfo.cs:
	* src/Core/Banshee.Core/Banshee.Collection/SampleTrackInfo.cs:
	* src/Core/Banshee.Services/Banshee.Collection.Database/LibraryTrackInfo.cs:
	* src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs:
	* src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs: Add/use properties
	for all attributes - the flags are way to painful an API.

	* src/Core/Banshee.Services/Banshee.Services.mdp:

	* src/Core/Banshee.Services/Banshee.Sources/Source.cs: Fix whitespace.  If
	the defining assembly for a source is not Banshee.Services, record it for
	use when retrieving resources.

	* src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs:
	* src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs:
	* src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs:
	* src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys/MultimediaKeysService.cs:
	* src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:
	* src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs:
	* src/Core/Banshee.Core/Banshee.Configuration/ConfigurationClient.cs:
	* src/Core/Banshee.Core/Banshee.IO/Provider.cs:
	* src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistCore.cs:
	* src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:
	* src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs:
	* src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs:
	* src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs:
	* src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz/MusicBrainzQueryJob.cs:
	* src/Core/Banshee.Services/Banshee.Metadata.Rhapsody/RhapsodyQueryJob.cs:
	* src/Core/Banshee.Services/Banshee.Networking/NetworkDetect.cs:
	* src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs:
	* src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs:
	* src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs:
	* src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs:
	* src/Core/Banshee.Services/Banshee.Web/Browser.cs: Add using Hyena.

	* src/Core/Banshee.Core/Banshee.Base/ApplicationContext.cs: Add static
	ctor that sets Hyena.Log.Debugging.

	* src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtworkManager.cs:
	* src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs:

	* src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/GladeDialog.cs: Add
	ctor from stable.

	* src/Core/Banshee.ThickClient/Banshee.Gui/IconThemeUtils.cs: Support
	loading resources from arbitrary assemblies (eg from extensions).

	* src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs:
	Specify the Source's defining assembly as the assembly to load the icon
	resource from.

	* src/Core/Banshee.ThickClient/Banshee.ThickClient.addin.xml:

	* src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml: Add
	RefreshSmartPlaylist action to the Edit menu, and add a BelowAddToPlaylist
	placeholder in the track context menu.

	* src/Core/Makefile.am:
	* src/Core/Hyena.Gui/*:
	* src/Core/Hyena/*: Move Hyena* to src/Libraries

	* src/Libraries/Makefile.am:
	* src/Libraries/Libraries.mds: Add Hyena and Hyena.Gui.

	* src/Extensions/Extensions.mds: Add Banshee.Lastfm.
	* src/Extensions/Makefile.am: Add Banshee.Lastfm to the build.

	* src/Extensions/Banshee.Lastfm/Banshee.Lastfm.mdp: Reflect new/removed
	files.

	* src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastFMSource.cs:
	* src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmSource.cs:
	* src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastFMTrackInfo.cs:
	* src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmTrackInfo.cs:
	* src/Extensions/Banshee.Lastfm/Resources/Banshee.LastFM.addin.xml:
	* src/Extensions/Banshee.Lastfm/Resources/Banshee.Lastfm.addin.xml:
	Lower case fm.

	* src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmActions.cs:

	* src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmTrackListModel.cs:
	New List<TrackInfo> based model.

	* src/Extensions/Banshee.Lastfm/Resources/Actions.xml:
	* src/Extensions/Banshee.Lastfm/Banshee.Lastfm/Plugin.cs: Removed.

	* src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationEditor.cs: 
	* src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationSource.cs: Update
	headers, fix creation/saving, use new model.

	* src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationType.cs: Update
	header.

	* src/Extensions/Banshee.Lastfm/Makefile.am:
	* src/Extensions/Banshee.Lastfm/Resources/ActiveSourceUI.xml:
	* src/Extensions/Banshee.Lastfm/Resources/GlobalUI.xml: New action
	resources.

	* src/Libraries/Hyena/Hyena.Data/IFilterable.cs:
	* src/Libraries/Hyena/Hyena.Data/ISortable.cs: Whitespace.

	* src/Libraries/Hyena/Hyena.Data/PropertyStore.cs: Whitespace, reorder
	some logic.

	* src/Libraries/Lastfm.Gui/Lastfm.Gui.mdp:
	* src/Libraries/Lastfm/Lastfm.mdp:
	* src/Libraries/Mono.Media/Mono.Media.mdp: New mdp files.

	* src/Libraries/Lastfm/Lastfm/Account.cs: Remove abstract class modifier.

	* src/Libraries/Lastfm/Lastfm/Connection.cs: Use Hyena.Log for logging msgs.

	* src/Libraries/Mono.Media/Makefile.am:
	* src/Libraries/Mono.Media/Playlists.Xspf/*:
	* src/Libraries/Mono.Media/Media.Playlists.Xspf/*: Change namespace to
	Media.Playlists.Xspf.  Merge fix for not-quite-compliant Last.fm Playlist
	files from stable.


Added:
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.dll.config.in   (props changed)
      - copied unchanged from r3228, /trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Plugins.LastFM.dll.config.in
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.mdp   (contents, props changed)
      - copied, changed from r3228, /trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Plugins.LastFM.mdp
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmActions.cs
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmSource.cs
      - copied, changed from r3228, /trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastFMSource.cs
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmTrackInfo.cs
      - copied, changed from r3228, /trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastFMTrackInfo.cs
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmTrackListModel.cs
   trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/ActiveSourceUI.xml
   trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/Banshee.Lastfm.addin.xml   (contents, props changed)
      - copied, changed from r3228, /trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/Banshee.LastFM.addin.xml
   trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/GlobalUI.xml   (contents, props changed)
      - copied, changed from r3228, /trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/Actions.xml
   trunk/banshee/src/Libraries/Hyena/   (props changed)
      - copied from r3233, /trunk/banshee/src/Core/Hyena/
   trunk/banshee/src/Libraries/Hyena.Gui/   (props changed)
      - copied from r3233, /trunk/banshee/src/Core/Hyena.Gui/
   trunk/banshee/src/Libraries/Hyena/Hyena/Log.cs   (contents, props changed)
      - copied, changed from r3233, /trunk/banshee/src/Core/Banshee.Core/Banshee.Base/Log.cs
   trunk/banshee/src/Libraries/Lastfm.Gui/Lastfm.Gui.mdp
   trunk/banshee/src/Libraries/Libraries.mds
   trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/
      - copied from r3233, /trunk/banshee/src/Libraries/Mono.Media/Playlists.Xspf/
   trunk/banshee/src/Libraries/Mono.Media/Mono.Media.mdp
Removed:
   trunk/banshee/src/Core/Banshee.Core/Banshee.Base/Log.cs
   trunk/banshee/src/Core/Hyena/
   trunk/banshee/src/Core/Hyena.Gui/
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastFMSource.cs
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastFMTrackInfo.cs
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/Plugin.cs
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Plugins.LastFM.dll.config.in
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Plugins.LastFM.mdp
   trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/Actions.xml
   trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/Banshee.LastFM.addin.xml
   trunk/banshee/src/Libraries/Mono.Media/Playlists.Xspf/
Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/build/build.environment.mk
   trunk/banshee/configure.ac
   trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
   trunk/banshee/src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs
   trunk/banshee/src/Banshee.mds
   trunk/banshee/src/Core/Banshee.Core/Banshee.Base/ApplicationContext.cs
   trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/SampleTrackInfo.cs
   trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
   trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/UnknownTrackInfo.cs
   trunk/banshee/src/Core/Banshee.Core/Banshee.Configuration/ConfigurationClient.cs
   trunk/banshee/src/Core/Banshee.Core/Banshee.Core.mdp
   trunk/banshee/src/Core/Banshee.Core/Banshee.IO/Provider.cs
   trunk/banshee/src/Core/Banshee.Core/Makefile.am
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/LibraryTrackInfo.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz/MusicBrainzQueryJob.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Metadata.Rhapsody/RhapsodyQueryJob.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Networking/NetworkDetect.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Services.mdp
   trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistCore.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/Source.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Web/Browser.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtworkManager.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/GladeDialog.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/IconThemeUtils.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.addin.xml
   trunk/banshee/src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml
   trunk/banshee/src/Core/Core.mds
   trunk/banshee/src/Core/Makefile.am
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationEditor.cs
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationSource.cs
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationType.cs
   trunk/banshee/src/Extensions/Banshee.Lastfm/Makefile.am
   trunk/banshee/src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys/MultimediaKeysService.cs
   trunk/banshee/src/Extensions/Extensions.mds
   trunk/banshee/src/Extensions/Makefile.am
   trunk/banshee/src/Libraries/Hyena/Hyena.Data/IFilterable.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data/ISortable.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data/PropertyStore.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.mdp
   trunk/banshee/src/Libraries/Hyena/Makefile.am
   trunk/banshee/src/Libraries/Lastfm/Lastfm.mdp
   trunk/banshee/src/Libraries/Lastfm/Lastfm/Account.cs
   trunk/banshee/src/Libraries/Lastfm/Lastfm/Connection.cs
   trunk/banshee/src/Libraries/Makefile.am
   trunk/banshee/src/Libraries/Mono.Media/Makefile.am
   trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/LinkEntry.cs
   trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/MetaEntry.cs
   trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/Playlist.cs
   trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/Track.cs
   trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/W3CDateTime.cs
   trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/XmlUtil.cs
   trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/XspfBaseObject.cs

Modified: trunk/banshee/build/build.environment.mk
==============================================================================
--- trunk/banshee/build/build.environment.mk	(original)
+++ trunk/banshee/build/build.environment.mk	Thu Feb 14 18:07:56 2008
@@ -49,19 +49,32 @@
 #REF_GNOME_KEYRING = $(LINK_DBUS) $(LINK_MONO_POSIX)
 #LINK_GNOME_KEYRING = -r:$(DIR_GNOME_KEYRING)/Gnome.Keyring.dll
 #LINK_GNOME_KEYRING_DEPS = $(REF_GNOME_KEYRING) $(LINK_GNOME_KEYRING)
-#
-REF_LASTFM = $(LINK_SYSTEM) $(LINK_SYSTEM_WEB) $(LINK_MONO_MEDIA) $(LINK_MONO_POSIX)
+
+# Hyena
+REF_HYENA = $(LINK_SYSTEM) $(LINK_SQLITE)
+LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll
+LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA)
+
+# Hyena.Gui
+REF_HYENA_GUI = $(LINK_HYENA_DEPS) $(LINK_MONO_POSIX) $(LINK_CAIRO) $(LINK_GTK)
+LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll
+LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI)
+
+# Lastfm
+REF_LASTFM = $(LINK_SYSTEM) $(LINK_SYSTEM_WEB) $(LINK_MONO_MEDIA) $(LINK_MONO_POSIX) $(LINK_HYENA)
 LINK_LASTFM = -r:$(DIR_BIN)/Lastfm.dll
 LINK_LASTFM_DEPS = $(REF_LASTFM) $(LINK_LASTFM)
 
+# Lastfm.Gui
 REF_LASTFM_GUI = $(LINK_GLIB) $(LINK_GTK) $(LINK_LASTFM_DEPS)
 LINK_LASTFM_GUI = -r:$(DIR_BIN)/Lastfm.Gui.dll
 LINK_LASTFM_GUI_DEPS = $(REF_LASTFM_GUI) $(LINK_LASTFM_GUI)
 
+# Mono.Media
 REF_MONO_MEDIA = $(LINK_SYSTEM)
 LINK_MONO_MEDIA = -r:$(DIR_BIN)/Mono.Media.dll
 LINK_MONO_MEDIA_DEPS = $(REF_MONO_MEDIA) $(LINK_MONO_MEDIA)
-#
+
 #DIR_MUSICBRAINZ = $(DIR_LIBRARIES)/MusicBrainz
 #MONO_BASE_PATH += $(DIR_MUSICBRAINZ)
 #REF_MUSICBRAINZ = $(LINK_SYSTEM)
@@ -70,13 +83,6 @@
 
 
 # Core
-REF_HYENA = $(LINK_SYSTEM) $(LINK_SQLITE)
-LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll
-LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA)
-
-REF_HYENA_GUI = $(LINK_HYENA_DEPS) $(LINK_MONO_POSIX) $(LINK_CAIRO) $(LINK_GTK)
-LINK_HYENA_GUI = -r:$(DIR_BIN)/Hyena.Gui.dll
-LINK_HYENA_GUI_DEPS = $(REF_HYENA_GUI) $(LINK_HYENA_GUI)
 
 REF_BANSHEE_CORE = $(LINK_HYENA_DEPS) $(LINK_MONO_POSIX) $(LINK_GLIB) \
 	$(LINK_DBUS) $(LINK_TAGLIB) $(LINK_MONO_ADDINS_DEPS)
@@ -114,7 +120,7 @@
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
-REF_EXTENSION_LASTFM = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_LAST_FM) -r:System.Data -r:System.Web -r:System.Xml
+REF_EXTENSION_LASTFM = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_MEDIA) $(LINK_LASTFM) $(LINK_LASTFM_GUI)
 
 # Build rules
 # Ignoring 0278 due to a bug in gmcs: 

Modified: trunk/banshee/configure.ac
==============================================================================
--- trunk/banshee/configure.ac	(original)
+++ trunk/banshee/configure.ac	Thu Feb 14 18:07:56 2008
@@ -121,8 +121,6 @@
 src/AssemblyInfo.cs
 
 src/Core/Makefile
-src/Core/Hyena/Makefile
-src/Core/Hyena.Gui/Makefile
 src/Core/Banshee.Core/Makefile
 src/Core/Banshee.Services/Makefile
 src/Core/Banshee.ThickClient/Makefile
@@ -140,9 +138,11 @@
 src/Backends/Banshee.Unix/Makefile
 
 src/Libraries/Makefile
-src/Libraries/Mono.Media/Makefile
+src/Libraries/Hyena/Makefile
+src/Libraries/Hyena.Gui/Makefile
 src/Libraries/Lastfm/Makefile
 src/Libraries/Lastfm.Gui/Makefile
+src/Libraries/Mono.Media/Makefile
 
 src/Extensions/Makefile
 src/Extensions/Banshee.Audioscrobbler/Makefile

Modified: trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
==============================================================================
--- trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs	(original)
+++ trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs	Thu Feb 14 18:07:56 2008
@@ -30,6 +30,7 @@
 using System.Collections;
 using System.Runtime.InteropServices;
 using Mono.Unix;
+using Hyena;
 using Hyena.Data;
 
 using Banshee.Base;

Modified: trunk/banshee/src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs
==============================================================================
--- trunk/banshee/src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs	(original)
+++ trunk/banshee/src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs	Thu Feb 14 18:07:56 2008
@@ -31,6 +31,7 @@
 using System.Collections.Generic;
 using Mono.Unix;
 
+using Hyena;
 using Banshee.Base;
 
 namespace Banshee.IO.Unix

Modified: trunk/banshee/src/Banshee.mds
==============================================================================
--- trunk/banshee/src/Banshee.mds	(original)
+++ trunk/banshee/src/Banshee.mds	Thu Feb 14 18:07:56 2008
@@ -10,10 +10,12 @@
     <Execute type="None" entry="Core" />
     <Execute type="None" entry="Engines" />
     <Execute type="None" entry="Extensions" />
+    <Execute type="None" entry="Libraries" />
   </StartMode>
   <Entries>
     <Entry filename="Core/Core.mds" />
     <Entry filename="Backends/Backends.mds" />
     <Entry filename="Extensions/Extensions.mds" />
+    <Entry filename="Libraries/Libraries.mds" />
   </Entries>
-</Combine>
\ No newline at end of file
+</Combine>

Modified: trunk/banshee/src/Core/Banshee.Core/Banshee.Base/ApplicationContext.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Banshee.Base/ApplicationContext.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Banshee.Base/ApplicationContext.cs	Thu Feb 14 18:07:56 2008
@@ -27,6 +27,8 @@
 //
 
 using System;
+
+using Hyena;
 using Hyena.CommandLine;
 
 namespace Banshee.Base
@@ -66,5 +68,9 @@
         public static System.Globalization.CultureInfo InternalCultureInfo {
             get { return culture_info; }
         }
+
+        static ApplicationContext () {
+            Log.Debugging = Debugging;
+        }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/SampleTrackInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/SampleTrackInfo.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/SampleTrackInfo.cs	Thu Feb 14 18:07:56 2008
@@ -42,7 +42,8 @@
             Duration = TimeSpan.FromSeconds (182);
             Year = 1965;
             
-            Attributes |= TrackAttributes.CanPlay | TrackAttributes.CanSaveToDatabase;
+            CanPlay = true;
+            CanSaveToDatabase = true;
         }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs	Thu Feb 14 18:07:56 2008
@@ -63,14 +63,17 @@
         private int skip_count;
         private DateTime last_played;
         
-        private TrackAttributes attributes;
-        
         private StreamPlaybackError playback_error = StreamPlaybackError.None;
 
         public TrackInfo ()
         {
         }
 
+        public virtual void IncrementPlayCount ()
+        {
+            PlayCount++;
+        }
+
         public override string ToString ()
         {
             return String.Format ("{0} - {1} (on {2}) <{3}> [{4}]", ArtistName, TrackTitle, 
@@ -220,22 +223,27 @@
             set { last_played = value; }
         }
         
-        public virtual TrackAttributes Attributes {
-            get { return attributes; }
-            protected set { attributes = value; }
-        }
-
         public virtual StreamPlaybackError PlaybackError {
             get { return playback_error; }
             set { playback_error = value; }
         }
+
+        private bool can_save_to_database = true;
+        public bool CanSaveToDatabase {
+            get { return can_save_to_database; }
+            set { can_save_to_database = value; }
+        }
         
+        private bool is_live = false;
         public bool IsLive {
-            get { return (Attributes & TrackAttributes.IsLive) == TrackAttributes.IsLive; }
+            get { return is_live; }
+            set { is_live = value; }
         }
 
+        private bool can_play = true;
         public bool CanPlay {
-            get { return (Attributes & TrackAttributes.CanPlay) == TrackAttributes.CanPlay; }
+            get { return can_play; }
+            set { can_play = value; }
         }
         
         // Generates a{sv} of self according to http://wiki.xmms2.xmms.se/index.php/Media_Player_Interfaces#.22Metadata.22

Modified: trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/UnknownTrackInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/UnknownTrackInfo.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/UnknownTrackInfo.cs	Thu Feb 14 18:07:56 2008
@@ -37,7 +37,7 @@
         public UnknownTrackInfo(SafeUri uri) 
         {
             Uri = uri;
-            Attributes |= TrackAttributes.IsLive;
+            IsLive = true;
         }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.Core/Banshee.Configuration/ConfigurationClient.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Banshee.Configuration/ConfigurationClient.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Banshee.Configuration/ConfigurationClient.cs	Thu Feb 14 18:07:56 2008
@@ -29,6 +29,7 @@
 using System;
 using Mono.Addins;
 
+using Hyena;
 using Banshee.Base;
 
 namespace Banshee.Configuration
@@ -99,4 +100,4 @@
             client.Set<T> (@namespace, key, value);
         }
     }
-}
\ No newline at end of file
+}

Modified: trunk/banshee/src/Core/Banshee.Core/Banshee.Core.mdp
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Banshee.Core.mdp	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Banshee.Core.mdp	Thu Feb 14 18:07:56 2008
@@ -40,7 +40,6 @@
     <File name="Banshee.Collection/IBasicTrackInfo.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Configuration.Schema/ImportSchema.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Configuration.Schema/LibrarySchema.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Base/Log.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Base/ProductInformation.cs" subtype="Code" buildaction="Compile" />
     <File name="Resources/contributors.xml" subtype="Code" buildaction="EmbedAsResource" />
     <File name="Resources/translators.xml" subtype="Code" buildaction="EmbedAsResource" />
@@ -82,4 +81,4 @@
     <AsmRefVar />
     <ProjectRefVar />
   </MonoDevelop.Autotools.MakefileInfo>
-</Project>
\ No newline at end of file
+</Project>

Modified: trunk/banshee/src/Core/Banshee.Core/Banshee.IO/Provider.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Banshee.IO/Provider.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Banshee.IO/Provider.cs	Thu Feb 14 18:07:56 2008
@@ -30,6 +30,7 @@
 using System.Reflection;
 using Mono.Addins;
 
+using Hyena;
 using Banshee.Base;
 using Banshee.Configuration;
 

Modified: trunk/banshee/src/Core/Banshee.Core/Makefile.am
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Makefile.am	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Makefile.am	Thu Feb 14 18:07:56 2008
@@ -6,7 +6,6 @@
 	Banshee.Base/CoverArtSpec.cs \
 	Banshee.Base/FileNamePattern.cs \
 	Banshee.Base/Localization.cs \
-	Banshee.Base/Log.cs \
 	Banshee.Base/NamingUtil.cs \
 	Banshee.Base/Paths.cs \
 	Banshee.Base/PlatformHacks.cs \

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/LibraryTrackInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/LibraryTrackInfo.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/LibraryTrackInfo.cs	Thu Feb 14 18:07:56 2008
@@ -66,7 +66,6 @@
         
         public LibraryTrackInfo () : base ()
         {
-            Attributes |= TrackAttributes.CanPlay;
         }
 
         public override void Save ()

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/ImportManager.cs	Thu Feb 14 18:07:56 2008
@@ -32,6 +32,7 @@
 using System.Threading;
 using Mono.Unix;
 
+using Hyena;
 using Banshee.IO;
 using Banshee.Base;
 using Banshee.ServiceStack;

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 14 18:07:56 2008
@@ -31,6 +31,7 @@
 
 using Mono.Unix;
 
+using Hyena;
 using Banshee.Base;
 using Banshee.Sources;
 using Banshee.ServiceStack;

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs	Thu Feb 14 18:07:56 2008
@@ -178,7 +178,7 @@
         protected void OnTagFound (StreamTag tag)
         {
             if (tag.Equals (StreamTag.Zero) || current_track == null || 
-                current_track.Attributes & TrackAttributes.IsLive == 0) {
+                !current_track.IsLive) {
                     return;
             }
                         

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs	Thu Feb 14 18:07:56 2008
@@ -34,6 +34,7 @@
 using Mono.Unix;
 using Mono.Addins;
 
+using Hyena;
 using Banshee.Base;
 using Banshee.Streaming;
 using Banshee.ServiceStack;

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz/MusicBrainzQueryJob.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz/MusicBrainzQueryJob.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Metadata.MusicBrainz/MusicBrainzQueryJob.cs	Thu Feb 14 18:07:56 2008
@@ -33,6 +33,7 @@
 using System.Text;
 using System.Collections.Generic;
 
+using Hyena;
 using Banshee.Base;
 using Banshee.Metadata;
 using Banshee.Kernel;

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Metadata.Rhapsody/RhapsodyQueryJob.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Metadata.Rhapsody/RhapsodyQueryJob.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Metadata.Rhapsody/RhapsodyQueryJob.cs	Thu Feb 14 18:07:56 2008
@@ -34,6 +34,7 @@
 using System.Text.RegularExpressions;
 using System.Collections.Generic;
 
+using Hyena;
 using Banshee.Base;
 using Banshee.Collection;
 using Banshee.Metadata;

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Networking/NetworkDetect.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Networking/NetworkDetect.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Networking/NetworkDetect.cs	Thu Feb 14 18:07:56 2008
@@ -29,6 +29,8 @@
 using System;
 using System.Collections;
 using Mono.Unix;
+
+using Hyena;
 using Banshee.Base;
 
 namespace Banshee.Networking

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs	Thu Feb 14 18:07:56 2008
@@ -28,6 +28,7 @@
 
 using System;
 
+using Hyena;
 using Hyena.Collections;
 
 using Banshee.Base;

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs	Thu Feb 14 18:07:56 2008
@@ -33,6 +33,7 @@
 using NDesk.DBus;
 using org.freedesktop.DBus;
 
+using Hyena;
 using Banshee.Base;
 
 namespace Banshee.ServiceStack

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs	Thu Feb 14 18:07:56 2008
@@ -32,6 +32,7 @@
 
 using Mono.Addins;
 
+using Hyena;
 using Banshee.Base;
 using Banshee.AudioProfiles;
 using Banshee.Sources;

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 14 18:07:56 2008
@@ -61,13 +61,6 @@
     <File name="Banshee.Playlists.Formats/PlaylistFormatDescription.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Playlists.Formats/PlaylistParser.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Playlists.Formats/PlsPlaylistFormat.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Playlists.Formats.Xspf/LinkEntry.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Playlists.Formats.Xspf/MetaEntry.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Playlists.Formats.Xspf/Playlist.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Playlists.Formats.Xspf/Track.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Playlists.Formats.Xspf/W3CDateTime.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Playlists.Formats.Xspf/XmlUtil.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Playlists.Formats.Xspf/XspfBaseObject.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Web/Browser.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Streaming/RadioTrackInfo.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Equalizer/EqualizerSetting.cs" subtype="Code" buildaction="Compile" />
@@ -151,4 +144,4 @@
     <AsmRefVar />
     <ProjectRefVar />
   </MonoDevelop.Autotools.MakefileInfo>
-</Project>
\ No newline at end of file
+</Project>

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistCore.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistCore.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistCore.cs	Thu Feb 14 18:07:56 2008
@@ -5,6 +5,7 @@
 
 using Mono.Unix;
 
+using Hyena;
 using Hyena.Query;
  
 using Banshee.Base;

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs	Thu Feb 14 18:07:56 2008
@@ -34,6 +34,7 @@
 
 using Mono.Unix;
 
+using Hyena;
 using Hyena.Query;
 using Hyena.Data.Sqlite;
  

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/Source.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/Source.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/Source.cs	Thu Feb 14 18:07:56 2008
@@ -27,6 +27,7 @@
 //
 
 using System;
+using System.Reflection;
 using System.Text;
 using System.Collections;
 using System.Collections.Generic;
@@ -44,36 +45,43 @@
     public abstract class Source : ISource
     {
         private Source parent;        
-        private PropertyStore properties = new PropertyStore();
-        private List<Source> child_sources = new List<Source>();
+        private PropertyStore properties = new PropertyStore ();
+        private List<Source> child_sources = new List<Source> ();
 
         public event EventHandler Updated;
         public event EventHandler UserNotifyUpdated;
         public event SourceEventHandler ChildSourceAdded;
         public event SourceEventHandler ChildSourceRemoved;
         
-        protected Source(string generic_name, string name, int order)
+        protected Source (string generic_name, string name, int order)
         {
             GenericName = generic_name;
             Name = name;
             Order = order;
-            
+
+            // If this source is not defined in Banshee.Services, set its
+            // ResourceAssembly to the assembly where it is defined.
+            Assembly asm = Assembly.GetAssembly (this.GetType ());//Assembly.GetCallingAssembly ();
+            if (asm != Assembly.GetExecutingAssembly ()) {
+                Properties.Set<Assembly> ("ResourceAssembly", asm);
+            }
+
             properties.PropertyChanged += OnPropertyChanged;
         }
         
-        protected void OnSetupComplete()
+        protected void OnSetupComplete ()
         {
-            if(this is ITrackModelSource) {
+            if (this is ITrackModelSource) {
                 ITrackModelSource tm_source = (ITrackModelSource)this;
                 
                 tm_source.TrackModel.Parent = this;
-                ServiceManager.DBusServiceManager.RegisterObject(tm_source.TrackModel);
+                ServiceManager.DBusServiceManager.RegisterObject (tm_source.TrackModel);
                 
                 tm_source.ArtistModel.Parent = this;
-                ServiceManager.DBusServiceManager.RegisterObject(tm_source.ArtistModel);
+                ServiceManager.DBusServiceManager.RegisterObject (tm_source.ArtistModel);
                 
                 tm_source.AlbumModel.Parent = this;
-                ServiceManager.DBusServiceManager.RegisterObject(tm_source.AlbumModel);
+                ServiceManager.DBusServiceManager.RegisterObject (tm_source.AlbumModel);
             }
         }
 
@@ -90,17 +98,17 @@
 
 #region Public Methods
         
-        public virtual void Activate()
+        public virtual void Activate ()
         {
         }
 
-        public virtual void Deactivate()
+        public virtual void Deactivate ()
         {
         }
 
-        public virtual void Rename(string newName)
+        public virtual void Rename (string newName)
         {
-            properties.SetString("Name", newName);
+            properties.SetString ("Name", newName);
         }
         
         public virtual bool AcceptsInputFromSource (Source source)
@@ -122,9 +130,9 @@
             this.parent = parent;
         }
         
-        public virtual void AddChildSource(Source child)
+        public virtual void AddChildSource (Source child)
         {
-            lock(Children) {
+            lock (Children) {
                 child.SetParentSource (this);
                 child_sources.Add (child);
                 OnChildSourceAdded (child);
@@ -141,7 +149,7 @@
                 child_sources.Remove (child);
                 
                 if (ServiceManager.SourceManager.ActiveSource == child) {
-                    ServiceManager.SourceManager.SetActiveSource(ServiceManager.SourceManager.DefaultSource);
+                    ServiceManager.SourceManager.SetActiveSource (ServiceManager.SourceManager.DefaultSource);
                 }
                 
                 OnChildSourceRemoved (child);
@@ -150,8 +158,8 @@
         
         public virtual void ClearChildSources ()
         {
-            lock(Children) {
-                while(child_sources.Count > 0) {
+            lock (Children) {
+                while (child_sources.Count > 0) {
                     RemoveChildSource (child_sources[child_sources.Count - 1]);
                 }
             }
@@ -192,39 +200,39 @@
         
 #region Protected Methods
     
-        protected virtual void OnChildSourceAdded(Source source)
+        protected virtual void OnChildSourceAdded (Source source)
         {
             SourceEventHandler handler = ChildSourceAdded;
-            if(handler != null) {
-                SourceEventArgs args = new SourceEventArgs();
+            if (handler != null) {
+                SourceEventArgs args = new SourceEventArgs ();
                 args.Source = source;
-                handler(args);
+                handler (args);
             }
         }
         
-        protected virtual void OnChildSourceRemoved(Source source)
+        protected virtual void OnChildSourceRemoved (Source source)
         {
             SourceEventHandler handler = ChildSourceRemoved;
-            if(handler != null) {
-                SourceEventArgs args = new SourceEventArgs();
+            if (handler != null) {
+                SourceEventArgs args = new SourceEventArgs ();
                 args.Source = source;
-                handler(args);
+                handler (args);
             }
         }
         
-        protected virtual void OnUpdated()
+        protected virtual void OnUpdated ()
         {
             EventHandler handler = Updated;
-            if(handler != null) {
-                handler(this, EventArgs.Empty);
+            if (handler != null) {
+                handler (this, EventArgs.Empty);
             }
         }
         
-        protected virtual void OnUserNotifyUpdated()
+        protected virtual void OnUserNotifyUpdated ()
         {
             EventHandler handler = UserNotifyUpdated;
-            if(handler != null) {
-                handler(this, EventArgs.Empty);
+            if (handler != null) {
+                handler (this, EventArgs.Empty);
             }
         }
         
@@ -232,9 +240,9 @@
         
 #region Private Methods
         
-        private void OnPropertyChanged(object o, PropertyChangeEventArgs args)
+        private void OnPropertyChanged (object o, PropertyChangeEventArgs args)
         {
-            OnUpdated();
+            OnUpdated ();
         }
         
 #endregion
@@ -264,18 +272,18 @@
         }
 
         public string Name {
-            get { return properties.GetString("Name"); }
-            set { properties.SetString("Name", value); }
+            get { return properties.GetString ("Name"); }
+            set { properties.SetString ("Name", value); }
         }
 
         public string GenericName {
-            get { return properties.GetString("GenericName"); }
-            set { properties.SetString("GenericName", value); }
+            get { return properties.GetString ("GenericName"); }
+            set { properties.SetString ("GenericName", value); }
         }
         
         public int Order {
-            get { return properties.GetInteger("Order"); }
-            set { properties.SetInteger("Order", value); }
+            get { return properties.GetInteger ("Order"); }
+            set { properties.SetInteger ("Order", value); }
         }
 
         public virtual bool ImplementsCustomSearch {
@@ -287,18 +295,18 @@
         }
                 
         public virtual string FilterQuery {
-            get { return properties.GetString("FilterQuery"); }
-            set { properties.SetString("FilterQuery", value); }
+            get { return properties.GetString ("FilterQuery"); }
+            set { properties.SetString ("FilterQuery", value); }
         }
         
         public TrackFilterType FilterType {
-            get { return (TrackFilterType)properties.GetInteger("FilterType"); }
-            set { properties.SetInteger("FilterType", (int)value); }
+            get { return (TrackFilterType)properties.GetInteger ("FilterType"); }
+            set { properties.SetInteger ("FilterType", (int)value); }
         }
         
         public virtual bool Expanded {
-            get { return properties.GetBoolean("Expanded"); }
-            set { properties.SetBoolean("Expanded", value); }
+            get { return properties.GetBoolean ("Expanded"); }
+            set { properties.SetBoolean ("Expanded", value); }
         }
         
         public virtual bool? AutoExpand {
@@ -359,7 +367,7 @@
         }
         
         string IService.ServiceName {
-            get { return DBusServiceManager.MakeDBusSafeString(Name) + "Source"; }
+            get { return DBusServiceManager.MakeDBusSafeString (Name) + "Source"; }
         }
         
         IDBusExportable IDBusExportable.Parent {

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Streaming/RadioTrackInfo.cs	Thu Feb 14 18:07:56 2008
@@ -30,7 +30,8 @@
 using System.Threading;
 using System.Collections.Generic;
 
-using Playlists.Xspf;
+using Hyena;
+using Media.Playlists.Xspf;
 
 using Banshee.Base;
 using Banshee.Collection;
@@ -52,7 +53,7 @@
         
         protected RadioTrackInfo()
         {
-            Attributes |= TrackAttributes.IsLive | TrackAttributes.CanPlay;
+            IsLive = true;
         }
         
         public RadioTrackInfo(Track track) : this()

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Web/Browser.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Web/Browser.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Web/Browser.cs	Thu Feb 14 18:07:56 2008
@@ -29,6 +29,7 @@
 using System;
 using Mono.Unix;
 
+using Hyena;
 using Banshee.Base;
 using Banshee.ServiceStack;
 

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtworkManager.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtworkManager.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ArtworkManager.cs	Thu Feb 14 18:07:56 2008
@@ -35,6 +35,7 @@
 
 using Gdk;
 
+using Hyena;
 using Banshee.Base;
 using Banshee.ServiceStack;
 

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/AboutDialog.cs	Thu Feb 14 18:07:56 2008
@@ -33,6 +33,7 @@
 using Gtk;
 using Mono.Unix;
 
+using Hyena;
 using Banshee.Base;
 
 namespace Banshee.Gui.Dialogs

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/GladeDialog.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/GladeDialog.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/GladeDialog.cs	Thu Feb 14 18:07:56 2008
@@ -36,6 +36,10 @@
         public GladeDialog(string name) : base(name)
         {
         }
+
+        public GladeDialog(string name, Glade.XML resource) : base(name, resource)
+        {
+        }
     
         public virtual ResponseType Run()
         {

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs	Thu Feb 14 18:07:56 2008
@@ -34,6 +34,7 @@
 using Gtk;
 using Cairo;
 
+using Hyena;
 using Hyena.Gui;
 using Hyena.Gui.Theatrics;
 

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs	Thu Feb 14 18:07:56 2008
@@ -30,6 +30,7 @@
 using Mono.Unix;
 using Gtk;
 
+using Hyena;
 using Banshee.Base;
 using Banshee.ServiceStack;
 using Banshee.Streaming;

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs	Thu Feb 14 18:07:56 2008
@@ -28,6 +28,7 @@
 
 using System;
 
+using Hyena;
 using Banshee.Base;
 using Banshee.ServiceStack;
 using Banshee.Gui.Dialogs;

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/IconThemeUtils.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/IconThemeUtils.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/IconThemeUtils.cs	Thu Feb 14 18:07:56 2008
@@ -34,8 +34,7 @@
 {
     public static class IconThemeUtils
     {
-        private static Assembly assembly = Assembly.GetExecutingAssembly ();
-        private static string [] resource_names;
+        private static Assembly executing_assembly = Assembly.GetExecutingAssembly ();
     
         public static bool HasIcon (string name)
         {
@@ -44,8 +43,13 @@
 
         public static Gdk.Pixbuf LoadIcon (int size, params string [] names)
         {
+            return LoadIcon (executing_assembly, size, names);
+        }
+
+        public static Gdk.Pixbuf LoadIcon (Assembly assembly, int size, params string [] names)
+        {
             for (int i = 0; i < names.Length; i++) {
-                Gdk.Pixbuf pixbuf = LoadIcon (names[i], size, i == names.Length - 1);
+                Gdk.Pixbuf pixbuf = LoadIcon (assembly, names[i], size, i == names.Length - 1);
                 if (pixbuf != null) {
                     return pixbuf;
                 }
@@ -56,13 +60,19 @@
 
         public static Gdk.Pixbuf LoadIcon (string name, int size)
         {
-            return LoadIcon (name, size, true);
+            return LoadIcon (executing_assembly, name, size, true);
         }
 
         public static Gdk.Pixbuf LoadIcon (string name, int size, bool fallBackOnResource)
         {
+            return LoadIcon (executing_assembly, name, size, fallBackOnResource);
+        }
+
+        public static Gdk.Pixbuf LoadIcon (Assembly assembly, string name, int size, bool fallBackOnResource)
+        {
+            Gdk.Pixbuf pixbuf = null;
             try {
-                Gdk.Pixbuf pixbuf = IconTheme.Default.LoadIcon (name, size, (IconLookupFlags)0);
+                pixbuf = IconTheme.Default.LoadIcon (name, size, (IconLookupFlags)0);
                 if (pixbuf != null) {
                     return pixbuf;
                 }
@@ -72,27 +82,23 @@
             if (!fallBackOnResource) {
                 return null;
             }
-            
+
+            assembly = assembly ?? executing_assembly;
+
+            string desired_resource_name = String.Format ("{0}.png", name);
+            string desired_resource_name_with_size = String.Format ("{0}-{1}.png", name, size);
+
             try {
-                if (resource_names == null) {
-                    resource_names = assembly.GetManifestResourceNames ();
-                }
-                
-                string desired_resource_name = name + ".png";
-                string desired_resource_name_with_size = String.Format ("{0}-{1}.png", name, size);
-                
-                foreach (string resource_name in resource_names) {
-                    if (resource_name == desired_resource_name) {
-                        return new Gdk.Pixbuf (assembly, desired_resource_name);
-                    } else if (resource_name == desired_resource_name_with_size) {
-                        return new Gdk.Pixbuf (assembly, desired_resource_name_with_size);
-                    }
-                }
-                
-                return null;
-            } catch {
-                return null;
-            }
+                if (assembly.GetManifestResourceInfo (desired_resource_name) != null)
+                    return new Gdk.Pixbuf (assembly, desired_resource_name);
+            } catch {}
+
+            try {
+                if (assembly.GetManifestResourceInfo (desired_resource_name_with_size) != null)
+                    return new Gdk.Pixbuf (assembly, desired_resource_name_with_size);
+            } catch {}
+
+            return null;
         }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/SourceRowRenderer.cs	Thu Feb 14 18:07:56 2008
@@ -27,6 +27,7 @@
 //
 
 using System;
+using System.Reflection;
 using Gtk;
 using Gdk;
 using Pango;
@@ -183,27 +184,26 @@
         
         private Gdk.Pixbuf ResolveSourceIcon (Source source)
         {
-            Hyena.Data.PropertyStore properties = source.Properties;
             Gdk.Pixbuf icon = source.Properties.Get<Gdk.Pixbuf> ("IconPixbuf");
             
             if (icon != null) {
                 return icon;
             }
             
-            Type icon_type = properties.GetType ("IconName");
-                
+            Type icon_type = source.Properties.GetType ("IconName");
+            Assembly asm = source.Properties.Get<Assembly> ("ResourceAssembly");
             if(icon_type == typeof (string)) {
-                icon = Banshee.Gui.IconThemeUtils.LoadIcon (22, properties.GetString ("IconName"));
+                icon = Banshee.Gui.IconThemeUtils.LoadIcon (asm, 22, source.Properties.GetString ("IconName"));
             } else if (icon_type == typeof (string [])) {
-                icon = Banshee.Gui.IconThemeUtils.LoadIcon (22, properties.GetStringList ("IconName"));
+                icon = Banshee.Gui.IconThemeUtils.LoadIcon (asm, 22, source.Properties.GetStringList ("IconName"));
             }
-                
+
             if (icon == null) {
                 icon = Banshee.Gui.IconThemeUtils.LoadIcon (22, "image-missing");
             }
                 
             if (icon != null) {
-                properties.Set<Gdk.Pixbuf> ("IconPixbuf", icon);
+                source.Properties.Set<Gdk.Pixbuf> ("IconPixbuf", icon);
             }
             
             return icon;

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.addin.xml
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.addin.xml	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.addin.xml	Thu Feb 14 18:07:56 2008
@@ -8,5 +8,15 @@
     <ImportSource class="Banshee.Library.Gui.FolderImportSource"/>
     <ImportSource class="Banshee.Library.Gui.FileImportSource"/>
   </Extension>
+
+  <ExtensionPoint path="/Banshee/ThickClient/ActionGroup">
+    <Description>Defines a new action group, possibly in conjunction with a Source extension.</Description>
+    <ExtensionNode name="ActionGroup"/>
+  </ExtensionPoint>
+
+  <ExtensionPoint path="/Banshee/ThickClient/SourceView">
+    <Description>Defines a new action group, possibly in conjunction with a Source extension.</Description>
+    <ExtensionNode name="ActionGroup"/>
+  </ExtensionPoint>
   
 </Addin>

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml	Thu Feb 14 18:07:56 2008
@@ -36,6 +36,7 @@
       <menuitem name="DeleteTracksFromDrive" action="DeleteTracksFromDriveAction"/>
       <separator/>
       <menuitem name="RenameSource" action="RenameSourceAction"/>
+      <menuitem name="RefreshSmartPlaylist" action="RefreshSmartPlaylistAction"/>
       <!--<menuitem name="ExportPlaylist" action="ExportPlaylistAction"/>-->
       <menuitem name="SourceProperties" action="SourcePropertiesAction"/>
       <menuitem name="UnmapSource" action="UnmapSourceAction"/>
@@ -117,6 +118,7 @@
   <popup name="TrackContextMenu" action="TrackContextMenuAction">
     <placeholder name="AboveAddToPlaylist"/>
     <menu name="AddToPlaylist" action="AddToPlaylistAction"></menu>
+    <placeholder name="BelowAddToPlaylist"/>
     <separator/>
     <menuitem name="RemoveTracks" action="RemoveTracksAction"/>
     <menuitem name="RemoveTracksFromLibrary" action="RemoveTracksFromLibraryAction"/>

Modified: trunk/banshee/src/Core/Core.mds
==============================================================================
--- trunk/banshee/src/Core/Core.mds	(original)
+++ trunk/banshee/src/Core/Core.mds	Thu Feb 14 18:07:56 2008
@@ -2,8 +2,6 @@
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="CombineConfiguration">
       <Entry build="True" name="Banshee.Widgets" configuration="Debug" />
-      <Entry build="True" name="Hyena" configuration="Debug" />
-      <Entry build="True" name="Hyena.Gui" configuration="Debug" />
       <Entry build="True" name="Banshee.Services" configuration="Debug" />
       <Entry build="True" name="Banshee.Core" configuration="Debug" />
       <Entry build="True" name="Nereid" configuration="Debug" />
@@ -13,8 +11,6 @@
   <StartMode startupentry="Nereid" single="True">
     <Execute type="None" entry="Banshee.Widgets" />
     <Execute type="None" entry="Banshee.Base" />
-    <Execute type="None" entry="Hyena" />
-    <Execute type="None" entry="Hyena.Gui" />
     <Execute type="None" entry="Banshee.Services" />
     <Execute type="None" entry="Banshee.Core" />
     <Execute type="None" entry="Nereid" />
@@ -22,11 +18,9 @@
   </StartMode>
   <Entries>
     <Entry filename="Banshee.Widgets/Banshee.Widgets.mdp" />
-    <Entry filename="Hyena/Hyena.mdp" />
-    <Entry filename="Hyena.Gui/Hyena.Gui.mdp" />
     <Entry filename="Banshee.Services/Banshee.Services.mdp" />
     <Entry filename="Banshee.Core/Banshee.Core.mdp" />
     <Entry filename="Nereid/Nereid.mdp" />
     <Entry filename="Banshee.ThickClient/Banshee.ThickClient.mdp" />
   </Entries>
-</Combine>
\ No newline at end of file
+</Combine>

Modified: trunk/banshee/src/Core/Makefile.am
==============================================================================
--- trunk/banshee/src/Core/Makefile.am	(original)
+++ trunk/banshee/src/Core/Makefile.am	Thu Feb 14 18:07:56 2008
@@ -1,6 +1,4 @@
 SUBDIRS = \
-	Hyena \
-	Hyena.Gui \
 	Banshee.Core \
 	Banshee.Services \
 	Banshee.Widgets \

Copied: trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.mdp (from r3228, /trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Plugins.LastFM.mdp)
==============================================================================
--- /trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Plugins.LastFM.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.mdp	Thu Feb 14 18:07:56 2008
@@ -8,20 +8,19 @@
     </Configuration>
   </Configurations>
   <Contents>
-    <File name="./Plugin.cs" subtype="Code" buildaction="Compile" />
-    <File name="./Editor.cs" subtype="Code" buildaction="Compile" />
-    <File name="./LastFMSource.cs" subtype="Code" buildaction="Compile" />
-    <File name="./LastFMTrackInfo.cs" subtype="Code" buildaction="Compile" />
-    <File name="./Connection.cs" subtype="Code" buildaction="Compile" />
-    <File name="./StationSource.cs" subtype="Code" buildaction="Compile" />
-    <File name="./StationType.cs" subtype="Code" buildaction="Compile" />
-    <File name="./data/Actions.xml" subtype="Code" buildaction="EmbedAsResource" />
-    <File name="./data/lastfm.glade" subtype="Code" buildaction="EmbedAsResource" />
-    <File name="./data/audioscrobbler.png" subtype="Code" buildaction="EmbedAsResource" />
-    <File name="./data/loved.png" subtype="Code" buildaction="EmbedAsResource" />
-    <File name="./data/people.png" subtype="Code" buildaction="EmbedAsResource" />
-    <File name="./data/person.png" subtype="Code" buildaction="EmbedAsResource" />
-    <File name="./data/recommended.png" subtype="Code" buildaction="EmbedAsResource" />
+    <File name="./Banshee.Lastfm/LastfmActions.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Banshee.Lastfm/LastfmSource.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Banshee.Lastfm/LastfmTrackInfo.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Banshee.Lastfm/StationEditor.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Banshee.Lastfm/StationSource.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Banshee.Lastfm/StationType.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Resources/Actions.xml" subtype="Code" buildaction="EmbedAsResource" />
+    <File name="./Resources/lastfm.glade" subtype="Code" buildaction="EmbedAsResource" />
+    <File name="./Resources/audioscrobbler.png" subtype="Code" buildaction="EmbedAsResource" />
+    <File name="./Resources/loved.png" subtype="Code" buildaction="EmbedAsResource" />
+    <File name="./Resources/people.png" subtype="Code" buildaction="EmbedAsResource" />
+    <File name="./Resources/person.png" subtype="Code" buildaction="EmbedAsResource" />
+    <File name="./Resources/recommended.png" subtype="Code" buildaction="EmbedAsResource" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="gtk-sharp, Version=2.8.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />

Added: trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmActions.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmActions.cs	Thu Feb 14 18:07:56 2008
@@ -0,0 +1,253 @@
+//
+// LastfmActions.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2007-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 Gtk;
+
+using Mono.Unix;
+
+using Lastfm;
+using Lastfm.Gui;
+using SortType = Hyena.Data.SortType;
+
+using Banshee.Base;
+using Banshee.Sources;
+using Banshee.Widgets;
+using Banshee.MediaEngine;
+using Banshee.Database;
+using Banshee.Configuration;
+using Banshee.ServiceStack;
+using Banshee.Gui;
+
+namespace Banshee.Lastfm
+{
+    public class LastfmActions : BansheeActionGroup
+    {
+        private LastfmSource source;
+
+        private ActionButton love_button;
+        private ActionButton hate_button;
+        private bool last_track_was_lastfm = false;
+
+        private InterfaceActionService action_service;
+        private uint actions_id;
+        private ActionGroup actions;
+
+        public LastfmActions (LastfmSource source) : base ("Lastfm")
+        {
+            action_service = ServiceManager.Get<InterfaceActionService> ();
+            this.source = source;
+
+            AddImportant (
+                new ActionEntry (
+                    "LastfmAddAction", Stock.Add,
+                     Catalog.GetString ("_Add Station"),
+                     null, Catalog.GetString ("Add a new Last.fm radio station"), OnAddStation
+                )
+            );
+
+            Add (new ActionEntry [] {
+                new ActionEntry (
+                    "LastfmConnectAction", null,
+                     Catalog.GetString ("Connect"),
+                     null, String.Empty, OnConnect
+                ),
+                new ActionEntry (
+                    "LastfmSortAction", "gtk-sort-descending",
+                    Catalog.GetString ("Sort Stations by"),
+                    null, String.Empty, null
+                ),
+                new ActionEntry (
+                    "LastfmLoveAction", "face-smile",
+                    Catalog.GetString ("Love Track"), null,
+                    Catalog.GetString ("Mark current track as loved"), OnLoved
+                ),
+                new ActionEntry (
+                    "LastfmHateAction", "face-sad",
+                    Catalog.GetString ("Ban Track"), null,
+                    Catalog.GetString ("Mark current track as banned"), OnHated
+                )
+            });
+
+            Add (
+                new RadioActionEntry [] {
+                    new RadioActionEntry (
+                        "LastfmSortStationsByNameAction", null,
+                         Catalog.GetString ("Station Name"),
+                         null, "", 0
+                    ),
+                    new RadioActionEntry (
+                        "LastfmSortStationsByPlayCountAction", null,
+                         Catalog.GetString ("Total Play Count"),
+                         null, "", 1
+                    ),
+                    new RadioActionEntry (
+                        "LastfmSortStationsByTypeAction", null,
+                         Catalog.GetString ("Station Type"),
+                         null, "", 2
+                    )
+                },
+                Array.IndexOf (LastfmSource.ChildComparers, source.ChildComparer),
+                delegate (object sender, ChangedArgs args) {
+                    source.ChildComparer = LastfmSource.ChildComparers[args.Current.Value];
+                    source.SortChildSources ();
+                }
+            );
+
+            actions_id = action_service.UIManager.AddUiFromResource ("GlobalUI.xml");
+
+            source.Connection.StateChanged += HandleConnectionStateChanged;
+
+            /*Globals.ActionManager["LastfmLoveAction"].IsImportant = true;
+            Globals.ActionManager["LastfmHateAction"].IsImportant = true;
+            Globals.ActionManager["LastfmLoveAction"].Visible = false;
+            Globals.ActionManager["LastfmHateAction"].Visible = false;
+            ActionButton love_button = new ActionButton (actions.GetAction ("LastfmLoveAction"));
+            love_button.Pixbuf = IconThemeUtils.LoadIcon ("face-smile", 22);
+            love_button.Padding = 1;
+            ActionButton hate_button = new ActionButton (actions.GetAction ("LastfmHateAction"));
+            hate_button.Pixbuf = IconThemeUtils.LoadIcon ("face-sad", 22);
+            hate_button.Padding = 1;
+            InterfaceElements.ActionButtonBox.PackStart (love_button, false, false, 0);
+            InterfaceElements.ActionButtonBox.PackStart (hate_button, false, false, 0);*/
+
+            /*PlayerEngineCore.EventChanged += delegate (object o, PlayerEngineEventArgs args) {
+                if (args.Event == PlayerEngineEvent.TrackInfoUpdated) {
+                    if (PlayerEngineCore.CurrentTrack is LastfmTrackInfo) {
+                        if (!last_track_was_lastfm) {
+                            this["LastfmLoveAction"].Visible = true;
+                            this["LastfmHateAction"].Visible = true;
+                            last_track_was_lastfm = true;
+                        }
+                    } else {
+                        if (last_track_was_lastfm) {
+                            this["LastfmLoveAction"].Visible = false;
+                            this["LastfmHateAction"].Visible = false;
+                            last_track_was_lastfm = false;
+                        }
+                    }
+                }
+            };*/
+
+            UpdateActions ();
+
+            action_service.AddActionGroup (this);
+        }
+
+        public override void Dispose ()
+        {
+            //InterfaceElements.ActionButtonBox.Remove (love_button);
+            //InterfaceElements.ActionButtonBox.Remove (hate_button);
+
+            //Globals.ActionManager.UI.RemoveUi (actions_id);
+            //Globals.ActionManager.UI.RemoveActionGroup (actions);
+            actions = null;
+
+            base.Dispose ();
+        }
+
+#region Action Handlers 
+
+        private void OnAddStation (object sender, EventArgs args)
+        {
+            StationEditor ed = new StationEditor (source);
+            ed.Window.ShowAll ();
+            ed.RunDialog ();
+        }
+
+        private void OnConnect (object sender, EventArgs args)
+        {
+            source.Connection.Connect ();
+        }
+
+        private void OnChangeStation (object sender, EventArgs args)
+        {
+            (ServiceManager.SourceManager.ActiveSource as StationSource).ChangeToThisStation ();
+        }
+
+        private void OnRefreshStation (object sender, EventArgs args)
+        {
+            (ServiceManager.SourceManager.ActiveSource as StationSource).Refresh ();
+        }
+
+        private void OnLoved (object sender, EventArgs args)
+        {
+            LastfmTrackInfo track = null;//PlayerEngineCore.CurrentTrack as LastfmTrackInfo;
+            if (track == null)
+                return;
+
+            track.Love ();
+        }
+
+        private void OnHated (object sender, EventArgs args)
+        {
+            LastfmTrackInfo track = null; //PlayerEngineCore.CurrentTrack as LastfmTrackInfo;
+            if (track == null)
+                return;
+
+            track.Ban ();
+            action_service.GlobalActions ["NextAction"].Activate ();
+        }
+
+        public void ShowLoginDialog ()
+        {
+            AccountLoginDialog dialog = new AccountLoginDialog (source.Account, true);
+            dialog.SaveOnEdit = true;
+            if (source.Account.Username == null) {
+                dialog.AddSignUpButton ();
+            }
+            dialog.Run ();
+            dialog.Destroy ();
+        }
+
+#endregion
+
+        private void HandleConnectionStateChanged (object sender, ConnectionStateChangedArgs args)
+        {
+            UpdateActions ();
+        }
+
+        private bool updating = false;
+        private void UpdateActions ()
+        {
+            lock (this) {
+                if (updating)
+                    return;
+                updating = true;
+            }
+
+            bool have_user = (source.Account.Username != null);
+            this["LastfmAddAction"].Sensitive = have_user;
+            this["LastfmSortAction"].Sensitive = have_user;
+            this["LastfmConnectAction"].Visible = source.Connection.State == ConnectionState.Disconnected;
+
+            updating = false;
+        }
+    }
+}

Copied: trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmSource.cs (from r3228, /trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastFMSource.cs)
==============================================================================
--- /trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastFMSource.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmSource.cs	Thu Feb 14 18:07:56 2008
@@ -1,82 +1,120 @@
-/***************************************************************************
- *  LastFMSource.cs
- *
- *  Copyright (C) 2007-2008 Novell, Inc.
- *  Written by Gabriel Burt <gabriel burt gmail com>
- ****************************************************************************/
-
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
- *
- *  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.
- */
+//
+// LastfmSource.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2007-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.IO;
 using System.Collections;
 using System.Collections.Generic;
 using Mono.Unix;
-using Gtk;
+
+using Lastfm;
+using Hyena.Data;
+using SortType = Hyena.Data.SortType;
 
 using Banshee.Base;
 using Banshee.Collection;
 using Banshee.Configuration;
-using Banshee.Widgets;
 using Banshee.Sources;
 using Banshee.MediaEngine;
+using Banshee.ServiceStack;
+using Banshee.Networking;
 
-using Last.FM.Gui;
- 
 namespace Banshee.Lastfm
 {   
-    public class LastFMSource : Source
+    public class LastfmSource : Source, IDisposable
     {
-        static string lastfm = "Last.fm";
-        public LastFMSource () : base (lastfm, 150)
+        private const string lastfm = "Last.fm";
+
+        private Connection connection;
+        public Connection Connection {
+            get { return connection; }
+        }
+
+        private Account account;
+        public Account Account {
+            get { return account; }
+        }
+
+        private LastfmActions actions;
+
+        public LastfmSource () : base (lastfm, lastfm, 150)
         {
+            account = new Account ();
+
+            // We don't automatically connect to Last.fm, but load the last Last.fm
+            // username we used so we can load the user's stations.
+            account.Username = LastUserSchema.Get ();
+            account.Password = "nicoleh";
+
+            connection = new Connection (account, Banshee.Web.Browser.UserAgent);
+            connection.UpdateNetworkState (NetworkDetect.Instance.Connected);
+            NetworkDetect.Instance.StateChanged += delegate (object o, NetworkStateChangedArgs args) {
+                connection.UpdateNetworkState (args.Connected);
+            };
+
+            Initialize ();
+
+            Properties.SetString ("ActiveSourceUIResource", "ActiveSourceUI.xml");
+            Properties.SetString ("GtkActionPath", "/LastfmSourcePopup");
+            Properties.SetString ("IconName", "audioscrobbler");
+            Properties.SetString ("SourcePropertiesActionLabel", Catalog.GetString ("Edit Last.fm Settings"));
+
+            actions = new LastfmActions (this);
+
+            ServiceManager.SourceManager.AddSource (this);
         }
 
         public void Initialize ()
         {
-            Connection.Instance.StateChanged += HandleConnectionStateChanged;
+            Connection.StateChanged += HandleConnectionStateChanged;
             UpdateUI ();
         }
 
-        protected override void OnDispose ()
+        public void Dispose ()
         {
-            Connection.Instance.StateChanged -= HandleConnectionStateChanged;
-            ClearChildSources ();
+            Connection.StateChanged -= HandleConnectionStateChanged;
+            //ClearChildSources ();
         }
 
-        public override void ClearChildSources ()
+        /*public override void ClearChildSources ()
         {
             lock (Children) {
                 foreach (StationSource child in Children) {
-                    if (SourceManager.ContainsSource (child))
-                        SourceManager.RemoveSource (child);
+                    //if (SourceManager.ContainsSource (child))
+                    //    SourceManager.RemoveSource (child);
                     child.Dispose ();
                 }
             }
 
             base.ClearChildSources ();
-        }
+        }*/
 
-        public override void AddChildSource (ChildSource source)
+        /*public override void AddChildSource (ChildSource source)
         {
             base.AddChildSource (source);
             SortChildSources ();
@@ -87,18 +125,8 @@
         {
             base.RemoveChildSource (source);
             source.Updated -= HandleChildUpdated;
-        }
+        }*/
 
-        public override void ShowPropertiesDialog ()
-        {
-            AccountLoginDialog dialog = new AccountLoginDialog (true);
-            dialog.SaveOnEdit = true;
-            if (Connection.Instance.Username == null) {
-                dialog.AddSignUpButton ();
-            }
-            dialog.Run ();
-            dialog.Destroy ();
-        }
 
         // Order by the playCount of a station, then by inverted name
         public class PlayCountComparer : IComparer<Source>
@@ -127,14 +155,14 @@
         public static IComparer<Source> [] ChildComparers = new IComparer<Source> [] {
             new NameComparer (), new PlayCountComparer (), new TypeComparer ()
         };
-        public static SortOrder [] child_orders = new SortOrder [] {
-            SortOrder.Ascending, SortOrder.Descending, SortOrder.Ascending
+        public static SortType [] child_orders = new SortType [] {
+            SortType.Ascending, SortType.Descending, SortType.Ascending
         };
 
         public IComparer<Source> ChildComparer {
             get {
                 if (child_comparer == null) {
-                    int i = (int) LastFMPlugin.StationSortSchema.Get ();
+                    int i = (int) StationSortSchema.Get ();
                     ChildComparer = ChildComparers [i];
                 }
                 return child_comparer;
@@ -143,29 +171,48 @@
                 child_comparer = value;
                 int i = Array.IndexOf (ChildComparers, child_comparer);
                 child_order = child_orders[i];
-                LastFMPlugin.StationSortSchema.Set (i);
+                StationSortSchema.Set (i);
             }
         }
 
         private bool sorting = false;
         private IComparer<Source> child_comparer;
-        private SortOrder child_order;
-        public override void SortChildSources (IComparer<Source> comparer, SortOrder order)
+        private SortType child_order;
+        public override void SortChildSources (IComparer<Source> comparer, bool asc)
         {
-            lock (TracksMutex) {
+            lock (this) {
                 if (sorting)
                     return;
                 sorting = true;
             }
 
-            base.SortChildSources (comparer, order);
+            base.SortChildSources (comparer, asc);
             ChildComparer = comparer;
             sorting = false;
         }
 
         public void SortChildSources  ()
         {
-            SortChildSources (ChildComparer, child_order);
+            SortChildSources (ChildComparer, child_order == SortType.Ascending);
+        }
+
+        private string last_username;
+        public void SetUsername (string username)
+        {
+            if (username != last_username) {
+                last_username = username;
+                LastfmSource.LastUserSchema.Set (last_username);
+                ClearChildSources ();
+                sorting = true;
+                foreach (StationSource child in StationSource.LoadAll (this, Account.Username)) {
+                    if (!child.Type.SubscribersOnly || Connection.Subscriber) {
+                        AddChildSource (child);
+                        //SourceManager.AddSource (child);
+                    }
+                }
+                sorting = false;
+                SortChildSources ();
+            }
         }
 
         /*public override void Activate ()
@@ -173,45 +220,27 @@
             InterfaceElements.ActionButtonBox.PackStart (add_button, false, false, 0);
         }*/
 
-        public override string ActionPath {
-            get { return "/LastFMSourcePopup"; }
-        }
-
-        private static string properties_label = Catalog.GetString ("Edit Last.fm Settings");
-        public override string SourcePropertiesLabel {
-            get { return properties_label; }
+        public override bool CanSearch {
+            get { return false; }
         }
 
-        public override bool SearchEnabled {
-            get { return false; }
+        public override int Count {
+             get { return 0; }
         }
         
-        public override bool CanWriteToCD {
-            get { return false; }
-        }
-                
-        public override bool ShowPlaylistHeader {
-            get { return false; }
-        }
-
         public override bool? AutoExpand {
-            get { return LastFMPlugin.ExpandedSchema.Get (); }
+            get { return ExpandedSchema.Get (); }
         }
 
         public override bool Expanded {
-            get { return LastFMPlugin.ExpandedSchema.Get (); }
-            set { LastFMPlugin.ExpandedSchema.Set (value); }
+            get { return ExpandedSchema.Get (); }
+            set { ExpandedSchema.Set (value); }
         }
 
         public override bool CanActivate {
             get { return false; }
         }
 
-        private Gdk.Pixbuf icon = Gdk.Pixbuf.LoadFromResource ("audioscrobbler.png");
-        public override Gdk.Pixbuf Icon {
-            get { return icon; }
-        }
-
         private void HandleConnectionStateChanged (object sender, ConnectionStateChangedArgs args)
         {
             UpdateUI ();
@@ -222,43 +251,34 @@
             SortChildSources ();
         }
 
-        private string last_username;
-        private bool updating = false;
         private void UpdateUI ()
         {
-            lock (TracksMutex) {
-                if (updating)
-                    return;
-                updating = true;
-            }
-
-            bool have_user = (Connection.Instance.Username != null);
-            Globals.ActionManager["LastFMAddAction"].Sensitive = have_user;
-            Globals.ActionManager["LastFMSortAction"].Sensitive = have_user;
-            Globals.ActionManager["LastFMConnectAction"].Visible = Connection.Instance.State == ConnectionState.Disconnected;
+            bool have_user = (Account.Username != null);
 
             if (have_user) {
-                if (Connection.Instance.Username != last_username) {
-                    last_username = Connection.Instance.Username;
-                    LastFMPlugin.LastUserSchema.Set (last_username);
-                    ClearChildSources ();
-                    sorting = true;
-                    foreach (StationSource child in StationSource.LoadAll (Connection.Instance.Username)) {
-                        if (!child.Type.SubscribersOnly || Connection.Instance.Subscriber) {
-                            AddChildSource (child);
-                            SourceManager.AddSource (child);
-                        }
-                    }
-                    sorting = false;
-                    SortChildSources ();
-                }
+                SetUsername (Account.Username);
             } else {
                 ClearChildSources ();
             }
 
-            Name = (Connection.Instance.State == ConnectionState.Connected ) ? lastfm : Catalog.GetString ("Last.fm (Disconnected)");
+            Name = (Connection.State == ConnectionState.Connected ) ? lastfm : Catalog.GetString ("Last.fm (Disconnected)");
             OnUpdated ();
-            updating = false;
         }
+
+        public static readonly SchemaEntry<bool> EnabledSchema = new SchemaEntry<bool> (
+            "plugins.lastfm", "enabled", false, "Extension enabled", "Last.fm extension enabled"
+        );
+
+        public static readonly SchemaEntry<int> StationSortSchema = new SchemaEntry<int> (
+            "plugins.lastfm", "station_sort", 0, "Station sort criteria", "Last.fm station sort criteria. 0 = name, 1 = play count, 2 = type"
+        );
+
+        public static readonly SchemaEntry<string> LastUserSchema = new SchemaEntry<string> (
+            "plugins.lastfm", "username", "", "Last.fm user", "Last.fm username"
+        );
+
+        public static readonly SchemaEntry<bool> ExpandedSchema = new SchemaEntry<bool> (
+            "plugins.lastfm", "expanded", false, "Last.fm expanded", "Last.fm expanded"
+        );
     }
 }

Copied: trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmTrackInfo.cs (from r3228, /trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastFMTrackInfo.cs)
==============================================================================
--- /trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastFMTrackInfo.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmTrackInfo.cs	Thu Feb 14 18:07:56 2008
@@ -1,30 +1,30 @@
-/***************************************************************************
- *  LastFMTrackInfo.cs
- *
- *  Copyright (C) 2007 Novell, Inc.
- *  Written by Gabriel Burt <gabriel burt gmail com>
- ****************************************************************************/
-
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
- *
- *  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.
- */
+//
+// LastfmTrackInfo.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2007-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.IO;
@@ -35,17 +35,17 @@
 
 using Banshee.Base;
 using Banshee.Collection;
-using Banshee.Playlists.Formats.Xspf;
+using Media.Playlists.Xspf;
 
 namespace Banshee.Lastfm
 {
-    public class LastFMTrackInfo : TrackInfo
+    public class LastfmTrackInfo : TrackInfo
     {
         private StationSource station;
         private Track track;
         private bool loved, hated;
 
-        public LastFMTrackInfo ()
+        public LastfmTrackInfo ()
         {
             CanSaveToDatabase = false;
         }
@@ -63,30 +63,31 @@
             get { return hated; }
         }
 
-        public LastFMTrackInfo (Track track, StationSource station)
+        public LastfmTrackInfo (Track track, StationSource station)
         {
             this.station = station;
             Uri = new SafeUri (track.Locations[0]);
-            Artist = track.Creator;
-            Title = track.Title;
-            Album = track.Album;
+            ArtistName = track.Creator;
+            TrackTitle = track.Title;
+            AlbumTitle = track.Album;
             Duration = track.Duration;
-            TrackNumber = track.TrackNumber;
+            TrackNumber = (int) track.TrackNumber;
             XspfTrack = track;
+
             CanSaveToDatabase = false;
         }
 
         public override void IncrementPlayCount ()
         {
             station.PlayCount++;
-            station.Commit ();
+            station.Save ();
         }
 
 		public void Love () 
 		{
             loved = true; hated = false;
             ThreadAssist.Spawn (delegate {
-                Connection.Instance.Love (this);
+                station.LastfmSource.Connection.Love (ArtistName, TrackTitle);
             });
 		}
 
@@ -94,7 +95,7 @@
 		{
             loved = false; hated = true;
             ThreadAssist.Spawn (delegate {
-                Connection.Instance.Ban (this);
+                station.LastfmSource.Connection.Ban (ArtistName, TrackTitle);
             });
 		}
     }

Added: trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmTrackListModel.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/LastfmTrackListModel.cs	Thu Feb 14 18:07:56 2008
@@ -0,0 +1,95 @@
+//
+// LastfmTrackListModell.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 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;
+using System.Collections.Generic;
+
+using Banshee.Collection;
+ 
+namespace Banshee.Lastfm
+{
+    public class LastfmTrackListModel : TrackListModel, IEnumerable<TrackInfo>
+    {
+        private List<TrackInfo> tracks = new List<TrackInfo> ();
+
+        public LastfmTrackListModel () : base ()
+        {
+        }
+
+        public override void Clear()
+        {
+            tracks.Clear ();
+        }
+        
+        public override void Reload()
+        {
+            OnReloaded ();
+        }
+
+        public void Add (TrackInfo track)
+        {
+            tracks.Add (track);
+        }
+
+        public void Remove (TrackInfo track)
+        {
+            tracks.Remove (track);
+        }
+
+        public bool Contains (TrackInfo track)
+        {
+            return IndexOf (track) != -1;
+        }
+    
+        public override TrackInfo this[int index] {
+            get { return (index < tracks.Count) ? tracks[index] : null; }
+        }
+
+        public override int Count { 
+            get { return tracks.Count; }
+        }
+        
+        public override int IndexOf (TrackInfo track)
+        {
+            return tracks.IndexOf (track);
+        }
+
+        public IEnumerator<TrackInfo> GetEnumerator ()
+        {
+            foreach (TrackInfo track in tracks) {
+                yield return track;
+            }
+        }
+
+        IEnumerator IEnumerable.GetEnumerator ()
+        {
+            return GetEnumerator ();
+        }
+    }
+}

Modified: trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationEditor.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationEditor.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationEditor.cs	Thu Feb 14 18:07:56 2008
@@ -1,30 +1,30 @@
-/***************************************************************************
- *  StationEditor.cs
- *
- *  Copyright (C) 2007-2008 Novell, Inc.
- *  Written by Gabriel Burt <gabriel burt gmail com>
- ****************************************************************************/
-
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
- *
- *  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.
- */
+//
+// StationEditor.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2007-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;
@@ -46,6 +46,7 @@
         const string dialog_name = "StationSourceEditorDialog";
         const string dialog_resource = "lastfm.glade";
 
+        private LastfmSource lastfm;
         private StationSource source;
 
         [Widget] private Gtk.Entry name_entry;
@@ -54,9 +55,10 @@
         [Widget] private Gtk.Label arg_label;
         [Widget] private Gtk.Button ok_button;
 
-        public StationEditor (StationSource source) : base (dialog_name, new Glade.XML (
+        public StationEditor (LastfmSource lastfm, StationSource source) : base (dialog_name, new Glade.XML (
             System.Reflection.Assembly.GetExecutingAssembly (), dialog_resource, dialog_name, "banshee"))
         {
+            this.lastfm = lastfm;
             this.source = source;
             SourceName = source.Name;
             Arg = source.Arg;
@@ -64,9 +66,10 @@
             Dialog.Title = Catalog.GetString ("Edit Station");
         }
     
-        public StationEditor () : base (dialog_name, new Glade.XML (
+        public StationEditor (LastfmSource lastfm) : base (dialog_name, new Glade.XML (
             System.Reflection.Assembly.GetExecutingAssembly (), dialog_resource, dialog_name, "banshee"))
         {
+            this.lastfm = lastfm;
             Initialize ();
             Dialog.Title = Catalog.GetString ("New Station");
         }
@@ -88,7 +91,7 @@
             int active_type = 0;
             int i = 0;
             foreach (StationType type in StationType.Types) {
-                if (!type.SubscribersOnly || Connection.Instance.Subscriber) {
+                if (!type.SubscribersOnly || lastfm.Connection.Subscriber) {
                     type_combo.AppendText (type.Label);
                     if (source != null && type == source.Type) {
                         active_type = i;
@@ -123,14 +126,15 @@
 
                 ThreadAssist.Spawn (delegate {
                     if (source == null) {
-                        source = new StationSource (name, type.Name, arg);
-                        LastFMPlugin.Instance.Source.AddChildSource (source);
-                        SourceManager.AddSource (source);
+                        source = new StationSource (lastfm, name, type.Name, arg);
+                        lastfm.AddChildSource (source);
+                        //LastFMPlugin.Instance.Source.AddChildSource (source);
+                        //ServiceManager.SourceManager.AddSource (source);
                     } else {
                         source.Rename (name);
                         source.Type = type;
                         source.Arg = arg;
-                        source.Commit ();
+                        source.Save ();
                         //source.Refresh ();
                     }
                 });

Modified: trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationSource.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationSource.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationSource.cs	Thu Feb 14 18:07:56 2008
@@ -1,56 +1,70 @@
-/***************************************************************************
- *  StationSource.cs
- *
- *  Copyright (C) 2007 Novell, Inc.
- *  Written by Gabriel Burt <gabriel burt gmail com>
- ****************************************************************************/
-
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
- *
- *  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.
- */
+//
+// StationSource.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2007-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.IO;
 using System.Data;
+using System.IO;
 using System.Collections.Generic;
 using System.Threading;
 using Mono.Unix;
 using Gtk;
 
+using Hyena;
+using Hyena.Data.Sqlite;
+using Lastfm;
+using ConnectionState = Lastfm.ConnectionState;
+
 using Banshee.Base;
 using Banshee.Widgets;
 using Banshee.Database;
 using Banshee.Sources;
 using Banshee.Metadata;
 using Banshee.MediaEngine;
-using Banshee.Playlists.Formats.Xspf;
+using Banshee.Collection;
+using Banshee.ServiceStack;
  
 namespace Banshee.Lastfm
 {
-    public class StationSource : Source
+    public class StationSource : Source, ITrackModelSource, IUnmapableSource, IDisposable
     {
-        private static readonly Gdk.Pixbuf refresh_pixbuf = IconThemeUtils.LoadIcon (22, Stock.Refresh);
-        private static readonly Gdk.Pixbuf error_pixbuf = IconThemeUtils.LoadIcon (22, Stock.DialogError);
+        //private static readonly Gdk.Pixbuf refresh_pixbuf = IconThemeUtils.LoadIcon (22, Stock.Refresh);
+        //private static readonly Gdk.Pixbuf error_pixbuf = IconThemeUtils.LoadIcon (22, Stock.DialogError);
+
+        private static string generic_name = Catalog.GetString ("Last.fm Station");
+        
+        private LastfmTrackListModel track_model;
+        
+        //private HighlightMessageArea status_bar;
 
-        private List<TrackInfo> tracks = new List<TrackInfo> ();
-        private HighlightMessageArea status_bar;
+        private LastfmSource lastfm;
+        public LastfmSource LastfmSource {
+            get { return lastfm; }
+        }
 
         private string station;
         public string Station {
@@ -63,10 +77,9 @@
             get { return type; }
             set {
                 type = value;
-                if (icon != null) {
-                    icon.Dispose ();
-                    icon = null;
-                }
+
+                if (type.IconName != null)
+                    Properties.SetString ("IconName", type.IconName);
             }
         }
 
@@ -85,78 +98,87 @@
         private int dbid;
         
         // For StationSources that already exist in the db
-        protected StationSource (int dbId, string name, string type, string arg, int playCount) : base (name, 150)
+        protected StationSource (LastfmSource lastfm, int dbId, string name, string type, string arg, int playCount) : base (generic_name, name, 150)
         {
+            this.lastfm = lastfm;
             dbid = dbId;
             Type = StationType.FindByName (type);
             Arg = arg;
             PlayCount = playCount;
             Station = Type.GetStationFor (arg);
 
-            PlayerEngineCore.StateChanged += OnPlayerStateChanged;
-            Connection.Instance.StateChanged += HandleConnectionStateChanged;
-
-            BuildInterface ();
+            Initialize ();
         }
 
-        public StationSource (string name, string type, string arg) : base (name, 150)
+        public StationSource (LastfmSource lastfm, string name, string type, string arg) : base (generic_name, name, 150)
         {
+            this.lastfm = lastfm;
             Type = StationType.FindByName (type);
             Arg = arg;
             Station = Type.GetStationFor (arg);
 
-            DbCommand command = new DbCommand (@"
-                INSERT INTO LastfmStations
-                    (Creator, Name, Type, Arg, PlayCount)
-                    VALUES (:creator, :name, :type, :arg, :play_count)",
-                    "creator", Connection.Instance.Username, 
-                    "name", Name, 
-                    "type", Type.ToString (),
-                    "arg", Arg,
-                    "play_count", PlayCount
-            );
+            Save ();
 
-            dbid = Globals.Library.Db.Execute (command);
+            Initialize ();
+        }
+
+        private void Initialize ()
+        {
+            track_model = new LastfmTrackListModel ();
 
-            PlayerEngineCore.StateChanged += OnPlayerStateChanged;
-            Connection.Instance.StateChanged += HandleConnectionStateChanged;
+            ServiceManager.PlayerEngine.StateChanged += OnPlayerStateChanged;
+            lastfm.Connection.StateChanged += HandleConnectionStateChanged;
 
-            BuildInterface ();
+            Properties.SetString ("ActiveSourceUIResource", "ActiveSourceUI.xml");
+            Properties.SetString ("GtkActionPath", "/LastfmStationSourcePopup");
+            Properties.SetString ("SourcePropertiesActionLabel", Catalog.GetString ("Edit Last.fm Station"));
+            Properties.SetString ("UnmapSourceActionLabel", Catalog.GetString ("Delete Last.fm Station"));
+
+            //box = new VBox ();
+            //status_bar = new HighlightMessageArea ();
+            //status_bar.BorderWidth = 5;
+            //status_bar.LeftPadding = 15;
+            //status_bar.Hide ();
+            UpdateUI (lastfm.Connection.State);
         }
 
-        private void BuildInterface ()
+        public void Dispose ()
         {
-            //box = new VBox ();
-            status_bar = new HighlightMessageArea ();
-            status_bar.BorderWidth = 5;
-            status_bar.LeftPadding = 15;
-            status_bar.Hide ();
-            UpdateUI (Connection.Instance.State);
-        }
-
-        protected override void OnDispose ()
-        {
-            PlayerEngineCore.StateChanged -= OnPlayerStateChanged;
-            Connection.Instance.StateChanged -= HandleConnectionStateChanged;
-        }
-
-        public override void Commit ()
-        {
-            DbCommand command = new DbCommand (@"
-                UPDATE LastfmStations
-                SET 
-                    Name = :name,
-                    Type = :type,
-                    Arg = :arg,
-                    PlayCount = :play_count
-                WHERE StationID = :station_id",
-                "name", Name,
-                "type", Type.ToString (),
-                "arg", Arg,
-                "play_count", PlayCount,
-                "station_id", dbid
+            ServiceManager.PlayerEngine.StateChanged -= OnPlayerStateChanged;
+            lastfm.Connection.StateChanged -= HandleConnectionStateChanged;
+        }
+
+        public virtual void Save ()
+        {
+            if (dbid <= 0)
+                Create ();
+            else
+                Update ();
+
+            OnUpdated ();
+        }
+
+        private void Create ()
+        {
+            HyenaSqliteCommand command = new HyenaSqliteCommand (
+                @"INSERT INTO LastfmStations (Creator, Name, Type, Arg, PlayCount)
+                    VALUES (?, ?, ?, ?, ?)",
+                lastfm.Account.Username, Name, 
+                Type.ToString (), Arg, PlayCount
+            );
+
+            dbid = ServiceManager.DbConnection.Execute (command);
+        }
+
+        private void Update ()
+        {
+            HyenaSqliteCommand command = new HyenaSqliteCommand (
+                @"UPDATE LastfmStations
+                    SET Name = ?, Type = ?, Arg = ?, PlayCount = ?
+                    WHERE StationID = ?",
+                Name, Type.ToString (), Arg, PlayCount, dbid
             );
-            Globals.Library.Db.Execute (command);
+            ServiceManager.DbConnection.Execute (command);
 
             Station = Type.GetStationFor (Arg);
             OnUpdated ();
@@ -165,23 +187,24 @@
         private bool shuffle;
         public override void Activate ()
         {
-            shuffle = (Globals.ActionManager["ShuffleAction"] as ToggleAction).Active;
-            (Globals.ActionManager["ShuffleAction"] as ToggleAction).Active = false;
+            base.Activate ();
+            //shuffle = (action_service.GlobalActions ["ShuffleAction"] as ToggleAction).Active;
+            //(action_service.GlobalActions ["ShuffleAction"] as ToggleAction).Active = false;
             //Globals.ActionManager["ShuffleAction"].Sensitive = false;
  
-            if (show_status)
+            /*if (show_status)
                 status_bar.Show ();
             else
-                status_bar.Hide ();
+                status_bar.Hide ();*/
 
-            Globals.ActionManager["PreviousAction"].Sensitive = false;
-            InterfaceElements.MainContainer.PackEnd (status_bar, false, false, 0);
+            //action_service.GlobalActions ["PreviousAction"].Sensitive = false;
+            //InterfaceElements.MainContainer.PackEnd (status_bar, false, false, 0);
 
             // We lazy load the Last.fm connection, so if we're not already connected, do it
-            if (Connection.Instance.State == ConnectionState.Connected)
+            if (lastfm.Connection.State == ConnectionState.Connected)
                 TuneAndLoad ();
-            else if (Connection.Instance.State == ConnectionState.Disconnected)
-                Connection.Instance.Connect ();
+            else if (lastfm.Connection.State == ConnectionState.Disconnected)
+                lastfm.Connection.Connect ();
         }
 
         private void TuneAndLoad ()
@@ -199,28 +222,28 @@
 
         public override void Deactivate ()
         {
-            (Globals.ActionManager["ShuffleAction"] as ToggleAction).Active = shuffle;
+            //(Globals.ActionManager["ShuffleAction"] as ToggleAction).Active = shuffle;
             //Globals.ActionManager["ShuffleAction"].Sensitive = true;
 
-            Globals.ActionManager["PreviousAction"].Sensitive = true;
-            InterfaceElements.MainContainer.Remove (status_bar);
+            //Globals.ActionManager["PreviousAction"].Sensitive = true;
+            //InterfaceElements.MainContainer.Remove (status_bar);
         }
 
         // Last.fm requires you to 'tune' to a station before requesting a track list/playing it
         public bool ChangeToThisStation ()
         {
-            if (Connection.Instance.Station == Station)
+            if (lastfm.Connection.Station == Station)
                 return false;
 
-            LogCore.Instance.PushDebug (String.Format ("Tuning Last.fm to {0}", Name), null);
+            Log.Debug (String.Format ("Tuning Last.fm to {0}", Name), null);
             SetStatus (Catalog.GetString ("Tuning Last.fm to {0}."), false);
-            StationError error = Connection.Instance.ChangeStationTo (Station);
+            StationError error = lastfm.Connection.ChangeStationTo (Station);
 
             if (error == StationError.None) {
-                LogCore.Instance.PushDebug (String.Format ("Successfully tuned Last.fm to {0}", station), null);
+                Log.Debug (String.Format ("Successfully tuned Last.fm to {0}", station), null);
                 return true;
             } else {
-                LogCore.Instance.PushDebug (String.Format ("Failed to tune Last.fm to {0}", Name), Connection.ErrorMessageFor (error));
+                Log.Debug (String.Format ("Failed to tune Last.fm to {0}", Name), Connection.ErrorMessageFor (error));
                 SetStatus (String.Format (
                     // Translators: {0} is an error message sentence from Connection.cs.
                     Catalog.GetString ("Failed to tune in station. {0}"), Connection.ErrorMessageFor (error)), true
@@ -232,35 +255,35 @@
         bool show_status = false;
         private void SetStatus (string message, bool error)
         {
-            ThreadAssist.ProxyToMain (delegate {
+            /*ThreadAssist.ProxyToMain (delegate {
                 show_status = true;
                 string status_name = String.Format ("<i>{0}</i>", GLib.Markup.EscapeText (Name));
                 status_bar.Message = String.Format ("<big>{0}</big>", String.Format (GLib.Markup.EscapeText (message), status_name));
                 status_bar.Pixbuf = error ? error_pixbuf : refresh_pixbuf;
                 status_bar.ShowCloseButton = true;
                 status_bar.Show ();
-            });
+            });*/
         }
 
         private void HideStatus ()
         {
-            ThreadAssist.ProxyToMain (delegate {
+            /*ThreadAssist.ProxyToMain (delegate {
                 show_status = false;
                 status_bar.Hide ();
-            });
+            });*/
         }
 
-        public override void ShowPropertiesDialog ()
+        /*public override void ShowPropertiesDialog ()
         {
             Editor ed = new Editor (this);
             ed.RunDialog ();
-        }
+        }*/
 
         /*private bool playback_requested = false;
         public override void StartPlayback ()
         {
             if (CurrentTrack != null) {
-                PlayerEngineCore.OpenPlay (CurrentTrack);
+                ServiceManager.PlayerEngine.OpenPlay (CurrentTrack);
             } else if (playback_requested == false) {
                 playback_requested = true;
                 Refresh ();
@@ -271,7 +294,7 @@
         public TrackInfo CurrentTrack {
             get { return GetTrack (current_track); }
             set {
-                int i = tracks.IndexOf (value);
+                int i = track_model.IndexOf (value);
                 if (i != -1)
                     current_track = i;
             }
@@ -282,12 +305,12 @@
         }
 
         private TrackInfo GetTrack (int track_num) {
-            return (track_num > tracks.Count - 1) ? null : tracks[track_num];
+            return (track_num > track_model.Count - 1) ? null : track_model[track_num];
         }
 
         private int TracksLeft {
             get {
-                int left = tracks.Count - current_track - 1;
+                int left = track_model.Count - current_track - 1;
                 return (left < 0) ? 0 : left;
             }
         }
@@ -296,7 +319,7 @@
         public void Refresh ()
         {
             lock (this) {
-                if (refreshing || Connection.Instance.Station != Station) {
+                if (refreshing || lastfm.Connection.Station != Station) {
                     return;
                 }
                 refreshing = true;
@@ -307,23 +330,24 @@
             }
 
             ThreadAssist.Spawn (delegate {
-                Playlist playlist = Connection.Instance.LoadPlaylistFor (Station);
+                Media.Playlists.Xspf.Playlist playlist = lastfm.Connection.LoadPlaylistFor (Station);
                 if (playlist != null) {
                     if (playlist.TrackCount == 0) {
                         SetStatus (Catalog.GetString ("No new songs available for {0}."), true);
                     } else {
                         List<TrackInfo> new_tracks = new List<TrackInfo> ();
-                        foreach (Track track in playlist.Tracks) {
-                            TrackInfo ti = new LastFMTrackInfo (track, this);
+                        foreach (Media.Playlists.Xspf.Track track in playlist.Tracks) {
+                            TrackInfo ti = new LastfmTrackInfo (track, this);
                             new_tracks.Add (ti);
-                            lock (TracksMutex) {
-                                tracks.Add (ti);
+                            lock (track_model) {
+                                track_model.Add (ti);
                             }
                         }
                         HideStatus ();
 
                         ThreadAssist.ProxyToMain (delegate {
-                            OnTrackAdded (null, new_tracks);
+                            //OnTrackAdded (null, new_tracks);
+                            track_model.Reload ();
                             OnUpdated ();
 
                             /*if (playback_requested) {
@@ -340,23 +364,13 @@
             });
         }
 
-        private void ClearTracks ()
-        {
-            lock (TracksMutex) {
-                if (tracks.Count > 0) {
-                    OnTrackRemoved (null, tracks);
-                    tracks.Clear ();
-                }
-            }
-        }
-
         private void OnPlayerStateChanged (object o, PlayerEngineStateArgs args)
         {
-            if (args.State == PlayerEngineState.Loaded && tracks.Contains (PlayerEngineCore.CurrentTrack)) {
-                CurrentTrack = PlayerEngineCore.CurrentTrack;
+            if (args.State == PlayerEngineState.Loaded && track_model.Contains (ServiceManager.PlayerEngine.CurrentTrack)) {
+                CurrentTrack = ServiceManager.PlayerEngine.CurrentTrack;
 
-                lock (TracksMutex) {
-                    foreach (TrackInfo track in tracks) {
+                lock (track_model) {
+                    foreach (TrackInfo track in track_model) {
                         if (track == CurrentTrack)
                             break;
                         if (track.CanPlay) {
@@ -381,110 +395,138 @@
         {
             if (state == ConnectionState.Connected) {
                 HideStatus ();
-                if (this == SourceManager.ActiveSource) {
+                if (this == ServiceManager.SourceManager.ActiveSource) {
                     TuneAndLoad ();
                 }
             } else {
-                ClearTracks ();
+                track_model.Clear ();
                 SetStatus (Connection.MessageFor (state), state != ConnectionState.Connecting);
+                OnUpdated ();
             }
         }
 
-        public override bool Unmap ()
+        public override string GetStatusText ()
         {
-            Globals.Library.Db.Execute (String.Format (
-                @"DELETE FROM LastfmStations
-                    WHERE StationID = '{0}'",
-                    dbid
-            ));
-            Parent.RemoveChildSource (this);
-            SourceManager.RemoveSource (this);
-            return true;
+            return String.Format (
+                Catalog.GetPluralString ("{0} song played", "{0} songs played", PlayCount), PlayCount
+            );
+        }
+
+#region ITrackModelSource Implementation
+
+        public TrackListModel TrackModel {
+            get { return track_model; }
+        }
+
+        public AlbumListModel AlbumModel {
+            get { return null; }
         }
 
-        protected override bool UpdateName (string oldName, string newName)
+        public ArtistListModel ArtistModel {
+            get { return null; }
+        }
+
+        public void Reload ()
         {
-            Name = newName;
-            Commit ();
-            return true;
+            track_model.Reload ();
         }
-        
-        public override bool SearchEnabled {
-            get { return false; }
+
+        public void RemoveSelectedTracks ()
+        {
         }
-        
-        public override bool CanWriteToCD {
-            get { return false; }
+
+        public void DeleteSelectedTracks ()
+        {
+            throw new Exception ("Should not call DeleteSelectedTracks on StationSource");
         }
-                
-        public override bool ShowPlaylistHeader {
+
+        public bool CanRemoveTracks {
             get { return false; }
         }
 
-        public override string ActionPath {
-            get { return "/LastFMStationSourcePopup"; }
+        public bool CanDeleteTracks {
+            get { return false; }
         }
 
-        public override IEnumerable<TrackInfo> Tracks {
-            get { return tracks; }
+        public bool ConfirmRemoveTracks {
+            get { return false; }
+        }
+        
+        public bool ShowBrowser {
+            get { return false; }
         }
 
-        private static string unmap_label = Catalog.GetString ("Delete Last.fm Station");
-        public override string UnmapLabel {
-            get { return unmap_label; }
+#endregion
+
+#region IUnmapableSource Implementation
+
+        public bool Unmap ()
+        {
+            ServiceManager.DbConnection.Execute (String.Format (
+                @"DELETE FROM LastfmStations
+                    WHERE StationID = '{0}'",
+                    dbid
+            ));
+            Parent.RemoveChildSource (this);
+            ServiceManager.SourceManager.RemoveSource (this);
+            return true;
         }
 
-        private static string generic_name = Catalog.GetString ("Last.fm Station");
-        public override string GenericName {
-            get { return generic_name; }
+        public bool CanUnmap {
+            get { return true; }
         }
 
-        private static string properties_label = Catalog.GetString ("Edit Last.fm Station");
-        public override string SourcePropertiesLabel {
-            get { return properties_label; }
+        public bool ConfirmBeforeUnmap {
+            get { return true; }
         }
 
-        private Gdk.Pixbuf icon;
-        public override Gdk.Pixbuf Icon {
-            get {
-                if (icon == null && Type != null && Type.IconName != null) {
-                    icon = IconThemeUtils.LoadIcon (22, Type.IconName);
-                    if (icon == null) {
-                        icon = Gdk.Pixbuf.LoadFromResource (Type.IconName + ".png");
-                    }
-                }
-                return icon;
-            }
+#endregion
+
+        public override void Rename (string newName)
+        {
+            base.Rename (newName);
+            Save ();
+        }
+        
+        public override bool CanSearch {
+            get { return false; }
         }
 
-        public static List<StationSource> LoadAll (string creator)
+        public override int Count {
+            get { return 0; }
+        }
+        
+        public static List<StationSource> LoadAll (LastfmSource lastfm, string creator)
         {
             List<StationSource> stations = new List<StationSource> ();
 
-            DbCommand command = new DbCommand (
-                "SELECT StationID, Name, Type, Arg, PlayCount FROM LastfmStations WHERE Creator = :creator",
-                "creator", creator
+            HyenaSqliteCommand command = new HyenaSqliteCommand (
+                "SELECT StationID, Name, Type, Arg, PlayCount FROM LastfmStations WHERE Creator = ?",
+                creator
             );
 
-            IDataReader reader = Globals.Library.Db.Query (command);
-
-            while (reader.Read ()) {
-                try {
-                    stations.Add (new StationSource (
-                        (int) reader[0], (string) reader[1], (string) reader[2], (string) reader[3], (int) reader[4]
-                    ));
-                } catch (Exception e) {
-                    LogCore.Instance.PushWarning ("Error Loading Last.fm Station", e.ToString (), false);
+            using (IDataReader reader = ServiceManager.DbConnection.ExecuteReader (command)) {
+                while (reader.Read ()) {
+                    try {
+                        stations.Add (new StationSource (lastfm,
+                            Convert.ToInt32 (reader[0]),
+                            reader[1] as string,
+                            reader[2] as string,
+                            reader[3] as string,
+                            Convert.ToInt32 (reader[4])
+                        ));
+                    } catch (Exception e) {
+                        Log.Warning ("Error Loading Last.fm Station", e.ToString (), false);
+                    }
                 }
             }
-            reader.Dispose ();
 
             // Create some default stations if the user has none
             if (stations.Count == 0) {
-                stations.Add (new StationSource (Catalog.GetString ("Recommended"), "Recommended", creator));
-                stations.Add (new StationSource (Catalog.GetString ("Personal"), "Personal", creator));
-                stations.Add (new StationSource (Catalog.GetString ("Loved"), "Loved", creator));
-                stations.Add (new StationSource (Catalog.GetString ("Neighbors"), "Neighbor", creator));
+                stations.Add (new StationSource (lastfm, Catalog.GetString ("Recommended"), "Recommended", creator));
+                stations.Add (new StationSource (lastfm, Catalog.GetString ("Personal"), "Personal", creator));
+                stations.Add (new StationSource (lastfm, Catalog.GetString ("Loved"), "Loved", creator));
+                stations.Add (new StationSource (lastfm, Catalog.GetString ("Neighbors"), "Neighbor", creator));
             }
 
             return stations;
@@ -492,8 +534,8 @@
 
         static StationSource ()
         {
-            if (!Globals.Library.Db.TableExists ("LastfmStations")) {
-                Globals.Library.Db.Execute (@"
+            if (!ServiceManager.DbConnection.TableExists ("LastfmStations")) {
+                ServiceManager.DbConnection.Execute (@"
                     CREATE TABLE LastfmStations (
                         StationID           INTEGER PRIMARY KEY,
                         Creator             STRING NOT NULL,
@@ -505,11 +547,11 @@
                 ");
             } else {
                 try {
-                    Globals.Library.Db.QuerySingle ("SELECT PlayCount FROM LastfmStations LIMIT 1");
+                    ServiceManager.DbConnection.QueryInt32 ("SELECT PlayCount FROM LastfmStations LIMIT 1");
                 } catch {
-                    LogCore.Instance.PushDebug ("Adding new database column", "Table: LastfmStations, Column: PlayCount INTEGER");
-                    Globals.Library.Db.Execute ("ALTER TABLE LastfmStations ADD PlayCount INTEGER");
-                    Globals.Library.Db.Execute ("UPDATE LastfmStations SET PlayCount = 0");
+                    Log.Debug ("Adding new database column", "Table: LastfmStations, Column: PlayCount INTEGER");
+                    ServiceManager.DbConnection.Execute ("ALTER TABLE LastfmStations ADD PlayCount INTEGER");
+                    ServiceManager.DbConnection.Execute ("UPDATE LastfmStations SET PlayCount = 0");
                 }
             }
         }

Modified: trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationType.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationType.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationType.cs	Thu Feb 14 18:07:56 2008
@@ -1,34 +1,34 @@
-/***************************************************************************
- *  StationType.cs
- *
- *  Copyright (C) 2007 Novell, Inc.
- *  Written by Gabriel Burt <gabriel burt gmail com>
- ****************************************************************************/
-
-/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
- *
- *  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.
- */
+//
+// StationType.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2007-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.Gettext;
+using Mono.Unix;
 
 namespace Banshee.Lastfm
 {

Modified: trunk/banshee/src/Extensions/Banshee.Lastfm/Makefile.am
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Lastfm/Makefile.am	(original)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Makefile.am	Thu Feb 14 18:07:56 2008
@@ -3,18 +3,20 @@
 LINK = $(REF_EXTENSION_LASTFM)
 
 SOURCES = \
-	Banshee.Lastfm/Editor.cs \
 	Banshee.Lastfm/Connection.cs \
-	Banshee.Lastfm/Plugin.cs \
-	Banshee.Lastfm/LastFMSource.cs \
-	Banshee.Lastfm/LastFMTrackInfo.cs \
+	Banshee.Lastfm/LastfmActions.cs \
+	Banshee.Lastfm/LastfmSource.cs \
+	Banshee.Lastfm/LastfmTrackInfo.cs \
+	Banshee.Lastfm/LastfmTrackListModel.cs \
+	Banshee.Lastfm/StationEditor.cs \
 	Banshee.Lastfm/StationSource.cs \
 	Banshee.Lastfm/StationType.cs
 
 RESOURCES =  \
-	Resources/Banshee.LastFM.addin.xml \
+	Resources/Banshee.Lastfm.addin.xml \
 	Resources/lastfm.glade \
-	Resources/Actions.xml \
+	Resources/ActiveSourceUI.xml \
+	Resources/GlobalUI.xml \
 	Resources/audioscrobbler.png \
 	Resources/recommended.png
 

Added: trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/ActiveSourceUI.xml
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/ActiveSourceUI.xml	Thu Feb 14 18:07:56 2008
@@ -0,0 +1,7 @@
+<ui>
+  <toolbar name="HeaderToolbar">
+    <placeholder name="SourceActions">
+        <toolitem name="LastfmAdd" action="LastfmAddAction"/>
+    </placeholder>
+  </toolbar>
+</ui>

Copied: trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/Banshee.Lastfm.addin.xml (from r3228, /trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/Banshee.LastFM.addin.xml)
==============================================================================
--- /trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/Banshee.LastFM.addin.xml	(original)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/Banshee.Lastfm.addin.xml	Thu Feb 14 18:07:56 2008
@@ -1,4 +1,4 @@
-<Addin id="Banshee.LastFM">
+<Addin id="Banshee.Lastfm">
 
   <Dependencies>
     <Addin id="Banshee.Services" version="1.0"/>
@@ -6,7 +6,7 @@
   </Dependencies>
 
   <Extension path="/Banshee/SourceManager/Source">
-    <Source class="Banshee.LastFM.LastFMSource"/>
+    <Source class="Banshee.Lastfm.LastfmSource"/>
   </Extension>
   
 </Addin>

Copied: trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/GlobalUI.xml (from r3228, /trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/Actions.xml)
==============================================================================
--- /trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/Actions.xml	(original)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Resources/GlobalUI.xml	Thu Feb 14 18:07:56 2008
@@ -1,19 +1,27 @@
 <ui>
-    <popup name="LastFMSourcePopup" action="LastFMSourcePopupAction">
-        <menuitem name="Add" action="LastFMAddAction" />
-        <menu name='SortPlaylist' action='LastFMSortAction'>
-            <menuitem name='SortStationByName' action='LastFMSortStationsByNameAction' />
-            <menuitem name='SortStationByPlayCount' action='LastFMSortStationsByPlayCountAction' />
-            <menuitem name='SortStationByType' action='LastFMSortStationsByTypeAction' />
+    <popup name="LastfmSourcePopup" action="LastfmSourcePopupAction">
+        <menuitem name="LastfmAdd" action="LastfmAddAction" />
+        <menu name='SortPlaylist' action='LastfmSortAction'>
+            <menuitem name='SortStationByName' action='LastfmSortStationsByNameAction' />
+            <menuitem name='SortStationByPlayCount' action='LastfmSortStationsByPlayCountAction' />
+            <menuitem name='SortStationByType' action='LastfmSortStationsByTypeAction' />
         </menu>
-        <menuitem name="Connect" action="LastFMConnectAction" />
+        <menuitem name="Connect" action="LastfmConnectAction" />
         <separator />
-        <menuitem name="SelectedSourceProperties" action="SelectedSourcePropertiesAction" />
+        <menuitem name="SourceProperties" action="SourcePropertiesAction" />
     </popup>
-    <popup name="LastFMStationSourcePopup" action="LastFMStationSourcePopupAction">
+
+    <popup name="LastfmStationSourcePopup" action="LastfmStationSourcePopupAction">
         <menuitem name="RenameSource" action="RenameSourceAction" />
         <menuitem name="UnmapSource" action="UnmapSourceAction" />
         <separator />
-        <menuitem name="SelectedSourceProperties" action="SelectedSourcePropertiesAction" />
+        <menuitem name="SourceProperties" action="SourcePropertiesAction" />
+    </popup>
+
+    <popup name="TrackContextMenu" action="TrackContextMenuAction">
+        <placeholder name="BelowAddToPlaylist">
+            <menuitem name="LastfmLove" action="LastfmLoveAction"></menuitem>
+            <menuitem name="LastfmHate" action="LastfmHateAction"></menuitem>
+        </placeholder>
     </popup>
 </ui>

Modified: trunk/banshee/src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys/MultimediaKeysService.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys/MultimediaKeysService.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys/MultimediaKeysService.cs	Thu Feb 14 18:07:56 2008
@@ -33,6 +33,7 @@
 
 using NDesk.DBus;
 
+using Hyena;
 using Banshee.Base;
 using Banshee.ServiceStack;
 

Modified: trunk/banshee/src/Extensions/Extensions.mds
==============================================================================
--- trunk/banshee/src/Extensions/Extensions.mds	(original)
+++ trunk/banshee/src/Extensions/Extensions.mds	Thu Feb 14 18:07:56 2008
@@ -4,6 +4,7 @@
       <Entry build="True" name="Banshee.NotificationArea" configuration="Debug" />
       <Entry build="True" name="Banshee.MultimediaKeys" configuration="Debug" />
       <Entry build="True" name="Banshee.PlayQueue" configuration="Debug" />
+      <Entry build="False" name="Banshee.Lastfm" configuration="Debug" />
       <Entry build="True" name="Banshee.DapCore" configuration="Debug" />
       <Entry build="True" name="Banshee.Dap.MassStorage" configuration="Debug" />
     </Configuration>
@@ -18,7 +19,8 @@
     <Entry filename="Banshee.NotificationArea/Banshee.NotificationArea.mdp" />
     <Entry filename="Banshee.MultimediaKeys/Banshee.MultimediaKeys.mdp" />
     <Entry filename="Banshee.PlayQueue/Banshee.PlayQueue.mdp" />
+    <Entry filename="Banshee.Lastfm/Banshee.Lastfm.mdp" />
     <Entry filename="../Dap/Banshee.DapCore/Banshee.DapCore.mdp" />
     <Entry filename="../Dap/Banshee.Dap.MassStorage/Banshee.Dap.MassStorage.mdp" />
   </Entries>
-</Combine>
\ No newline at end of file
+</Combine>

Modified: trunk/banshee/src/Extensions/Makefile.am
==============================================================================
--- trunk/banshee/src/Extensions/Makefile.am	(original)
+++ trunk/banshee/src/Extensions/Makefile.am	Thu Feb 14 18:07:56 2008
@@ -1,5 +1,6 @@
 SUBDIRS = \
 	Banshee.Audioscrobbler \
+	Banshee.Lastfm \
 	Banshee.MultimediaKeys \
 	Banshee.NotificationArea \
 	Banshee.PlayQueue

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data/IFilterable.cs
==============================================================================
--- /trunk/banshee/src/Core/Hyena/Hyena.Data/IFilterable.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data/IFilterable.cs	Thu Feb 14 18:07:56 2008
@@ -30,7 +30,7 @@
 {
     public interface IFilterable
     {
-        void Refilter();
+        void Refilter ();
         string Filter { get; set; }
         int UnfilteredCount { get; }
     }

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data/ISortable.cs
==============================================================================
--- /trunk/banshee/src/Core/Hyena/Hyena.Data/ISortable.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data/ISortable.cs	Thu Feb 14 18:07:56 2008
@@ -30,7 +30,7 @@
 {
     public interface ISortable
     {
-        void Sort(ISortableColumn column);
+        void Sort (ISortableColumn column);
         ISortableColumn SortColumn { get; }
     }
 }

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data/PropertyStore.cs
==============================================================================
--- /trunk/banshee/src/Core/Hyena/Hyena.Data/PropertyStore.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data/PropertyStore.cs	Thu Feb 14 18:07:56 2008
@@ -112,7 +112,7 @@
                 if(object_store == null) {
                     object_store = new Dictionary<string, object>();
                 }
-                
+
                 if(object_store.ContainsKey(name)) {
                     old_value = (T)object_store[name];
                     if (value.Equals (old_value))
@@ -188,7 +188,7 @@
         public Type GetType(string name)
         {
             lock(this) {
-                return !Contains(name) ? null : object_store[name].GetType();
+                return Contains(name) ? object_store[name].GetType() : null;
             }
         }
     }

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.mdp
==============================================================================
--- /trunk/banshee/src/Core/Hyena/Hyena.mdp	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.mdp	Thu Feb 14 18:07:56 2008
@@ -75,6 +75,7 @@
     <File name="Hyena.Data/DictionaryModelCache.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena.Query/AliasedObjectSet.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena/StringUtil.cs" subtype="Code" buildaction="Compile" />
+    <File name="Hyena/Log.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
@@ -91,4 +92,4 @@
     <AsmRefVar />
     <ProjectRefVar />
   </MonoDevelop.Autotools.MakefileInfo>
-</Project>
\ No newline at end of file
+</Project>

Copied: trunk/banshee/src/Libraries/Hyena/Hyena/Log.cs (from r3233, /trunk/banshee/src/Core/Banshee.Core/Banshee.Base/Log.cs)
==============================================================================
--- /trunk/banshee/src/Core/Banshee.Core/Banshee.Base/Log.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena/Log.cs	Thu Feb 14 18:07:56 2008
@@ -29,7 +29,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace Banshee.Base
+namespace Hyena
 {
     public delegate void LogNotifyHandler (LogNotifyArgs args);
 
@@ -93,10 +93,16 @@
         
         private static Dictionary<uint, DateTime> timers = new Dictionary<uint, DateTime> ();
         private static uint next_timer_id = 1;
+
+        private static bool debugging = false;
+        public static bool Debugging {
+            get { return debugging; }
+            set { debugging = value; }
+        }
         
         private static void Commit (LogEntryType type, string message, string details, bool showUser)
         {
-            if (type == LogEntryType.Debug && !ApplicationContext.Debugging) {
+            if (type == LogEntryType.Debug && !Debugging) {
                 return;
             }
         
@@ -137,28 +143,28 @@
                                     
         public static void Debug (string message, string details)
         {
-            if (ApplicationContext.Debugging) {
+            if (Debugging) {
                 Commit (LogEntryType.Debug, message, details, false);
             }
         }
         
         public static void Debug (string message)
         {
-            if (ApplicationContext.Debugging) {
+            if (Debugging) {
                 Debug (message, null);
             }
         }
         
         public static void DebugFormat (string format, params object [] args)
         {
-            if (ApplicationContext.Debugging) {
+            if (Debugging) {
                 Debug (String.Format (format, args));
             }
         }
         
         public static uint DebugTimerStart (string message)
         {
-            if (!ApplicationContext.Debugging) {
+            if (!Debugging) {
                 return 0;
             }
             
@@ -168,7 +174,7 @@
         
         public static uint DebugTimerStart ()
         {
-            if (!ApplicationContext.Debugging) {
+            if (!Debugging) {
                 return 0;
             }
             
@@ -179,7 +185,7 @@
         
         public static void DebugTimerPrint (uint id)
         {
-            if (!ApplicationContext.Debugging) {
+            if (!Debugging) {
                 return;
             }
             
@@ -188,7 +194,7 @@
         
         public static void DebugTimerPrint (uint id, string message)
         {
-            if (!ApplicationContext.Debugging) {
+            if (!Debugging) {
                 return;
             }
             

Modified: trunk/banshee/src/Libraries/Hyena/Makefile.am
==============================================================================
--- /trunk/banshee/src/Core/Hyena/Makefile.am	(original)
+++ trunk/banshee/src/Libraries/Hyena/Makefile.am	Thu Feb 14 18:07:56 2008
@@ -67,6 +67,7 @@
 	Hyena.SExpEngine/TreeNode.cs \
 	Hyena.SExpEngine/UtilityFunctionSet.cs \
 	Hyena/IUndoAction.cs \
+	Hyena/Log.cs \
 	Hyena/StringUtil.cs \
 	Hyena/Timer.cs \
 	Hyena/UndoManager.cs \

Added: trunk/banshee/src/Libraries/Lastfm.Gui/Lastfm.Gui.mdp
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Libraries/Lastfm.Gui/Lastfm.Gui.mdp	Thu Feb 14 18:07:56 2008
@@ -0,0 +1,23 @@
+<Project name="Lastfm.Gui" fileversion="2.0" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
+  <Configurations active="Debug">
+    <Configuration name="Debug" ctype="DotNetProjectConfiguration">
+      <Output directory="./" assembly="Lastfm" />
+      <Build debugmode="True" target="Library" />
+      <Execution runwithwarnings="True" consolepause="True" runtime="MsNet" clr-version="Net_2_0" />
+      <CodeGeneration compiler="Csc" warninglevel="4" optimize="True" unsafecodeallowed="False" generateoverflowchecks="True" mainclass="" generatexmldocumentation="False" ctype="CSharpCompilerParameters" />
+    </Configuration>
+  </Configurations>
+  <Contents>
+    <File name="./Lastfm.Gui/AccountLoginDialog.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Lastfm.Gui/AccountLoginForm.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Lastfm.Gui/Badge.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Lastfm.Gui/LinkButton.cs" subtype="Code" buildaction="Compile" />
+  </Contents>
+  <References>
+    <ProjectReference type="Gac" localcopy="True" refto="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+    <ProjectReference type="Gac" localcopy="True" refto="gtk-sharp, Version=2.8.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+    <ProjectReference type="Gac" localcopy="True" refto="Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
+    <ProjectReference type="Project" localcopy="False" refto="Gnome.Keyring" />
+    <ProjectReference type="Gac" localcopy="True" refto="gnome-sharp, Version=2.8.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+  </References>
+</Project>

Modified: trunk/banshee/src/Libraries/Lastfm/Lastfm.mdp
==============================================================================
--- trunk/banshee/src/Libraries/Lastfm/Lastfm.mdp	(original)
+++ trunk/banshee/src/Libraries/Lastfm/Lastfm.mdp	Thu Feb 14 18:07:56 2008
@@ -1,25 +1,20 @@
-<Project name="Last.FM" fileversion="2.0" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
+<Project name="Lastfm" fileversion="2.0" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
-      <Output directory="./" assembly="Last.FM" />
+      <Output directory="./" assembly="Lastfm" />
       <Build debugmode="True" target="Library" />
       <Execution runwithwarnings="True" consolepause="True" runtime="MsNet" clr-version="Net_2_0" />
       <CodeGeneration compiler="Csc" warninglevel="4" optimize="True" unsafecodeallowed="False" generateoverflowchecks="True" mainclass="" generatexmldocumentation="False" ctype="CSharpCompilerParameters" />
     </Configuration>
   </Configurations>
   <Contents>
-    <File name="./Last.FM/Account.cs" subtype="Code" buildaction="Compile" />
-    <File name="./Last.FM/Browser.cs" subtype="Code" buildaction="Compile" />
-    <File name="./Last.FM.Gui/AccountLoginDialog.cs" subtype="Code" buildaction="Compile" />
-    <File name="./Last.FM.Gui/AccountLoginForm.cs" subtype="Code" buildaction="Compile" />
-    <File name="./Last.FM.Gui/Badge.cs" subtype="Code" buildaction="Compile" />
-    <File name="./Last.FM.Gui/LinkButton.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Lastfm/Account.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Lastfm/Browser.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Lastfm/Connection.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-    <ProjectReference type="Gac" localcopy="True" refto="gtk-sharp, Version=2.8.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
     <ProjectReference type="Gac" localcopy="True" refto="Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
-    <ProjectReference type="Project" localcopy="False" refto="Gnome.Keyring" />
     <ProjectReference type="Gac" localcopy="True" refto="gnome-sharp, Version=2.8.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
   </References>
-</Project>
\ No newline at end of file
+</Project>

Modified: trunk/banshee/src/Libraries/Lastfm/Lastfm/Account.cs
==============================================================================
--- trunk/banshee/src/Libraries/Lastfm/Lastfm/Account.cs	(original)
+++ trunk/banshee/src/Libraries/Lastfm/Lastfm/Account.cs	Thu Feb 14 18:07:56 2008
@@ -34,7 +34,7 @@
 
 namespace Lastfm
 {
-    public abstract class Account
+    public class Account
     {
         public event EventHandler Updated;
 

Modified: trunk/banshee/src/Libraries/Lastfm/Lastfm/Connection.cs
==============================================================================
--- trunk/banshee/src/Libraries/Lastfm/Lastfm/Connection.cs	(original)
+++ trunk/banshee/src/Libraries/Lastfm/Lastfm/Connection.cs	Thu Feb 14 18:07:56 2008
@@ -36,9 +36,10 @@
 using System.Xml;
 using System.Web;
 
+using Hyena;
 using Mono.Unix;
 
-using Playlists.Xspf;
+using Media.Playlists.Xspf;
 
 namespace Lastfm
 {
@@ -109,7 +110,7 @@
                     return;
 
                 state = value;
-                //LogCore.Instance.PushDebug (String.Format ("Last.fm State Changed to {0}", state), null, false);
+                Log.Debug (String.Format ("Last.fm State Changed to {0}", state), null);
                 StateChangedHandler handler = StateChanged;
                 if (handler != null) {
                     handler (this, new ConnectionStateChangedArgs (state));
@@ -211,9 +212,9 @@
                 try {
                     stream = GetXspfStream (url);
                     pl.Load (stream);
-                    //LogCore.Instance.PushDebug (String.Format ("Adding {0} Tracks to Last.fm Station {1}", pl.TrackCount, station), null);
+                    Log.Debug (String.Format ("Adding {0} Tracks to Last.fm Station {1}", pl.TrackCount, station), null);
                 } catch (System.Net.WebException e) {
-                    //LogCore.Instance.PushWarning ("Error Loading Last.fm Station", e.Message, false);
+                    Log.Warning ("Error Loading Last.fm Station", e.Message, false);
                     return null;
                 } catch (Exception e) {
                     string body = "Unable to get body";
@@ -222,10 +223,10 @@
                             body = strm.ReadToEnd ();
                         }
                     } catch {}
-                    /*LogCore.Instance.PushWarning (
+                    Log.Warning (
                         "Error loading station",
                         String.Format ("Exception:\n{0}\n\nResponse Body:\n{1}", e.ToString (), body), false
-                    );*/
+                    );
                     return null;
                 }
 
@@ -277,11 +278,11 @@
                     // Set us as connecting, assuming the connection attempt wasn't changed out from under us
                     if (ParseHandshake (new StreamReader (stream).ReadToEnd ()) && session != null) {
                         State = ConnectionState.Connected;
-                        //LogCore.Instance.PushDebug (String.Format ("Logged into Last.fm as {0}", Username), null, false);
+                        Log.Debug (String.Format ("Logged into Last.fm as {0}", account.Username), null);
                         return;
                     }
                 } catch (Exception e) {
-                    //LogCore.Instance.PushDebug ("Error in Last.fm Handshake", e.ToString (), false);
+                    Log.Debug ("Error in Last.fm Handshake", e.ToString ());
                 }
                 
                 // Must not have parsed correctly
@@ -293,7 +294,7 @@
 
 		private bool ParseHandshake (string content) 
 		{
-            //LogCore.Instance.PushDebug ("Got Last.fm Handshake Response", content, false);
+            Log.Debug ("Got Last.fm Handshake Response", content);
 			string [] lines = content.Split (new Char[] {'\n'});
 			foreach (string line in lines) {
 				string [] opts = line.Split (new Char[] {'='});
@@ -303,11 +304,11 @@
 					if (opts[1].ToLower () == "failed") {
 						session = null;
 						State = ConnectionState.InvalidAccount;
-                        /*LogCore.Instance.PushWarning (
+                        Log.Warning (
                             Catalog.GetString ("Failed to Login to Last.fm"),
                             Catalog.GetString ("Either your username or password is invalid."),
                             false
-                        );*/
+                        );
 						return false;
 					}
 

Added: trunk/banshee/src/Libraries/Libraries.mds
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Libraries/Libraries.mds	Thu Feb 14 18:07:56 2008
@@ -0,0 +1,25 @@
+<Combine name="Core" fileversion="2.0">
+  <Configurations active="Debug">
+    <Configuration name="Debug" ctype="CombineConfiguration">
+      <Entry build="True" name="Hyena" configuration="Debug" />
+      <Entry build="True" name="Hyena.Gui" configuration="Debug" />
+      <Entry build="True" name="Lastfm" configuration="Debug" />
+      <Entry build="True" name="Lastfm.Gui" configuration="Debug" />
+      <Entry build="True" name="Mono.Media" configuration="Debug" />
+    </Configuration>
+  </Configurations>
+  <StartMode startupentry="Nereid" single="True">
+    <Execute type="None" entry="Hyena" />
+    <Execute type="None" entry="Hyena.Gui" />
+    <Execute type="None" entry="Lastfm" />
+    <Execute type="None" entry="Lastfm.Gui" />
+    <Execute type="None" entry="Mono.Media" />
+  </StartMode>
+  <Entries>
+    <Entry filename="Hyena/Hyena.mdp" />
+    <Entry filename="Hyena.Gui/Hyena.Gui.mdp" />
+    <Entry filename="Lastfm/Lastfm.mdp" />
+    <Entry filename="Lastfm.Gui/Lastfm.Gui.mdp" />
+    <Entry filename="Mono.Media/Mono.Media.mdp" />
+  </Entries>
+</Combine>

Modified: trunk/banshee/src/Libraries/Makefile.am
==============================================================================
--- trunk/banshee/src/Libraries/Makefile.am	(original)
+++ trunk/banshee/src/Libraries/Makefile.am	Thu Feb 14 18:07:56 2008
@@ -1,4 +1,6 @@
 SUBDIRS = \
+   Hyena \
+   Hyena.Gui \
    Mono.Media \
    Lastfm \
    Lastfm.Gui

Modified: trunk/banshee/src/Libraries/Mono.Media/Makefile.am
==============================================================================
--- trunk/banshee/src/Libraries/Mono.Media/Makefile.am	(original)
+++ trunk/banshee/src/Libraries/Mono.Media/Makefile.am	Thu Feb 14 18:07:56 2008
@@ -3,13 +3,13 @@
 LINK = $(REF_MONO_MEDIA)
 
 SOURCES = \
-	Playlists.Xspf/LinkEntry.cs \
-	Playlists.Xspf/MetaEntry.cs \
-	Playlists.Xspf/Playlist.cs \
-	Playlists.Xspf/Track.cs \
-	Playlists.Xspf/W3CDateTime.cs \
-	Playlists.Xspf/XmlUtil.cs \
-	Playlists.Xspf/XspfBaseObject.cs
+	Media.Playlists.Xspf/LinkEntry.cs \
+	Media.Playlists.Xspf/MetaEntry.cs \
+	Media.Playlists.Xspf/Playlist.cs \
+	Media.Playlists.Xspf/Track.cs \
+	Media.Playlists.Xspf/W3CDateTime.cs \
+	Media.Playlists.Xspf/XmlUtil.cs \
+	Media.Playlists.Xspf/XspfBaseObject.cs
 
 include $(top_srcdir)/build/build.mk
 

Modified: trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/LinkEntry.cs
==============================================================================
--- /trunk/banshee/src/Libraries/Mono.Media/Playlists.Xspf/LinkEntry.cs	(original)
+++ trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/LinkEntry.cs	Thu Feb 14 18:07:56 2008
@@ -28,7 +28,7 @@
  
 using System;
 
-namespace Playlists.Xspf
+namespace Media.Playlists.Xspf
 {
     public struct LinkEntry
     {

Modified: trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/MetaEntry.cs
==============================================================================
--- /trunk/banshee/src/Libraries/Mono.Media/Playlists.Xspf/MetaEntry.cs	(original)
+++ trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/MetaEntry.cs	Thu Feb 14 18:07:56 2008
@@ -28,7 +28,7 @@
 
 using System;
 
-namespace Playlists.Xspf
+namespace Media.Playlists.Xspf
 {
     public struct MetaEntry
     {

Modified: trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/Playlist.cs
==============================================================================
--- /trunk/banshee/src/Libraries/Mono.Media/Playlists.Xspf/Playlist.cs	(original)
+++ trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/Playlist.cs	Thu Feb 14 18:07:56 2008
@@ -32,7 +32,7 @@
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 
-namespace Playlists.Xspf
+namespace Media.Playlists.Xspf
 {
     public class Playlist : XspfBaseObject
     {
@@ -57,14 +57,20 @@
         }
         
         private void Load(XmlDocument doc)
-        {   
+        {
             XmlNamespaceManager xmlns = new XmlNamespaceManager(doc.NameTable);
             xmlns.AddNamespace("xspf", XspfNamespace);
             
             XmlNode playlist_node = doc.SelectSingleNode("/xspf:playlist", xmlns);
-            
+
             if(playlist_node == null) {
-                throw new ApplicationException("Not a valid XSPF playlist");
+                // Hack to work with files that don't have a namespace on the <playlist> node, like Last.fm
+                xmlns.AddNamespace("xspf", String.Empty);
+                playlist_node = doc.SelectSingleNode("/xspf:playlist", xmlns);
+
+                if(playlist_node == null) {
+                    throw new ApplicationException("Not a valid XSPF playlist");
+                }
             }
 
             XmlAttribute version_attr = playlist_node.Attributes["version"];

Modified: trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/Track.cs
==============================================================================
--- /trunk/banshee/src/Libraries/Mono.Media/Playlists.Xspf/Track.cs	(original)
+++ trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/Track.cs	Thu Feb 14 18:07:56 2008
@@ -31,7 +31,7 @@
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 
-namespace Playlists.Xspf
+namespace Media.Playlists.Xspf
 {
     public class Track : XspfBaseObject
     {

Modified: trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/W3CDateTime.cs
==============================================================================
--- /trunk/banshee/src/Libraries/Mono.Media/Playlists.Xspf/W3CDateTime.cs	(original)
+++ trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/W3CDateTime.cs	Thu Feb 14 18:07:56 2008
@@ -29,7 +29,7 @@
 using System;
 using System.Text.RegularExpressions;
 
-namespace Playlists.Xspf
+namespace Media.Playlists.Xspf
 {
     public struct W3CDateTime: IComparable
     {

Modified: trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/XmlUtil.cs
==============================================================================
--- /trunk/banshee/src/Libraries/Mono.Media/Playlists.Xspf/XmlUtil.cs	(original)
+++ trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/XmlUtil.cs	Thu Feb 14 18:07:56 2008
@@ -30,7 +30,7 @@
 using System.Xml;
 using System.Collections.Generic;
 
-namespace Playlists.Xspf
+namespace Media.Playlists.Xspf
 {
     internal static class XmlUtil
     {

Modified: trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/XspfBaseObject.cs
==============================================================================
--- /trunk/banshee/src/Libraries/Mono.Media/Playlists.Xspf/XspfBaseObject.cs	(original)
+++ trunk/banshee/src/Libraries/Mono.Media/Media.Playlists.Xspf/XspfBaseObject.cs	Thu Feb 14 18:07:56 2008
@@ -31,7 +31,7 @@
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 
-namespace Playlists.Xspf
+namespace Media.Playlists.Xspf
 {
     public abstract class XspfBaseObject
     {

Added: trunk/banshee/src/Libraries/Mono.Media/Mono.Media.mdp
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Libraries/Mono.Media/Mono.Media.mdp	Thu Feb 14 18:07:56 2008
@@ -0,0 +1,27 @@
+<Project name="Mono.Media" fileversion="2.0" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
+  <Configurations active="Debug">
+    <Configuration name="Debug" ctype="DotNetProjectConfiguration">
+      <Output directory="./" assembly="Mono.Media" />
+      <Build debugmode="True" target="Library" />
+      <Execution runwithwarnings="True" consolepause="True" runtime="MsNet" clr-version="Net_2_0" />
+      <CodeGeneration compiler="Csc" warninglevel="4" optimize="True" unsafecodeallowed="False" generateoverflowchecks="True" mainclass="" generatexmldocumentation="False" ctype="CSharpCompilerParameters" />
+    </Configuration>
+  </Configurations>
+  <Contents>
+    <File name="./Lastfm/Account.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Lastfm/Browser.cs" subtype="Code" buildaction="Compile" />
+    <File name="./Lastfm/Connection.cs" subtype="Code" buildaction="Compile" />
+    <File name="Mono.Media/Banshee.Playlists.Formats.Xspf/LinkEntry.cs" subtype="Code" buildaction="Compile" />
+    <File name="Mono.Media/Banshee.Playlists.Formats.Xspf/MetaEntry.cs" subtype="Code" buildaction="Compile" />
+    <File name="Mono.Media/Banshee.Playlists.Formats.Xspf/Playlist.cs" subtype="Code" buildaction="Compile" />
+    <File name="Mono.Media/Banshee.Playlists.Formats.Xspf/Track.cs" subtype="Code" buildaction="Compile" />
+    <File name="Mono.Media/Banshee.Playlists.Formats.Xspf/W3CDateTime.cs" subtype="Code" buildaction="Compile" />
+    <File name="Mono.Media/Banshee.Playlists.Formats.Xspf/XmlUtil.cs" subtype="Code" buildaction="Compile" />
+    <File name="Mono.Media/Banshee.Playlists.Formats.Xspf/XspfBaseObject.cs" subtype="Code" buildaction="Compile" />
+  </Contents>
+  <References>
+    <ProjectReference type="Gac" localcopy="True" refto="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+    <ProjectReference type="Gac" localcopy="True" refto="Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
+    <ProjectReference type="Gac" localcopy="True" refto="gnome-sharp, Version=2.8.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+  </References>
+</Project>



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