private void LoadFromDevice(bool refresh) { tracks_map.Clear(); if (refresh || MediaDatabase == null) { if (MediaDatabase != null) { MediaDatabase.Dispose(); } try { MediaDatabase = new GPod.ITDB(Device.Mountpoint); } catch (GLib.GException e) { Log.Exception("iPod database could not be loaded, creating a new one", e); if (GPod.ITDB.InitIpod(Volume.MountPoint, null, Volume.Name)) { // this may throw again. In the future we need to implement some kind of alert // mechanism to let the user know that something more serious is wrong with their // apple device a la the other iPod extension. MediaDatabase = new GPod.ITDB(Device.Mountpoint); } else { Log.Error("Failed to init iPod database"); return; } } } if (MediaDatabase.MasterPlaylist == null) { MediaDatabase.Playlists.Add(new GPod.Playlist(Name) { IsMaster = true }); } if (SupportsPodcasts && MediaDatabase.PodcastsPlaylist == null) { MediaDatabase.Playlists.Add(new GPod.Playlist(Catalog.GetString("Podcasts")) { IsPodcast = true }); } var invalid_tracks = new List <GPod.Track> (); foreach (var ipod_track in MediaDatabase.Tracks) { if (String.IsNullOrEmpty(ipod_track.IpodPath)) { invalid_tracks.Add(ipod_track); continue; } try { var track = new AppleDeviceTrackInfo(ipod_track); if (!tracks_map.ContainsKey(track.TrackId)) { track.PrimarySource = this; track.Save(false); tracks_map.Add(track.TrackId, track); } } catch (Exception e) { Log.Exception(e); } } if (invalid_tracks.Count > 0) { Log.Warning(String.Format("Found {0} invalid tracks on the device", invalid_tracks.Count)); foreach (var track in invalid_tracks) { DeleteTrack(track, false); } } 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 (var playlist in MediaDatabase.Playlists) { if (playlist.IsMaster || playlist.IsPodcast) { continue; } PlaylistSource pl_src = new PlaylistSource(playlist.Name, this); pl_src.Save(); // We use the GPod.Track.DBID here b/c we just shoved it into ExternalID above when we loaded // the tracks, however when we sync, the Track.DBID values may/will change. foreach (var track in playlist.Tracks) { // DBID will be stored in a long, so we need to cast it. See bgo#650011 ServiceManager.DbConnection.Execute(insert_cmd, pl_src.DbId, this.DbId, (long)track.DBID); } pl_src.UpdateCounts(); AddChildSource(pl_src); } RaiseReadyToScrobble(); }
private void LoadFromDevice (bool refresh) { tracks_map.Clear (); if (refresh || MediaDatabase == null) { if (MediaDatabase != null) MediaDatabase.Dispose (); try { MediaDatabase = new GPod.ITDB (Device.Mountpoint); } catch (GLib.GException e) { Log.Exception ("iPod database could be loaded, creating a new one", e); if (GPod.ITDB.InitIpod (Volume.MountPoint, null, Volume.Name)) { // this may throw again. In the future we need to implement some kind of alert // mechanism to let the user know that something more serious is wrong with their // apple device a la the other iPod extension. MediaDatabase = new GPod.ITDB (Device.Mountpoint); } else { Log.Error ("Failed to init iPod database"); return; } } } if (MediaDatabase.MasterPlaylist == null) { MediaDatabase.Playlists.Add (new GPod.Playlist (Name) { IsMaster = true }); } if (SupportsPodcasts && MediaDatabase.PodcastsPlaylist == null) { MediaDatabase.Playlists.Add (new GPod.Playlist (Catalog.GetString ("Podcasts")) { IsPodcast = true }); } foreach (var ipod_track in MediaDatabase.Tracks) { try { var track = new AppleDeviceTrackInfo (ipod_track); if (!tracks_map.ContainsKey (track.TrackId)) { 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 (var playlist in MediaDatabase.Playlists) { if (playlist.IsMaster || 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 (var track in playlist.Tracks) { ServiceManager.DbConnection.Execute (insert_cmd, pl_src.DbId, this.DbId, track.DBID); } pl_src.UpdateCounts (); AddChildSource (pl_src); } }
private void LoadFromDevice (bool refresh) { tracks_map.Clear (); if (refresh || MediaDatabase == null) { if (MediaDatabase != null) MediaDatabase.Dispose (); MediaDatabase = new GPod.ITDB (Device.Mountpoint); } foreach (var ipod_track in MediaDatabase.Tracks) { try { var track = new AppleDeviceTrackInfo (ipod_track); if (!tracks_map.ContainsKey (track.TrackId)) { 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(); }*/ }
public void CommitToIpod(GPod.ITDB database) { bool addTrack = IpodTrack == null; if (IpodTrack == null) { IpodTrack = new GPod.Track(); } var track = IpodTrack; track.Compilation = IsCompilation; track.AlbumArtist = AlbumArtist; track.Bitrate = BitRate; track.Samplerate = (ushort)SampleRate; track.BPM = (short)Bpm; track.Comment = Comment; track.Composer = Composer; track.TimeAdded = DateTime.Now; track.CDs = DiscCount; track.CDNumber = DiscNumber; track.TrackLength = (int)Duration.TotalMilliseconds; track.Size = (int)FileSize; track.Grouping = Grouping; try { track.TimePlayed = LastPlayed; } catch { Hyena.Log.InformationFormat("Couldn't set TimePlayed to '{0}'", LastPlayed); } track.PlayCount = (uint)PlayCount; track.Tracks = TrackCount; track.TrackNumber = TrackNumber; track.Year = Year; try { track.TimeReleased = ReleaseDate; } catch { Hyena.Log.InformationFormat("Couldn't set TimeReleased to '{0}'", ReleaseDate); } track.Album = AlbumTitle; track.Artist = ArtistName; track.Title = TrackTitle; track.Genre = Genre; track.SortArtist = ArtistNameSort; track.SortAlbum = AlbumTitleSort; track.SortAlbumArtist = AlbumArtistSort; track.SortTitle = TrackTitleSort; track.Rating = ((Rating >= 1) && (Rating <= 5)) ? (uint)Rating : 0; if (HasAttribute(TrackMediaAttributes.Podcast)) { track.Description = description; track.RememberPlaybackPosition = true; track.SkipWhenShuffling = true; track.Flag4 = (byte)1; track.MarkUnplayed = (track.PlayCount == 0); } track.MediaType = GPod.MediaType.Audio; if (HasAttribute(TrackMediaAttributes.VideoStream)) { if (HasAttribute(TrackMediaAttributes.Podcast)) { track.MediaType = GPod.MediaType.Podcast | GPod.MediaType.Movie; } else if (HasAttribute(TrackMediaAttributes.Music)) { if (HasAttribute(TrackMediaAttributes.TvShow)) { track.MediaType = GPod.MediaType.MusicTVShow; } else { track.MediaType = GPod.MediaType.MusicVideo; } } else if (HasAttribute(TrackMediaAttributes.Movie)) { track.MediaType = GPod.MediaType.Movie; } else if (HasAttribute(TrackMediaAttributes.TvShow)) { track.MediaType = GPod.MediaType.TVShow; } else { // I dont' think AudioVideo should be used here; upon loading the tracks // into Banshee, audio files often have AudioVideo (aka MediaType == 0) too. //track.MediaType = GPod.MediaType.AudioVideo; track.MediaType = GPod.MediaType.Movie; } } else { if (HasAttribute(TrackMediaAttributes.Podcast)) { track.MediaType = GPod.MediaType.Podcast; } else if (HasAttribute(TrackMediaAttributes.AudioBook)) { track.MediaType = GPod.MediaType.Audiobook; } else if (HasAttribute(TrackMediaAttributes.Music)) { track.MediaType = GPod.MediaType.Audio; } else { track.MediaType = GPod.MediaType.Audio; } } if (addTrack) { track.Filetype = mimetype; database.Tracks.Add(IpodTrack); database.MasterPlaylist.Tracks.Add(IpodTrack); if (HasAttribute(TrackMediaAttributes.Podcast) && database.Device.SupportsPodcast) { database.PodcastsPlaylist.Tracks.Add(IpodTrack); } database.CopyTrackToIPod(track, Uri.LocalPath); Uri = new SafeUri(GPod.ITDB.GetLocalPath(database.Device, track)); ExternalId = (long)IpodTrack.DBID; } if (CoverArtSpec.CoverExists(ArtworkId)) { string path = CoverArtSpec.GetPath(ArtworkId); if (!track.ThumbnailsSet(path)) { Log.Error(String.Format("Could not set cover art for {0}.", path)); } } else { track.ThumbnailsRemoveAll(); } }