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; }
/// <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); }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; } }
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; }
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; }
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."); } }
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; } }
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."); }
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); }
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)); }
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; }
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); }
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(); } } }
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); } } }
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; }
//public abstract Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID); public abstract Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding);
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); }
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(); } } }