Streamline extern-conv stdin/infile

This commit is contained in:
Eike Kettner
2020-02-18 12:43:47 +01:00
parent 0dcc00836b
commit 5869e2ee6e
6 changed files with 68 additions and 93 deletions

View File

@ -13,50 +13,28 @@ object ExternConv {
cmdCfg: SystemCommand.Config,
wd: Path,
chunkSize: Int,
useStdin: Boolean,
blocker: Blocker,
logger: Logger[F]
): Pipe[F, Byte, Byte] =
in =>
Stream.resource(File.withTempDir[F](wd, s"docspell-$name")).flatMap { dir =>
val out = dir.resolve("out.pdf")
val inFile = dir.resolve("infile").toAbsolutePath.normalize
val out = dir.resolve("out.pdf").toAbsolutePath.normalize
val sysCfg =
cmdCfg.mapArgs(_.replace("{{outfile}}", out.toAbsolutePath.normalize.toString))
SystemCommand
.execSuccess[F](sysCfg, blocker, logger, Some(dir), in)
.flatMap(result =>
logResult(name, result, logger) ++ readResult[F](
out,
result,
blocker,
chunkSize,
logger
)
)
}
def toPDFviaFile[F[_]: Sync: ContextShift](
name: String,
cmdCfg: SystemCommand.Config,
wd: Path,
chunkSize: Int,
blocker: Blocker,
logger: Logger[F]
): Pipe[F, Byte, Byte] =
in =>
Stream.resource(File.withTempDir[F](wd, s"docspell-$name")).flatMap { dir =>
val inFile = dir.resolve("infile")
val out = dir.resolve("out.pdf")
val sysCfg =
cmdCfg.mapArgs(
_.replace("{{outfile}}", out.toAbsolutePath.normalize.toString)
.replace("{{infile}}", inFile.toAbsolutePath.normalize.toString)
cmdCfg.replace(
Map("{{outfile}}" -> out.toString) ++
(if (!useStdin) Map("{{infile}}" -> inFile.toString)
else Map.empty)
)
(Stream.eval(logger.debug(s"Storing input to file ${inFile} for running $name")).drain ++
Stream.eval(storeFile(in, inFile, blocker))).flatMap { _ =>
val createInput: Pipe[F, Byte, Unit] =
if (useStdin) _ => Stream.emit(())
else storeDataToFile(name, blocker, logger, inFile)
in.through(createInput).flatMap { _ =>
SystemCommand
.execSuccess[F](sysCfg, blocker, logger, Some(dir))
.execSuccess[F](sysCfg, blocker, logger, Some(dir), if (useStdin) in else Stream.empty)
.flatMap(result =>
logResult(name, result, logger) ++ readResult[F](
out,
@ -69,7 +47,7 @@ object ExternConv {
}
}
private def readResult[F[_]: Sync: ContextShift](
def readResult[F[_]: Sync: ContextShift](
out: Path,
result: SystemCommand.Result,
blocker: Blocker,
@ -91,6 +69,11 @@ object ExternConv {
)
}
private def storeDataToFile[F[_]: Sync: ContextShift](name: String, blocker: Blocker, logger: Logger[F], inFile: Path): Pipe[F, Byte, Unit] =
in =>
Stream.eval(logger.debug(s"Storing input to file ${inFile} for running $name")).drain ++
Stream.eval(storeFile(in, inFile, blocker))
private def logResult[F[_]: Sync](
name: String,
result: SystemCommand.Result,

View File

@ -0,0 +1,5 @@
package docspell.convert.extern
object Tesseract {
}

View File

@ -12,7 +12,7 @@ object Unoconv {
blocker: Blocker,
logger: Logger[F],
): Pipe[F, Byte, Byte] =
ExternConv.toPDFviaFile[F]("unoconv", cfg.cmd, cfg.workingDir, chunkSize, blocker, logger)
ExternConv.toPDF[F]("unoconv", cfg.cmd, cfg.workingDir, chunkSize, false, blocker, logger)
}

View File

@ -12,7 +12,7 @@ object WkHtmlPdf {
blocker: Blocker,
logger: Logger[F],
): Pipe[F, Byte, Byte] =
ExternConv.toPDF[F]("wkhtmltopdf", cfg.cmd, cfg.workingDir, chunkSize, blocker, logger)
ExternConv.toPDF[F]("wkhtmltopdf", cfg.cmd, cfg.workingDir, chunkSize, true, blocker, logger)
}