in common/src/main/scala/com/theguardian/multimedia/archivehunter/common/ProxyLocation.scala [77:119]
def fromS3(proxyBucket: String, key: String, mainMediaBucket: String, mediaItemKey:String, proxyType:Option[ProxyType.Value] = None, region:Region)(implicit client:S3Client):Future[Either[String, ProxyLocation]] = Future {
try {
logger.debug(s"Looking up proxy location for s3://$proxyBucket/$key")
val meta = client.headObject(HeadObjectRequest.builder().bucket(proxyBucket).key(key).build())
val mimeType = Option(meta.contentType()) match {
case Some(mimeTypeString) =>
MimeType.fromString(mimeTypeString) match {
case Right(mt) => mt
case Left(error) =>
logger.warn(error)
MimeType("application", "octet-stream")
}
case None =>
logger.warn(s"received no content type from S3 for s3://$proxyBucket/$key")
MimeType("application", "octet-stream")
}
val pt = proxyType match {
case None =>
proxyTypeForMime(mimeType) match {
case Success(pt) => pt
case Failure(err) =>
logger.error(s"Could not determine proxy type for s3://$proxyBucket/$key: ${err.toString}")
if(key.endsWith(".mp4")) { //go through the obvious file extensions, as a fallback
ProxyType.VIDEO
} else if(key.endsWith(".mp3")) {
ProxyType.AUDIO
} else if(key.endsWith(".jpg") || key.endsWith(".jpeg")) {
ProxyType.THUMBNAIL
} else {
ProxyType.UNKNOWN
}
}
case Some(value) => value
}
logger.debug(s"doc ID is ${makeDocId(mainMediaBucket, mediaItemKey)} from $mainMediaBucket and $key")
Right(new ProxyLocation(makeDocId(mainMediaBucket, mediaItemKey), makeDocId(proxyBucket, key), pt, proxyBucket, key, Some(region.toString), StorageClass.safeWithName(meta.storageClassAsString())))
} catch {
case ex:Throwable=>
logger.error("could not find proxyLocation in s3: ", ex)
Left(ex.toString)
}
}