Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ID3 tags with Swift

I'm looking for a way to modify ID3 tags with Swift. More specifically, I want to write the Album Art image to an mp3/m4a file.

A Swift library would be the best, but I'll take anything that can be done natively in Swift. I don't want to rely on another language's library.

I had a quick look at AVFoundation, but it looks like it's only for audio/video playback and conversion. This is about the closest I found from ID3 tags: https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVAsset_Class/

Any suggestion?

like image 468
LaX Avatar asked May 15 '15 16:05

LaX


People also ask

Do I need ID3 tags?

ID3 tags are a critical component of audio files, particularly MP3s. In simple terms, ID3 tags are the metadata for an audio file to make sure they are displayed correctly in computer software such as a DAW, a DJ streaming software, or a music streaming app like Apple Music.

How do I get rid of ID3 tags?

Simply select the track, or tracks, that you wish to remove ID3 tags for, then right click them in the Music Tag file list. On the menu that appears, click the "Remove Tags" option. You'll be presented with a box wish asks you to confirm that you would like to remove the tags, and that the operation is irreversible.

What does convert ID3 tags mean?

ID3 tags are embedded in your Mp3 files. ID3 tags are not an official specification of the format. (Definition from Apple support) The definition we like better reads something like: ID3 tags allow information such as the title, artist, album, track number, and other information about the file.


1 Answers

I was faced with this same problem over and over so I decided to make a swift framework for it. You can find it here: https://github.com/philiphardy/ID3Edit

Add it into your Xcode project and then make sure to embed it by going to your project settings > General > Embedded Binaries

Here is how to implement it in your code:

import ID3Edit
...
do
{
   // Open the file
   let mp3File = try MP3File(path: "/Users/Example/Music/example.mp3")
   // Use MP3File(data: data) data being an NSData object
   // to load an MP3 file from memory
   // NOTE: If you use the MP3File(data: NSData?) initializer make
   //       sure to set the path before calling writeTag() or an
   //       exception will be thrown

   // Get song information
   print("Title:\t\(mp3File.getTitle())")
   print("Artist:\t\(mp3File.getArtist())")
   print("Album:\t\(mp3File.getAlbum())")
   print("Lyrics:\n\(mp3File.getLyrics())")

   let artwork = mp3File.getArtwork()

   // Write song information
   mp3File.setTitle("The new song title")
   mp3File.setArtist("The new artist")
   mp3File.setAlbum("The new album")
   mp3File.setLyrics("Yeah Yeah new lyrics")

   if let newArt = NSImage(contentsOfFile: "/Users/Example/Pictures/example.png")
   {
          mp3File.setArtwork(newArt, isPNG: true)
   }
   else
   {
          print("The artwork referenced does not exist.")
   }

   // Save the information to the mp3 file
   mp3File.writeTag() // or mp3.getMP3Data() returns the NSData
                      // of the mp3 file
}
catch ID3EditErrors.FileDoesNotExist
{
   print("The file does not exist.")
}
catch ID3EditErrors.NotAnMP3
{
   print("The file you attempted to open was not an mp3 file.")
}
catch {}
like image 73
Philip Hardy Avatar answered Oct 31 '22 09:10

Philip Hardy