def fromS3()

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)
    }
  }