Example #1
0
        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);
            }
        }
Example #3
0
        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);
            }
        }
Example #4
0
        /*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();
            }*/
        }
Example #7
0
        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;
            }
        }