/// <summary> /// Save ID3 info to file /// </summary> /// <param name="Ver">minor version of ID3v2</param> /// <param name="Formula">Formula to renaming file</param> public void Save(int Ver, string Formula) { if (Ver < 3 || Ver > 4) throw (new ArgumentOutOfRangeException("Version of ID3 can be between 3-4")); string NewFilePath; if (Formula == "") NewFilePath = _FilePath; else { string DirName = Path.GetDirectoryName(_FilePath); NewFilePath = DirName + ((DirName.Length > 0) ? "\\" : "") + this.FormulaFileName(Formula); } FileStreamEx Orgin = new FileStreamEx(_FilePath, FileMode.Open); FileStreamEx Temp = new FileStreamEx(NewFilePath + "~TEMP", FileMode.Create); int StartIndex = 0; if (Orgin.HaveID3v2()) { Orgin.Seek(3, SeekOrigin.Current); StartIndex = Orgin.ReadSize(); } if (!_HaveTag) { SaveRestOfFile(StartIndex, Orgin, Temp, 0); return; } // if Orginal file and current file both don't contain ID3 // we don't need to do anything WriteID3Header(Temp, Ver); foreach (TextFrame TF in _TextFrames.Items) { if (!FramesInfo.IsCompatible(TF.FrameID, Ver)) continue; if (TF.IsAvailable) TF.FrameStream(Ver).WriteTo(Temp); } foreach (UserTextFrame UTF in _UserTextFrames.Items) { if (!FramesInfo.IsCompatible(UTF.FrameID, Ver)) continue; if (UTF.IsAvailable) UTF.FrameStream(Ver).WriteTo(Temp); } foreach (PrivateFrame PF in _PrivateFrames.Items) { if (!FramesInfo.IsCompatible(PF.FrameID, Ver)) continue; if (PF.IsAvailable) PF.FrameStream(Ver).WriteTo(Temp); } foreach (TextWithLanguageFrame TWLF in _TextWithLangFrames.Items) { if (!FramesInfo.IsCompatible(TWLF.FrameID, Ver)) continue; if (TWLF.IsAvailable) TWLF.FrameStream(Ver).WriteTo(Temp); } foreach (SynchronisedText ST in _SynchronisedTextFrames.Items) { if (!FramesInfo.IsCompatible(ST.FrameID, Ver)) continue; if (ST.IsAvailable) ST.FrameStream(Ver).WriteTo(Temp); } foreach (AttachedPictureFrame AP in _AttachedPictureFrames.Items) { if (!FramesInfo.IsCompatible(AP.FrameID, Ver)) continue; if (AP.IsAvailable) AP.FrameStream(Ver).WriteTo(Temp); } foreach (GeneralFileFrame GF in _EncapsulatedObjectFrames.Items) { if (!FramesInfo.IsCompatible(GF.FrameID, Ver)) continue; if (GF.IsAvailable) GF.FrameStream(Ver).WriteTo(Temp); } foreach (PopularimeterFrame PF in _PopularimeterFrames.Items) { if (!FramesInfo.IsCompatible(PF.FrameID, Ver)) continue; if (PF.IsAvailable) PF.FrameStream(Ver).WriteTo(Temp); } foreach (AudioEncryptionFrame AE in _AudioEncryptionFrames.Items) { if (!FramesInfo.IsCompatible(AE.FrameID, Ver)) continue; if (AE.IsAvailable) AE.FrameStream(Ver).WriteTo(Temp); } foreach (LinkFrame LF in _LinkFrames.Items) { if (!FramesInfo.IsCompatible(LF.FrameID, Ver)) continue; if (LF.IsAvailable) LF.FrameStream(Ver).WriteTo(Temp); } foreach (TermOfUseFrame TU in _TermOfUseFrames.Items) { if (!FramesInfo.IsCompatible(TU.FrameID, Ver)) continue; if (TU.IsAvailable) TU.FrameStream(Ver).WriteTo(Temp); } foreach (DataWithSymbolFrame DS in _DataWithSymbolFrames.Items) { if (!FramesInfo.IsCompatible(DS.FrameID, Ver)) continue; if (DS.IsAvailable) DS.FrameStream(Ver).WriteTo(Temp); } // Saving Unknown Frames if (!_DropUnknown) foreach (BinaryFrame BF in _UnknownFrames.Items) if (BF.IsAvailable) BF.FrameStream(Ver).WriteTo(Temp); if (_MCDIFrame != null && FramesInfo.IsCompatible(_MCDIFrame.FrameID, Ver)) if (_MCDIFrame.IsAvailable) _MCDIFrame.FrameStream(Ver).WriteTo(Temp); if (_SYTCFrame != null && FramesInfo.IsCompatible(_SYTCFrame.FrameID, Ver)) if (_SYTCFrame.IsAvailable) _SYTCFrame.FrameStream(Ver).WriteTo(Temp); if (_PCNTFrame != null && FramesInfo.IsCompatible(_PCNTFrame.FrameID, Ver)) if (_PCNTFrame.IsAvailable) _PCNTFrame.FrameStream(Ver).WriteTo(Temp); if (_RBUFFrame != null && FramesInfo.IsCompatible(_RBUFFrame.FrameID, Ver)) if (_RBUFFrame.IsAvailable) _RBUFFrame.FrameStream(Ver).WriteTo(Temp); if (_OWNEFrame != null && FramesInfo.IsCompatible(_OWNEFrame.FrameID, Ver)) if (_OWNEFrame.IsAvailable) _OWNEFrame.FrameStream(Ver).WriteTo(Temp); if (_COMRFrame != null && FramesInfo.IsCompatible(_COMRFrame.FrameID, Ver)) if (_COMRFrame.IsAvailable) _COMRFrame.FrameStream(Ver).WriteTo(Temp); if (_RVRBFrame != null && FramesInfo.IsCompatible(_RVRBFrame.FrameID, Ver)) if (_RVRBFrame.IsAvailable) _RVRBFrame.FrameStream(Ver).WriteTo(Temp); if (_EQUAFrame != null && FramesInfo.IsCompatible(_EQUAFrame.FrameID, Ver)) if (_EQUAFrame.IsAvailable) _EQUAFrame.FrameStream(Ver).WriteTo(Temp); if (_RVADFrame != null && FramesInfo.IsCompatible(_RVADFrame.FrameID, Ver)) if (_RVADFrame.IsAvailable) _RVADFrame.FrameStream(Ver).WriteTo(Temp); if (_ETCOFrame != null && FramesInfo.IsCompatible(_ETCOFrame.FrameID, Ver)) if (_ETCOFrame.IsAvailable) _ETCOFrame.FrameStream(_ver.Minor).WriteTo(Temp); if (_POSSFrame != null && FramesInfo.IsCompatible(_POSSFrame.FrameID, Ver)) if (_POSSFrame.IsAvailable) _POSSFrame.FrameStream(Ver).WriteTo(Temp); SaveRestOfFile(StartIndex, Orgin, Temp, Ver); }
/// <summary> /// Load ID3 information from file /// </summary> /// <exception cref="FileNotFoundException">File Not Found</exception> public void Load() { FileStreamEx ID3File = new FileStreamEx(_FilePath, FileMode.Open); if (!ID3File.HaveID3v2()) // If file don't contain ID3v2 exit function { _HaveTag = false; ID3File.Close(); return; } _ver = ID3File.ReadVersion(); // Read ID3v2 version _Flags = (ID3v2Flags)ID3File.ReadByte(); // Extended Header Must Read Here ReadFrames(ID3File, ID3File.ReadSize()); ID3File.Close(); _HaveTag = true; }