Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
package main
import (
"bytes"
"compress/gzip"
"fmt"
"io"
"log"
"os"
)
type chapter struct {
begin int64
end int64
}
func main() {
log.Printf("opening %s", os.Args[1])
indata, err := os.ReadFile(os.Args[1])
if err != nil {
log.Fatal(err)
}
bio := bytes.NewReader(indata)
gzi, err := gzip.NewReader(bio)
if err != nil {
log.Fatal(err)
}
i := 0
chapters := []chapter{}
for {
gzi.Multistream(false)
pos, err := bio.Seek(0, os.SEEK_CUR)
if err != nil {
log.Fatal(err)
}
chapter := chapter{
begin: pos - 10,
end: int64(bio.Len()),
}
log.Printf("new stream! id=%d @%d", i, pos)
if i > 0 {
chapters[i - 1].end = pos - 10
}
chapters = append(chapters, chapter)
outF, err := os.Create(fmt.Sprintf("stream-%d.tar", i))
if err != nil {
log.Fatal(err)
return
}
defer outF.Close()
if _, err := io.Copy(outF, gzi); err != nil {
log.Printf("error while copying:")
log.Fatal(err)
}
i++
err = gzi.Reset(bio)
if err == io.EOF {
break
}
if err != nil {
log.Printf("error while resetting:")
log.Fatal(err)
}
}
if err := gzi.Close(); err != nil {
log.Fatal(err)
}
for i, chapter := range chapters {
log.Printf("chapter %d, begin: %d, end: %d", i, chapter.begin, chapter.end)
outF, err := os.Create(fmt.Sprintf("stream-%d.tar.gz", i))
if err != nil {
log.Fatal(err)
}
defer outF.Close()
outF.Write(indata[chapter.begin:chapter.end])
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment