Beispiel #1
0
        public virtual FrameParser CreateFrameParser(ID3v2MajorVersion version, string frameID)
        {
            List<CreateParserDelegate> parsers=new List<CreateParserDelegate>();

            parsers.Add(new CreateParserDelegate(Frames.AlbumTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.ArtistTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.BeatsPerMinuteTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.ComposerTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.CopyrightTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.CustomUserTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.DateTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.EncodedByTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.EncodingTimeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.FileTypeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.GenreTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.GroupingTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.InitialKeyTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.LanguageTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.LengthTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.MediaTypeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OrchestraTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OriginalAlbumTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OriginalArtistTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OriginalReleaseTimeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OriginalReleaseYearTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.PartOfSetTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.PublisherTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.RecordingTimeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.ReleaseTimeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.SoftwareSettingsTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.TaggingTimeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.TimeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.TitleTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.TrackTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.YearTextFrame.CreateParser));

            parsers.Add(new CreateParserDelegate(Frames.CommentExtendedTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.LyricsExtendedTextFrame.CreateParser));

            parsers.Add(new CreateParserDelegate(Frames.CommercialUrlFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.CustomUserUrlFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OfficialArtistUrlFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OfficialAudioFileUrlFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OfficialAudioSourceUrlFrame.CreateParser));

            parsers.Add(new CreateParserDelegate(Frames.GeneralEncapsulatedObjectFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.MusicCDIdentifierFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.PictureFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.PlayCounterFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.PrivateFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.UniqueFileIdentifierFrame.CreateParser));

            foreach(CreateParserDelegate p in parsers)
            {
                FrameParser parser=p(version, frameID);
                if(parser!=null)
                    return parser;
            }
            return null;
        }
Beispiel #2
0
        /// <summary>
        /// This function parses the next frame from the stream and returns it.
        /// </summary>
        /// <param name="stream">The stream to parse the Frame from.</param>
        /// <param name="version">The ID3 v2 Major version of the ID3 tag that the stream is reading.</param>
        /// <param name="parserFactory">A FrameParserFactory to use to create FrameParsers based on Frame IDs.</param>
        /// <param name="frameID">Output: outputs the frameID of the frame just parsed.</param>
        /// <returns>The parsed Frame object.</returns>
        /// <exception cref="Achamenes.ID3.NoFrameParserProvidedException">
        /// Thrown if the FrameParserFactory object passed did not recognize the Frame ID for the given version.
        /// </exception>
        public static Frame Parse(System.IO.Stream stream, ID3v2MajorVersion version, FrameParserFactory parserFactory, out string frameID)
        {
            FrameHeaderParser headerParser=FrameHeaderParser.CreateFrameHeaderParser(version);
            FrameHeader header=headerParser.Parse(stream);
            frameID="";
            if(header==null) // have reached the padding, no more frames.
            {
                return null;
            }
            frameID=header.FrameID;

            if(header.Length > 128*128*128*128)
            {
                throw new FatalException("Invalid frame length for frame with frame ID '"+frameID+"'.");
            }

            byte[] frameData=new byte[header.Length];
            stream.Read(frameData, 0, frameData.Length);
            FrameParser parser=parserFactory.CreateFrameParser(version,header.FrameID);
            if(parser==null)
            {
                throw new NoFrameParserProvidedException(frameID,version, "No frame parser object is provided to parse this type of frame in this implementation.");
            }
            return parser.ParseFrame(frameData);
        }
Beispiel #3
0
 public override Achamenes.ID3.Frames.Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding)
 {
     if(version==ID3v2MajorVersion.Version4)
     {
         return new Writers.TextFrameWriter(this, "TDTG", Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), encoding);
     }
     return null;
 }
Beispiel #4
0
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version4 && frameID=="TDTG")
     {
         return new Parsers.TaggingTimeTextFrameParser();
     }
     return null;
 }
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="COM")
     {
         return new Parsers.CommentExtendedTextFrameParser();
     }
     if((version==ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) && frameID=="COMM")
     {
         return new Parsers.CommentExtendedTextFrameParser();
     }
     return null;
 }
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="TOR")
     {
         return new Parsers.OriginalReleaseYearTextFrameParser();
     }
     if(version==ID3v2MajorVersion.Version3  && frameID=="TORY")
     {
         return new Parsers.OriginalReleaseYearTextFrameParser();
     }
     return null;
 }
 public override Achamenes.ID3.Frames.Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding)
 {
     if(version==ID3v2MajorVersion.Version2)
     {
         return new Writers.MusicCDIdentifierFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "MCI", encoding);
     }
     else if(version==ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4)
     {
         return new Writers.MusicCDIdentifierFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "MCDI", encoding);
     }
     return null;
 }
 public static Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="MCI")
     {
         return new Parsers.MusicCDIdentifierFrameParser();
     }
     else if((version == ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) && frameID=="MCDI")
     {
         return new Parsers.MusicCDIdentifierFrameParser();
     }
     return null;
 }
Beispiel #9
0
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="TDA")
     {
         return new Parsers.DateTextFrameParser();
     }
     if(version==ID3v2MajorVersion.Version3 && frameID=="TDAT")
     {
         return new Parsers.DateTextFrameParser();
     }
     return null;
 }
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="GEO")
     {
         return new Parsers.GeneralEncapsulatedObjectFrameParser();
     }
     if((version==ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) && frameID=="GEOB")
     {
         return new Parsers.GeneralEncapsulatedObjectFrameParser();
     }
     return null;
 }
Beispiel #11
0
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="TMT")
     {
         return new Parsers.MediaTypeTextFrameParser();
     }
     if((version==ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) && frameID=="TMED")
     {
         return new Parsers.MediaTypeTextFrameParser();
     }
     return null;
 }
Beispiel #12
0
 public static Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="CNT")
     {
         return new Parsers.PlayCounterFrameParser();
     }
     else if((version == ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) && frameID=="PCNT")
     {
         return new Parsers.PlayCounterFrameParser();
     }
     return null;
 }
Beispiel #13
0
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="TOT")
     {
         return new Parsers.OriginalAlbumTextFrameParser();
     }
     if((version==ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) && frameID=="TOAL")
     {
         return new Parsers.OriginalAlbumTextFrameParser();
     }
     return null;
 }
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="TBP")
     {
         return new Parsers.BeatsPerMinuteTextFrameParser();
     }
     if((version==ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) && frameID=="TBPM")
     {
         return new Parsers.BeatsPerMinuteTextFrameParser();
     }
     return null;
 }
Beispiel #15
0
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="WXX")
     {
         return new Parsers.CustomUserUrlFrameParser();
     }
     if((version==ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) && frameID=="WXXX")
     {
         return new Parsers.CustomUserUrlFrameParser();
     }
     return null;
 }
Beispiel #16
0
 public static Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="PRI")
     {
         return new Parsers.PrivateFrameParser();
     }
     else if((version == ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) && frameID=="PRIV")
     {
         return new Parsers.PrivateFrameParser();
     }
     return null;
 }
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="TSS")
     {
         return new Parsers.SoftwareSettingsTextFrameParser();
     }
     if((version==ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) && frameID=="TSSE")
     {
         return new Parsers.SoftwareSettingsTextFrameParser();
     }
     return null;
 }
Beispiel #18
0
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="TCR")
     {
         return new Parsers.CopyrightTextFrameParser();
     }
     if((version==ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) && frameID=="TCOP")
     {
         return new Parsers.CopyrightTextFrameParser();
     }
     return null;
 }
Beispiel #19
0
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="TKE")
     {
         return new Parsers.InitialKeyTextFrameParser();
     }
     if((version==ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) && frameID=="TKEY")
     {
         return new Parsers.InitialKeyTextFrameParser();
     }
     return null;
 }
Beispiel #20
0
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="WAR")
     {
         return new Parsers.OfficialArtistUrlFrameParser();
     }
     if((version==ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) && frameID=="WOAR")
     {
         return new Parsers.OfficialArtistUrlFrameParser();
     }
     return null;
 }
Beispiel #21
0
 public override Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding)
 {
     switch(version)
     {
         case ID3v2MajorVersion.Version2:
             return new Writers.PrivateFrameWriter(this,Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version),"PRI",encoding);
         case ID3v2MajorVersion.Version3:
         case ID3v2MajorVersion.Version4:
             return new Writers.PrivateFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "PRIV", encoding);
         default:
             return null;
     }
 }
Beispiel #22
0
 public static Achamenes.ID3.Frames.Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     // ID3 v2.4 does not support Year text frame
     if(version==ID3v2MajorVersion.Version2 && frameID=="TYE")
     {
         return new Parsers.YearTextFrameParser();
     }
     if(version==ID3v2MajorVersion.Version3 && frameID=="TYER")
     {
         return new Parsers.YearTextFrameParser();
     }
     return null;
 }
Beispiel #23
0
 public static FrameParser CreateParser(ID3v2MajorVersion version, string frameID)
 {
     if(version==ID3v2MajorVersion.Version2 && frameID=="XLP")
     {
         return new LastPlayedOnFrameParser();
     }
     else if((version == ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4)
         && frameID=="XLPO")
     {
         return new LastPlayedOnFrameParser();
     }
     return null;
 }
Beispiel #24
0
 public static FrameHeaderParser CreateFrameHeaderParser(ID3v2MajorVersion version)
 {
     switch(version)
     {
         case ID3v2MajorVersion.Version2:
             return new FrameHeaderParserM2();
         case ID3v2MajorVersion.Version3:
             return new FrameHeaderParserM3();
         case ID3v2MajorVersion.Version4:
             return new FrameHeaderParserM4();
         default:
             throw new FeatureNotSupportedException("Reading this version of ID3 tags is not supported.");
     }
 }
Beispiel #25
0
 public override FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding)
 {
     switch(version)
     {
         case ID3v2MajorVersion.Version2:
             return new LastPlayedOnFrameWriter(this,
                 FrameHeaderWriter.CreateFrameHeaderWriter(version), "XLP", encoding);
         case ID3v2MajorVersion.Version3:
         case ID3v2MajorVersion.Version4:
             return new LastPlayedOnFrameWriter(this,
                 FrameHeaderWriter.CreateFrameHeaderWriter(version), "XLPO", encoding);
         default:
             return null;
     }
 }
Beispiel #26
0
        public static FrameHeaderWriter CreateFrameHeaderWriter(ID3v2MajorVersion version)
        {
            if(version==ID3v2MajorVersion.Version2)
            {
                return new FrameHeaderWriterM2();
            }
            else if(version==ID3v2MajorVersion.Version3)
            {
                return new FrameHeaderWriterM3();
            }
            else if(version==ID3v2MajorVersion.Version4)
            {
                return new FrameHeaderWriterM4();
            }

            throw new FeatureNotSupportedException("Writing ID3 tags in the provided version is not supported by this implementation.");
        }
Beispiel #27
0
        private void TestTextFrame(TextFrame frame, EncodingScheme encoding, ID3v2MajorVersion version)
        {
            string frameId;
            FrameParserFactory factory=new FrameParserFactory();
            FrameWriter writer=frame.CreateWriter(version, encoding);
            if(writer==null)
            {
                return;
            }
            MemoryStream stream=new MemoryStream();

            writer.WriteToStream(stream);
            stream.Seek(0, SeekOrigin.Begin);

            Frame writtenFrame=FrameParser.Parse(stream, version, factory, out frameId);

            Assert.IsInstanceOfType(writtenFrame.GetType(), frame);
            TextFrame textFrame=(TextFrame)writtenFrame;

            Assert.AreEqual(textFrame.Text, frame.Text);
        }
Beispiel #28
0
        private void RunTest(TagBase tag, ID3v2MajorVersion version, EncodingScheme encoding)
        {
            File.Delete(_taggedFile1);
            File.Delete(_taggedFile2);
            File.Copy(_originalFile, _taggedFile1);
            File.Copy(_originalFile, _taggedFile2);

            tag.WriteToFile(_taggedFile1, version, encoding);

            TagBase tag2 = new TagBase();

            tag2.ReadFromFile(_taggedFile1);

            tag2.WriteToFile(_taggedFile2, version, encoding);
            Assert.IsTrue(CompareFiles(_taggedFile1, _taggedFile2));

            TagBase.RemoveTag(_taggedFile1);
            Assert.IsTrue(CompareFiles(_taggedFile1, _originalFile));

            TagBase.RemoveTag(_taggedFile2);
            Assert.IsTrue(CompareFiles(_taggedFile2, _originalFile));
        }
Beispiel #29
0
        private void TestTextFrame(TextFrame frame, EncodingScheme encoding, ID3v2MajorVersion version)
        {
            string             frameId;
            FrameParserFactory factory = new FrameParserFactory();
            FrameWriter        writer  = frame.CreateWriter(version, encoding);

            if (writer == null)
            {
                return;
            }
            MemoryStream stream = new MemoryStream();


            writer.WriteToStream(stream);
            stream.Seek(0, SeekOrigin.Begin);

            Frame writtenFrame = FrameParser.Parse(stream, version, factory, out frameId);

            Assert.IsInstanceOfType(frame, writtenFrame.GetType());
            TextFrame textFrame = (TextFrame)writtenFrame;

            Assert.AreEqual(textFrame.Text, frame.Text);
        }
 /// <summary>
 /// Initializes a new instance of NoFrameWriterProvidedException.
 /// </summary>
 /// <param name="frame">The frame that did not support the write operation.</param>
 /// <param name="version">The ID3 v2 major version of the tag in which the frame was to be written.</param>
 /// <param name="message">The error message that explains the reason for the exception.</param>
 /// <param name="inner">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>
 public NoFrameWriterProvidedException(Frames.Frame frame, ID3v2MajorVersion version, string message, Exception inner) : base(message, inner)
 {
     this._frame   = frame;
     this._version = version;
 }
        /// <param name="frameID">The ID of the unrecognized frame.</param>


        /// <summary>
        /// Initializes a new instance of NoFrameWriterProvidedException.
        /// </summary>
        /// <param name="frame">The frame that did not support the write operation.</param>
        /// <param name="version">The ID3 v2 major version of the tag in which the frame was to be written.</param>
        public NoFrameWriterProvidedException(Frames.Frame frame, ID3v2MajorVersion version)
        {
            this._frame   = frame;
            this._version = version;
        }
Beispiel #32
0
        public virtual FrameParser CreateFrameParser(ID3v2MajorVersion version, string frameID)
        {
            List <CreateParserDelegate> parsers = new List <CreateParserDelegate>();

            parsers.Add(new CreateParserDelegate(Frames.AlbumTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.ArtistTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.BeatsPerMinuteTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.ComposerTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.CopyrightTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.CustomUserTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.DateTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.EncodedByTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.EncodingTimeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.FileTypeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.GenreTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.GroupingTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.InitialKeyTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.LanguageTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.LengthTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.MediaTypeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OrchestraTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OriginalAlbumTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OriginalArtistTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OriginalReleaseTimeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OriginalReleaseYearTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.PartOfSetTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.PublisherTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.RecordingTimeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.ReleaseTimeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.SoftwareSettingsTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.TaggingTimeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.TimeTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.TitleTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.TrackTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.YearTextFrame.CreateParser));

            parsers.Add(new CreateParserDelegate(Frames.CommentExtendedTextFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.LyricsExtendedTextFrame.CreateParser));

            parsers.Add(new CreateParserDelegate(Frames.CommercialUrlFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.CustomUserUrlFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OfficialArtistUrlFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OfficialAudioFileUrlFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.OfficialAudioSourceUrlFrame.CreateParser));

            parsers.Add(new CreateParserDelegate(Frames.GeneralEncapsulatedObjectFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.MusicCDIdentifierFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.PlayCounterFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.PrivateFrame.CreateParser));
            parsers.Add(new CreateParserDelegate(Frames.UniqueFileIdentifierFrame.CreateParser));

            foreach (CreateParserDelegate p in parsers)
            {
                FrameParser parser = p(version, frameID);
                if (parser != null)
                {
                    return(parser);
                }
            }
            return(null);
        }
Beispiel #33
0
		public virtual void WriteToFile(string fileName, ID3v2MajorVersion version, EncodingScheme encoding)
		{
			FileStream targetFileStream=null;
			try
			{
				// First write all frame data to a memory buffer
				// This way we catch all fatal exceptions before 
				// touching the file, so there's not a even a slight 
				// chance of corrupting the file.

				MemoryStream memoryBuffer=new MemoryStream();
				WriteFrames(memoryBuffer, version, encoding);

				int newSize=(int)memoryBuffer.Length;

				if(newSize==0)
				{
					throw new FatalException("No data to write in the tag.");
				}

				targetFileStream=File.Open(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
				TagHeader oldHeader=TagHeader.FromStream(targetFileStream);

				bool useIntermediate=false;

				if(oldHeader==null)
				{
					// There is no attached tag in the file. We need to use an intermediate temporary file.					
					useIntermediate=true;
					// Rewind the place in stream to the very beginning, so that when
					// we copy the data from the original file to the intermediate file,
					// we won't lose any data.
					targetFileStream.Seek(0, SeekOrigin.Begin);
				}
				else
				{
					// File already has an ID3 v2 tag attached.
					if(oldHeader.TagSize<newSize)
					{
						useIntermediate=true;
						// Allow for 4KB of padding.
						newSize+=4*1024;
						// Move to the correct place in stream so when we copy data to 
						// the intermediate file, we won't lose any data.
						// The +10 is to go skip the tag header, since it's not included
						// in TagHeader.TagSize 
						targetFileStream.Seek(oldHeader.TagSize+10, SeekOrigin.Begin);
					}
					else
					{
						// We should write exactly the same number of bytes back to the file.
						// When writing the padding, compare memoryBuffer.Length to newSize to
						// calculate the number of padding bytes required to write.
						newSize=oldHeader.TagSize;
						// Seek the beginning of the file. The tag header and frame information
						// will be overwritten.
						targetFileStream.Seek(0, SeekOrigin.Begin);
					}
				}

				TagHeader newHeader=new TagHeader((byte)version, 0, TagHeaderFlags.None, newSize);

				if(useIntermediate)
				{
					string intermediateFileName=GetTempIntermediateFileName(fileName);
					FileStream intermediateStream=null;
					try
					{
						intermediateStream=File.Create(intermediateFileName);
						newHeader.WriteToStream(intermediateStream);

						// Write the frame data residing in memory buffer.
						intermediateStream.Write(memoryBuffer.GetBuffer(), 0, (int)memoryBuffer.Length);

						//Write any required paddings.
						for(int i=(int)memoryBuffer.Length;i<newSize;i++)
						{
							intermediateStream.WriteByte(0);
						}

						// Copy the data from the original file to the intermediate file.
						CopyFromStreamToStream(targetFileStream, intermediateStream);

						// Close the stream of original and intermediate file streams.
						targetFileStream.Close();
						intermediateStream.Close();

						// If control reaches this point, then everything went file, so
						// should normally delete the original file and rename the intermediate file.
						// But as a safety measure, for pre-release, alpha, and beta version, 
						// instead of removing the file, I decided to rename the old file to
						// fileName+".old."+revisionNumber instead. The user can manually delete
						// the these files after ensuring the integrity of the new files.
#if ACHAMENES_ID3_BACKUP_FILES_BEFORE_MODIFICATION
						File.Move(fileName, GetBackupFileName(fileName));
#else
						File.Delete(fileName);
#endif
						File.Move(intermediateFileName, fileName);
					}
					finally
					{
						if(intermediateStream!=null)
						{
							intermediateStream.Close();
						}
					}
				}
				else // If using an intermediate file is not necessary.
				{
					// Similarly, we would normally just start writing to @stream here,
					// but instead, we close it, make a backup copy of it, and then 
					// open it again, and write the tag information just to ensure nothing
					// will be lost.

					targetFileStream.Close();
#if ACHAMENES_ID3_BACKUP_FILES_BEFORE_MODIFICATION
					File.Copy(fileName, GetBackupFileName(fileName));
#endif
					targetFileStream=File.Open(fileName, FileMode.Open, FileAccess.Write, FileShare.Write);
					
					// Write the header.
					newHeader.WriteToStream(targetFileStream);
					
					// Write frame data from memory buffer.
					targetFileStream.Write(memoryBuffer.GetBuffer(), 0, (int)memoryBuffer.Length);
					
					// Write any required padding.
					for(int i=(int)memoryBuffer.Length;i<newSize;i++)
					{
						targetFileStream.WriteByte(0);
					}

					// And finally close the stream.
					targetFileStream.Close();
				}
			}
			finally
			{
				if(targetFileStream!=null)
				{
					targetFileStream.Close();
				}
			}
		}
Beispiel #34
0
		private void WriteFrames(Stream stream, ID3v2MajorVersion version, EncodingScheme encoding)
		{
			foreach(Frame f in this.Frames)
			{
				try
				{
					WriteFrame(f,stream,version,encoding);					
				}
				catch(NonFatalException exception)
				{
					RaiseWritingWarning(exception, f);
				}
			}
		}
Beispiel #35
0
		private void WriteFrame(Frame frame, Stream stream, ID3v2MajorVersion version, EncodingScheme encoding)
		{
			FrameWriter writer=frame.CreateWriter(version, encoding);
			if(writer==null)
			{
				throw new NoFrameWriterProvidedException(frame, version);
			}
			writer.WriteToStream(stream);
		}
 /// <summary>
 /// Initializes a new instance of NoFrameParserProvidedException.
 /// </summary>
 /// <param name="frameID">The ID of the unrecognized frame.</param>
 /// <param name="version">The ID3 v2 major version of the tag in which the frame was to be parsed.</param>
 /// <param name="message">The error message that explains the reason for the exception.</param>
 /// <param name="inner">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>
 public NoFrameParserProvidedException(string frameID, ID3v2MajorVersion version, string message, Exception inner)
     : base(message, inner)
 {
     this._frameID = frameID;
     this._version = version;
 }
 /// <summary>
 /// Initializes a new instance of NoFrameParserProvidedException.
 /// </summary>
 /// <param name="frameID">The ID of the unrecognized frame.</param>
 /// <param name="version">The ID3 v2 major version of the tag in which the frame was to be parsed.</param>
 public NoFrameParserProvidedException(string frameID, ID3v2MajorVersion version)
 {
     this._frameID = frameID;
     this._version = version;
 }
Beispiel #38
0
 //public abstract Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID);
 public abstract Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding);
Beispiel #39
0
 private void TestVersion(EncodingScheme encoding, ID3v2MajorVersion version)
 {
     foreach (string testcase in _asciiTestCases)
     {
         TestTextFrame(new AlbumTextFrame(testcase), encoding, version);
         TestTextFrame(new ArtistTextFrame(testcase), encoding, version);
         TestTextFrame(new ComposerTextFrame(testcase), encoding, version);
         TestTextFrame(new CopyrightTextFrame(testcase), encoding, version);
         TestTextFrame(new CustomUserTextFrame(testcase), encoding, version);
         TestTextFrame(new DateTextFrame(testcase), encoding, version);
         TestTextFrame(new EncodedByTextFrame(testcase), encoding, version);
         TestTextFrame(new EncodingTimeTextFrame(testcase), encoding, version);
         TestTextFrame(new FileTypeTextFrame(testcase), encoding, version);
         TestTextFrame(new GenreTextFrame(testcase), encoding, version);
         TestTextFrame(new GroupingTextFrame(testcase), encoding, version);
         TestTextFrame(new InitialKeyTextFrame(testcase), encoding, version);
         TestTextFrame(new LanguageTextFrame(testcase), encoding, version);
         TestTextFrame(new LengthTextFrame(testcase), encoding, version);
         TestTextFrame(new MediaTypeTextFrame(testcase), encoding, version);
         TestTextFrame(new OrchestraTextFrame(testcase), encoding, version);
         TestTextFrame(new OriginalAlbumTextFrame(testcase), encoding, version);
         TestTextFrame(new OriginalArtistTextFrame(testcase), encoding, version);
         TestTextFrame(new OriginalReleaseTimeTextFrame(testcase), encoding, version);
         TestTextFrame(new OriginalReleaseYearTextFrame(testcase), encoding, version);
         TestTextFrame(new PublisherTextFrame(testcase), encoding, version);
         TestTextFrame(new RecordingTimeTextFrame(testcase), encoding, version);
         TestTextFrame(new ReleaseTimeTextFrame(testcase), encoding, version);
         TestTextFrame(new SoftwareSettingsTextFrame(testcase), encoding, version);
         TestTextFrame(new TaggingTimeTextFrame(testcase), encoding, version);
         TestTextFrame(new TitleTextFrame(testcase), encoding, version);
     }
     if (encoding != EncodingScheme.Ascii)
     {
         foreach (string testcase in _unicodeTestCases)
         {
             TestTextFrame(new AlbumTextFrame(testcase), encoding, version);
             TestTextFrame(new ArtistTextFrame(testcase), encoding, version);
             TestTextFrame(new ComposerTextFrame(testcase), encoding, version);
             TestTextFrame(new CopyrightTextFrame(testcase), encoding, version);
             TestTextFrame(new CustomUserTextFrame(testcase), encoding, version);
             TestTextFrame(new DateTextFrame(testcase), encoding, version);
             TestTextFrame(new EncodedByTextFrame(testcase), encoding, version);
             TestTextFrame(new EncodingTimeTextFrame(testcase), encoding, version);
             TestTextFrame(new FileTypeTextFrame(testcase), encoding, version);
             TestTextFrame(new GenreTextFrame(testcase), encoding, version);
             TestTextFrame(new GroupingTextFrame(testcase), encoding, version);
             TestTextFrame(new InitialKeyTextFrame(testcase), encoding, version);
             TestTextFrame(new LanguageTextFrame(testcase), encoding, version);
             TestTextFrame(new LengthTextFrame(testcase), encoding, version);
             TestTextFrame(new MediaTypeTextFrame(testcase), encoding, version);
             TestTextFrame(new OrchestraTextFrame(testcase), encoding, version);
             TestTextFrame(new OriginalAlbumTextFrame(testcase), encoding, version);
             TestTextFrame(new OriginalArtistTextFrame(testcase), encoding, version);
             TestTextFrame(new OriginalReleaseTimeTextFrame(testcase), encoding, version);
             TestTextFrame(new OriginalReleaseYearTextFrame(testcase), encoding, version);
             TestTextFrame(new PublisherTextFrame(testcase), encoding, version);
             TestTextFrame(new RecordingTimeTextFrame(testcase), encoding, version);
             TestTextFrame(new ReleaseTimeTextFrame(testcase), encoding, version);
             TestTextFrame(new SoftwareSettingsTextFrame(testcase), encoding, version);
             TestTextFrame(new TaggingTimeTextFrame(testcase), encoding, version);
             TestTextFrame(new TitleTextFrame(testcase), encoding, version);
         }
     }
     TestTextFrame(new PartOfSetTextFrame(4), encoding, version);
     TestTextFrame(new PartOfSetTextFrame(45, 123), encoding, version);
     TestTextFrame(new TrackTextFrame(415), encoding, version);
     TestTextFrame(new TrackTextFrame(15, 1234), encoding, version);
     TestTextFrame(new YearTextFrame(""), encoding, version);
     TestTextFrame(new YearTextFrame("14"), encoding, version);
     TestTextFrame(new YearTextFrame("144"), encoding, version);
     TestTextFrame(new YearTextFrame("1234"), encoding, version);
     TestTextFrame(new TimeTextFrame("134"), encoding, version);
     TestTextFrame(new BeatsPerMinuteTextFrame(134), encoding, version);
 }
Beispiel #40
0
        public virtual void WriteToFile(string fileName, ID3v2MajorVersion version, EncodingScheme encoding)
        {
            FileStream targetFileStream = null;

            try {
                // First write all frame data to a memory buffer
                // This way we catch all fatal exceptions before
                // touching the file, so there's not a even a slight
                // chance of corrupting the file.

                MemoryStream memoryBuffer = new MemoryStream();
                WriteFrames(memoryBuffer, version, encoding);

                int newSize = (int)memoryBuffer.Length;

                if (newSize == 0)
                {
                    throw new FatalException("No data to write in the tag.");
                }

                targetFileStream = File.Open(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
                TagHeader oldHeader = TagHeader.FromStream(targetFileStream);

                bool useIntermediate = false;

                if (oldHeader == null)
                {
                    // There is no attached tag in the file. We need to use an intermediate temporary file.
                    useIntermediate = true;
                    // Rewind the place in stream to the very beginning, so that when
                    // we copy the data from the original file to the intermediate file,
                    // we won't lose any data.
                    targetFileStream.Seek(0, SeekOrigin.Begin);
                }
                else
                {
                    // File already has an ID3 v2 tag attached.
                    if (oldHeader.TagSize < newSize)
                    {
                        useIntermediate = true;
                        // Allow for 4KB of padding.
                        newSize += 4 * 1024;
                        // Move to the correct place in stream so when we copy data to
                        // the intermediate file, we won't lose any data.
                        // The +10 is to go skip the tag header, since it's not included
                        // in TagHeader.TagSize
                        targetFileStream.Seek(oldHeader.TagSize + 10, SeekOrigin.Begin);
                    }
                    else
                    {
                        // We should write exactly the same number of bytes back to the file.
                        // When writing the padding, compare memoryBuffer.Length to newSize to
                        // calculate the number of padding bytes required to write.
                        newSize = oldHeader.TagSize;
                        // Seek the beginning of the file. The tag header and frame information
                        // will be overwritten.
                        targetFileStream.Seek(0, SeekOrigin.Begin);
                    }
                }

                TagHeader newHeader = new TagHeader((byte)version, 0, TagHeaderFlags.None, newSize);

                if (useIntermediate)
                {
                    string     intermediateFileName = GetTempIntermediateFileName(fileName);
                    FileStream intermediateStream   = null;
                    try {
                        intermediateStream = File.Create(intermediateFileName);
                        newHeader.WriteToStream(intermediateStream);

                        // Write the frame data residing in memory buffer.
                        intermediateStream.Write(memoryBuffer.GetBuffer(), 0, (int)memoryBuffer.Length);

                        //Write any required paddings.
                        for (int i = (int)memoryBuffer.Length; i < newSize; i++)
                        {
                            intermediateStream.WriteByte(0);
                        }

                        // Copy the data from the original file to the intermediate file.
                        CopyFromStreamToStream(targetFileStream, intermediateStream);

                        // Close the stream of original and intermediate file streams.
                        targetFileStream.Close();
                        intermediateStream.Close();

                        // If control reaches this point, then everything went file, so
                        // should normally delete the original file and rename the intermediate file.
                        // But as a safety measure, for pre-release, alpha, and beta version,
                        // instead of removing the file, I decided to rename the old file to
                        // fileName+".old."+revisionNumber instead. The user can manually delete
                        // the these files after ensuring the integrity of the new files.
#if ACHAMENES_ID3_BACKUP_FILES_BEFORE_MODIFICATION
                        File.Move(fileName, GetBackupFileName(fileName));
#else
                        File.Delete(fileName);
#endif
                        File.Move(intermediateFileName, fileName);
                    }
                    finally {
                        if (intermediateStream != null)
                        {
                            intermediateStream.Close();
                        }
                    }
                }
                else // If using an intermediate file is not necessary.
                {
                    // Similarly, we would normally just start writing to @stream here,
                    // but instead, we close it, make a backup copy of it, and then
                    // open it again, and write the tag information just to ensure nothing
                    // will be lost.

                    targetFileStream.Close();
#if ACHAMENES_ID3_BACKUP_FILES_BEFORE_MODIFICATION
                    File.Copy(fileName, GetBackupFileName(fileName));
#endif
                    targetFileStream = File.Open(fileName, FileMode.Open, FileAccess.Write, FileShare.Write);

                    // Write the header.
                    newHeader.WriteToStream(targetFileStream);

                    // Write frame data from memory buffer.
                    targetFileStream.Write(memoryBuffer.GetBuffer(), 0, (int)memoryBuffer.Length);

                    // Write any required padding.
                    for (int i = (int)memoryBuffer.Length; i < newSize; i++)
                    {
                        targetFileStream.WriteByte(0);
                    }

                    // And finally close the stream.
                    targetFileStream.Close();
                }
            }
            finally {
                if (targetFileStream != null)
                {
                    targetFileStream.Close();
                }
            }
        }