public Album(DirectoryInfo sourceDirectory, IProgress progress, CancellationToken cancellationToken, Session session, Context context) : this(session, context) { var discDirectories = new List<DirectoryInfo>(); discDirectories.Add(sourceDirectory); discDirectories.AddRange(sourceDirectory.GetDirectories()); progress.Begin(discDirectories.Sum(directory => directory.GetFiles("*.mp3").Length)); foreach (var directory in discDirectories) { var disc = new Disc(this, _session, _context); foreach (var file in directory.GetFiles("*.mp3")) { cancellationToken.ThrowIfCancellationRequested(); progress.Advance(file.Name); var track = new Track(file, disc, _session, _context); disc.Tracks.Add(track); } if (disc.Tracks.Count > 0) Discs.Add(disc); } SourceDirectory = sourceDirectory; }
public Track(FileInfo sourceFile, Disc disc, Session session, Context context) : this(session, context) { SourceFile = sourceFile; Disc = disc; // Find tags using (var stream = new BufferedStream(sourceFile.Open(FileMode.Open, FileAccess.Read, FileShare.Read))) { _mpegDataOffset = 0; _mpegDataSize = stream.Length; Stream dataStream; // Better be sorted from outer to inner Type[] tagTypes = { typeof(Id3v2Tag), typeof(Id3v1Tag), typeof(Lyrics3v2Tag), typeof(ApeTag) }; while (true) { dataStream = new SubStream(stream, _mpegDataOffset, _mpegDataSize); var anyTagFound = false; foreach (var tagType in tagTypes) { var tag = (ITag)Activator.CreateInstance(tagType); if (!tag.Read(dataStream)) continue; if (tag.Position == TagPosision.Beginning) { _mpegDataOffset += tag.Size; _mpegDataSize -= tag.Size; } else { _mpegDataSize -= tag.Size; } Tags.Add(tag); anyTagFound = true; break; } if (!anyTagFound) break; } MpegFileInfo = new MpegFileInfo(dataStream); } }
public IEnumerable<IValidator> GetDiscValidators(Disc disc) { yield return new DiscNameValidator(disc, GetTextValidators()); yield return new DuplicateTrackNameValidator(disc); }
private void mnuTrackMoveToDiscNewDisc_Click(object sender, EventArgs e) { var newDisc = new Disc(Session.Album, Session, Context); newDisc.NameChanged += Disc_NameChanged; Session.Album.Discs.Add(newDisc); var selectedTracks = new List<Track>(); foreach (ListViewItem item in lvwTracks.SelectedItems) { var track = (Track)item.Tag; selectedTracks.Add(track); track.Disc.Tracks.Remove(track); newDisc.Tracks.Add(track); track.Disc = newDisc; } for (var i = 0; i < Session.Album.Discs.Count; i++) { var disc = Session.Album.Discs[i]; if (disc.Tracks.Count != 0) continue; Session.Album.Discs.Remove(disc); i--; } PopulateTracks(selectedTracks); PopulateMoveToDiscs(); }