Пример #1
0
        /// <summary>
        /// Scan all tracks in the given playlist.
        /// </summary>
        /// <param name="list"></param>

        private void ScanTracks(PersistentIDCollection pids)
        {
            // Artwork must be applied to every track in an album.
            // Although we may apply artwork to the CurrentTrack, it will not show up in the
            // iTunes artwork viewer until context is moved to another track and then the user
            // selects or plays that first track again.

            foreach (PersistentID persistentID in pids)
            {
                if (!base.isActive)
                {
                    Logger.WriteLine(base.name, "Artwork scanner cancelled while scanning");
                    break;
                }

                using (Track track = libraryPlaylist.GetTrack(persistentID))
                {
                    if ((track != null) && (track.Kind == TrackKind.File))
                    {
                        string album  = track.Album;
                        string artist = track.Artist;

                        string key = track.MakeKey();
                        if (String.IsNullOrEmpty(track.Artwork))
                        {
                            Logger.WriteLine(base.name, "Fetching album artwork for " + key);

                            try
                            {
                                if (ScannerBase.isLive)
                                {
                                    track.Artwork = GetArtworkPath(artist, album);
                                }
                            }
                            catch (Exception exc)
                            {
                                Logger.WriteLine(base.name,
                                                 String.Format("Error fetching artwork {0}, {1}, {2}",
                                                               artist, track.Name, album), exc);
                            }
                        }
                        else
                        {
                            Logger.WriteLine(base.name, "Album already has artwork " + key);
                        }
                    }
                }

                count++;
                base.ProgressPercentage = (int)((double)count / (double)total * 100.0);
            }
        }
Пример #2
0
        /// <summary>
        /// Scan all tracks in the given playlist.
        /// </summary>
        /// <param name="list"></param>

        private void ScanTracks(PersistentIDCollection pids)
        {
            var tagger = new Tagger();
            int total  = pids.Count;
            int count  = 0;

            foreach (PersistentID persistentID in pids)
            {
                if (!base.isActive)
                {
                    Logger.WriteLine(base.name, "Information scanner cancelled while scanning");
                    break;
                }

                using (Track track = libraryPlaylist.GetTrack(persistentID))
                {
                    if ((track != null) && (track.Kind == TrackKind.File))
                    {
                        Logger.WriteLine(base.name, String.Format(
                                             "Fetching tag information for '{0}' ({1})",
                                             track.MakeKey(), track.UniqueID));

                        try
                        {
                            // store into a temporary TrackFile so we can decide which
                            // properties to update...

                            var buffer = new TrackFile(track);
                            tagger.RetrieveTags(buffer);

                            Reconcile(track, buffer);
                        }
                        catch (Exception exc)
                        {
                            Logger.WriteLine(base.name,
                                             String.Format("Error fetching information {0}, {1}, {2}",
                                                           track.Artist, track.Name, track.Album), exc);
                        }
                    }
                }

                count++;
                base.ProgressPercentage = (int)((double)count / (double)total * 100.0);
            }

            tagger = null;
        }
Пример #3
0
        /// <summary>
        /// Scan all tracks in the given playlist.
        /// </summary>
        /// <param name="list"></param>

        private void ScanTracks(PersistentIDCollection pids)
        {
            foreach (PersistentID persistentID in pids)
            {
                if (base.isActive)
                {
                    using (Track track = libraryPlaylist.GetTrack(persistentID))
                    {
                        if ((track != null) && (track.Kind == TrackKind.File))
                        {
                            //Logger.WriteLine(base.name, "ScanTrying " + track.MakeKey());

                            if (String.IsNullOrEmpty(track.Location) || !File.Exists(track.Location))
                            {
                                Logger.WriteLine(base.name,
                                                 "Deleting phantom track " + track.MakeKey());

                                try
                                {
                                    if (ScannerBase.isLive)
                                    {
                                        // deletes library entry but not physical media file
                                        track.Delete();
                                    }
                                }
                                catch (Exception exc)
                                {
                                    Logger.WriteLine(base.name,
                                                     String.Format("Error deleting phantom {0}, {1}, {2}",
                                                                   track.Artist, track.Name, track.Album), exc);
                                }
                            }
                        }
                    }

                    count++;
                    base.ProgressPercentage = (int)((double)count / (double)total * 100.0);
                }
                else
                {
                    Logger.WriteLine(base.name, "Phantom scanner cancelled while scanning");
                    break;
                }
            }
        }
Пример #4
0
        //========================================================================================
        // Methods
        //========================================================================================

        /// <summary>
        /// Execute the scanner.
        /// </summary>
        /// <remarks>
        /// Duplicates are first identified by comparing Artist, Name, and Album.  These are
        /// all stored as (ID3) tags within the media file.  So these must match or the files
        /// are already different and any further analysis (checksum or MD5) would be useless.
        /// </remarks>

        public override void Execute()
        {
            try
            {
                Logger.WriteLine(base.name, "Duplicate scanner beginning");

                int                    total;
                int                    count = 0;
                Track                  candidate;
                Candidates             candidates      = new Candidates();
                TrackCollection        duplicates      = new TrackCollection();
                Playlist               libraryPlaylist = controller.LibraryPlaylist;
                PersistentIDCollection pids;

                if (!String.IsNullOrEmpty(albumFilter) && !String.IsNullOrEmpty(artistFilter))
                {
                    pids  = catalog.FindTracksByAlbum(albumFilter, artistFilter);
                    total = pids.Count;

                    Logger.WriteLine(base.name, String.Format(
                                         "Analyzing album '{0}' by '{1}' with {2} tracks",
                                         albumFilter, artistFilter, total));
                }
                else if (!playlistFilter.IsEmpty)
                {
                    pids  = catalog.FindTracksByPlaylist(playlistFilter);
                    total = pids.Count;

                    Logger.WriteLine(base.name, String.Format(
                                         "Analyzing playlist '{0}' with {1} tracks",
                                         catalog.FindPlaylistName(playlistFilter), total));
                }
                else
                {
                    pids  = catalog.FindTracksByPlaylist(libraryPlaylist.PersistentID);
                    total = pids.Count;

                    Logger.WriteLine(base.name,
                                     String.Format("Analyzing {0} tracks", total));
                }

                foreach (PersistentID persistentID in pids)
                {
                    if (base.isActive)
                    {
                        Track track = libraryPlaylist.GetTrack(persistentID);

                        if ((track != null) && (track.Kind == TrackKind.File))
                        {
                            candidate            = track;
                            candidate.IsBuffered = true;

                            // need to skip phantoms or Track.IsBetterThan will hang
                            if (!String.IsNullOrEmpty(candidate.Location))
                            {
                                Track demoted = candidates.Reconcile(candidate);
                                if (demoted != null)
                                {
                                    duplicates.Add(demoted);

                                    // DO NOT dispose demoted here because that would corrupt
                                    // the instance we just stored in the duplicates collection
                                }
                            }

                            // DO NOT dispose candidate here because the instance is stored in
                            // either the candidates or duplicates collection and disposing
                            // would corrupt that reference
                        }

                        // DO NOT dispose track here because the instance is stored in
                        // either the candidates or duplicates collection and disposing
                        // would corrupt that reference

                        count++;
                        base.ProgressPercentage = (int)((double)count / (double)total * 100.0);
                    }
                    else
                    {
                        Logger.WriteLine(base.name, "Duplicate scanner cancelled while scanning");
                        break;
                    }
                }

                if (base.isActive)
                {
                    UpdateCandidates(candidates);
                }

                candidates.Clear();
                candidates = null;

                if (base.isActive)
                {
                    ArchiveDuplicates(duplicates);
                }

                duplicates.Dispose();
                duplicates = null;

                pids.Clear();
                pids = null;

                Logger.WriteLine(base.name, "Duplicate scanner completed");
            }
            catch (Exception exc)
            {
                App.LogException(new SmartException(exc));
            }
        }