void SyncDatabase(UserJob progressUpdater) { try { string message = Catalog.GetString("Writing media database"); UpdateProgress(progressUpdater, message, 1, 1); lock (write_mutex) { MediaDatabase.Write(); } Log.Information("Wrote iPod database"); } catch (Exception e) { Log.Error("Failed to save iPod database", e); } }
private void RaiseReadyToScrobble() { var handler = ReadyToScrobble; if (handler != null) { var recent_plays = new ScrobblingBatchEventArgs { ScrobblingBatch = GatherRecentPlayInfo() }; if (recent_plays.ScrobblingBatch.Count != 0) { handler(this, recent_plays); // We must perform a write to clear out the recent playcount information so we do not // submit duplicate plays on subsequent invocations. lock (write_mutex) { MediaDatabase.Write(); } } } }
private void PerformSyncThreadCycle() { Hyena.Log.Debug("Starting AppleDevice sync thread cycle"); string message; int total, i = 0; var progressUpdater = new UserJob(Catalog.GetString("Syncing iPod"), Catalog.GetString("Preparing to synchronize..."), GetIconNames()); progressUpdater.Register(); MediaDatabase.StartSync(); message = Catalog.GetString("Adding track {0} of {1}"); total = tracks_to_add.Count; while (tracks_to_add.Count > 0) { AppleDeviceTrackInfo track = null; lock (sync_mutex) { total = tracks_to_add.Count + i; track = tracks_to_add.Dequeue(); } try { UpdateProgress(progressUpdater, message, ++i, total); track.CommitToIpod(MediaDatabase); track.Save(false); tracks_map[track.TrackId] = track; } catch (Exception e) { Log.Exception("Cannot save track to the Apple device", e); } } if (total > 0) { OnTracksAdded(); OnUserNotifyUpdated(); } while (tracks_to_update.Count > 0) { AppleDeviceTrackInfo track = null; lock (sync_mutex) { track = tracks_to_update.Dequeue(); } try { track.CommitToIpod(MediaDatabase); } catch (Exception e) { Log.Exception("Cannot save track to iPod", e); } } message = Catalog.GetString("Removing track {0} of {1}"); total = tracks_to_remove.Count; while (tracks_to_remove.Count > 0) { AppleDeviceTrackInfo track = null; lock (sync_mutex) { track = tracks_to_remove.Dequeue(); } if (tracks_map.ContainsKey(track.TrackId)) { tracks_map.Remove(track.TrackId); } try { if (track.IpodTrack != null) { UpdateProgress(progressUpdater, message, total - tracks_to_remove.Count, total); DeleteTrack(track.IpodTrack, true); } else { Log.Error("The ipod track was null"); } } catch (Exception e) { Log.Exception("Cannot remove track from iPod", e); } } if (SupportsPlaylists) { // Remove playlists on the device var device_playlists = new List <GPod.Playlist> (MediaDatabase.Playlists); foreach (var playlist in device_playlists) { if (!playlist.IsMaster && !playlist.IsPodcast) { MediaDatabase.Playlists.Remove(playlist); } } // Add playlists from Banshee to the device foreach (Source child in Children) { PlaylistSource from = child as PlaylistSource; if (from != null && from.Count > 0) { var playlist = new GPod.Playlist(from.Name); MediaDatabase.Playlists.Add(playlist); foreach (int track_id in ServiceManager.DbConnection.QueryEnumerable <int> (String.Format( "SELECT CoreTracks.TrackID FROM {0} WHERE {1}", from.DatabaseTrackModel.ConditionFromFragment, from.DatabaseTrackModel.Condition))) { if (tracks_map.ContainsKey(track_id)) { playlist.Tracks.Add(tracks_map[track_id].IpodTrack); } } } } } try { message = Catalog.GetString("Writing media database"); UpdateProgress(progressUpdater, message, 1, 1); lock (write_mutex) { MediaDatabase.Write(); } Log.Information("Wrote iPod database"); } catch (Exception e) { Log.Exception("Failed to save iPod database", e); } MediaDatabase.StopSync(); progressUpdater.Finish(); Hyena.Log.Debug("Ending AppleDevice sync thread cycle"); }