mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-21 18:08:25 +00:00
Streamline extern-conv stdin/infile
This commit is contained in:
@ -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,
|
||||
|
5
modules/convert/src/main/scala/docspell/convert/extern/Tesseract.scala
vendored
Normal file
5
modules/convert/src/main/scala/docspell/convert/extern/Tesseract.scala
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
package docspell.convert.extern
|
||||
|
||||
object Tesseract {
|
||||
|
||||
}
|
@ -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)
|
||||
|
||||
|
||||
}
|
||||
|
@ -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)
|
||||
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user