banshee r4190 - in trunk/banshee: . src/Core/Banshee.Services/Banshee.Collection.Database src/Extensions/Banshee.Daap/Banshee.Daap src/Extensions/Banshee.Daap/Daap src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data



Author: gburt
Date: Mon Jun 23 22:38:31 2008
New Revision: 4190
URL: http://svn.gnome.org/viewvc/banshee?rev=4190&view=rev

Log:
2008-06-23  Gabriel Burt  <gabriel burt gmail com>

	Some good changes to the DAAP extension.  It should now load the remote
	track list much much faster.  Still needs work though.

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs:
	* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs:
	Bind the ExternalId in DatabaseTrackInfo.

	* src/Extensions/Banshee.Daap/Daap/ServiceLocator.cs: Clean up logging.

	* src/Extensions/Banshee.Daap/Banshee.Daap/DaapService.cs: Remove the
	container source when disposing the service.

	* src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs: Get rid of the
	Dictionary track_map (instead use the CoreTracks.ExternalId column),
	improve logging, and purge tracks and unmap playlists when disposed.

	* src/Extensions/Banshee.Daap/Banshee.Daap/DaapTrackInfo.cs: Set the
	MimeType and ExternalId properties.

	* src/Extensions/Banshee.Daap/Banshee.Daap/DaapPlaylistSource.cs: First
	pass at making playlists much more efficient (one SQL command instead of
	N).


Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
   trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapPlaylistSource.cs
   trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapService.cs
   trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs
   trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapTrackInfo.cs
   trunk/banshee/src/Extensions/Banshee.Daap/Daap/ServiceLocator.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs	Mon Jun 23 22:38:31 2008
@@ -451,6 +451,13 @@
             set { base.SkipCount = value; }
         }
         
+        private long external_id;
+        [DatabaseColumn ("ExternalID")]
+        public long ExternalId {
+            get { return external_id; }
+            set { external_id = value; }
+        }
+        
         [DatabaseColumn ("LastPlayedStamp")]
         public override DateTime LastPlayed {
             get { return base.LastPlayed; }

Modified: trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapPlaylistSource.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapPlaylistSource.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapPlaylistSource.cs	Mon Jun 23 22:38:31 2008
@@ -27,10 +27,13 @@
 //
 
 using System;
+using System.Collections.Generic;
 using Mono.Unix;
 
 using Hyena;
+using Hyena.Data.Sqlite;
 
+using Banshee.ServiceStack;
 using Banshee.Collection;
 using Banshee.Collection.Database;
 using Banshee.Playlist;
@@ -42,6 +45,11 @@
 {
     public class DaapPlaylistSource : PlaylistSource
     {
+        private HyenaSqliteCommand insert_track_command = new HyenaSqliteCommand (@"
+            INSERT INTO CorePlaylistEntries (PlaylistID, EntryID) 
+                SELECT ?, TrackID FROM CoreTracks WHERE PrimarySourceID = ? AND ExternalID IN (?)"
+        );
+        
         private DaapSource parent;
         public DAAP.Database Database {
             get { return parent.Database; }
@@ -50,26 +58,23 @@
         public DaapPlaylistSource (DAAP.Playlist playlist, int id, DaapSource parent) : base (playlist.Name, parent.DbId)
         {
             this.parent = parent;
-            this.Save ();
+            Save ();
             
-            foreach (DAAP.Track track in playlist.Tracks) {
-                if (track != null && parent.TrackMap.ContainsKey (track.Id)) {
-                    Console.WriteLine ("Adding track {0} to {1}", parent.TrackMap [track.Id], DbId);
-                    AddTrack (parent.TrackMap [track.Id]);
-                } else {
-                    Log.Warning ("Can't find track: was either null or not in map.", false);
+            if (playlist.Tracks.Count > 0) {
+                //IList<DAAP.Track> tracks = playlist.Tracks;
+                int [] external_ids = new int [playlist.Tracks.Count];
+                //for (int i = 0; i < tracks.Count; i++) {
+                int i = 0;
+                foreach (DAAP.Track track in playlist.Tracks) {
+                    external_ids[i] = track.Id;
+                    i++;
                 }
+                HyenaSqliteCommand.LogAll = true;
+                ServiceManager.DbConnection.Execute (insert_track_command, DbId, parent.DbId, external_ids);
+                HyenaSqliteCommand.LogAll = false;
             }
-            
-            this.Reload ();
-        }
-        
-        public override bool ShowBrowser {
-            get { return false; }
-        }
-        
-        protected override string TypeUniqueId {
-            get { return "daap-playlist"; }
+            SavedCount = playlist.Tracks.Count;
+            OnUpdated ();
         }
     }
 }

Modified: trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapService.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapService.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapService.cs	Mon Jun 23 22:38:31 2008
@@ -78,6 +78,11 @@
                 kv.Value.Dispose ();
             }
             
+            if (container != null) {
+                ServiceManager.SourceManager.RemoveSource (container, false);
+                container = null;
+            }
+            
             source_map.Clear ();
         }
         

Modified: trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapSource.cs	Mon Jun 23 22:38:31 2008
@@ -53,11 +53,6 @@
             get { return database; }
         }
         
-        private Dictionary <int, int> daap_track_map;
-        public Dictionary <int, int> TrackMap {
-            get { return daap_track_map; }
-        }
-        
         private bool is_activating;
         private int playlistid;
         
@@ -65,7 +60,6 @@
                                                     (service.Address.ToString () + service.Port).Replace (":", "").Replace (".", ""), 300)
         {
             this.service = service;
-            daap_track_map = new Dictionary <int, int> ();
             Properties.SetString ("UnmapSourceActionLabel", Catalog.GetString ("Disconnect"));
             Properties.SetString ("UnmapSourceActionIconName", "gtk-disconnect");
             
@@ -87,7 +81,7 @@
         public override void Activate ()
         {
             if (client != null || is_activating) {
-            	return;
+                return;
             }
             
             is_activating = true;
@@ -108,22 +102,8 @@
                         ThreadAssist.ProxyToMain (PromptLogin);
                     }
                 } catch(Exception e) {
-                    /*ThreadAssist.ProxyToMain(delegate {
-                        DaapErrorView error_view = new DaapErrorView(this, DaapErrorType.BrokenAuthentication);
-                        while(box.Children.Length > 0) {
-                            box.Remove(box.Children[0]);
-                        }
-                        box.PackStart(error_view, true, true, 0);
-                        error_view.Show();
-                    });*/
-                    
-                    string details = String.Format ("Couldn't connect to service {0} on {1}:{2} - {3}",
-                                                      service.Name,
-                                                      service.Address,
-                                                      service.Port, e.ToString ().Replace ("&", "&amp;")
-                                                    .Replace ("<", "&lt;").Replace (">", "&gt;"));
-                    Log.Warning ("Failed to connect", details, true);
-                    HideStatus ();
+                    SetStatus (String.Format (Catalog.GetString ("Failed to connect to {0}"), service.Name), true);
+                    Hyena.Log.Exception (e);
                 }
                
                 is_activating = false;
@@ -144,11 +124,7 @@
             
             // Remove tracks associated with this source, since we don't want
             // them after we unmap - we'll refetch.
-            if (Count > 0) {
-                RemoveTrackRange ((DatabaseTrackListModel)TrackModel, new Hyena.Collections.RangeCollection.Range (0, Count));
-            }
-            
-            daap_track_map.Clear ();
+            PurgeTracks ();
             
             if (client != null) {
                 if (logout) {
@@ -165,7 +141,14 @@
                 database.TrackRemoved -= OnDatabaseTrackRemoved;
                 database = null;
             }
-
+            
+            List<Source> children = new List<Source> (Children);
+            foreach (Source child in children) {
+                if (child is Banshee.Sources.IUnmapableSource) {
+                    (child as Banshee.Sources.IUnmapableSource).Unmap ();
+                }
+            }
+            
             ClearChildSources();
             
             return true;
@@ -177,7 +160,7 @@
             base.Dispose ();
         }
         
-        private void PromptLogin (object o, EventArgs args)
+        private void PromptLogin ()
         {
             SetStatus (String.Format (Catalog.GetString ("Logging in to {0}"), Name), false);
             
@@ -210,21 +193,24 @@
                 database.TrackAdded += OnDatabaseTrackAdded;
                 database.TrackRemoved += OnDatabaseTrackRemoved;
                 
+                SetStatus (String.Format (Catalog.GetString ("Loading {0} tracks"), database.Tracks.Count), false, true, "gtk-refresh");
+                
+                int count = 0;
+                DaapTrackInfo daap_track = null;
                 foreach (DAAP.Track track in database.Tracks) {
-                    DaapTrackInfo daaptrack = new DaapTrackInfo (track, this);
-                    daaptrack.Save ();
-                    Log.Debug ("Track ID", daaptrack.TrackId.ToString ());
-                    
-                    daap_track_map.Add (track.Id, daaptrack.TrackId);
+                    daap_track = new DaapTrackInfo (track, this);
+                    daap_track.Save (++count % 250 == 0);
                 }
                 
-                AddPlaylistSources ();
+                // Save the last track once more to trigger the NotifyTrackAdded
+                if (daap_track != null) {
+                    daap_track.Save ();
+                }
                 
+                SetStatus (Catalog.GetString ("Loading playlists"), false);
+                AddPlaylistSources ();
                 Reload ();
-                
-                ThreadAssist.ProxyToMain(delegate {
-                    HideStatus ();
-                });
+                HideStatus ();
             }
             
             Name = client.Name;
@@ -246,20 +232,11 @@
         {
             DaapTrackInfo track = new DaapTrackInfo (args.Track, this);
             track.Save ();
-            
-            if (!daap_track_map.ContainsKey (args.Track.Id)) {
-                daap_track_map.Add (args.Track.Id, track.TrackId);
-            }
         }
         
         public void OnDatabaseTrackRemoved (object o, DAAP.TrackArgs args)
         {
-            if (daap_track_map.ContainsKey (args.Track.Id)) {
-                //DaapTrackInfo track = daap_track_map [args.Track.Id];
-                //RemoveTrack (track);
-                //RemoveTrack (
-                // TODO
-            }
+            //RemoveTrack (
         }
         
         public override bool CanRemoveTracks {
@@ -276,14 +253,9 @@
 
         public bool Unmap ()
         {
-            // TODO: Maybe keep track of where we came from, or pick the next source up on the list?
-            ServiceManager.SourceManager.SetActiveSource (ServiceManager.SourceManager.MusicLibrary);
-            
             // Disconnect and clear out our tracks and such.
             Disconnect (true);
             
-            Reload ();
-            
             return true;
         }
         

Modified: trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapTrackInfo.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapTrackInfo.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap/DaapTrackInfo.cs	Mon Jun 23 22:38:31 2008
@@ -53,20 +53,23 @@
             TrackNumber = track.TrackNumber;
             Year = track.Year;
             Duration = track.Duration;
+            MimeType = track.Format;
+            ExternalId = track.Id;
             
             PrimarySource = source;
             
-            string sessionid = "";
+            string session_id = String.Empty;
             if (source.Database.Client.Fetcher.SessionId != 0) {
-                sessionid = String.Format ("?session-id={0}", source.Database.Client.Fetcher.SessionId);
+                session_id = String.Format ("?session-id={0}", source.Database.Client.Fetcher.SessionId);
             }
+
             string uri = String.Format ("http://{0}:{1}/databases/{2}/items/{3}.{4}{5}";,
                                         source.Database.Client.Address.ToString (),
                                         source.Database.Client.Port,
                                         source.Database.Id,
                                         track.Id,
                                         track.Format,
-                                        sessionid);
+                                        session_id);
             
             Uri = new SafeUri (uri);
             

Modified: trunk/banshee/src/Extensions/Banshee.Daap/Daap/ServiceLocator.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Daap/Daap/ServiceLocator.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Daap/Daap/ServiceLocator.cs	Mon Jun 23 22:38:31 2008
@@ -102,7 +102,6 @@
         
         public ServiceLocator ()
         {
-            Log.Debug ("ServiceLocator backend", "using Mono.Zeroconf.");
         }
         
         public void Start () {
@@ -124,28 +123,28 @@
         
         private void OnServiceAdded (object o, ServiceBrowseEventArgs args) {
             args.Service.Resolved += OnServiceResolved;
-            Log.DebugFormat ("Got {0}, trying to resolve...", args.Service.Name);
+            Log.DebugFormat ("Found DAAP share {0}, trying to resolve...", args.Service.Name);
             args.Service.Resolve ();
         }
         
         private void OnServiceResolved (object o, ServiceResolvedEventArgs args) {
             string name = args.Service.Name;
 
-            Log.DebugFormat ("Managed to resolve {0}.", args.Service.Name);
+            Log.DebugFormat ("Managed to resolve DAAP share {0}.", args.Service.Name);
                         
-            bool pwRequired = false;
+            bool password_required = false;
 
             // iTunes tacks this on to indicate a passsword protected share.  Ugh.
             if (name.EndsWith ("_PW")) {
                 name = name.Substring (0, name.Length - 3);
-                pwRequired = true;
+                password_required = true;
             }
             
             IResolvableService service = (IResolvableService) args.Service;
             
             foreach(TxtRecordItem item in service.TxtRecord) {
                 if(item.Key.ToLower () == "password") {
-                    pwRequired = item.ValueString.ToLower () == "true";
+                    password_required = item.ValueString.ToLower () == "true";
                 } else if (item.Key.ToLower () == "machine name") {
                     name = item.ValueString;
                 }
@@ -176,7 +175,7 @@
             Log.DebugFormat ("Using address {0}", address);
             
             Daap.Service svc = new Daap.Service (address, (ushort)service.Port, 
-                name, pwRequired);
+                name, password_required);
             
             if (services.ContainsKey (name)) {
                 services[name] = svc;

Modified: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs	Mon Jun 23 22:38:31 2008
@@ -69,7 +69,6 @@
         }
         
         private int position;
-        private long item_id;
 
 #region Properties
 
@@ -80,12 +79,12 @@
         private FeedItem item;
         public FeedItem Item {
             get {
-                if (item == null && item_id > 0) {
-                    item = FeedItem.Provider.FetchSingle (item_id);
+                if (item == null && ExternalId > 0) {
+                    item = FeedItem.Provider.FetchSingle (ExternalId);
                 }
                 return item;
             }
-            set { item = value; item_id = value.DbId; }
+            set { item = value; ExternalId = value.DbId; }
         }
         
         public DateTime PublishedDate {
@@ -109,12 +108,6 @@
             get { return Item.PubDate; }
         }
         
-        [DatabaseColumn ("ExternalID")]
-        public long ItemId {
-            get { return item_id; }
-            private set { item_id = value; }
-        }
-        
         //[VirtualDatabaseColumn ("Title", Item.Feed.Title, "ItemID", "ExternalID")]
         
         // Override these two so they aren't considered DatabaseColumns so we don't



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