Create tasks to generate all previews

There is a task to generate preview images per attachment. It can
either add them (if not present yet) or overwrite them (e.g. some
config has changed).

There is a task that selects all attachments without previews and
submits a task to create it. This is submitted on start automatically
to generate previews for all existing attachments.
This commit is contained in:
Eike Kettner
2020-11-08 23:46:02 +01:00
parent eede194352
commit 709848244c
9 changed files with 299 additions and 9 deletions

View File

@ -0,0 +1,26 @@
package docspell.common
import io.circe.generic.semiauto._
import io.circe.{Decoder, Encoder}
/** Arguments for the `AllPreviewsTask` that submits tasks to
* generates a preview image for attachments.
*
* It can replace the current preview image or only generate one, if
* it is missing. If no collective is specified, it considers all
* attachments.
*/
case class AllPreviewsArgs(
collective: Option[Ident],
storeMode: MakePreviewArgs.StoreMode
)
object AllPreviewsArgs {
val taskName = Ident.unsafe("all-previews")
implicit val jsonEncoder: Encoder[AllPreviewsArgs] =
deriveEncoder[AllPreviewsArgs]
implicit val jsonDecoder: Decoder[AllPreviewsArgs] =
deriveDecoder[AllPreviewsArgs]
}

View File

@ -2,8 +2,8 @@ package docspell.common
object DocspellSystem {
val user = Ident.unsafe("docspell-system")
val taskGroup = user
val migrationTaskTracker = Ident.unsafe("full-text-index-tracker")
val user = Ident.unsafe("docspell-system")
val taskGroup = user
val migrationTaskTracker = Ident.unsafe("full-text-index-tracker")
val allPreviewTaskTracker = Ident.unsafe("generate-all-previews")
}

View File

@ -0,0 +1,53 @@
package docspell.common
import io.circe.generic.semiauto._
import io.circe.{Decoder, Encoder}
/** Arguments for the `MakePreviewTask` that generates a preview image
* for an attachment.
*
* It can replace the current preview image or only generate one, if
* it is missing.
*/
case class MakePreviewArgs(
attachment: Ident,
store: MakePreviewArgs.StoreMode
)
object MakePreviewArgs {
val taskName = Ident.unsafe("make-preview")
sealed trait StoreMode extends Product {
final def name: String =
productPrefix.toLowerCase()
}
object StoreMode {
/** Replace any preview file that may already exist. */
case object Replace extends StoreMode
/** Only create a preview image, if it is missing. */
case object WhenMissing extends StoreMode
def fromString(str: String): Either[String, StoreMode] =
Option(str).map(_.trim.toLowerCase()) match {
case Some("replace") => Right(Replace)
case Some("whenmissing") => Right(WhenMissing)
case _ => Left(s"Invalid store mode: $str")
}
implicit val jsonEncoder: Encoder[StoreMode] =
Encoder.encodeString.contramap(_.name)
implicit val jsonDecoder: Decoder[StoreMode] =
Decoder.decodeString.emap(fromString)
}
implicit val jsonEncoder: Encoder[MakePreviewArgs] =
deriveEncoder[MakePreviewArgs]
implicit val jsonDecoder: Decoder[MakePreviewArgs] =
deriveDecoder[MakePreviewArgs]
}