Created by
Mateusz Kubuszok
| package io.skillhouse.files.streams
import akka.http.scaladsl.model.MediaType
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{ Sink, Source }
import akka.util.ByteString
import io.skillhouse.Predef._
import monix.execution.Scheduler
import org.apache.tika.Tika
import scala.concurrent.Future
class MimeTypeDetector(implicit materializer: ActorMaterializer, scheduler: Scheduler) {
private val tika = new Tika
private val minimumDetectionSize = 64 * 1024
def detect(source: Source[ByteString, Any]): Future[MediaType.Binary] = source
.take(minimumDetectionSize)
.runWith(Sink.head)
.map(binaryMediaTypeFor)
@SuppressWarnings(Array("org.wartremover.warts.AsInstanceOf"))
private def binaryMediaTypeFor(prefix: ByteString): MediaType.Binary =
MediaType.custom(tika.detect(prefix.toArray), binary = true).asInstanceOf[MediaType.Binary]
}
|