summaryrefslogtreecommitdiff
path: root/src/Dap
diff options
context:
space:
mode:
authorAndrés G. Aragoneses <knocte@gmail.com>2010-09-19 15:29:51 +0200
committerAndrés G. Aragoneses <knocte@gmail.com>2010-09-19 15:29:51 +0200
commit70380e3920da9264dca773a522b856bfd3461e64 (patch)
treeb352cd1aed0a0589d85d25a5f46774baec79ab61 /src/Dap
parent48a23c092d5472126915e146c4364d2106791c20 (diff)
[Dap.Ipod] Update metadata in Manual Sync mode (bgo#589196)
This patch basically takes care of implementing the UpdateMetadata() call exposed virtually by PrimarySource to make the changes belong to the PerformSync operation, and overrides HasEditableTrackProperties to true for the SaveTrackMetadaService to be able to hook on the source to flush changes to files (these changes wouldn't actually be visible by the iPod but it's still good to flush them to maintain them in sync with what is in the iPod database, just in case some user copies/imports them from the device).
Diffstat (limited to 'src/Dap')
-rw-r--r--src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs49
-rw-r--r--src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodTrackInfo.cs13
2 files changed, 58 insertions, 4 deletions
diff --git a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs
index e79bb1208..ec928fea2 100644
--- a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs
+++ b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs
@@ -35,6 +35,7 @@ using Mono.Unix;
using IPod;
using Hyena;
+using Hyena.Query;
using Banshee.Base;
using Banshee.ServiceStack;
using Banshee.Sources;
@@ -401,6 +402,27 @@ namespace Banshee.Dap.Ipod
#region Syncing
+ public override void UpdateMetadata (DatabaseTrackInfo track)
+ {
+ lock (sync_mutex) {
+ IpodTrackInfo ipod_track;
+ if (!tracks_map.TryGetValue (track.TrackId, out ipod_track)) {
+ return;
+ }
+
+ ipod_track.UpdateInfo (track);
+ tracks_to_update.Enqueue (ipod_track);
+ }
+ }
+
+ protected override void OnTracksChanged (params QueryField[] fields)
+ {
+ if (tracks_to_update.Count > 0 && !Sync.Syncing) {
+ QueueSync ();
+ }
+ base.OnTracksChanged (fields);
+ }
+
protected override void OnTracksAdded ()
{
if (!IsAdding && tracks_to_add.Count > 0 && !Sync.Syncing) {
@@ -418,6 +440,7 @@ namespace Banshee.Dap.Ipod
}
private Queue<IpodTrackInfo> tracks_to_add = new Queue<IpodTrackInfo> ();
+ private Queue<IpodTrackInfo> tracks_to_update = new Queue<IpodTrackInfo> ();
private Queue<IpodTrackInfo> tracks_to_remove = new Queue<IpodTrackInfo> ();
private uint sync_timeout_id = 0;
@@ -586,7 +609,18 @@ namespace Banshee.Dap.Ipod
OnUserNotifyUpdated ();
}
- // TODO sync updated metadata to changed tracks
+ while (tracks_to_update.Count > 0) {
+ IpodTrackInfo track = null;
+ lock (sync_mutex) {
+ track = tracks_to_update.Dequeue ();
+ }
+
+ try {
+ track.CommitToIpod (ipod_device);
+ } catch (Exception e) {
+ Log.Exception ("Cannot save track to iPod", e);
+ }
+ }
while (tracks_to_remove.Count > 0) {
IpodTrackInfo track = null;
@@ -702,11 +736,22 @@ namespace Banshee.Dap.Ipod
public bool SyncNeeded {
get {
lock (sync_mutex) {
- return tracks_to_add.Count > 0 || tracks_to_remove.Count > 0;
+ return tracks_to_add.Count > 0 ||
+ tracks_to_update.Count > 0 ||
+ tracks_to_remove.Count > 0;
+
}
}
}
+ public override bool HasEditableTrackProperties {
+ get {
+ // we want child sources to be able to edit metadata and the
+ // savetrackmetadataservice to take in account this source
+ return true;
+ }
+ }
+
#endregion
}
diff --git a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodTrackInfo.cs b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodTrackInfo.cs
index a2be748ef..9d83e303c 100644
--- a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodTrackInfo.cs
+++ b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodTrackInfo.cs
@@ -61,10 +61,19 @@ namespace Banshee.Dap.Ipod
public IpodTrackInfo (TrackInfo track)
{
+ CanSaveToDatabase = true;
+
if (track is IpodTrackInfo) {
this.track = ((IpodTrackInfo)track).IpodTrack;
LoadFromIpodTrack ();
} else {
+ UpdateInfo (track);
+ }
+ }
+
+ public void UpdateInfo (TrackInfo track)
+ {
+ if (!(track is IpodTrackInfo)) {
AlbumArtist = track.AlbumArtist;
AlbumTitle = track.AlbumTitle;
ArtistName = track.ArtistName;
@@ -100,9 +109,9 @@ namespace Banshee.Dap.Ipod
description = podcast_info.Description;
ReleaseDate = podcast_info.ReleaseDate;
}
+ } else {
+ throw new ArgumentException ("Shouldn't update an IpodTrackInfo from an IpodTrackInfo");
}
-
- CanSaveToDatabase = true;
}
private void LoadFromIpodTrack ()