



Its pure golang library for parsing and editing tags in mp3, mp4 and flac formats
gogetgithub.com/frolovo22/tag
For using command line arguments
goinstallgithub.com/frolovo22/tag
Name | ID3v1 | ID3v2.2 | ID3v2.3 | ID3v2.4 | MP4 | FLAC |
---|
Title | Title | TT2 | TIT2 | TIT2 | \xa9nam | TITLE |
Artist | Artist | TP1 | TPE1 | TPE1 | \xa9art | ARTIST |
Album | Album | TAL | TALB | TALB | \xa9alb | ALBUM |
Year | Year | TYE | TYER | TDOR | \xa9day | YEAR |
Comment | Comment | COM | COMM | COMM | | COMMENT |
Genre | Genre | TCO | TCON | TCON | \xa9gen | GENRE |
Album Artist | - | TOA | TPE2 | TPE2 | aART | ALBUMARTIST |
Date | - | TIM | TYER | TDRC | | DATE |
Arranger | - | - | IPLS | IPLS | | ARRANGER |
Author | - | TOL | TOLY | TOLY | | AUTHOR |
BPM | - | BPM | TBPM | TBPM | | BPM |
Catalog Number | - | - | TXXX:CATALOGNUMBER | TXXX:CATALOGNUMBER | | CATALOGNUMBER |
Compilation | - | - | TCMP | TCMP | | COMPILATION |
Composer | - | TCM | TCOM | TCOM | \xa9wrt | COMPOSER |
Conductor | - | TP3 | TPE3 | TPE3 | | CONDUCTOR |
Copyright | - | TCR | TCOP | TCOP | cprt | COPYRIGHT |
Description | - | TXX | TIT3 | TIT3 | | DESCRIPTION |
Disc Number | - | - | TPOS | TPOS | | DISCNUMBER |
Encoded by | - | TEN | TENC | TENC | \xa9too | ENCODED-BY |
Track Number | TrackNumber | TRK | TRCK | TRCK | trkn | TRACKNUMBER |
Picture | - | PIC | APIC | APIC | covr | METADATA_BLOCK_PICTURE |
In progress
Future features:
- Support all tags (id3 v1, v1.1, v2.2, v2.3, v2.4, mp4, flac)
- Fix errors in files (empty tags, incorrect size, tag size, tag parameters)
- Command line arguments
Format | Read | Set | Delete | Save |
---|
idv1 | | | | |
idv1.1 | | | | |
idv2.2 | | | | |
idv2.3 | | | | |
idv2.4 | | | | |
mp4 | | | | |
FLAC | | | | |
Cli info
For read tags use
tagread -in"path/to/file"# example outputversion: id3v2.4description: subtitletrack number: 12/12author: Kittencatalog number: catalogcatbmp: 777conductor: catconductorcopyright: 2019album: CatAlbumcomment: catcomment
for save meta information use
tagread -in"path/to/file" -out"path/to/outputfile.json"
Now supported only json output file
tags,err:=tag.ReadFile("song.mp3")iferr!=nil {returnerr}fmt.Println(tags.GetTitle())
tag.ReadFile or tag.Read
return interfaceMetadata
:
package tagtypeMetadatainterface {GetMetadataSetMetadataDeleteMetadataSaveMetadata}typeGetMetadatainterface {GetAllTagNames() []stringGetVersion()VersionGetFileData() []byte// all another file dataGetTitle() (string,error)GetArtist() (string,error)GetAlbum() (string,error)GetYear() (int,error)GetComment() (string,error)GetGenre() (string,error)GetAlbumArtist() (string,error)GetDate() (time.Time,error)GetArranger() (string,error)GetAuthor() (string,error)GetBMP() (int,error)GetCatalogNumber() (int,error)GetCompilation() (string,error)GetComposer() (string,error)GetConductor() (string,error)GetCopyright() (string,error)GetDescription() (string,error)GetDiscNumber() (int,int,error)// number, totalGetEncodedBy() (string,error)GetTrackNumber() (int,int,error)// number, totalGetPicture() (image.Image,error)}typeSetMetadatainterface {SetTitle(titlestring)errorSetArtist(artiststring)errorSetAlbum(albumstring)errorSetYear(yearint)errorSetComment(commentstring)errorSetGenre(genrestring)errorSetAlbumArtist(albumArtiststring)errorSetDate(date time.Time)errorSetArranger(arrangerstring)errorSetAuthor(authorstring)errorSetBMP(bmpint)errorSetCatalogNumber(catalogNumberint)errorSetCompilation(compilationstring)errorSetComposer(composerstring)errorSetConductor(conductorstring)errorSetCopyright(copyrightstring)errorSetDescription(descriptionstring)errorSetDiscNumber(numberint,totalint)errorSetEncodedBy(encodedBystring)errorSetTrackNumber(numberint,totalint)errorSetPicture(picture image.Image)error}typeDeleteMetadatainterface {DeleteAll()errorDeleteTitle()errorDeleteArtist()errorDeleteAlbum()errorDeleteYear()errorDeleteComment()errorDeleteGenre()errorDeleteAlbumArtist()errorDeleteDate()errorDeleteArranger()errorDeleteAuthor()errorDeleteBMP()errorDeleteCatalogNumber()errorDeleteCompilation()errorDeleteComposer()errorDeleteConductor()errorDeleteCopyright()errorDeleteDescription()errorDeleteDiscNumber()errorDeleteEncodedBy()errorDeleteTrackNumber()errorDeletePicture()error}typeSaveMetadatainterface {SaveFile(pathstring)errorSave(input io.WriteSeeker)error}
Also you can read defined format. For Example:
package mainimport ("fmt""github.com/frolovo22/tag""os")funcRead()error {file,err:=os.Open("path/to/file")iferr!=nil {returnerr}deferfile.Close()id3v2,err:=tag.ReadID3v24(file)iferr!=nil {returnerr}// Get tag value by namevalue,err:=id3v2.GetString("TIT2")iferr!=nil {returnerr}fmt.Println("title: "+value)// Set tag valueerr=id3v2.SetString("TIT2","Title")iferr!=nil {returnerr}// User defined tagsvalue,err=id3v2.GetStringTXXX("MYTAG")iferr!=nil {returnerr}fmt.Println("my tag: "+value)// Set user tagerr=id3v2.SetStringTXXX("MYTAG222","Dogs")iferr!=nil {returnerr}// Save changeserr=id3v2.SaveFile("path/to/file")iferr!=nil {returnerr}}