|
|
|
# ∙ ID3ED (ID3 - Encoder - Decoder)
|
|
|
|
## ⚬ Library for encoding/decoding ID3 tags
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
# Under construction !
|
|
|
|
|
|
|
|
# Project status
|
|
|
|
|
|
|
|
Right now it`s capable of reading and writing ID3v1 and ID3v1.1 tags.
|
|
|
|
|
|
|
|
ID3v2 support is still in making, but it can read header and frames
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
# ∙ Installation
|
|
|
|
|
|
|
|
To download package source:
|
|
|
|
```
|
|
|
|
go get github.com/Unbewohnte/id3ed/...
|
|
|
|
```
|
|
|
|
will be deprecated in 1.17 as far as I know
|
|
|
|
|
|
|
|
To donwload and compile package:
|
|
|
|
```
|
|
|
|
go install github.com/Unbewohnte/id3ed/...
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
# ∙ Examples
|
|
|
|
|
|
|
|
## ⚬ Reading ID3v1
|
|
|
|
```
|
|
|
|
package main
|
|
|
|
|
|
|
|
import(
|
|
|
|
"fmt"
|
|
|
|
id3v1 "github.com/Unbewohnte/id3ed/v1"
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
mp3file, err := os.Open("/path/to/mp3/myMP3.mp3")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// extract ID3v1.1 tag
|
|
|
|
mp3tag, err := id3v1.Readv1Tag(mp3file)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// print the whole tag
|
|
|
|
fmt.Printf("%+v",mp3tag)
|
|
|
|
|
|
|
|
// get certain fields
|
|
|
|
songname := mp3tag.SongName
|
|
|
|
|
|
|
|
genre := mp3tag.Genre
|
|
|
|
|
|
|
|
// etc.
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
## ⚬ Writing ID3v1
|
|
|
|
```
|
|
|
|
package main
|
|
|
|
|
|
|
|
import(
|
|
|
|
"fmt"
|
|
|
|
id3v1 "github.com/Unbewohnte/id3ed/v1"
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
f, err := os.OpenFile("/path/to/file/myfile.mp3",os.O_WRONLY, os.ModePerm)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
defer f.Close()
|
|
|
|
|
|
|
|
// create your tags struct
|
|
|
|
tag := &id3v1.ID3v1Tag{
|
|
|
|
SongName: "mysong",
|
|
|
|
Artist: "me",
|
|
|
|
Album: "my album",
|
|
|
|
Year: 2021,
|
|
|
|
Comment: "Cool song",
|
|
|
|
Track: 1,
|
|
|
|
Genre: "Christian Gangsta Rap", // for list of genres see: "./v1/genres.go"
|
|
|
|
}
|
|
|
|
|
|
|
|
// write tags to file
|
|
|
|
err = tag.WriteToFile(f)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
## ⚬ Reading ID3v2
|
|
|
|
```
|
|
|
|
package main
|
|
|
|
|
|
|
|
import(
|
|
|
|
"fmt"
|
|
|
|
id3v2 "github.com/Unbewohnte/id3ed/v2"
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
mp3file, err := os.Open("/path/to/mp3/myMP3.mp3")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// extract ID3v2 tag
|
|
|
|
mp3tag, err := id3v2.Readv2Tag(mp3file)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if mp3tag.Header.Version == id3v2.V2_3 {
|
|
|
|
// get certain frame by identifier.
|
|
|
|
// Contents is []byte. CAN AND PROBABLY WILL
|
|
|
|
// CONTAIN NULL OR OTHER NON-PRINTABLE BYTES !!!
|
|
|
|
// Text encoding support is still not implemented.
|
|
|
|
title := mp3tag.Frames["TIT2"].Contents
|
|
|
|
artist := mp3tag.Frames["TPE1"].Contents
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// etc.
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
# ∙ Testing
|
|
|
|
|
|
|
|
To test everything
|
|
|
|
```
|
|
|
|
go test ./...
|
|
|
|
```
|
|
|
|
or
|
|
|
|
```
|
|
|
|
go test -v ./...
|
|
|
|
```
|
|
|
|
to get a verbose output
|
|
|
|
|
|
|
|
OR
|
|
|
|
|
|
|
|
```
|
|
|
|
go test ./package_name_here
|
|
|
|
```
|
|
|
|
to test a specific package
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
# ∙ License
|
|
|
|
|
|
|
|
[MIT LICENSE](https://github.com/Unbewohnte/id3ed/blob/main/LICENSE)
|