Update methods to be refactored into util package to be used in many locations. Add end to end test of ytsync for CI
111 lines
2.4 KiB
Go
111 lines
2.4 KiB
Go
package thumbs
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
|
|
"github.com/lbryio/errors.go"
|
|
|
|
"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"
|
|
"google.golang.org/api/youtube/v3"
|
|
)
|
|
|
|
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, 0750)
|
|
img, err := os.Create("/tmp/ytsync_thumbnails/" + u.name)
|
|
if err != nil {
|
|
return errors.Err(err)
|
|
}
|
|
defer img.Close()
|
|
|
|
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"),
|
|
})
|
|
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, s3Config aws.Config) (string, error) {
|
|
tu := thumbnailUploader{
|
|
originalUrl: url,
|
|
name: name,
|
|
s3Config: s3Config,
|
|
}
|
|
err := tu.downloadThumbnail()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer tu.deleteTmpFile()
|
|
|
|
err = tu.uploadThumbnail()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return tu.mirroredUrl, nil
|
|
}
|
|
|
|
func GetBestThumbnail(thumbnails *youtube.ThumbnailDetails) *youtube.Thumbnail {
|
|
if thumbnails.Maxres != nil {
|
|
return thumbnails.Maxres
|
|
} else if thumbnails.High != nil {
|
|
return thumbnails.High
|
|
} else if thumbnails.Medium != nil {
|
|
return thumbnails.Medium
|
|
} else if thumbnails.Standard != nil {
|
|
return thumbnails.Standard
|
|
}
|
|
return thumbnails.Default
|
|
}
|