private TagLib.File OpenAudioFile(string path, string ext) // Opens a proper file format via TagLib# and gets a file hadler object { TagLib.File audioFile = null; switch (ext) // Opening correct file type with TagLib# { case "MP3": audioFile = new TagLib.Mpeg.AudioFile(path, TagLib.ReadStyle.Average); break; case "FLAC": audioFile = new TagLib.Flac.File(path, TagLib.ReadStyle.Average); break; case "APE": // Generally not supported yet audioFile = new TagLib.Ape.File(path, TagLib.ReadStyle.Average); break; case "AAC": // Generally not supported yet audioFile = new TagLib.Aac.File(path, TagLib.ReadStyle.Average); break; case "AIFF": // Generally not supported yet audioFile = new TagLib.Aiff.File(path, TagLib.ReadStyle.Average); break; default: audioFile = TagLib.File.Create(path); break; } return(audioFile); }
public Audio(string filePath) : base(filePath) { if (this.Extension.ToLower() == ".mp3") { TagLib.Mpeg.AudioFile audioFile = new TagLib.Mpeg.AudioFile(filePath); _artist = audioFile.Tag.FirstAlbumArtist; _album = audioFile.Tag.Album; _genre = audioFile.Tag.FirstGenre; _lengthInSeconds = (int)Math.Round(audioFile.Properties.Duration.TotalSeconds); } else if (this.Extension.ToLower() == ".wav") { TagLib.Riff.File audioFile = new TagLib.Riff.File(filePath); _artist = audioFile.Tag.FirstAlbumArtist; _album = audioFile.Tag.Album; _genre = audioFile.Tag.FirstGenre; _lengthInSeconds = (int)Math.Round(audioFile.Properties.Duration.TotalSeconds); } else if (this.Extension.ToLower() == ".aiff") { TagLib.Aiff.File audioFile = new TagLib.Aiff.File(filePath); _artist = audioFile.Tag.FirstAlbumArtist; _album = audioFile.Tag.Album; _genre = audioFile.Tag.FirstGenre; _lengthInSeconds = (int)Math.Round(audioFile.Properties.Duration.TotalSeconds); } else if (this.Extension.ToLower() == ".flac") { TagLib.Flac.File audioFile = new TagLib.Flac.File(filePath); _artist = audioFile.Tag.FirstAlbumArtist; _album = audioFile.Tag.Album; _genre = audioFile.Tag.FirstGenre; _lengthInSeconds = (int)Math.Round(audioFile.Properties.Duration.TotalSeconds); } else if (this.Extension.ToLower() == ".aa" || this.Extension.ToLower() == ".aax") { TagLib.Audible.File audioFile = new TagLib.Audible.File(filePath); _artist = audioFile.Tag.FirstAlbumArtist; _album = audioFile.Tag.Album; _genre = audioFile.Tag.FirstGenre; _lengthInSeconds = (int)Math.Round(audioFile.Properties.Duration.TotalSeconds); } }
/// <summary> /// Refreshes the metadata of the audio file. /// </summary> public void RefreshMetadata() { // Get file size #if WINDOWSSTORE fileSize = 0; #else var fileInfo = new FileInfo(filePath); fileSize = fileInfo.Length; #endif // Check what is the type of the audio file if (fileType == AudioFileFormat.MP3) { // Declare variables TagLib.Mpeg.AudioFile file = null; try { // Create a more specific type of class for MP3 files file = new TagLib.Mpeg.AudioFile(filePath); // Get the position of the first and last block firstBlockPosition = file.InvariantStartPosition; lastBlockPosition = file.InvariantEndPosition; // Copy tags FillProperties(file.Tag); // Loop through codecs (usually just one) foreach (TagLib.ICodec codec in file.Properties.Codecs) { // Convert codec into a header TagLib.Mpeg.AudioHeader header = (TagLib.Mpeg.AudioHeader)codec; // Copy properties audioChannels = header.AudioChannels; frameLength = header.AudioFrameLength; audioLayer = header.AudioLayer; sampleRate = header.AudioSampleRate; bitsPerSample = 16; // always 16-bit channelMode = header.ChannelMode; bitrate = header.AudioBitrate; length = Conversion.TimeSpanToTimeString(header.Duration); } } catch (Exception ex) { // Throw exception TODO: Check if file exists when catching the exception (to make a better error description) throw new Exception("An error occured while reading the tags and properties of the file (" + filePath + ").", ex); } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } try { // // Check if there's a Xing header // XingInfoHeaderData xingHeader = XingInfoHeaderReader.ReadXingInfoHeader(filePath, firstBlockPosition); // // // Check if the read was successful // if (xingHeader.Status == XingInfoHeaderStatus.Successful) // { // // Set property value // //m_xingInfoHeader = xingHeader; // mp3EncoderDelay = xingHeader.EncoderDelay; // mp3EncoderPadding = xingHeader.EncoderPadding; // mp3EncoderVersion = xingHeader.EncoderVersion; // mp3HeaderType = xingHeader.HeaderType; // } } catch (Exception ex) { throw ex; } } else if (fileType == AudioFileFormat.FLAC) { // Declare variables TagLib.Flac.File file = null; try { // Read VorbisComment in FLAC file file = new TagLib.Flac.File(filePath); // Get the position of the first and last block firstBlockPosition = file.InvariantStartPosition; lastBlockPosition = file.InvariantEndPosition; // Copy tags FillProperties(file.Tag); // Loop through codecs (usually just one) foreach (TagLib.ICodec codec in file.Properties.Codecs) { // Convert codec into a header TagLib.Flac.StreamHeader header = (TagLib.Flac.StreamHeader)codec; // Copy properties bitrate = header.AudioBitrate; audioChannels = header.AudioChannels; sampleRate = header.AudioSampleRate; bitsPerSample = header.BitsPerSample; length = Conversion.TimeSpanToTimeString(header.Duration); } } catch (Exception ex) { // Throw exception throw new Exception("An error occured while reading the tags and properties of the file (" + filePath + ").", ex); } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } } else if (fileType == AudioFileFormat.OGG) { // Declare variables TagLib.Ogg.File file = null; try { // Read VorbisComment in OGG file file = new TagLib.Ogg.File(filePath); // Get the position of the first and last block firstBlockPosition = file.InvariantStartPosition; lastBlockPosition = file.InvariantEndPosition; // Copy tags FillProperties(file.Tag); // Loop through codecs (usually just one) foreach (TagLib.ICodec codec in file.Properties.Codecs) { // Check what kind of codec is used if (codec is TagLib.Ogg.Codecs.Theora) { // Do nothing, this is useless for audio. } else if (codec is TagLib.Ogg.Codecs.Vorbis) { // Convert codec into a header TagLib.Ogg.Codecs.Vorbis header = (TagLib.Ogg.Codecs.Vorbis)codec; // Copy properties bitrate = header.AudioBitrate; audioChannels = header.AudioChannels; sampleRate = header.AudioSampleRate; bitsPerSample = 16; length = Conversion.TimeSpanToTimeString(header.Duration); } } } catch (Exception ex) { // Throw exception throw new Exception("An error occured while reading the tags and properties of the file (" + filePath + ").", ex); } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } } else if (fileType == AudioFileFormat.APE) { // Monkey's Audio (APE) supports APEv2 tags. // http://en.wikipedia.org/wiki/Monkey's_Audio // Declare variables TagLib.Ape.File file = null; try { // Read APE metadata apeTag = APEMetadata.Read(filePath); // Get APEv1/v2 tags from APE file file = new TagLib.Ape.File(filePath); // Get the position of the first and last block firstBlockPosition = file.InvariantStartPosition; lastBlockPosition = file.InvariantEndPosition; // Copy tags FillProperties(file.Tag); // Loop through codecs (usually just one) foreach (TagLib.ICodec codec in file.Properties.Codecs) { // Check what kind of codec is used if (codec is TagLib.Ape.StreamHeader) { // Convert codec into a header TagLib.Ape.StreamHeader header = (TagLib.Ape.StreamHeader)codec; // Copy properties bitrate = header.AudioBitrate; audioChannels = header.AudioChannels; sampleRate = header.AudioSampleRate; bitsPerSample = 16; length = Conversion.TimeSpanToTimeString(header.Duration); } } } catch (Exception ex) { // Throw exception throw new Exception("An error occured while reading the tags and properties of the file (" + filePath + ").", ex); } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } } else if (fileType == AudioFileFormat.MPC) { // MusePack (MPC) supports APEv2 tags. // http://en.wikipedia.org/wiki/Musepack try { // Try to read SV8 header sv8Tag = SV8Metadata.Read(filePath); // Set audio properties audioChannels = sv8Tag.AudioChannels; sampleRate = sv8Tag.SampleRate; bitsPerSample = 16; length = sv8Tag.Length; bitrate = sv8Tag.Bitrate; } catch (SV8TagNotFoundException exSV8) { try { // Try to read the SV7 header sv7Tag = SV7Metadata.Read(filePath); // Set audio properties audioChannels = sv7Tag.AudioChannels; sampleRate = sv7Tag.SampleRate; bitsPerSample = 16; length = sv7Tag.Length; bitrate = sv7Tag.Bitrate; } catch (SV7TagNotFoundException exSV7) { // No headers have been found! SV8TagNotFoundException finalEx = new SV8TagNotFoundException(exSV8.Message, exSV7); throw new Exception("Error: The file is not in SV7/MPC or SV8/MPC format!", finalEx); } } try { // Read APE tag apeTag = APEMetadata.Read(filePath); // Copy tags FillProperties(apeTag); } catch (Exception ex) { // Check exception if (ex is APETagNotFoundException) { // Skip file } else { throw; } } } else if (fileType == AudioFileFormat.OFR) { // TagLib does not support OFR files... // OptimFROG (OFR) supports APEv2 tags. // http://en.wikipedia.org/wiki/OptimFROG } else if (fileType == AudioFileFormat.WV) { // WavPack supports APEv2 and ID3v1 tags. // http://www.wavpack.com/wavpack_doc.html // Declare variables TagLib.WavPack.File file = null; try { // Read WavPack tags file = new TagLib.WavPack.File(filePath); // Get the position of the first and last block firstBlockPosition = file.InvariantStartPosition; lastBlockPosition = file.InvariantEndPosition; // Copy tags FillProperties(file.Tag); // Loop through codecs (usually just one) foreach (TagLib.ICodec codec in file.Properties.Codecs) { // Check what kind of codec is used if (codec is TagLib.WavPack.StreamHeader) { // Convert codec into a header TagLib.WavPack.StreamHeader header = (TagLib.WavPack.StreamHeader)codec; // Copy properties bitrate = header.AudioBitrate; audioChannels = header.AudioChannels; sampleRate = header.AudioSampleRate; bitsPerSample = 16; length = Conversion.TimeSpanToTimeString(header.Duration); } } } catch (Exception ex) { // Throw exception throw new Exception("An error occured while reading the tags and properties of the file (" + filePath + ").", ex); } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } } else if (fileType == AudioFileFormat.TTA) { // The True Audio (TTA) format supports ID3v1, ID3v2 and APEv2 tags. // http://en.wikipedia.org/wiki/TTA_(codec) audioChannels = 2; sampleRate = 44100; bitsPerSample = 16; // TagLib doesn't work. } else if (fileType == AudioFileFormat.WAV) { // Declare variables TagLib.Riff.File file = null; try { // Get WAV file file = new TagLib.Riff.File(filePath); // Get the position of the first and last block firstBlockPosition = file.InvariantStartPosition; lastBlockPosition = file.InvariantEndPosition; // Copy tags FillProperties(file.Tag); // Loop through codecs (usually just one) foreach (TagLib.ICodec codec in file.Properties.Codecs) { // Check what kind of codec is used if (codec is TagLib.Riff.WaveFormatEx) { // Convert codec into a header TagLib.Riff.WaveFormatEx header = (TagLib.Riff.WaveFormatEx)codec; // Copy properties bitrate = header.AudioBitrate; audioChannels = header.AudioChannels; sampleRate = header.AudioSampleRate; bitsPerSample = 16; length = Conversion.TimeSpanToTimeString(header.Duration); } } } catch (Exception ex) { // Throw exception throw new Exception("An error occured while reading the tags and properties of the file (" + filePath + ").", ex); } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } } else if (fileType == AudioFileFormat.WMA) { // Declare variables TagLib.Asf.File file = null; try { // Read ASF/WMA tags file = new TagLib.Asf.File(filePath); // Get the position of the first and last block firstBlockPosition = file.InvariantStartPosition; lastBlockPosition = file.InvariantEndPosition; // Copy tags FillProperties(file.Tag); // The right length is here, not in the codec data structure length = Conversion.TimeSpanToTimeString(file.Properties.Duration); // Loop through codecs (usually just one) foreach (TagLib.ICodec codec in file.Properties.Codecs) { // Check what kind of codec is used if (codec is TagLib.Riff.WaveFormatEx) { // Convert codec into a header TagLib.Riff.WaveFormatEx header = (TagLib.Riff.WaveFormatEx)codec; // Copy properties bitrate = header.AudioBitrate; audioChannels = header.AudioChannels; sampleRate = header.AudioSampleRate; bitsPerSample = 16; } } } catch (Exception ex) { throw ex; } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } } else if (fileType == AudioFileFormat.AAC) { // Declare variables TagLib.Aac.File file = null; try { // Read AAC tags file = new TagLib.Aac.File(filePath); // Doesn't seem to work very well... } catch (Exception ex) { throw ex; } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } } // If the song has no name, give filename as the name if (String.IsNullOrEmpty(Title)) { Title = Path.GetFileNameWithoutExtension(filePath); } // If the artist has no name, give it "Unknown Artist" if (String.IsNullOrEmpty(ArtistName)) { ArtistName = "Unknown Artist"; } // If the song has no album title, give it "Unknown Album" if (String.IsNullOrEmpty(AlbumTitle)) { AlbumTitle = "Unknown Album"; } }
/// <summary> /// Saves the metadata associated with this audio file from its properties. /// </summary> public void SaveMetadata() { // Check what is the type of the audio file if (fileType == AudioFileFormat.MP3) { // Declare variables TagLib.Mpeg.AudioFile file = null; try { // Read tags file = new TagLib.Mpeg.AudioFile(filePath); // Copy tags file = (TagLib.Mpeg.AudioFile)FillTags(file); // Save metadata file.Save(); } catch (Exception ex) { // Throw exception throw new Exception("An error occured while reading/writing the tags and properties of the file (" + filePath + ").", ex); } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } } else if (fileType == AudioFileFormat.FLAC) { // Declare variables TagLib.Flac.File file = null; try { // Read tags file = new TagLib.Flac.File(filePath); // Copy tags file = (TagLib.Flac.File)FillTags(file); // Save metadata file.Save(); } catch (Exception ex) { // Throw exception throw new Exception("An error occured while reading/writing the tags and properties of the file (" + filePath + ").", ex); } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } } else if (fileType == AudioFileFormat.OGG) { // Declare variables TagLib.Ogg.File file = null; try { // Read tags file = new TagLib.Ogg.File(filePath); // Copy tags file = (TagLib.Ogg.File)FillTags(file); // Save metadata file.Save(); } catch (Exception ex) { // Throw exception throw new Exception("An error occured while reading/writing the tags and properties of the file (" + filePath + ").", ex); } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } } else if (fileType == AudioFileFormat.APE) { // Declare variables TagLib.Ape.File file = null; try { // Read tags file = new TagLib.Ape.File(filePath); // Copy tags file = (TagLib.Ape.File)FillTags(file); // Save metadata file.Save(); } catch (Exception ex) { // Throw exception throw new Exception("An error occured while reading/writing the tags and properties of the file (" + filePath + ").", ex); } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } } else if (fileType == AudioFileFormat.WV) { // Declare variables TagLib.WavPack.File file = null; try { // Read tags file = new TagLib.WavPack.File(filePath); // Copy tags file = (TagLib.WavPack.File)FillTags(file); // Save metadata file.Save(); } catch (Exception ex) { // Throw exception throw new Exception("An error occured while reading/writing the tags and properties of the file (" + filePath + ").", ex); } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } } else if (fileType == AudioFileFormat.WMA) { // Declare variables TagLib.Asf.File file = null; try { // Read tags file = new TagLib.Asf.File(filePath); // Copy tags file = (TagLib.Asf.File)FillTags(file); // Save metadata file.Save(); } catch (Exception ex) { // Throw exception throw new Exception("An error occured while reading/writing the tags and properties of the file (" + filePath + ").", ex); } finally { // Dispose file (if needed) if (file != null) file.Dispose(); } } }