/// <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); } }
/// <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; }
/// <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; } } }
//======================================================================================== // 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)); } }