Script personalizado

Visão geral

O gerenciador de processamento em lote permite que você personalize um Fluxo de trabalho adicionando a ferramenta Script shell do usuário para executar um script para processar suas imagens com ferramentas externas, como ImageMagick ou ExifTool.

A ferramenta Script shell do usuário está disponível na categoria Ferramentas personalizadas da lista Ferramentas base. A ferramenta foi projetada para executar o código-fonte de um script de shell que pode chamar um ou mais programas de linha de comando para cada item na fila. O script de shell é escrito pelo usuário inteiramente dentro do plugin. Esses scripts podem incluir um conjunto de variáveis ​​de ambiente que especificam nomes de arquivos e alguns tipos de metadados.

O gerenciador de processamento em lote incluindo um script personalizado em um fluxo de trabalho

A ferramenta oferece estas opções:

  • Tipo de arquivo de saída: especifica o formato de imagem esperado na saída do seu script. O padrão é Igual à entrada, mas você pode definir JPEG, PNG, TIFF, dentre outros. Observe que JPEG é um formato de compactação com perdas, suporta apenas profundidade de cor de 8 bits e não oferece suporte a transparência.

  • Shell script: este campo de texto é onde você insere o código-fonte do seu script de shell. Script Bash é suportado no Linux e macOS. Script Batch é suportado no Windows.

As palavras-chave que você pode usar no código do seu script estão listadas abaixo. A ferramenta substituirá todas as ocorrências de palavras-chave no script de shell em tempo de execução, antes da execução do script. Observe que as palavras-chave diferenciam maiúsculas de minúsculas.

  • $INPUT é substituído pelo nome do arquivo de entrada do fluxo de trabalho (com caracteres especiais escapados).

  • $OUTPUT é substituído pelo nome do arquivo de saída do fluxo de trabalho (com caracteres especiais escapados).

Importante

Um novo arquivo é sempre esperado em $OUTPUT. Programas de script que não criam um novo arquivo (por exemplo, alterando metadados com o ExifTool) devem primeiro copiar $INPUT para $OUTPUT com o comando apropriado para o sistema operacional, antes de fazer qualquer alteração em $OUTPUT.

As variáveis ​​de ambiente que você pode usar no seu script de shell são:

  • TITLE: para usar a propriedade Título do item do digiKam.

  • COMMENTS: para usar a propriedade Descrição do item do digiKam.

  • COLORLABEL: para usar a propriedade Rótulo de cor do item do digiKam.

  • PICKLABEL: para usar a propriedade Rótulo de seleção do item do digiKam.

  • RATING: para usar a propriedade Classificação do item do digiKam.

  • TAGSPATH: para usar a propriedade Etiquetas do item do digiKam.

Todas essas propriedades são definidas com base nas propriedades da imagem armazenadas no banco de dados do digiKam.

Nota

No Linux e no macOS, as variáveis ​​de ambiente podem ser acessadas no script com $ como prefixo para nomes de variáveis ​​(por exemplo, $INPUT). O interpretador usado para executar o script é o /bin/bash.

No Windows, as variáveis ​​de ambiente podem ser acessadas no script com % como prefixo e sufixo dos nomes das variáveis ​​(por exemplo, %INPUT%). O interpretador usado para executar o script é o cmd.exe.

Valor devolvido

Por convenção, um script Bash no Linux e macOS retorna 0 em caso de sucesso ou um inteiro no intervalo de 1 a 255 em caso de erro. Use exit < código_de_erro > para passar o valor de retorno de volta para o fluxo de trabalho.

No Windows, um script Batch retorna 0 em caso de sucesso e outro valor em caso de erro, mas o valor é um inteiro com sinal, portanto, um valor negativo é possível. Use EXIT /B < código_de_erro > para passar o valor de retorno para o fluxo de trabalho.

O gerenciador de processamento em lote processa o valor retornado pelo seu script. Se zero for retornado, o fluxo de trabalho continuará conforme o esperado. Caso contrário, o fluxo de trabalho será interrompido e o gerenciador de processamento em lote interromperá o processamento.

Exemplos

Prova de conceito

O primeiro exemplo mostrado abaixo não faz nada de especial. Ele imprime no console os nomes dos arquivos de entrada/saída e as propriedades dos itens passados ​​do gerenciador de processamento em lote para o script e copia o arquivo de entrada para o arquivo de saída (esta etapa é necessária para evitar que o gerenciador de processamento em lote retorne um erro porque o arquivo de destino não existe). O script retorna o valor do comando de cópia de arquivo, que é analisado pelo gerenciador de processamento em lote para cada item no fluxo de trabalho. Veja abaixo a versão Bash do script:

echo "INPUT FILE: $INPUT"
echo "OUTPUT FILE: $OUTPUT"

echo "TITLE: $TITLE"
echo "COMMENT: $COMMENT"
echo "COLORLABEL: $COLORLABEL"
echo "PICKLABEL: $PICKLABEL"
echo "RATING: $RATING"
echo "TAGSPATH: $TAGSPATH"

cp $INPUT $OUTPUT
exit $?

Veja abaixo a versão do script para o Windows Shell. A saída é redirecionada e concatenada para o arquivo C:tempdigikam.txt:

set infile=$INPUT
set outfile=$OUTPUT

echo INPUT FILE: %infile%  >>C:\temp\digikam.txt
echo OUTPUT FILE:  %outfile% >>C:\temp\digikam.txt

echo TITLE: %TITLE%  >>C:\temp\digikam.txt
echo COMMENT: %COMMENT%  >>C:\temp\digikam.txt
echo COLORLABEL: %COLORLABEL%  >>C:\temp\digikam.txt
echo PICKLABEL: %PICKLABEL% >>C:\temp\digikam.txt
echo RATING: %RATING% >>C:\temp\digikam.txt
echo TAGSPATH: %TAGSPATH% >>C:\temp\digikam.txt

copy %infile% %outfile%

Se você iniciou o digiKam em um terminal e habilitou os rastreamentos de depuração na página de diálogo Configurações/Diversos/Sistema, verá algo assim:

digikam.general: Action Thread run  1  new jobs
digikam.general: Tool : index=  1  :: name=  "UserScript"  :: group=  Digikam::BatchTool::CustomTool  :: wurl=  QUrl("file:///mnt/data/Images/SALAGOU")
digikam.general: path:  "/mnt/data/Images/SALAGOU/BatchTool-EpEjEz-9e1c7a12.digikamtempfile.JPG"
digikam.general: Tool:        "User Shell Script"
digikam.general: Input url:   QUrl("file:///mnt/data/Images/SALAGOU/DSC08833.JPG")
digikam.general: Output url:  QUrl("file:///mnt/data/Images/SALAGOU/BatchTool-EpEjEz-9e1c7a12.digikamtempfile.JPG")
digikam.dplugin.bqm: Script stdout "INPUT FILE: /mnt/data/Images/SALAGOU/DSC08833.JPG\nOUTPUT FILE: /mnt/data/Images/SALAGOU/BatchTool-EpEjEz-9e1c7a12.digikamtempfile.JPG\nTITLE: Salagou Trip\nCOMMENT: \nCOLORLABEL: 5\nPICKLABEL: 3\nRATING: 3\nTAGSPATH: Places;Places/France;Places/France/Salagou Lake\n"
digikam.dplugin.bqm: Script stderr ""
digikam.dplugin.bqm: Script exit code: 0

As informações do digiKam retiradas do banco de dados são:

  • O item processado é /mnt/data/Images/SALAGOU/DSC08833.JPG.

  • O nome do arquivo de destino é /mnt/data/Images/SALAGOU/BatchTool-EpEjEz-9e1c7a12.digikamtempfile.JPG (um arquivo temporário gerado pelo gerenciador de processamento em lote).

  • O título do item é Salagou Trip.

  • O comentário do item é nulo.

  • O rótulo de cor do item é 5 (Verde).

  • O rótulo de seleção do item é 3 (Aceito).

  • A classificação do item é 3 estrelas.

  • As etiquetas do item são Places, Places/France, Places/France/Salagou Lake.

Adicionar uma marca d’água com o ImageMagick

O segundo exemplo abaixo é mais complexo e usa a ferramenta de linha de comando ImageMagick para adicionar marcas d’água visíveis sobrepondo um campo de texto multilinha sobre cada imagem na fila.

watermark="This image is\ncopyrighted and\navailable with\nlimited usage"

in_file="$INPUT"
out_file="$OUTPUT"

convert -size 2000x1000 xc:none -gravity center \
    -stroke yellow -pointsize 120 -font Courier-BoldOblique \
    -strokewidth 3 -annotate +100+100 "${watermark}" \
    -blur 0x25 -level 0%,50% \
    -fill white -stroke none -annotate +100+100 "${watermark}" \
    "${in_file}"  +swap -gravity center -geometry +0-3 \
    -composite  "${out_file}"

Nota

Neste exemplo, não há uma chamada explícita de exit para retornar um valor ao fluxo de trabalho. O Bash usa o último método chamado como o valor retornado do script, neste caso, a ferramenta de linha de comando convert do ImageMagick.

Isso dá um resultado como o abaixo.

O resultado do script usando o ImageMagick para aplicar uma marca d’água