Example #1
0
        private static Id3Tagv2 LoadV4(BinaryReader reader, byte versionMinor)
        {
            var tag = new Id3Tagv2();
            tag.Version = new Version(4, versionMinor);

            var headerFlags = (TagHeaderFlags)reader.ReadByte();

            if (headerFlags.HasFlag(TagHeaderFlags.Unsynchronisation))
                throw new NotSupportedException();

            if (headerFlags.HasFlag(TagHeaderFlags.ExtendedHeader))
                throw new NotSupportedException();

            if (headerFlags.HasFlag(TagHeaderFlags.FooterPresent))
                throw new NotSupportedException();

            var tagSize = EndianHelper.BigToLittleEndianInt32(reader.ReadBytes(4), true);

            var offset = 0;
            while (offset < tagSize)
            {
                if (reader.PeekChar() == 0)
                {
                    tag.PaddingSize = tagSize - offset;
                    break;
                }

                var frameId = new string(reader.ReadChars(4));
                var frameSize = EndianHelper.BigToLittleEndianInt32(reader.ReadBytes(4), true);
                var frameFlags = (FrameHeaderFlagsV4)EndianHelper.BigToLittleEndianInt16(reader.ReadBytes(2));

                if (frameFlags.HasFlag(FrameHeaderFlagsV4.GroupingIdentity))
                    throw new NotSupportedException();

                if (frameFlags.HasFlag(FrameHeaderFlagsV4.Compression))
                    throw new NotSupportedException();

                if (frameFlags.HasFlag(FrameHeaderFlagsV4.Encryption))
                    throw new NotSupportedException();

                if (frameFlags.HasFlag(FrameHeaderFlagsV4.Unsynchronisation))
                    throw new NotSupportedException();

                if (frameFlags.HasFlag(FrameHeaderFlagsV4.DataLengthIndicator))
                    throw new NotSupportedException();

                var frameData = reader.ReadBytes(frameSize);

                var frame = GetFrame(frameId, frameData);
                tag.Frames.Add(frame);

                offset += frameSize + 10;
            }

            return tag;
        }
Example #2
0
        public void SaveTo(DirectoryInfo discDirectory, IProgress progress, CancellationToken cancellationToken)
        {
            var sourceFilePath = SourceFile.FullName;
            var mpegDataOffset = _mpegDataOffset;
            var mpegDataSize = _mpegDataSize;
            string reEncodedFilePath = null;

            if (NeedsReEncoding() && _session.ReEncodeFiles)
            {
                var encoder = _context.GetEncoder();
                reEncodedFilePath = Path.GetTempFileName();

                var minBirtate = Disc.MostCommonBitrate != null ? Disc.MostCommonBitrate.Value : MpegFileInfo.MinBitrate;
                var maxBirtate = Disc.MostCommonBitrate != null ? Disc.MostCommonBitrate.Value : MpegFileInfo.MaxBitrate;
                var sampleRate = Disc.MostCommonSampleRate.Value;
                var channelMode = Disc.MostCommonChannelMode.Value;

                encoder.Encode(sourceFilePath, reEncodedFilePath, minBirtate, maxBirtate, sampleRate, channelMode);

                var tempTrack = new Track(new FileInfo(reEncodedFilePath), null, _session, _context);
                mpegDataOffset = tempTrack._mpegDataOffset;
                mpegDataSize = tempTrack._mpegDataSize;

                sourceFilePath = reEncodedFilePath;
            }

            using (var sourceStream = File.Open(sourceFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                using (var destinationStream = File.Open(Path.Combine(discDirectory.FullName, FileName), FileMode.CreateNew, FileAccess.Write, FileShare.None))
                {
                    var id3Tagv2 = new Id3Tagv2();
                    id3Tagv2.Version = new Version(3, 0);
                    id3Tagv2.Frames.Add(new Tpe1Frame(Disc.Album.ArtistName));
                    id3Tagv2.Frames.Add(new TyerFrame(Disc.Album.ReleaseYear));
                    id3Tagv2.Frames.Add(new TalbFrame(Disc.Album.FullName));
                    id3Tagv2.Frames.Add(new TposFrame(string.Format("{0}/{1}", Disc.Index, Disc.Album.Discs.Count)));
                    id3Tagv2.Frames.Add(new TrckFrame(string.Format("{0}/{1}", Index, Disc.Tracks.Count)));
                    id3Tagv2.Frames.Add(new Tit2Frame(Name));
                    id3Tagv2.Frames.Add(new PrivFrame("RHAPSODY", Encoding.ASCII.GetBytes(string.Format("RHAPSODY/{0}", VersionHelper.GetAppVersion()))));

                    if (Disc.Album.Cover != null)
                        id3Tagv2.Frames.Add(new ApicFrame(Disc.Album.Cover, PictureType.FrontCover));

                    if (!string.IsNullOrEmpty(Disc.Name))
                        id3Tagv2.Frames.Add(new TsstFrame(Disc.Name));

                    id3Tagv2.WriteTo(destinationStream);

                    StreamHelper.Copy(sourceStream, destinationStream, mpegDataOffset, mpegDataSize);
                }
            }

            if (reEncodedFilePath != null)
                File.Delete(reEncodedFilePath);
        }