示例#1
0
        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;
        }
示例#2
0
        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);
            }
        }
示例#3
0
 public IEnumerable<IValidator> GetDiscValidators(Disc disc)
 {
     yield return new DiscNameValidator(disc, GetTextValidators());
     yield return new DuplicateTrackNameValidator(disc);
 }
示例#4
0
        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();
        }