transcodelauncher/copier.go (76 lines of code) (raw):

package main import ( "context" "errors" "fmt" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go" "log" "regexp" ) type Copier struct { awsConfig aws.Config client *s3.Client } func NewCopier(config aws.Config) *Copier { client := s3.NewFromConfig(config) return &Copier{awsConfig: config, client: client} } func (c *Copier) DoCopy(ctx context.Context, sourceBucket string, sourceKey string, destBucket string, destKey string, public bool) error { headReq := &s3.HeadObjectInput{ Bucket: aws.String(sourceBucket), Key: aws.String(sourceKey), } headResponse, err := c.client.HeadObject(ctx, headReq) if err != nil { return err } acl := types.ObjectCannedACLPrivate if public { acl = types.ObjectCannedACLPublicRead } log.Printf("Copying from s3://%s/%s to s3://%s/%s with %s ACL", sourceBucket, sourceKey, destBucket, destKey, acl) copyReq := &s3.CopyObjectInput{ Bucket: aws.String(destBucket), CopySource: aws.String(fmt.Sprintf("%s/%s", sourceBucket, sourceKey)), Key: aws.String(destKey), ACL: acl, ContentType: headResponse.ContentType, } _, err = c.client.CopyObject(ctx, copyReq) if err != nil { return err } return nil } func (c *Copier) DoCopyDestspec(ctx context.Context, sourceBucket string, sourceKey string, destSpec string, public bool) error { splitter := regexp.MustCompile("([^:]+):/*(.*)") parts := splitter.FindAllStringSubmatch(destSpec, -1) if parts == nil { return errors.New(fmt.Sprintf("destSpec %s is malformed", destSpec)) } return c.DoCopy(ctx, sourceBucket, sourceKey, parts[0][1], parts[0][2], public) } func (c *Copier) DoesFileExist(ctx context.Context, bucket string, key string) (bool, error) { req := &s3.HeadObjectInput{ Bucket: aws.String(bucket), Key: aws.String(key), } log.Printf("Checking for existence of s3://%s/%s", bucket, key) _, err := c.client.HeadObject(ctx, req) if err != nil { var ae smithy.APIError if errors.As(err, &ae) { if ae.ErrorCode() == "NotFound" { return false, nil } else { log.Printf("ERROR Could not check file s3://%s/%s %s %s", bucket, key, ae.ErrorCode(), ae.ErrorMessage()) return false, err } } return false, err } return true, nil }