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
- From: gburt svn gnome org
- To: svn-commits-list gnome org
- Subject: 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
- Date: Mon, 23 Jun 2008 22:38:31 +0000 (UTC)
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 ("&", "&")
- .Replace ("<", "<").Replace (">", ">"));
- 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]