Snippets

Mateusz Kubuszok rkkkaX: Untitled snippet

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

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.