Compare commits

..

No commits in common. "master" and "2021-07-02" have entirely different histories.

2 changed files with 7 additions and 18 deletions

View File

@ -2,19 +2,7 @@
A program that extracts the individual tracks from an Ogg/Vorbis or mp3 radio stream. Written in go without any non-standard dependencies. A program that extracts the individual tracks from an Ogg/Vorbis or mp3 radio stream. Written in go without any non-standard dependencies.
## Obtaining the binary ## Building
### Via [releases](https://git.nobrain.org/r4/radio-stream-recorder/releases/latest)
- Download the binary for your system from https://git.nobrain.org/r4/radio-stream-recorder/releases/latest
- (__*nix only__) Make executable `chmod +x <EXECUTABLE PATH>`
- That should be it, just open a terminal and run it; see usage
### From source
- Clone the git repo and cd into it
- Install [go](https://golang.org/) (preferably a recent version) - Install [go](https://golang.org/) (preferably a recent version)

View File

@ -38,8 +38,8 @@ func NewExtractor(respHdr http.Header) (*Extractor, error) {
func (d *Extractor) ReadBlock(r io.Reader, w io.Writer) (isFirst bool, err error) { func (d *Extractor) ReadBlock(r io.Reader, w io.Writer) (isFirst bool, err error) {
var musicData bytes.Buffer var musicData bytes.Buffer
// We want to write everything except the metadata to the output and to // We want to write everything to the output, as well as musicData for
// musicData for calculating the checksum. // calculating the checksum.
multi := io.MultiWriter(w, &musicData) multi := io.MultiWriter(w, &musicData)
// Read until the metadata chunk. The part that is read here is also what // Read until the metadata chunk. The part that is read here is also what
@ -57,8 +57,8 @@ func (d *Extractor) ReadBlock(r io.Reader, w io.Writer) (isFirst bool, err error
// Read metadata blocks. // Read metadata blocks.
if numBlocks > 0 { if numBlocks > 0 {
// Metadata is only actually stored in the first metadata chunk // Metadata is only actually stored in the first metadata chunk
// of a given file. Therefore, every metadata chunk with more than 0 // of a given file. Therefore, every metadata chunk with more than 1
// blocks always marks the beginning of a file. // block always marks the beginning of a file.
isBOF = true isBOF = true
// Each block is 16 bytes in size. Any excess bytes in the last block // Each block is 16 bytes in size. Any excess bytes in the last block
@ -84,7 +84,8 @@ func (d *Extractor) ReadBlock(r io.Reader, w io.Writer) (isFirst bool, err error
t = t[1 : len(t)-1] t = t[1 : len(t)-1]
if t == "Unknown" { if t == "Unknown" {
// If there is no stream title, use format: // If there is no stream title, use format:
// Unknown_<crc32 checksum of first block> // Unknown_<crc32 checksum>
// Where the checksum is only that of the first block.
sumStr := strconv.FormatInt(int64(crc32.ChecksumIEEE(musicData.Bytes())), 10) sumStr := strconv.FormatInt(int64(crc32.ChecksumIEEE(musicData.Bytes())), 10)
d.streamTitle = "Unknown_" + sumStr d.streamTitle = "Unknown_" + sumStr
} else { } else {