voidwalker/blobsdownloader/tcp.go
2023-05-30 18:17:46 +02:00

71 lines
1.6 KiB
Go

package blobsdownloader
import (
"encoding/hex"
"os"
"time"
"voidwalker/configs"
"github.com/lbryio/lbry.go/v2/extras/errors"
"github.com/lbryio/lbry.go/v2/stream"
"github.com/lbryio/reflector.go/server/peer"
"github.com/lbryio/reflector.go/store"
)
func DownloadBlob(hash string, save bool, blobsDir string) (*stream.Blob, error) {
bStore := GetBlobStore()
blob, _, err := bStore.Get(hash)
if err != nil {
err = errors.Prefix(hash, err)
return nil, errors.Err(err)
}
if save {
err = os.MkdirAll(blobsDir, os.ModePerm)
if err != nil {
return nil, errors.Err(err)
}
err = os.WriteFile(blobsDir+hash, blob, 0644)
if err != nil {
return nil, errors.Err(err)
}
}
return &blob, nil
}
// GetBlobStore returns default pre-configured blob store.
func GetBlobStore() store.BlobStore {
return peer.NewStore(peer.StoreOpts{
Address: configs.Configuration.ReflectorServer,
Timeout: 30 * time.Second,
})
}
// downloads a stream and returns the speed in bytes per second
func DownloadStream(blob *stream.SDBlob, blobsDir string) error {
hashes := GetStreamHashes(blob)
for _, hash := range hashes {
_, err := os.Stat(blobsDir + hash)
if os.IsNotExist(err) {
_, err := DownloadBlob(hash, true, blobsDir)
if err != nil {
return err
}
} else if err != nil {
return errors.Err(err)
}
}
return nil
}
func GetStreamHashes(blob *stream.SDBlob) []string {
blobs := make([]string, 0, len(blob.BlobInfos))
for _, b := range blob.BlobInfos {
hash := hex.EncodeToString(b.BlobHash)
if hash == "" {
continue
}
blobs = append(blobs, hex.EncodeToString(b.BlobHash))
}
return blobs
}