? ID3 decoding and encoding library for Go

Overview

id3v2

Supported ID3 versions: 2.3, 2.4

Installation

go get -u github.com/bogem/id3v2

Usage example

package main

import (
	"fmt"
	"log"

	"github.com/bogem/id3v2"
)

func main() {
	tag, err := id3v2.Open("file.mp3", id3v2.Options{Parse: true})
	if err != nil {
 		log.Fatal("Error while opening mp3 file: ", err)
 	}
	defer tag.Close()

	// Read tags.
	fmt.Println(tag.Artist())
	fmt.Println(tag.Title())

	// Set tags.
	tag.SetArtist("Aphex Twin")
	tag.SetTitle("Xtal")

	comment := id3v2.CommentFrame{
		Encoding:    id3v2.EncodingUTF8,
		Language:    "eng",
		Description: "My opinion",
		Text:        "I like this song!",
	}
	tag.AddCommentFrame(comment)

	// Write tag to file.mp3.
	if err = tag.Save(); err != nil {
		log.Fatal("Error while saving a tag: ", err)
	}
}

Read multiple frames

pictures := tag.GetFrames(tag.CommonID("Attached picture"))
for _, f := range pictures {
	pic, ok := f.(id3v2.PictureFrame)
	if !ok {
		log.Fatal("Couldn't assert picture frame")
	}

	// Do something with picture frame.
	fmt.Println(pic.Description)
}

Encodings

For example, if you want to set comment frame with custom encoding, you may do the following:

comment := id3v2.CommentFrame{
	Encoding:    id3v2.EncodingUTF16,
	Language:    "ger",
	Description: "Tier",
	Text:        "Der Löwe",
}
tag.AddCommentFrame(comment)

Text field will be automatically encoded with UTF-16BE with BOM and written to w.

UTF-8 is default for v2.4, ISO-8859-1 - for v2.3.

Issues
  • fix invalid comparison causing errors opening frame

    fix invalid comparison causing errors opening frame

    I noticed that after modifying tags in foobar2000 that Open() would fail with the following error: frame went over tag area This was due to foobar2000 truncating the padding after the final frame and Open() was reading the audio data as the next frame size. The id == "" check should have caught this, but even though []byte{0, 0, 0, 0} will be printed as an empty string, it is not equivalent.

    opened by partyfamine 1
  • Attempt to fix parallel decoding

    Attempt to fix parallel decoding

    Added unit test TestDecodeTextParallel to demo an issue of decoding in multiple goroutines. run test:

    go test -race ./...
    

    result:

    WARNING: DATA RACE
    Write at 0x00c0000aa0ee by goroutine 36:
      golang.org/x/text/encoding/unicode.(*utf16Decoder).Reset()
          /Users/val/goLand/pkg/mod/golang.org/x/[email protected]/encoding/unicode/unicode.go:286 +0x57
      golang.org/x/text/encoding.(*Decoder).Reset()
          <autogenerated>:1 +0x49
      golang.org/x/text/transform.doAppend()
          /Users/val/goLand/pkg/mod/golang.org/x/[email protected]/transform/transform.go:689 +0x90
      golang.org/x/text/transform.Bytes()
          /Users/val/goLand/pkg/mod/golang.org/x/[email protected]/transform/transform.go:674 +0x8f
      golang.org/x/text/encoding.(*Decoder).Bytes()
          /Users/val/goLand/pkg/mod/golang.org/x/[email protected]/encoding/encoding.go:57 +0x30
      github.com/bogem/id3v2/v2.decodeText()
    

    this can be fixed by

        //result, err := fromXEncoding.Decoder().Bytes(src)
        result, err := fromXEncoding.encoding.NewDecoder().Bytes(src)
    

    This is just a proposal, please suggest better fix.

    opened by DrGolem 0
  • First implementation of chapter TOC

    First implementation of chapter TOC

    Hello Albert,

    it seams like that some mp3 players need chapter TOCs in addition to chapter frames to function properly. I've introduced AddChapterTocFrame according to https://id3.org/id3v2-chapters-1.0. I kept the spirit of a 'low-level' API without renaming the boolean values in reverse to support default values (values must be explicitly set). The fields are also named according to the specification to avoid confusion.

    opened by crra 5
  • Add support for writing v2 tags on files with v1 tags

    Add support for writing v2 tags on files with v1 tags

    I've got a number of files that already have 1-2 ID3v1 tags written to them. When I try to open these files for writing with this library, I get an Unsupported Version error. It would be really nice to be able to write v2 tags to files that already have v1 tags.

    opened by sa7mon 0
  • Add support of footer

    Add support of footer

    To speed up the process of locating an ID3v2 tag when searching from the end of a file, a footer can be added to the tag. It is REQUIRED to add a footer to an appended tag, i.e. a tag located after all audio data. The footer is a copy of the header, but with a different identifier.

    http://id3.org/id3v2.4.0-structure

    opened by bogem 1
Releases(v2.1.2)
  • v2.1.2(Nov 23, 2021)

    ⚠️ Breaking changes relative to v1

    From now on there can be only one attached picture frames (APICs) with same picture type and description. Before it was only one with same description. See issue (#65) and PR (#66). Thanks @tillt for investigation and solution!

    🚀 New feature

    Support CHAP frames #62 (thanks @takaishi for implementation)

    Source code(tar.gz)
    Source code(zip)
  • v2.0.0(Oct 13, 2021)

  • v1.2.0(Jun 7, 2020)

    🚀 New feature

    • Add PopularimeterFrame #58 (thanks @dhulihan for implementation)

    🐛 Bug fixes

    • Fix race conditions in unknown frame #59 (thanks @astax-t)

    🏃‍♀️ Performance

    • Improve performance for ISO encoding #61
      	name                   old time/op    new time/op    delta
      	WriteISO-4               21.7µs ± 1%     9.3µs ± 1%  -57.01%  (p=0.001 n=7+7)
      
      	name                   old alloc/op   new alloc/op   delta
      	WriteISO-4               47.2kB ± 0%     5.2kB ± 0%  -88.93%  (p=0.001 n=7+7)
      
      	name                   old allocs/op  new allocs/op  delta
      	WriteISO-4                 71.0 ± 0%      41.0 ± 0%  -42.25%  (p=0.001 n=7+7)
      
    Source code(tar.gz)
    Source code(zip)
  • v1.1.3(Mar 26, 2020)

  • v1.1.2(Mar 10, 2020)

    🐛 Bug fixes

    • Fixed UTF16 decoding and encoding #51 (thanks @tillt)
    • Fixed handling of duplicated frames #42 (thanks @AlexisWilke)
    • Check frame overflow #39 (thanks @eternal-flame-AD)
    • Fixed decoding and encoding of termination bytes #33 (thanks @ericmurmur and @jypelle)

    🏠 Internal

    • Use Go modules #50
    • Add and fix tests https://github.com/bogem/id3v2/commit/0a57fbfd454e5af70820fa8f650a099afd6d6f1b https://github.com/bogem/id3v2/commit/c0bd2d010f106c80f05af0633f5fa72b283bbe74 https://github.com/bogem/id3v2/commit/88f2646e81c1ad6fc4de6006754314e5faaf5634#diff-7d6d396947c2d955d4662722bcb4e86f
    Source code(tar.gz)
    Source code(zip)
  • v1.1.1(Sep 27, 2018)

    • Expose Tag's default encoding #35 https://github.com/bogem/id3v2/commit/7e434763606fc3a040c6ac9f356fc02953fb34d8
    // DefaultEncoding returns default encoding of tag.
    // Default encoding is used in methods (e.g. SetArtist, SetAlbum ...) for
    // setting text frames without the explicit providing of encoding.
    func (tag *Tag) DefaultEncoding() Encoding {
    	return tag.defaultEncoding
    }
    
    // SetDefaultEncoding sets default encoding for tag.
    // Default encoding is used in methods (e.g. SetArtist, SetAlbum ...) for
    // setting text frames without explicit providing encoding.
    func (tag *Tag) SetDefaultEncoding(encoding Encoding) {
    	tag.defaultEncoding = encoding
    }
    
    • Add AddTextFrame method https://github.com/bogem/id3v2/commit/7e434763606fc3a040c6ac9f356fc02953fb34d8
    // AddTextFrame creates the text frame with provided encoding and text
    // and adds to tag.
    func (tag *Tag) AddTextFrame(id string, encoding Encoding, text string) {
    	tag.AddFrame(id, TextFrame{Encoding: encoding, Text: text})
    }
    
    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Aug 25, 2018)

    • Add support for TXXX and UFID frames. Thanks to @robertgzr for PR! #37
    • Performance compared to v1.0.2:
    name                   old time/op    new time/op    delta
    ParseAllFrames-4         75.5µs ± 1%    77.4µs ± 5%  +2.52%  (p=0.008 n=6+7)
    ParseAllFramesISO-4      76.4µs ± 0%    77.2µs ± 1%  +1.13%  (p=0.002 n=6+6)
    ParseArtistAndTitle-4    2.39µs ±16%    2.30µs ±21%    ~     (p=0.364 n=7+7)
    Write-4                  6.76µs ± 0%    6.77µs ± 1%    ~     (p=0.902 n=7+7)
    WriteISO-4               9.43µs ± 1%    9.45µs ± 0%    ~     (p=0.535 n=7+7)
    
    name                   old alloc/op   new alloc/op   delta
    ParseAllFrames-4          263kB ± 0%     263kB ± 0%    ~     (p=0.333 n=7+7)
    ParseAllFramesISO-4       264kB ± 0%     264kB ± 0%    ~     (p=0.512 n=7+7)
    ParseArtistAndTitle-4      732B ± 1%      728B ± 1%    ~     (p=0.523 n=7+7)
    Write-4                  2.55kB ± 0%    2.55kB ± 0%    ~     (all equal)
    WriteISO-4               6.39kB ± 0%    6.39kB ± 0%    ~     (p=0.140 n=6+7)
    
    name                   old allocs/op  new allocs/op  delta
    ParseAllFrames-4           61.0 ± 0%      61.0 ± 0%    ~     (all equal)
    ParseAllFramesISO-4        66.4 ± 1%      66.6 ± 1%    ~     (p=1.000 n=7+7)
    ParseArtistAndTitle-4      14.3 ±12%      13.9 ±15%    ~     (p=0.592 n=7+7)
    Write-4                    35.0 ± 0%      35.0 ± 0%    ~     (all equal)
    WriteISO-4                 50.0 ± 0%      50.0 ± 0%    ~     (all equal)
    
    Source code(tar.gz)
    Source code(zip)
  • v1.0.2(Aug 15, 2018)

  • v1.0.1(Aug 15, 2018)

    • Fix parsing ID3v2.3 frame sizes. Earlier id3v2 didn't parse correctly v2.3 frame sizes. Huge thanks to @rstemmer for pointing to v2.3 size format #13, #34
    • Reduce memory allocations in encoding operations https://github.com/bogem/id3v2/commit/211759e6d3f2fefab64271a9a55ee01e25a501c2
    • Performance compared to v1.0.0:
    name                   old time/op    new time/op    delta
    ParseAllFrames-4         77.4µs ± 6%    77.1µs ± 5%   -0.36%  (p=0.690 n=5+5)
    ParseAllFramesISO-4      78.7µs ± 3%    76.3µs ± 1%   -3.01%  (p=0.008 n=5+5)
    ParseArtistAndTitle-4    2.40µs ±16%    2.45µs ±15%   +2.06%  (p=0.690 n=5+5)
    Write-4                  6.89µs ± 4%    6.79µs ± 2%   -1.56%  (p=0.310 n=5+5)
    WriteISO-4               11.0µs ± 0%     9.4µs ± 0%  -14.65%  (p=0.016 n=4+5)
    
    name                   old alloc/op   new alloc/op   delta
    ParseAllFrames-4          263kB ± 0%     263kB ± 0%   -0.01%  (p=0.095 n=5+5)
    ParseAllFramesISO-4       264kB ± 0%     264kB ± 0%   -0.08%  (p=0.008 n=5+5)
    ParseArtistAndTitle-4      732B ± 1%      734B ± 1%   +0.25%  (p=0.460 n=5+5)
    Write-4                  2.55kB ± 0%    2.55kB ± 0%     ~     (all equal)
    WriteISO-4               6.99kB ± 0%    6.39kB ± 0%   -8.58%  (p=0.000 n=5+4)
    
    name                   old allocs/op  new allocs/op  delta
    ParseAllFrames-4           62.0 ± 0%      61.0 ± 0%   -1.61%  (p=0.029 n=4+4)
    ParseAllFramesISO-4        76.6 ± 1%      66.0 ± 0%  -13.84%  (p=0.008 n=5+5)
    ParseArtistAndTitle-4      14.6 ±11%      14.6 ±11%     ~     (p=1.000 n=5+5)
    Write-4                    35.0 ± 0%      35.0 ± 0%     ~     (all equal)
    WriteISO-4                 80.0 ± 0%      50.0 ± 0%  -37.50%  (p=0.008 n=5+5)
    
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Apr 7, 2018)

    • id3v2 is exiting the beta and becoming stable, so the API will be changed only in major releases!
    • Major internal improvements: reduced code and improved performance.
    • Performance compared to v0.12.1:
    name                   old time/op    new time/op    delta
    ParseAllFrames-4          157µs ± 2%     155µs ± 2%   -1.12%  (p=0.008 n=8+9)
    ParseAllFramesISO-4       161µs ± 4%     158µs ± 2%   -1.63%  (p=0.222 n=9+9)
    ParseArtistAndTitle-4    37.6µs ±24%    37.7µs ±26%   +0.33%  (p=0.796 n=9+9)
    Write-4                  10.8ms ± 7%     7.3ms ±12%  -32.77%  (p=0.000 n=9+9)
    WriteISO-4               9.70ms ±37%    7.01ms ± 5%  -27.69%  (p=0.000 n=9+9)
    
    name                   old alloc/op   new alloc/op   delta
    ParseAllFrames-4          264kB ± 0%     264kB ± 0%   -0.08%  (p=0.000 n=8+7)
    ParseAllFramesISO-4       264kB ± 0%     264kB ± 0%   -0.02%  (p=0.234 n=8+8)
    ParseArtistAndTitle-4      811B ± 2%      807B ± 1%   -0.52%  (p=0.127 n=9+9)
    Write-4                  4.54kB ± 1%    4.18kB ± 0%   -7.97%  (p=0.000 n=7+9)
    WriteISO-4               8.63kB ± 4%    8.62kB ± 0%   -0.11%  (p=0.180 n=9+9)
    
    name                   old allocs/op  new allocs/op  delta
    ParseAllFrames-4           64.0 ± 0%      64.0 ± 0%     ~     (all equal)
    ParseAllFramesISO-4        79.0 ± 0%      79.0 ± 0%     ~     (all equal)
    ParseArtistAndTitle-4      17.0 ±12%      16.6 ± 9%   -2.61%  (p=0.519 n=9+9)
    Write-4                    52.0 ± 0%      52.0 ± 0%     ~     (all equal)
    WriteISO-4                 97.0 ± 0%      97.0 ± 0%     ~     (all equal)
    
    Source code(tar.gz)
    Source code(zip)
  • v0.12.1(Nov 18, 2017)

    • Now WriteTo methods return correct n values.
    • Significant performance improvements by writing:
    • Performance compared to v0.12:
    name                   old time/op    new time/op    delta
    ParseAllFrames-4          284µs ± 6%     225µs ± 1%  -20.86%  (p=0.003 n=7+5)
    ParseArtistAndTitle-4    26.1µs ±23%    21.8µs ±30%     ~     (p=0.097 n=7+7)
    AddTextFrame-4           1.29µs ± 2%    1.03µs ± 4%  -20.39%  (p=0.001 n=7+7)
    AddEncodedTextFrame-4    2.43µs ± 1%    2.04µs ± 1%  -15.99%  (p=0.001 n=7+7)
    ParseAndWrite-4          10.5ms ± 3%     8.7ms ±10%  -17.38%  (p=0.002 n=6+6)
    ReuseTag-4               3.42µs ± 0%    3.39µs ± 8%     ~     (p=0.508 n=6+7)
    WriteBytesSize-4         28.9ns ± 3%    29.9ns ±15%     ~     (p=0.466 n=6+7)
    ParseSize-4              8.36ns ± 2%    8.37ns ± 3%     ~     (p=0.876 n=7+7)
    
    name                   old alloc/op   new alloc/op   delta
    ParseAllFrames-4          527kB ± 0%     525kB ± 0%   -0.46%  (p=0.001 n=7+7)
    ParseArtistAndTitle-4      810B ± 1%      808B ± 1%     ~     (p=0.686 n=7+7)
    AddTextFrame-4             419B ± 0%      418B ± 0%   -0.24%  (p=0.001 n=7+7)
    AddEncodedTextFrame-4    1.35kB ± 0%    1.35kB ± 0%   -0.21%  (p=0.001 n=7+7)
    ParseAndWrite-4           269kB ± 0%     269kB ± 1%     ~     (p=0.902 n=7+7)
    ReuseTag-4               2.29kB ± 0%    2.29kB ± 0%     ~     (all equal)
    WriteBytesSize-4          10.0B ± 0%     10.0B ± 0%     ~     (all equal)
    ParseSize-4               0.00B          0.00B          ~     (all equal)
    
    name                   old allocs/op  new allocs/op  delta
    ParseAllFrames-4           98.6 ± 1%      95.4 ± 1%   -3.19%  (p=0.001 n=7+7)
    ParseArtistAndTitle-4      17.0 ±12%      16.7 ±14%     ~     (p=0.848 n=7+7)
    AddTextFrame-4             5.00 ± 0%      5.00 ± 0%     ~     (all equal)
    AddEncodedTextFrame-4      20.0 ± 0%      20.0 ± 0%     ~     (all equal)
    ParseAndWrite-4             103 ± 0%        98 ± 1%   -4.44%  (p=0.000 n=6+7)
    ReuseTag-4                 20.0 ± 0%      20.0 ± 0%     ~     (all equal)
    WriteBytesSize-4           0.00           0.00          ~     (all equal)
    ParseSize-4                0.00           0.00          ~     (all equal)
    
    Source code(tar.gz)
    Source code(zip)
  • v0.12(Nov 7, 2017)

    • Add full encoding conversion support. More in README #27
    • Get rid of subpackages. Now id3v2 is only one flat package!
    • Restore 32bit systems support #28
    • Major performance improvement by parsing with set Options.ParseFrames https://github.com/bogem/id3v2/commit/2378552672debb85dafde1806f726fd8d2381f7d
    • Performance compared to v0.11:
    name                   old time/op    new time/op    delta
    ParseAllFrames-4          219µs ± 1%     222µs ± 2%     ~     (p=0.051 n=7+6)
    ParseArtistAndTitle-4    66.3µs ± 2%    18.9µs ±23%  -71.51%  (p=0.001 n=7+7)
    ParseAndWrite-4          10.2ms ± 7%    10.2ms ± 3%     ~     (p=0.805 n=7+7)
    ReuseTag-4               3.13µs ± 1%    3.33µs ± 1%   +6.35%  (p=0.001 n=6+7)
    
    name                   old alloc/op   new alloc/op   delta
    ParseAllFrames-4          525kB ± 0%     525kB ± 0%   +0.08%  (p=0.001 n=7+7)
    ParseArtistAndTitle-4      763B ± 0%      810B ± 1%   +6.14%  (p=0.001 n=7+7)
    ParseAndWrite-4           267kB ± 0%     267kB ± 0%   +0.30%  (p=0.007 n=7+7)
    ReuseTag-4               2.16kB ± 0%    2.29kB ± 0%   +5.93%  (p=0.001 n=7+7)
    
    name                   old allocs/op  new allocs/op  delta
    ParseAllFrames-4           95.6 ± 1%      96.0 ± 0%     ~     (p=0.192 n=7+7)
    ParseArtistAndTitle-4      25.0 ± 0%      17.0 ±12%  -32.00%  (p=0.001 n=7+7)
    ParseAndWrite-4             101 ± 1%       102 ± 0%   +0.71%  (p=0.021 n=7+7)
    ReuseTag-4                 20.0 ± 0%      20.0 ± 0%     ~     (all equal)
    
    Source code(tar.gz)
    Source code(zip)
  • v0.11(Jul 18, 2017)

    • Rename all encodings. E.g. ENISOEncodingISO
    • Add NewEmptyTag constructor. Thanks to @corneldamian! #22
    • Return compatibility with old versions of Go. Thanks to @mro for report! #25
    • Fix race condition in util.FormSize d911cfa
    • Add tag.Reset function 2ccdfea
    • Performance compared to v0.10:
    name                   old time/op    new time/op    delta
    ParseAllFrames-4          201µs ± 1%     212µs ± 2%   +5.44%  (p=0.001 n=6+7)
    ParseArtistAndTitle-4    76.9µs ± 4%    56.9µs ± 2%  -25.97%  (p=0.001 n=7+7)
    ParseAndWrite-4          10.1ms ± 1%    10.2ms ± 4%   +0.68%  (p=0.945 n=6+7)
    
    name                   old alloc/op   new alloc/op   delta
    ParseAllFrames-4          526kB ± 0%     525kB ± 0%   -0.32%  (p=0.001 n=7+7)
    ParseArtistAndTitle-4      683B ± 0%      716B ± 0%   +4.75%  (p=0.001 n=7+7)
    ParseAndWrite-4           299kB ± 0%     267kB ± 0%  -10.65%  (p=0.001 n=7+7)
    
    name                   old allocs/op  new allocs/op  delta
    ParseAllFrames-4           95.0 ± 0%      95.0 ± 0%     ~     (all equal)
    ParseArtistAndTitle-4      24.0 ± 0%      25.0 ± 0%   +4.17%  (p=0.001 n=7+7)
    ParseAndWrite-4             101 ± 1%       102 ± 1%   +0.99%  (p=0.012 n=7+7)
    
    Source code(tar.gz)
    Source code(zip)
  • v0.10(May 12, 2017)

    • Added possibility to read tag from io.Reader (#20). Thanks to @corneldamian for his contribution!
    • Removed OpenFile as we have ParseReader now. They work same.
    Source code(tar.gz)
    Source code(zip)
  • v0.9(May 1, 2017)

    I'm glad to introduce new minor release of id3v2! There is new feature, what is very useful for high-performance tag parsing. And it is id3v2.Options! You can specify, which frames do you want to parse, so id3v2 will not spend time and resources of your computer to parse frames, that you don't need. Or maybe you don't want to parse tags at all, when you can tag, err := id3v2.Open("file.mp3", id3v2.Options{Parse: false}) and that's it!

    Also I made possible id3v2 to use in multiple goroutines! Earlier id3v2 had some global elements, so the usage of id3v2 in concurrent programs wasn't possible because of data races to these global elements.

    Source code(tar.gz)
    Source code(zip)
  • v0.8.10(Apr 12, 2017)

    Many memory consumption reduces. I can't attach benchcmp, because I also updated benchmark code to make them more honest, so the results are strongly different. Code of benchmarks is here. Here is benchmark results on my PC (MacBook Air 13" 2014 / 1,4 GHz Intel Core i5 / 4 GB 1600 MHz DDR3):

    BenchmarkParseAllFrames-4            	   10000	    252955 ns/op	  525784 B/op	      94 allocs/op
    BenchmarkParseAndWriteCommonCase-4   	     200	   9974345 ns/op	  296208 B/op	      61 allocs/op
    BenchmarkParseAndWriteManyFrames-4   	     100	  10037205 ns/op	  297792 B/op	      99 allocs/op
    
    Source code(tar.gz)
    Source code(zip)
  • v0.8.9(Feb 17, 2017)

    • Memory consumption and parsing performance improvements:
    benchmark                              old ns/op     new ns/op     delta
    BenchmarkParseAllFrames-4              226969        203528        -10.33%
    BenchmarkParseAndWriteCommonCase-4     10028518      10054538      +0.26%
    BenchmarkParseAndWriteManyFrames-4     10130233      10911758      +7.71%
    
    benchmark                              old allocs     new allocs     delta
    BenchmarkParseAllFrames-4              125            107            -14.40%
    BenchmarkParseAndWriteCommonCase-4     89             84             -5.62%
    BenchmarkParseAndWriteManyFrames-4     147            134            -8.84%
    
    benchmark                              old bytes     new bytes     delta
    BenchmarkParseAllFrames-4              546643        528189        -3.38%
    BenchmarkParseAndWriteCommonCase-4     420651        414435        -1.48%
    BenchmarkParseAndWriteManyFrames-4     434129        419882        -3.28%
    
    
    • Remove Body method from Framer
    Source code(tar.gz)
    Source code(zip)
  • v0.8.8.1(Feb 10, 2017)

  • v0.8.8(Feb 10, 2017)

  • v0.8.7(Feb 5, 2017)

    • Add Version and SetVersion methods
    • Fix #15: tag.Save() failed on Windows, because temp file could be in different disk drive
    • Fix signature of Framer.WriteTo, so Framer now fully implements io.WriterTo interface
    • Minor bug fixes
    Source code(tar.gz)
    Source code(zip)
  • v0.8.6(Dec 6, 2016)

  • v0.8.5(Oct 22, 2016)

  • v0.8.4(Oct 12, 2016)

    • Use errors instead of panics, if there is invalid size format in frame
    • Add error handling, if there is frame with blank ID or size equals to 0
    Source code(tar.gz)
    Source code(zip)
  • v0.8.3(Oct 1, 2016)

  • v0.8.1(Sep 4, 2016)

  • v0.8(Sep 2, 2016)

  • v0.7.1(Aug 27, 2016)

  • v0.7(Aug 27, 2016)

  • v0.6.1(Aug 5, 2016)

Mini audio library

malgo Go bindings for miniaudio library. Requires cgo but does not require linking to anything on the Windows/macOS and it links only -ldl on Linux/BS

Milan Nikolic 185 Jul 29, 2022
♪ A low-level library to play sound on multiple platforms ♪

Oto (音) A low-level library to play sound. This package offers io.WriteCloser to play PCM sound. Platforms Windows macOS Linux FreeBSD OpenBSD Android

Hajime Hoshi 1k Jul 30, 2022
Go bindings for the PortAudio audio I/O library

portaudio This package provides an interface to the PortAudio audio I/O library. See the package documentation for details. To build this package you

Gordon Klaus 521 Aug 2, 2022
Go library for searching on YouTube Music.

ytmusic Go library for searching on YouTube Music and getting other useful information. Installing go get github.com/raitonoberu/ytmusic Usage Search

Denis 8 Jul 23, 2022
Small application to convert my music library folder structure to 'crates' in the open-source DJ software Mixxx

Small application to convert my music library folder structure to 'crates' in the open-source DJ software Mixxx

Bart van Oort 1 May 8, 2022
Go models of Note, Scale, Chord and Key

gopkg.in/music-theory.v0 Music theory models in Go There's an example command-line utility music-theory.go to demo the libraries, with a bin/ wrapper.

Music Theory 402 Jul 29, 2022
A yet to be voice call application in terminal. with the power of go and webRTC (pion).

A yet to be voice call application in terminal. with the power of go and webRTC (pion).

Mohammad Fatemi 37 Apr 30, 2022
Self-hosted music streaming server 🎶 with RESTful API and Web interface

Self-hosted music streaming server ?? with RESTful API and Web interface. Think of it as your very own Spotify!

Doychin Atanasov 419 Jul 30, 2022
A utility for sending and listening for OSC messages.

A simple utility to send and listen for OSC messages. It can also be used to send MIDI messages.

Tim Thompson 3 Mar 5, 2022
Download and listen music in the terminal!

?? this cli still has a lot of bugs ?? A simple tool to download and listen music in the terminal. You will need: golang deno v1.16+ youtube-dl Instal

pai 77 Jul 22, 2022
A tool coded by GO to decode cryptoed netease music files and qqmusic files

nqdumpgo A tool coded by GO to decode cryptoed netease music files and qqmusic files 一个使用 Go 语言编写的用于解密被网易云音乐或 QQ 音乐加密的文件的程序,Go 程序在拥有与 C++程序相近的效率的同时,大大

null 3 Jul 29, 2022
Like tar but different. PitCH is an archive file format that aims for high performance and minimal bloat.

Like tar but different. PitCH is an archive file format that aims for high performance and minimal bloat.

Raphael Reyna 2 Feb 17, 2022
go-eexcel implements encoding and decoding of XLSX like encoding/json

go-eexcel go-eexcel implements encoding and decoding of XLSX like encoding/json Usage func ExampleMarshal() { type st struct { Name string `eexce

sago35 0 Dec 9, 2021
GED - Global-purpose Encoding / Decoding library

GED - Global-purpose Encoding / Decoding library This library lets you use common encoding/decoding schemes and allows you to define custom ones. Use

Noémien Kocher 0 Nov 28, 2021
Go structure annotations that supports encoding and decoding; similar to C-style bitfields. Supports bitfield packing, self-describing layout parameters, and alignment.

STRUCTure EXtensions structex provides annotation rules that extend Go structures for implementation of encoding and decoding of byte backed data fram

Hewlett Packard Enterprise 53 Jul 26, 2022
A simple, semantic and developer-friendly golang package for encoding&decoding and encryption&decryption

A simple, semantic and developer-friendly golang package for encoding&decoding and encryption&decryption

null 267 Aug 4, 2022
Some Golang types based on builtin. Implements interfaces Value / Scan and MarshalJSON / UnmarshalJSON for simple working with database NULL-values and Base64 encoding / decoding.

gotypes Some simple types based on builtin Golang types that implement interfaces for working with DB (Scan / Value) and JSON (Marshal / Unmarshal). N

null 0 Feb 12, 2022
ID3, MP4 and OGG/FLAC metadata parsing in Go

MP3/MP4/OGG/FLAC metadata parsing library This package provides MP3 (ID3v1,2.{2,3,4}) and MP4 (ACC, M4A, ALAC), OGG and FLAC metadata detection, parsi

David Howden 398 Aug 2, 2022
Little golang app that allows you to download a youtube video as mp3, and optionally embed ID3 tags -Cover Art, Artist ...-

yt2mp3 Little golang app that allows you to download a youtube video as mp3, and optionally embed ID3 tags -Cover Art, Artist ...- Instructions At the

null 0 Dec 25, 2021
Encoding and decoding GeoJSON <-> Go

go.geojson Go.geojson is a package for encoding and decoding GeoJSON into Go structs. Supports both the json.Marshaler and json.Unmarshaler interfaces

Paul Mach 208 Aug 3, 2022
Go package for decoding and encoding TARGA image format

tga tga is a Go package for decoding and encoding TARGA image format. It supports RLE and raw TARGA images with 8/15/16/24/32 bits per pixel, monochro

Sigrid Solveig Haflínudóttir 31 Jul 29, 2022
Encoding and decoding for fixed-width formatted data

fixedwidth Package fixedwidth provides encoding and decoding for fixed-width formatted Data. go get github.com/ianlopshire/go-fixedwidth Usage Struct

Ian Lopshire 64 Jul 22, 2022
Go package containing implementations of efficient encoding, decoding, and validation APIs.

encoding Go package containing implementations of encoders and decoders for various data formats. Motivation At Segment, we do a lot of marshaling and

Segment 858 Jul 28, 2022
MIME mail encoding and decoding package for Go

enmime enmime is a MIME encoding and decoding library for Go, focused on generating and parsing MIME encoded emails. It is being developed in tandem w

James Hillyerd 322 Aug 7, 2022
Package json implements encoding and decoding of JSON as defined in RFC 7159

Package json implements encoding and decoding of JSON as defined in RFC 7159. The mapping between JSON and Go values is described in the documentation for the Marshal and Unmarshal functions

High Performance, Kubernetes Native Object Storage 2 Jun 26, 2022
encLib is a simple golang package for quickly encoding and decoding string data in hex

encLib is a simple golang package for quickly encoding and decoding string data in hex

null 0 Nov 1, 2021
json encoding and decoding

jx Package jx implements encoding and decoding of json [RFC 7159]. Lightweight fork of jsoniter. go get github.com/go-faster/jx Usage and examples Roa

go faster 63 Jul 5, 2022
A Form Encoding & Decoding Package for Go

form A Form Encoding & Decoding Package for Go, written by Alvaro J. Genial. Synopsis This library is designed to allow seamless, high-fidelity encodi

Alvaro J. Genial 226 Jul 11, 2022
A codec for Go structs with support for chainable encoding/decoding hooks.

structool A codec for Go structs with support for chainable encoding/decoding hooks. Features Provide a uniform codec by combining mapstructure and st

Luo Peng 11 Jan 15, 2022