070287716b
get rid of stupid stuff simplify S3 configuration split wallets from blockchain.db and use separate S3 store fix bugs
126 lines
2.8 KiB
Go
126 lines
2.8 KiB
Go
package thumbs
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/lbryio/ytsync/v5/configs"
|
|
"github.com/lbryio/ytsync/v5/downloader/ytdl"
|
|
|
|
"github.com/lbryio/lbry.go/v2/extras/errors"
|
|
|
|
"github.com/aws/aws-sdk-go/aws"
|
|
"github.com/aws/aws-sdk-go/aws/session"
|
|
"github.com/aws/aws-sdk-go/service/s3/s3manager"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type thumbnailUploader struct {
|
|
name string
|
|
originalUrl string
|
|
mirroredUrl string
|
|
s3Config aws.Config
|
|
}
|
|
|
|
const thumbnailPath = "/tmp/ytsync_thumbnails/"
|
|
const ThumbnailEndpoint = "https://thumbnails.lbry.com/"
|
|
|
|
func (u *thumbnailUploader) downloadThumbnail() error {
|
|
_ = os.Mkdir(thumbnailPath, 0777)
|
|
img, err := os.Create("/tmp/ytsync_thumbnails/" + u.name)
|
|
if err != nil {
|
|
return errors.Err(err)
|
|
}
|
|
defer img.Close()
|
|
if strings.HasPrefix(u.originalUrl, "//") {
|
|
u.originalUrl = "https:" + u.originalUrl
|
|
}
|
|
resp, err := http.Get(u.originalUrl)
|
|
if err != nil {
|
|
return errors.Err(err)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
_, err = io.Copy(img, resp.Body)
|
|
if err != nil {
|
|
return errors.Err(err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (u *thumbnailUploader) uploadThumbnail() error {
|
|
key := &u.name
|
|
thumb, err := os.Open("/tmp/ytsync_thumbnails/" + u.name)
|
|
if err != nil {
|
|
return errors.Err(err)
|
|
}
|
|
defer thumb.Close()
|
|
|
|
s3Session, err := session.NewSession(&u.s3Config)
|
|
if err != nil {
|
|
return errors.Err(err)
|
|
}
|
|
|
|
uploader := s3manager.NewUploader(s3Session)
|
|
|
|
_, err = uploader.Upload(&s3manager.UploadInput{
|
|
Bucket: aws.String("thumbnails.lbry.com"),
|
|
Key: key,
|
|
Body: thumb,
|
|
ACL: aws.String("public-read"),
|
|
ContentType: aws.String("image/jpeg"),
|
|
CacheControl: aws.String("public, max-age=2592000"),
|
|
})
|
|
|
|
u.mirroredUrl = ThumbnailEndpoint + u.name
|
|
return errors.Err(err)
|
|
}
|
|
|
|
func (u *thumbnailUploader) deleteTmpFile() {
|
|
err := os.Remove("/tmp/ytsync_thumbnails/" + u.name)
|
|
if err != nil {
|
|
log.Infof("failed to delete local thumbnail file: %s", err.Error())
|
|
}
|
|
}
|
|
func MirrorThumbnail(url string, name string) (string, error) {
|
|
tu := thumbnailUploader{
|
|
originalUrl: url,
|
|
name: name,
|
|
s3Config: *configs.Configuration.AWSThumbnailsS3Config.GetS3AWSConfig(),
|
|
}
|
|
err := tu.downloadThumbnail()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer tu.deleteTmpFile()
|
|
|
|
err = tu.uploadThumbnail()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
//this is our own S3 storage
|
|
tu2 := thumbnailUploader{
|
|
originalUrl: url,
|
|
name: name,
|
|
s3Config: *configs.Configuration.ThumbnailsS3Config.GetS3AWSConfig(),
|
|
}
|
|
err = tu2.uploadThumbnail()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return tu.mirroredUrl, nil
|
|
}
|
|
|
|
func GetBestThumbnail(thumbnails []ytdl.Thumbnail) *ytdl.Thumbnail {
|
|
var bestWidth ytdl.Thumbnail
|
|
for _, thumbnail := range thumbnails {
|
|
if bestWidth.Width < thumbnail.Width {
|
|
bestWidth = thumbnail
|
|
}
|
|
}
|
|
return &bestWidth
|
|
}
|