Captura de código automatizada

3

Eu estou fazendo um projeto, onde precisamos de um vídeo do script python sendo escrito no editor. Temos mais de 100 scripts, por isso precisamos de automação. Existe um programa, em que a entrada é o seu script python e saída é um vídeo que escreve charactet código por caractere em um editor.

    
por dibil08 15.04.2018 / 11:31

1 resposta

3

Embora eu deva dizer que esse "requisito" soa bem estranho, nada é impossível. Você pode conseguir isso com um pequeno script, como mostrarei abaixo.

Preparação

Primeiro de tudo, precisamos instalar algumas ferramentas. Estes são xdotool para a emulação de digitação e controle de janela, e byzanz para a gravação de vídeo. Instale-os usando:

sudo apt install xdotool byzanz

Em seguida, copie o código no final desta resposta e salve-o como um script bash em sua máquina, por exemplo, como ~/bin/typerec . Se você armazená-lo em uma pasta no seu $PATH , você poderá executá-lo sem especificar seu caminho. Não esqueça de torná-lo executável depois usando chmod +x PATH/TO/SCRIPT .

Uso

Agora, para registrar a digitação de um arquivo específico, primeiro abra seu editor de destino, no qual digitaremos. Certifique-se de que tenha algum recurso de "recuo automático" desativado, caso contrário, o recuo do código digitado será confuso!

Em seguida, inicie o meu script, por ex. de um terminal. A sintaxe correta é

typerec INPUT_FILE OUTPUT_FILE [DELAY]

onde INPUT_FILE é o caminho para o seu arquivo de texto de código e OUTPUT_FILE é o caminho do arquivo de saída onde a gravação deve ser armazenada. Deve ter uma extensão aceita por byzanz , ou seja, um dos gif , webm , ogg , ogv , flv , byzanz (minhas recomendações em negrito). O argumento DELAY é opcional e define o atraso entre dois pressionamentos de tecla em milissegundos. O padrão é 20 se omitido, eu recomendo não ir abaixo de 5.

Exemplo:

typerec /path/to/my/code.py ~/Videos/code.webm 100

O cursor do mouse mudará para algum tipo de mira (não visível na captura de tela) e você receberá um balão de notificação pedindo para clicar na janela do editor de destino agora:

typerec"selecione a janela de segmentação" notificação "> </a> </p>

<p> Faça o que lhe for solicitado, mas <strong> tenha cuidado </strong>! Se você não quiser iniciar a gravação, pressione <kbd> Ctrl </kbd> + <kbd> C </kbd> imediatamente, enquanto o terminal ainda está focado e antes de clicar em qualquer lugar. </P>

<blockquote>
  <p><strong>Warning!</strong><br>
  As soon as you click anywhere, the script will focus that window and start emulating all the keystrokes to type your input document a second later. <strong>This is not stoppable!</strong> Once it started, <strong>do not touch your keyboard or click anywhere until it finished!</strong>  Otherwise your input will mix with the emulated input and may trigger unintended actions, like opening/focusing other windows or activating keyboard shortcuts. You must wait until it stops on its own!</p>
</blockquote>

<p> É isso. Uma vez terminado o script (note que depois que a gravação terminar, ainda pode precisar de mais alguns segundos para renderizar e salvar o vídeo), você pode abrir o vídeo gravado e verificar os resultados. </P>

<p> <a href="https://i.stack.imgur.com/f9jsS.gif"> <img src="https://i.stack.imgur.com/f9jsS.gif"></a></a></p><h3>Aquiestáoscript:</h3><pre><code>#!/bin/bashTHIS="$(basename "$0")"
INPUT_FILE="$1"
OUTPUT_FILE="$2"
DELAY="${3:-20}"

show_usage() {
    echo "  Usage:  $THIS INPUT_FILE OUTPUT_FILE [DELAY]"
    echo "where INPUT_FILE is the text file with the content to be typed"
    echo "and OUTPUT_FILE is where the recorded video shall get saved."
    echo "You can set the DELAY between keystrokes in ms (default 20)."
    echo "Note that OUTPUT_FILE will be overwritten if it exists already."
    echo "It must have one of the extensions {gif|webm|ogg|ogv|flv|byzanz}."
    exit 1
}

if [[ -z "$INPUT_FILE" || ! -r "$INPUT_FILE" ]] ; then
    echo "Missing INPUT_FILE argument or file is not existing or readable!"
    show_usage
fi
if [[ -z "$OUTPUT_FILE" ]] ; then
    echo "Missing OUTPUT_FILE argument!"
    show_usage
fi
if [[ ! "$DELAY" -gt 0 ]] ; then
    echo "Invalid argument for DELAY, must be a number > 0 or omitted."
    show_usage
fi

notify-send -i "media-record" "$THIS" "Please select your target editor window."
eval $(xdotool selectwindow getwindowgeometry --shell)
if [[ -z "$WINDOW" || -z "$X" || -z "$Y" || -z "$WIDTH" || -z "$HEIGHT" ]]; then
    echo "Failed to obtain all required target window information. Aborting."
    exit 2
fi

TYPE_COMMAND="xdotool windowactivate --sync \"$WINDOW\" \
              getactivewindow \
              windowfocus --sync \
              sleep 1 \
              type --clearmodifiers --delay "$DELAY" \
                   --file <( tr \\n \\r < \"$INPUT_FILE\" )"

byzanz-record -e "bash -c

Alternativa de uma linha

Se você preferir não salvar o script em qualquer lugar, um one-liner que você pode simplesmente colar no terminal que basicamente faz o mesmo (mas omitindo parâmetros de entrada e validações, registrando file.txt como typerec.gif com um atraso de 20 ms) está abaixo. Você é responsável por editá-lo para usar os caminhos corretos e garantir que tudo esteja correto lá mesmo.

( eval $(xdotool selectwindow getwindowgeometry --shell) ; byzanz-record -e "bash -c 'xdotool windowactivate --sync $WINDOW getactivewindow windowfocus --sync sleep 1 type --clearmodifiers --delay 20 --file <( tr \\n \\r < file.txt )'" -x $X -y $Y -w $WIDTH -h $HEIGHT typerec.gif )
    
por Byte Commander 15.04.2018 / 15:09