private void LoadFromDevice(bool refresh) { // bool previous_database_supported = database_supported; if (refresh) { ipod_device.TrackDatabase.Reload(); } tracks_map.Clear(); if (database_supported || (ipod_device.HasTrackDatabase && ipod_device.ModelInfo.DeviceClass == "shuffle")) { foreach (Track ipod_track in ipod_device.TrackDatabase.Tracks) { try { IpodTrackInfo track = new IpodTrackInfo(ipod_track); track.PrimarySource = this; track.Save(false); tracks_map.Add(track.TrackId, track); } catch (Exception e) { Log.Exception(e); } } Hyena.Data.Sqlite.HyenaSqliteCommand insert_cmd = new Hyena.Data.Sqlite.HyenaSqliteCommand( @"INSERT INTO CorePlaylistEntries (PlaylistID, TrackID) SELECT ?, TrackID FROM CoreTracks WHERE PrimarySourceID = ? AND ExternalID = ?"); foreach (IPod.Playlist playlist in ipod_device.TrackDatabase.Playlists) { if (playlist.IsOnTheGo) // || playlist.IsPodcast) { { continue; } PlaylistSource pl_src = new PlaylistSource(playlist.Name, this); pl_src.Save(); // We use the IPod.Track.Id here b/c we just shoved it into ExternalID above when we loaded // the tracks, however when we sync, the Track.Id values may/will change. foreach (IPod.Track track in playlist.Tracks) { ServiceManager.DbConnection.Execute(insert_cmd, pl_src.DbId, this.DbId, track.Id); } pl_src.UpdateCounts(); AddChildSource(pl_src); } } /*else { * BuildDatabaseUnsupportedWidget (); * }*/ /*if(previous_database_supported != database_supported) { * OnPropertiesChanged(); * }*/ }
private void ResolveCoverArt(Track track) { string aaid = CoverArtSpec.CreateArtistAlbumId(track.Artist, track.Album); string path = CoverArtSpec.GetPath(aaid); if (File.Exists(path)) { IpodTrackInfo.SetIpodCoverArt(source.IpodDevice, track, path); } }
protected override void AddTrackToDevice(DatabaseTrackInfo track, SafeUri fromUri) { lock (sync_mutex) { if (track.PrimarySourceId == DbId) { return; } IpodTrackInfo ipod_track = new IpodTrackInfo(track); ipod_track.Uri = fromUri; ipod_track.PrimarySource = this; ipod_track.Save(false); tracks_to_add.Enqueue(ipod_track); } }
/*public override void CopyTrackTo (DatabaseTrackInfo track, SafeUri uri, BatchUserJob job) * { * throw new Exception ("Copy to Library is not implemented for iPods yet"); * }*/ protected override bool DeleteTrack(DatabaseTrackInfo track) { lock (sync_mutex) { if (!tracks_map.ContainsKey(track.TrackId)) { return(true); } IpodTrackInfo ipod_track = tracks_map[track.TrackId]; if (ipod_track != null) { tracks_to_remove.Enqueue(ipod_track); } return(true); } }
protected override void AddTrackToDevice (DatabaseTrackInfo track, SafeUri fromUri) { lock (sync_mutex) { if (track.PrimarySourceId == DbId) { return; } if (track.Duration.Equals (TimeSpan.Zero)) { throw new Exception (Catalog.GetString ("Track duration is zero")); } IpodTrackInfo ipod_track = new IpodTrackInfo (track); ipod_track.Uri = fromUri; ipod_track.PrimarySource = this; ipod_track.Save (false); tracks_to_add.Enqueue (ipod_track); } }
private void LoadFromDevice (bool refresh) { // bool previous_database_supported = database_supported; if (refresh) { ipod_device.TrackDatabase.Reload (); } tracks_map.Clear (); if (database_supported || (ipod_device.HasTrackDatabase && ipod_device.ModelInfo.DeviceClass == "shuffle")) { foreach (Track ipod_track in ipod_device.TrackDatabase.Tracks) { try { IpodTrackInfo track = new IpodTrackInfo (ipod_track); track.PrimarySource = this; track.Save (false); tracks_map.Add (track.TrackId, track); } catch (Exception e) { Log.Exception (e); } } Hyena.Data.Sqlite.HyenaSqliteCommand insert_cmd = new Hyena.Data.Sqlite.HyenaSqliteCommand ( @"INSERT INTO CorePlaylistEntries (PlaylistID, TrackID) SELECT ?, TrackID FROM CoreTracks WHERE PrimarySourceID = ? AND ExternalID = ?"); foreach (IPod.Playlist playlist in ipod_device.TrackDatabase.Playlists) { if (playlist.IsOnTheGo) { // || playlist.IsPodcast) { continue; } PlaylistSource pl_src = new PlaylistSource (playlist.Name, this); pl_src.Save (); // We use the IPod.Track.Id here b/c we just shoved it into ExternalID above when we loaded // the tracks, however when we sync, the Track.Id values may/will change. foreach (IPod.Track track in playlist.Tracks) { ServiceManager.DbConnection.Execute (insert_cmd, pl_src.DbId, this.DbId, track.Id); } pl_src.UpdateCounts (); AddChildSource (pl_src); } } /*else { BuildDatabaseUnsupportedWidget (); }*/ /*if(previous_database_supported != database_supported) { OnPropertiesChanged(); }*/ }
private void PerformSyncThreadCycle() { while (tracks_to_add.Count > 0) { IpodTrackInfo track = null; lock (sync_mutex) { track = tracks_to_add.Dequeue(); } try { track.CommitToIpod(ipod_device); tracks_map[track.TrackId] = track; } catch (Exception e) { Log.Exception("Cannot save track to iPod", e); } } // TODO sync updated metadata to changed tracks while (tracks_to_remove.Count > 0) { IpodTrackInfo 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) { ipod_device.TrackDatabase.RemoveTrack(track.IpodTrack); } } catch (Exception e) { Log.Exception("Cannot remove track from iPod", e); } } // Remove playlists on the device List <IPod.Playlist> device_playlists = new List <IPod.Playlist> (ipod_device.TrackDatabase.Playlists); foreach (IPod.Playlist playlist in device_playlists) { if (!playlist.IsOnTheGo) { ipod_device.TrackDatabase.RemovePlaylist(playlist); } } device_playlists.Clear(); if (SupportsPlaylists) { // Add playlists from Banshee to the device foreach (Source child in Children) { PlaylistSource from = child as PlaylistSource; if (from != null && from.Count > 0) { IPod.Playlist playlist = ipod_device.TrackDatabase.CreatePlaylist(from.Name); foreach (int track_id in ServiceManager.DbConnection.QueryEnumerable <int> (String.Format( "SELECT CoreTracks.TrackID FROM {0} WHERE {1}", from.DatabaseTrackModel.ConditionFromFragment, from.DatabaseTrackModel.Condition))) { playlist.AddTrack(tracks_map[track_id].IpodTrack); } } } } try { ipod_device.TrackDatabase.SaveStarted += OnIpodDatabaseSaveStarted; ipod_device.TrackDatabase.SaveEnded += OnIpodDatabaseSaveEnded; ipod_device.TrackDatabase.SaveProgressChanged += OnIpodDatabaseSaveProgressChanged; ipod_device.Save(); } catch (InsufficientSpaceException) { ErrorSource.AddMessage(Catalog.GetString("Out of space on device"), Catalog.GetString("Please manually remove some songs")); } catch (Exception e) { Log.Exception("Failed to save iPod database", e); } finally { ipod_device.TrackDatabase.SaveStarted -= OnIpodDatabaseSaveStarted; ipod_device.TrackDatabase.SaveEnded -= OnIpodDatabaseSaveEnded; ipod_device.TrackDatabase.SaveProgressChanged -= OnIpodDatabaseSaveProgressChanged; } }