app/util/UploadBuilder.scala (55 lines of code) (raw):
package util
import java.time.Instant
import com.gu.media.aws.{AwsAccess, UploadAccess}
import com.gu.media.model.{MediaAtom, PlutoSyncMetadataMessage, SelfHostedAsset, VideoSource}
import com.gu.media.upload.{TranscoderOutputKey, UploadPartKey}
import com.gu.media.upload.model._
import model.commands.CommandExceptions.AtomMissingYouTubeChannel
object UploadBuilder {
def build(atom: MediaAtom, email: String, version: Long, request: UploadRequest, aws: AwsAccess with UploadAccess): Upload = {
val id = s"${atom.id}-$version"
val plutoData = PlutoSyncMetadataMessage.build(id, atom, aws, email)
val metadata = UploadMetadata(
user = email,
bucket = aws.userUploadBucket,
region = aws.region.getName,
title = atom.title,
pluto = plutoData,
selfHost = request.selfHost,
runtime = getRuntimeMetadata(request.selfHost, atom.channelId),
asset = getAsset(request.selfHost, atom.title, id),
originalFilename = Some(request.filename),
version = Some(version),
startTimestamp = Some(Instant.now().toEpochMilli)
)
val progress = UploadProgress(
chunksInS3 = 0,
chunksInYouTube = 0,
fullyUploaded = false,
fullyTranscoded = false,
retries = 0
)
val parts = chunk(id, request.size, aws)
Upload(id, parts, metadata, progress)
}
private def getAsset(selfHosted: Boolean, title: String, id: String): Option[SelfHostedAsset] = {
if(!selfHosted) {
// YouTube assets are added after they have been uploaded (once we know the ID)
None
} else {
val mp4Key = TranscoderOutputKey(title, id, "mp4").toString
val mp4Source = VideoSource(mp4Key, "video/mp4")
Some(SelfHostedAsset(List(mp4Source)))
}
}
private def getRuntimeMetadata(selfHosted: Boolean, atomChannel: Option[String]) = atomChannel match {
case _ if selfHosted => SelfHostedUploadMetadata(List.empty)
case Some(channel) => YouTubeUploadMetadata(channel, uri = None)
case None => AtomMissingYouTubeChannel
}
private def chunk(uploadId: String, size: Long, aws: UploadAccess): List[UploadPart] = {
val boundaries = Upload.calculateChunks(size)
boundaries.zipWithIndex.map { case ((start, end), id) =>
UploadPart(UploadPartKey(aws.userUploadFolder, uploadId, id).toString, start, end)
}
}
}