From 6fc87e12136e53b45fb2b7c67560360fe46a9ca4 Mon Sep 17 00:00:00 2001 From: Robin Eklind Date: Sun, 4 Aug 2024 01:38:41 +0200 Subject: [PATCH] cmd: move example tools to dedicated mewkiz/flac-tools repo Fixes #62. --- cmd/flac2wav/flac2wav.go | 112 ------------ cmd/go-metaflac/metaflac.go | 354 ------------------------------------ cmd/wav2flac/main.go | 224 ----------------------- go.mod | 3 - go.sum | 8 - 5 files changed, 701 deletions(-) delete mode 100644 cmd/flac2wav/flac2wav.go delete mode 100644 cmd/go-metaflac/metaflac.go delete mode 100644 cmd/wav2flac/main.go diff --git a/cmd/flac2wav/flac2wav.go b/cmd/flac2wav/flac2wav.go deleted file mode 100644 index 1afca46..0000000 --- a/cmd/flac2wav/flac2wav.go +++ /dev/null @@ -1,112 +0,0 @@ -// The flac2wav tool converts FLAC files to WAV files. -package main - -import ( - "flag" - "fmt" - "io" - "log" - "os" - - "github.com/go-audio/audio" - "github.com/go-audio/wav" - "github.com/mewkiz/flac" - "github.com/mewkiz/pkg/osutil" - "github.com/mewkiz/pkg/pathutil" - "github.com/pkg/errors" -) - -func usage() { - const use = ` -Usage: flac2wav [OPTION]... FILE.flac...` - fmt.Fprintln(os.Stderr, use[1:]) - flag.PrintDefaults() -} - -func main() { - // Parse command line arguments. - var ( - // force overwrite WAV file if present already. - force bool - ) - flag.BoolVar(&force, "f", false, "force overwrite") - flag.Usage = usage - flag.Parse() - for _, path := range flag.Args() { - err := flac2wav(path, force) - if err != nil { - log.Fatalf("%+v", err) - } - } -} - -// flac2wav converts the provided FLAC file to a WAV file. -func flac2wav(path string, force bool) error { - // Open FLAC file. - stream, err := flac.Open(path) - if err != nil { - return errors.WithStack(err) - } - defer stream.Close() - - // Create WAV file. - wavPath := pathutil.TrimExt(path) + ".wav" - if !force { - if osutil.Exists(wavPath) { - return errors.Errorf("WAV file %q already present; use the -f flag to force overwrite", wavPath) - } - } - fw, err := os.Create(wavPath) - if err != nil { - return errors.WithStack(err) - } - defer fw.Close() - - // Create WAV encoder. - wavAudioFormat := 1 // PCM - enc := wav.NewEncoder(fw, int(stream.Info.SampleRate), int(stream.Info.BitsPerSample), int(stream.Info.NChannels), wavAudioFormat) - defer enc.Close() - var data []int - for { - // Decode FLAC audio samples. - frame, err := stream.ParseNext() - if err != nil { - if err == io.EOF { - break - } - return errors.WithStack(err) - } - - // Encode WAV audio samples. - data = data[:0] - for i := 0; i < frame.Subframes[0].NSamples; i++ { - for _, subframe := range frame.Subframes { - sample := int(subframe.Samples[i]) - if frame.BitsPerSample == 8 { - // WAV files with 8 bit-per-sample are stored with unsigned - // values, WAV files with more than 8 bit-per-sample are stored - // as signed values (ref page 59-60 of [1]). - // - // [1]: http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Docs/riffmci.pdf - // ref: https://github.com/mewkiz/flac/issues/51#issuecomment-1046183409 - const midpointValue = 0x80 - sample += midpointValue - } - data = append(data, sample) - } - } - buf := &audio.IntBuffer{ - Format: &audio.Format{ - NumChannels: int(stream.Info.NChannels), - SampleRate: int(stream.Info.SampleRate), - }, - Data: data, - SourceBitDepth: int(stream.Info.BitsPerSample), - } - if err := enc.Write(buf); err != nil { - return errors.WithStack(err) - } - } - - return nil -} diff --git a/cmd/go-metaflac/metaflac.go b/cmd/go-metaflac/metaflac.go deleted file mode 100644 index fc47e26..0000000 --- a/cmd/go-metaflac/metaflac.go +++ /dev/null @@ -1,354 +0,0 @@ -// TODO(u): Prefix lines with file name if flag.NArg() > 1. Example: -// tone24bit.flac:METADATA block #2 -// tone24bit.flac: type: 4 (VORBIS_COMMENT) -// tone24bit.flac: is last: false -// tone24bit.flac: length: 40 -// tone24bit.flac: vendor string: reference libFLAC 1.1.4 20070213 -// tone24bit.flac: comments: 0 -// tone24bit.flac:METADATA block #3 -// tone24bit.flac: type: 1 (PADDING) -// tone24bit.flac: is last: true -// tone24bit.flac: length: 8192 -// zonophone-x28010-10407u.flac:METADATA block #0 -// zonophone-x28010-10407u.flac: type: 0 (STREAMINFO) -// zonophone-x28010-10407u.flac: is last: false -// zonophone-x28010-10407u.flac: length: 34 - -package main - -import ( - "encoding/hex" - "flag" - "fmt" - "log" - "os" - "strconv" - "strings" - - "github.com/mewkiz/flac" - "github.com/mewkiz/flac/meta" -) - -// flagBlockNum contains an optional comma-separated list of block numbers to -// display. -var flagBlockNum string - -func init() { - flag.StringVar(&flagBlockNum, "block-number", "", "An optional comma-separated list of block numbers to display.") - flag.Usage = usage -} - -func usage() { - fmt.Fprintln(os.Stderr, "Usage: metaflac [OPTION]... FILE...") - fmt.Fprintln(os.Stderr) - fmt.Fprintln(os.Stderr, "Flags:") - flag.PrintDefaults() -} - -func main() { - flag.Parse() - if flag.NArg() < 1 { - flag.Usage() - os.Exit(1) - } - for _, path := range flag.Args() { - err := list(path) - if err != nil { - log.Fatalln(err) - } - } -} - -func list(path string) error { - var blockNums []int - if flagBlockNum != "" { - // Parse "--block-number" command line flag. - rawBlockNums := strings.Split(flagBlockNum, ",") - for _, rawBlockNum := range rawBlockNums { - blockNum, err := strconv.Atoi(rawBlockNum) - if err != nil { - return err - } - blockNums = append(blockNums, blockNum) - } - } - - // Open FLAC stream. - stream, err := flac.ParseFile(path) - if err != nil { - return err - } - - // List all blocks. - if blockNums == nil { - var isLast bool - if len(stream.Blocks) == 0 { - isLast = true - } - listStreamInfoHeader(isLast) - listStreamInfo(stream.Info) - for blockNum, block := range stream.Blocks { - // strea.Blocks doesn't contain StreamInfo, therefore the blockNum - // is one less. - blockNum-- - listBlock(block, blockNum) - } - return nil - } - - // Only list blocks specified in the "--block-number" command line flag. - for _, blockNum := range blockNums { - if blockNum == 0 { - listStreamInfo(stream.Info) - } else { - // strea.Blocks doesn't contain StreamInfo, therefore the blockNum - // is one less. - blockNum-- - } - if blockNum < len(stream.Blocks) { - listBlock(stream.Blocks[blockNum], blockNum) - } - } - return nil -} - -func listBlock(block *meta.Block, blockNum int) { - listHeader(&block.Header, blockNum) - switch body := block.Body.(type) { - case *meta.Application: - listApplication(body) - case *meta.SeekTable: - listSeekTable(body) - case *meta.VorbisComment: - listVorbisComment(body) - case *meta.CueSheet: - listCueSheet(body) - case *meta.Picture: - listPicture(body) - } -} - -// typeName maps from metadata block type to a string version of its name. -var typeName = map[meta.Type]string{ - meta.TypeStreamInfo: "STREAMINFO", - meta.TypePadding: "PADDING", - meta.TypeApplication: "APPLICATION", - meta.TypeSeekTable: "SEEKTABLE", - meta.TypeVorbisComment: "VORBIS_COMMENT", - meta.TypeCueSheet: "CUESHEET", - meta.TypePicture: "PICTURE", -} - -// Each field of the StreamInfo header is constant, with the exception of -// is_last. -// -// Example: -// -// METADATA block #0 -// type: 0 (STREAMINFO) -// is last: false -// length: 34 -func listStreamInfoHeader(isLast bool) { - fmt.Println("METADATA block #0") - fmt.Println(" type: 0 (STREAMINFO)") - fmt.Println(" is last:", isLast) - fmt.Println(" length: 34") -} - -// Example: -// -// METADATA block #0 -// type: 0 (STREAMINFO) -// is last: false -// length: 34 -func listHeader(header *meta.Header, blockNum int) { - name, ok := typeName[header.Type] - if !ok { - name = "UNKNOWN" - } - fmt.Printf("METADATA block #%d\n", blockNum) - fmt.Printf(" type: %d (%s)\n", header.Type, name) - fmt.Printf(" is last: %t\n", header.IsLast) - fmt.Printf(" length: %d\n", header.Length) -} - -// Example: -// -// minimum blocksize: 4608 samples -// maximum blocksize: 4608 samples -// minimum framesize: 0 bytes -// maximum framesize: 19024 bytes -// sample_rate: 44100 Hz -// channels: 2 -// bits-per-sample: 16 -// total samples: 151007220 -// MD5 signature: 2e6238f5d9fe5c19f3ead628f750fd3d -func listStreamInfo(si *meta.StreamInfo) { - fmt.Printf(" minimum blocksize: %d samples\n", si.BlockSizeMin) - fmt.Printf(" maximum blocksize: %d samples\n", si.BlockSizeMax) - fmt.Printf(" minimum framesize: %d bytes\n", si.FrameSizeMin) - fmt.Printf(" maximum framesize: %d bytes\n", si.FrameSizeMax) - fmt.Printf(" sample_rate: %d Hz\n", si.SampleRate) - fmt.Printf(" channels: %d\n", si.NChannels) - fmt.Printf(" bits-per-sample: %d\n", si.BitsPerSample) - fmt.Printf(" total samples: %d\n", si.NSamples) - fmt.Printf(" MD5 signature: %x\n", si.MD5sum) -} - -// Example: -// -// application ID: 46696361 -// data contents: -// Medieval CUE Splitter (www.medieval.it) -func listApplication(app *meta.Application) { - fmt.Printf(" application ID: %d\n", app.ID) - fmt.Println(" data contents:") - if len(app.Data) > 0 { - fmt.Println(string(app.Data)) - } -} - -// Example: -// -// seek points: 17 -// point 0: sample_number=0, stream_offset=0, frame_samples=4608 -// point 1: sample_number=2419200, stream_offset=3733871, frame_samples=4608 -// ... -func listSeekTable(st *meta.SeekTable) { - fmt.Printf(" seek points: %d\n", len(st.Points)) - for pointNum, point := range st.Points { - if point.SampleNum == meta.PlaceholderPoint { - fmt.Printf(" point %d: PLACEHOLDER\n", pointNum) - } else { - fmt.Printf(" point %d: sample_number=%d, stream_offset=%d, frame_samples=%d\n", pointNum, point.SampleNum, point.Offset, point.NSamples) - } - } -} - -// Example: -// -// vendor string: reference libFLAC 1.2.1 20070917 -// comments: 10 -// comment[0]: ALBUM=「sugar sweet nightmare」 & 「化物語」劇伴音楽集 其の壹 -// comment[1]: ARTIST=神前暁 -// ... -func listVorbisComment(vc *meta.VorbisComment) { - fmt.Printf(" vendor string: %s\n", vc.Vendor) - fmt.Printf(" comments: %d\n", len(vc.Tags)) - for tagNum, tag := range vc.Tags { - fmt.Printf(" comment[%d]: %s=%s\n", tagNum, tag[0], tag[1]) - } -} - -// Example: -// -// media catalog number: -// lead-in: 88200 -// is CD: true -// number of tracks: 18 -// track[0] -// offset: 0 -// number: 1 -// ISRC: -// type: AUDIO -// pre-emphasis: false -// number of index points: 1 -// index[0] -// offset: 0 -// number: 1 -// track[1] -// offset: 2421384 -// number: 2 -// ISRC: -// type: AUDIO -// pre-emphasis: false -// number of index points: 1 -// index[0] -// offset: 0 -// number: 1 -// ... -// track[17] -// offset: 151007220 -// number: 170 (LEAD-OUT) -func listCueSheet(cs *meta.CueSheet) { - fmt.Printf(" media catalog number: %s\n", cs.MCN) - fmt.Printf(" lead-in: %d\n", cs.NLeadInSamples) - fmt.Printf(" is CD: %t\n", cs.IsCompactDisc) - fmt.Printf(" number of tracks: %d\n", len(cs.Tracks)) - for trackNum, track := range cs.Tracks { - fmt.Printf(" track[%d]\n", trackNum) - fmt.Printf(" offset: %d\n", track.Offset) - if trackNum == len(cs.Tracks)-1 { - // Lead-out track. - fmt.Printf(" number: %d (LEAD-OUT)\n", track.Num) - continue - } - fmt.Printf(" number: %d\n", track.Num) - fmt.Printf(" ISRC: %s\n", track.ISRC) - var trackTypeName = map[bool]string{ - false: "DATA", - true: "AUDIO", - } - fmt.Printf(" type: %s\n", trackTypeName[track.IsAudio]) - fmt.Printf(" pre-emphasis: %t\n", track.HasPreEmphasis) - fmt.Printf(" number of index points: %d\n", len(track.Indicies)) - for indexNum, index := range track.Indicies { - fmt.Printf(" index[%d]\n", indexNum) - fmt.Printf(" offset: %d\n", index.Offset) - fmt.Printf(" number: %d\n", index.Num) - } - } -} - -// Example: -// -// type: 3 (Cover (front)) -// MIME type: image/jpeg -// description: -// width: 0 -// height: 0 -// depth: 0 -// colors: 0 (unindexed) -// data length: 234569 -// data: -// 00000000: FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 60 ......JFIF.....` -// 00000010: 00 60 00 00 FF DB 00 43 00 01 01 01 01 01 01 01 .`.....C........ -func listPicture(pic *meta.Picture) { - typeName := map[uint32]string{ - 0: "Other", - 1: "32x32 pixels 'file icon' (PNG only)", - 2: "Other file icon", - 3: "Cover (front)", - 4: "Cover (back)", - 5: "Leaflet page", - 6: "Media (e.g. label side of CD)", - 7: "Lead artist/lead performer/soloist", - 8: "Artist/performer", - 9: "Conductor", - 10: "Band/Orchestra", - 11: "Composer", - 12: "Lyricist/text writer", - 13: "Recording Location", - 14: "During recording", - 15: "During performance", - 16: "Movie/video screen capture", - 17: "A bright coloured fish", - 18: "Illustration", - 19: "Band/artist logotype", - 20: "Publisher/Studio logotype", - } - fmt.Printf(" type: %d (%s)\n", pic.Type, typeName[pic.Type]) - fmt.Printf(" MIME type: %s\n", pic.MIME) - fmt.Printf(" description: %s\n", pic.Desc) - fmt.Printf(" width: %d\n", pic.Width) - fmt.Printf(" height: %d\n", pic.Height) - fmt.Printf(" depth: %d\n", pic.Depth) - fmt.Printf(" colors: %d", pic.NPalColors) - if pic.NPalColors == 0 { - fmt.Print(" (unindexed)") - } - fmt.Println() - fmt.Printf(" data length: %d\n", len(pic.Data)) - fmt.Printf(" data:\n") - fmt.Print(hex.Dump(pic.Data)) -} diff --git a/cmd/wav2flac/main.go b/cmd/wav2flac/main.go deleted file mode 100644 index 6743311..0000000 --- a/cmd/wav2flac/main.go +++ /dev/null @@ -1,224 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "log" - "os" - - "github.com/go-audio/audio" - "github.com/go-audio/wav" - "github.com/mewkiz/flac" - "github.com/mewkiz/flac/frame" - "github.com/mewkiz/flac/meta" - "github.com/mewkiz/pkg/osutil" - "github.com/mewkiz/pkg/pathutil" - "github.com/pkg/errors" -) - -func main() { - // Parse command line arguments. - var ( - // force overwrite FLAC file if already present. - force bool - ) - flag.BoolVar(&force, "f", false, "force overwrite") - flag.Parse() - for _, wavPath := range flag.Args() { - if err := wav2flac(wavPath, force); err != nil { - log.Fatalf("%+v", err) - } - } -} - -func wav2flac(wavPath string, force bool) error { - // Create WAV decoder. - r, err := os.Open(wavPath) - if err != nil { - return errors.WithStack(err) - } - defer r.Close() - dec := wav.NewDecoder(r) - if !dec.IsValidFile() { - return errors.Errorf("invalid WAV file %q", wavPath) - } - sampleRate, nchannels, bps := int(dec.SampleRate), int(dec.NumChans), int(dec.BitDepth) - - // Create FLAC encoder. - flacPath := pathutil.TrimExt(wavPath) + ".flac" - if !force && osutil.Exists(flacPath) { - return errors.Errorf("FLAC file %q already present; use -f flag to force overwrite", flacPath) - } - w, err := os.Create(flacPath) - if err != nil { - return errors.WithStack(err) - } - info := &meta.StreamInfo{ - // Minimum block size (in samples) used in the stream; between 16 and - // 65535 samples. - BlockSizeMin: 16, // adjusted by encoder. - // Maximum block size (in samples) used in the stream; between 16 and - // 65535 samples. - BlockSizeMax: 65535, // adjusted by encoder. - // Minimum frame size in bytes; a 0 value implies unknown. - //FrameSizeMin // set by encoder. - // Maximum frame size in bytes; a 0 value implies unknown. - //FrameSizeMax // set by encoder. - // Sample rate in Hz; between 1 and 655350 Hz. - SampleRate: uint32(sampleRate), - // Number of channels; between 1 and 8 channels. - NChannels: uint8(nchannels), - // Sample size in bits-per-sample; between 4 and 32 bits. - BitsPerSample: uint8(bps), - // Total number of inter-channel samples in the stream. One second of - // 44.1 KHz audio will have 44100 samples regardless of the number of - // channels. A 0 value implies unknown. - //NSamples // set by encoder. - // MD5 checksum of the unencoded audio data. - //MD5sum // set by encoder. - } - enc, err := flac.NewEncoder(w, info) - if err != nil { - return errors.WithStack(err) - } - defer enc.Close() - - // Encode samples. - if err := dec.FwdToPCM(); err != nil { - return errors.WithStack(err) - } - // Number of samples per channel and block. - const nsamplesPerChannel = 16 - nsamplesPerBlock := nchannels * nsamplesPerChannel - buf := &audio.IntBuffer{ - Format: &audio.Format{ - NumChannels: nchannels, - SampleRate: sampleRate, - }, - Data: make([]int, nsamplesPerBlock), - SourceBitDepth: bps, - } - - subframes := make([]*frame.Subframe, nchannels) - for i := range subframes { - subframe := &frame.Subframe{ - Samples: make([]int32, nsamplesPerChannel), - } - subframes[i] = subframe - } - for frameNum := 0; !dec.EOF(); frameNum++ { - fmt.Println("frame number:", frameNum) - // Decode WAV samples. - n, err := dec.PCMBuffer(buf) - if err != nil { - return errors.WithStack(err) - } - if n == 0 { - break - } - for _, subframe := range subframes { - subHdr := frame.SubHeader{ - // Specifies the prediction method used to encode the audio sample of the - // subframe. - Pred: frame.PredVerbatim, - // Prediction order used by fixed and FIR linear prediction decoding. - Order: 0, - // Wasted bits-per-sample. - Wasted: 0, - } - subframe.SubHeader = subHdr - subframe.NSamples = n / nchannels - subframe.Samples = subframe.Samples[:subframe.NSamples] - } - for i, sample := range buf.Data { - subframe := subframes[i%nchannels] - subframe.Samples[i/nchannels] = int32(sample) - } - // Check if the subframe may be encoded as constant; when all samples are - // the same. - for _, subframe := range subframes { - sample := subframe.Samples[0] - constant := true - for _, s := range subframe.Samples[1:] { - if sample != s { - constant = false - } - } - if constant { - fmt.Println("constant method") - subframe.SubHeader.Pred = frame.PredConstant - } - } - - // Encode FLAC frame. - channels, err := getChannels(nchannels) - if err != nil { - return errors.WithStack(err) - } - hdr := frame.Header{ - // Specifies if the block size is fixed or variable. - HasFixedBlockSize: false, - // Block size in inter-channel samples, i.e. the number of audio samples - // in each subframe. - BlockSize: uint16(nsamplesPerChannel), - // Sample rate in Hz; a 0 value implies unknown, get sample rate from - // StreamInfo. - SampleRate: uint32(sampleRate), - // Specifies the number of channels (subframes) that exist in the frame, - // their order and possible inter-channel decorrelation. - Channels: channels, - // Sample size in bits-per-sample; a 0 value implies unknown, get sample - // size from StreamInfo. - BitsPerSample: uint8(bps), - // Specifies the frame number if the block size is fixed, and the first - // sample number in the frame otherwise. When using fixed block size, the - // first sample number in the frame can be derived by multiplying the - // frame number with the block size (in samples). - //Num // set by encoder. - } - f := &frame.Frame{ - Header: hdr, - Subframes: subframes, - } - if err := enc.WriteFrame(f); err != nil { - return errors.WithStack(err) - } - } - return nil -} - -// getChannels returns the channels assignment matching the given number of -// channels. -func getChannels(nchannels int) (frame.Channels, error) { - switch nchannels { - case 1: - // 1 channel: mono. - return frame.ChannelsMono, nil - case 2: - // 2 channels: left, right. - return frame.ChannelsLR, nil - //return frame.ChannelsLeftSide, nil // 2 channels: left, side; using inter-channel decorrelation. - //return frame.ChannelsSideRight, nil // 2 channels: side, right; using inter-channel decorrelation. - //return frame.ChannelsMidSide, nil // 2 channels: mid, side; using inter-channel decorrelation. - case 3: - // 3 channels: left, right, center. - return frame.ChannelsLRC, nil - case 4: - // 4 channels: left, right, left surround, right surround. - return frame.ChannelsLRLsRs, nil - case 5: - // 5 channels: left, right, center, left surround, right surround. - return frame.ChannelsLRCLsRs, nil - case 6: - // 6 channels: left, right, center, LFE, left surround, right surround. - return frame.ChannelsLRCLfeLsRs, nil - case 7: - // 7 channels: left, right, center, LFE, center surround, side left, side right. - return frame.ChannelsLRCLfeCsSlSr, nil - case 8: - // 8 channels: left, right, center, LFE, left surround, right surround, side left, side right. - return frame.ChannelsLRCLfeLsRsSlSr, nil - default: - return 0, errors.Errorf("support for %d number of channels not yet implemented", nchannels) - } -} diff --git a/go.mod b/go.mod index 26aaba7..2986412 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,6 @@ module github.com/mewkiz/flac go 1.14 require ( - github.com/go-audio/audio v1.0.0 - github.com/go-audio/wav v1.1.0 github.com/icza/bitio v1.1.0 github.com/mewkiz/pkg v0.0.0-20230226050401-4010bf0fec14 - github.com/pkg/errors v0.9.1 ) diff --git a/go.sum b/go.sum index fec7a33..3653f5a 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,4 @@ github.com/d4l3k/messagediff v1.2.2-0.20190829033028-7e0a312ae40b/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= -github.com/go-audio/audio v1.0.0 h1:zS9vebldgbQqktK4H0lUqWrG8P0NxCJVqcj7ZpNnwd4= -github.com/go-audio/audio v1.0.0/go.mod h1:6uAu0+H2lHkwdGsAY+j2wHPNPpPoeg5AaEFh9FlA+Zs= -github.com/go-audio/riff v1.0.0 h1:d8iCGbDvox9BfLagY94fBynxSPHO80LmZCaOsmKxokA= -github.com/go-audio/riff v1.0.0/go.mod h1:l3cQwc85y79NQFCRB7TiPoNiaijp6q8Z0Uv38rVG498= -github.com/go-audio/wav v1.1.0 h1:jQgLtbqBzY7G+BM8fXF7AHUk1uHUviWS4X39d5rsL2g= -github.com/go-audio/wav v1.1.0/go.mod h1:mpe9qfwbScEbkd8uybLuIpTgHyrISw/OTuvjUW2iGtE= github.com/icza/bitio v1.1.0 h1:ysX4vtldjdi3Ygai5m1cWy4oLkhWTAi+SyO6HC8L9T0= github.com/icza/bitio v1.1.0/go.mod h1:0jGnlLAx8MKMr9VGnn/4YrvZiprkvBelsVIbA9Jjr9A= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= @@ -13,8 +7,6 @@ github.com/jszwec/csvutil v1.5.1/go.mod h1:Rpu7Uu9giO9subDyMCIQfHVDuLrcaC36UA4Yc github.com/mewkiz/pkg v0.0.0-20230226050401-4010bf0fec14 h1:tnAPMExbRERsyEYkmR1YjhTgDM0iqyiBYf8ojRXxdbA= github.com/mewkiz/pkg v0.0.0-20230226050401-4010bf0fec14/go.mod h1:QYCFBiH5q6XTHEbWhR0uhR3M9qNPoD2CSQzr0g75kE4= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=