From b67a2d3431fe3dc94585c315aa622c5f49e034cf Mon Sep 17 00:00:00 2001 From: "jp.av.dev" Date: Mon, 14 Feb 2022 03:12:13 -0300 Subject: [PATCH] init repo Android_Timelapse --- NOTAS.md | 79 ++++++++++++++++++++++++ README.md | 87 ++++++++++++++++++++++++++ timelapse_host.sh | 146 ++++++++++++++++++++++++++++++++++++++++++++ timelapse_master.sh | 144 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 456 insertions(+) create mode 100644 NOTAS.md create mode 100644 README.md create mode 100755 timelapse_host.sh create mode 100755 timelapse_master.sh diff --git a/NOTAS.md b/NOTAS.md new file mode 100644 index 0000000..bf83aab --- /dev/null +++ b/NOTAS.md @@ -0,0 +1,79 @@ +# TimeLapse + +- Registro fotografico cada X tiempo, durante Y tiempo o Z cantidad de fotografias + +### Fecha/Tiempo + +**Formato:** `Dia-Mes-Año_hora:minutos` +```bash +FECHA = $(date +'%d-%h-%Y_%H:%M') +1-Feb-2022_02:12 +``` + +**Diferencia** de fechas en segundos +```bash +LA_FECHA=$(( ($(date -d "2022-01-27" "+%s") - $(date -d "2022-01-22" "+%s") ))) +``` + +**Agregar** segundos a **LA_FECHA** +```bash + LA_FECHA2=$((LA_FECHA+800)) + echo ${LA_FECHA2} +``` + +**Equivalencias** en segundos: +Otro | Segundos +-|- +1 Año | 31536000 +1 Mes | 18144000 +1 Semana | 604800 +1 Dia | 86400 +1 Hora | 3600 +20 Min | 1200 +15 Min | 900 +10 Min | 600 + +
+ +> **Necesito tiempo(s)** +> Para no depender de función sleep para los intervalos, +> ya que el tiempo de ejecucion de las ordenes es variable + + +Variables de tiempo | Poblada por +-|- +Tiempo Actual | `$(date -d today +%s")` int: segundos +Intervalo | Argumento (int: segundos) +Duración intervalo, ó
Cantidad de fotos | Argumento (int: segundos o cantidad) +Tiempo Ultimo Lapso,
(post-ejecucion) | `$(date -d today +%s")` int: segundos + + +ej. Fotos cada 1 hora, durante medio día: +```bash +# Limite por cantidad de fotos +./foto.sh --int=3600 --cant=12 + +# Limite por tiempo +./foto.sh --int=3600 --fin=43200 +``` + +
+ +Diferencia de tiempo entre intervalos: +```c +algún loop { + t_actual = "tiempo actual en segundos"; + if (t_actual - t_loop_previo) >= intervalo_loop { + # alguna acción... + t_loop_previo = t_actual; + } +} +``` + +### Video + +- Crea video con las imagenes (en orden temporal) +```bash +ffmpeg -framerate 5 -pattern_type glob -i "*.jpeg" -c:v libx264 -crf 0 output.mp4 +``` + diff --git a/README.md b/README.md new file mode 100644 index 0000000..b69af76 --- /dev/null +++ b/README.md @@ -0,0 +1,87 @@ +# Timelapse + +Utilidad para capturar fotografias a intervalos con un dispositivo Andriod, +utilizando [Termux](https://termux.com/), ssh, mogrify y rsync. + +### 2 scripts: + * **timelapse_master** (opcional): + - Controla el script timelapse_host por medio de **ssh**. + - Permite importar imagenes del host. + * **timelapse_host**: + - Realiza la capturas segun argumentos. + - Este script debe correr en el dispositivo Android. + +## Fotografias a intervalo + +Registro fotografico cada 'X' tiempo, durante 'Y' tiempo o 'Z' cantidad de imagenes. + +Las imagenes se guardan con el nombre (-n) como prefijo, seguido de la fecha. +`[NOMBRE]-[AÑO]-[MES]-[DIA]_[HH]:[MM]:[SS].jpeg` +> ej. +> * secuencia-2022-02-14_02:50:36.jpeg + +Las imagenes se guardan en `~/BashCamera/[NOMBRE]_[DIA]-[MES]-[AÑO]_[HH]:[MM]/` +> ej. +> * secuencia-2022-02-14_02:50/ + +```bash + BashCamera/ +└──  secuencia_14-02-2022_02:50/ + └──  secuencia_2022-02-14_02:50:36.jpeg +``` +---- +## Ayuda + +`timelapse_master --help` +``` + Uso: timelapse [OPCS] + + -h, --help - Muestra información de ayuda. + -C, --copia - Copia capturas del host en /tmp/BashCamera. + -d, --destino [opcional] - Directorio donde se guardan las capturas. + /tmp/BashCamera por defecto. + -H, --host - Nombre del host segun ~/.ssh/config. + -n, --nombre - Nombre prefijo de imagenes. + -i, --lapso - Tiempo entre capturas (segundos). + -f, --fin - Fin de la secuencia (segundos). + -c, --fotos - Cantidad de imagenes para finalizar (int). + invalida el fin de secuencia por tiempo. + -r, --rotar - Girar la imagen (90-180-270) + -v, --version - Muestra la fecha de la versión. + + + Ejemplos: + + timelapse -H [host] -n [titulo] -r 90 -i 300 -f 18000 + + Solicita al host fotografias cada 5 minutos durante 5 horas. + Las imagenes son nombradas [titulo]_[AÑO]-[MES]-[DIA]_[HH:MM:SS] + y se guardan en //data/data/com.termux/files/home/storage/dcim/BashCamera/[titulo]/ + Las imagenes se giran 90°. + + timelapse -C [host] -d [DESTINO(opcional)] + + Copia las capturas del host (rsync) +``` +`timelapse_host --help` +``` + Uso: timelapse [OPCS] + + -h, --help - Muestra información de ayuda. + -n, --nombre - Nombre prefijo de imagenes. + -i, --lapso - Tiempo entre capturas (segundos). + -f, --fin - Fin de la secuencia (segundos). + -c, --fotos - Cantidad de imagenes para finalizar (int). + invalida el fin de secuencia por tiempo. + -r, --rotar - Modifica el angulo de la imagen (90-180-270) + -v, --version - Muestra la fecha de la versión. + + + Ejemplo: + + timelapse -n [NOMBRE] -i 300 -f 18000 -r 90 + + Toma fotografias cada 5 minutos durante 5 horas. + Las imagenes son nombradas [NOMBRE]_[AÑO]-[MES]-[DIA]_[HH:MM:SS] + Las imagenes se giran 90°. +``` diff --git a/timelapse_host.sh b/timelapse_host.sh new file mode 100755 index 0000000..4a6ff3f --- /dev/null +++ b/timelapse_host.sh @@ -0,0 +1,146 @@ +#!/data/data/com.termux/files/usr/bin/env bash + +Progrm=timelapse +VersionStr='14-02-2022' +NOMBRE_BASE='timelapse' +DIR_BASE="/data/data/com.termux/files/home/storage/dcim/BashCamera/" +CONTADOR=0 +T_ANTERIOR=0 +T_FIN=0 +ROTAR=0 +ANGULO=0 + + + +Err(){ + printf 'ERROR: %s\n' "$2" 1>&2 + [ $1 -gt 0 ] && exit $1 +} + +Uso(){ + while read; do + printf '%s\n' "$REPLY" + done <<-EOF + Uso: $Progrm [OPCS] + + -h, --help - Muestra información de ayuda. + -n, --nombre - Nombre prefijo de imagenes. + -i, --lapso - Tiempo entre capturas (segundos). + -f, --fin - Fin de la secuencia (segundos). + -c, --fotos - Cantidad de imagenes para finalizar (int). + invalida el fin de secuencia por tiempo. + -r, --rotar - Modifica el angulo de la imagen (90-180-270) + -v, --version - Muestra la fecha de la versión. + + + Ejemplo: + + timelapse -n [NOMBRE] -i 300 -f 18000 -r 90 + + Toma fotografias cada 5 minutos durante 5 horas. + Las imagenes son nombradas [NOMBRE]_[AÑO]-[MES]-[DIA]_[HH:MM:SS] + Las imagenes se giran 90° + +EOF +} + +if ! [ -n "$1" ]; then + Err 1 "'$0' Debes ingresar opciones. \"ej: --help\"" +fi + +#while [ -n "$1" ]; do +while [[ $# -gt 0 ]]; do + case $1 in + -v|--version) + printf '%s\n' "$VersionStr"; exit 0 ;; + -h|--help) + Uso; exit 0 ;; + -n|--nombre) + NOMBRE_BASE="$2" + shift # past argument + shift # past value + ;; + -i|--lapso) + INTERVALO="$2" # Validar?! + shift + shift + ;; + -f|--fin) + T_FIN="$2" # Validar?! + shift + shift + ;; + -c|--fotos) + CONTADOR="$2" # Validar?! + shift + shift + ;; + -r|--rotar) + ROTAR=1 + ANGULO="$2" # Validar?! + shift + shift + ;; + -*|--*) + Err 1 "Opción no valida: $1" ;; + *) + Err 1 'Argumento(s) invalido(s).' ;; + esac +done + +[ -n "${INTERVALO}" ] || Err 1 "Debes Ingresar un intervalo" +[ "${INTERVALO}" -lt 15 ] && Err 1 "Intervalo de capturas debe ser >= 15" +[ ${CONTADOR} -eq 0 ] && [ ${T_FIN} -eq 0 ] && Err 1 "Debes ingresar un limite (tiempo o cantidad) (--help)" +[ ${ANGULO} -eq 0 ] && Err 1 "El angulo de giro debe ser: 90 - 180 - 270" + +NOMBRE_DIR="${NOMBRE_BASE}_$(date +'%d-%m-%Y_%H:%M')" +DIR_BASE="${DIR_BASE}${NOMBRE_DIR}/" +mkdir -p "${DIR_BASE}" + +captura(){ + CAPTURA="${DIR_BASE}${NOMBRE_BASE}_$(date +'%Y-%m-%d_%H:%M:%S').jpeg" + termux-camera-photo "${CAPTURA}" + # Puede depender de un argumento y otra funcion. Por ahora queda así + if [ ${ROTAR} -gt 0 ]; then + mogrify -rotate "${ANGULO}" "${CAPTURA}" + fi +} + +# Limite por cantidad de capturas +if [ "${CONTADOR}" -gt 0 ]; then + while [ $CONTADOR -gt 0 ]; do + T_ACTUAL=$(date "+%s") + T_DIFF=$((T_ACTUAL-T_ANTERIOR)) + if [ $T_DIFF -ge $INTERVALO ]; then + T_ANTERIOR=${T_ACTUAL} + captura + ((CONTADOR--)) + else + sleep 0.25 + fi + done +else + # Limite por tiempo + T_ACTUAL=$(date "+%s") + T_FIN=$((T_ACTUAL+T_FIN)) + while [ ${T_ACTUAL} -le ${T_FIN} ]; do + T_ACTUAL=$(date "+%s") + T_DIFF=$((T_ACTUAL-T_ANTERIOR)) + if [ $T_DIFF -ge $INTERVALO ]; then + T_ANTERIOR=${T_ACTUAL} + captura + else + sleep 0.20 + fi + + done +fi + +exit 0 + +############################################# +# PENDIENTE: # +# # +# VALIDACIONES # +# # +############################################# diff --git a/timelapse_master.sh b/timelapse_master.sh new file mode 100755 index 0000000..6133e72 --- /dev/null +++ b/timelapse_master.sh @@ -0,0 +1,144 @@ +#!/usr/bin/env bash + +Progrm=timelapse +VersionStr='14-02-2022' +NOMBRE_BASE='timelapse' +DIR_BASE="//data/data/com.termux/files/home" +DIR_PRGRM="${DIR_BASE}/.scripts/timelapse" +DIR_CAPT="${DIR_BASE}/storage/dcim/BashCamera" +DIR_DESTINO="/tmp" +CONTADOR=0 +T_FIN=0 +COPIA=0 +ROTAR=0 +ANGULO=0 + +Err(){ + printf 'ERROR: %s\n' "$2" 1>&2 + [ $1 -gt 0 ] && exit $1 +} + +Uso(){ + while read; do + printf '%s\n' "$REPLY" + done <<-EOF + Uso: $Progrm [OPCS] + + -h, --help - Muestra información de ayuda. + -C, --copia - Copia capturas del host en ${DIR_DESTINO}/BashCamera. + -d, --destino [opcional] - Directorio donde se guardan las capturas. + ${DIR_DESTINO}/BashCamera por defecto. + -H, --host - Nombre del host segun ~/.ssh/config. + -n, --nombre - Nombre prefijo de imagenes. + -i, --lapso - Tiempo entre capturas (segundos). + -f, --fin - Fin de la secuencia (segundos). + -c, --fotos - Cantidad de imagenes para finalizar (int). + invalida el fin de secuencia por tiempo. + -r, --rotar - Girar la imagen (90-180-270) + -v, --version - Muestra la fecha de la versión. + + + Ejemplos: + + timelapse -H [host] -n [titulo] -r 90 -i 300 -f 18000 + + Solicita al host fotografias cada 5 minutos durante 5 horas. + Las imagenes son nombradas [titulo]_[AÑO]-[MES]-[DIA]_[HH:MM:SS] + y se guardan en ${DIR_CAPT}/[titulo]/ + Las imagenes se giran 90°. + + timelapse -C [host] -d [DESTINO(opcional)] + + Copia las capturas del host (rsync) + +EOF +} + +Importar() { + rsync -avzhP "${MAQUINA}:${DIR_CAPT}" "${DIR_DESTINO}" + exit 0 +} + +if ! [ -n "$1" ]; then + Err 1 "'$0' Debes ingresar opciones. \"ej: --help\"" +fi + +while [[ $# -gt 0 ]]; do + case $1 in + -v|--version) + printf '%s\n' "$VersionStr"; exit 0 ;; + -h|--help) + Uso; exit 0 ;; + -C|--copia) + MAQUINA="$2" + COPIA=1 + shift + shift + ;; + -d|--destino) + DIR_DESTINO="$2" + shift + shift + ;; + -H|--host) + MAQUINA="$2" + shift + shift + ;; + -n|--nombre) + NOMBRE_BASE="$2" # Validar?! + shift # past argument + shift # past value + ;; + -i|--lapso) + INTERVALO="$2" + shift + shift + ;; + -f|--fin) + T_FIN="$2" # Validar?! + shift + shift + ;; + -c|--fotos) + CONTADOR="$2" # Validar?! + shift + shift + ;; + -r|--rotar) + ROTAR=1 + ANGULO="$2" # Validar?! + shift + shift + ;; + -*|--*) + Err 1 "Opción no valida: $1" ;; + *) + Err 1 'Argumento(s) invalido(s).' ;; + esac +done + + +[ ${COPIA} -gt 0 ] && Importar +[ -n "${INTERVALO}" ] || Err 1 "Debes Ingresar un intervalo" +[ "${INTERVALO}" -lt 15 ] && Err 1 "Intervalo de capturas debe ser >= 15" +[ ${ANGULO} -eq 0 ] && Err 1 "El angulo de giro debe ser: 90 - 180 - 270" +[ ${CONTADOR} -eq 0 ] && [ ${T_FIN} -eq 0 ] && Err 1 "Debes ingresar un limite (tiempo o cantidad) (--help)" + +if [ "${CONTADOR}" -gt 0 ]; then + # Limite por cantidad de capturas + ssh -f "${MAQUINA}" "${DIR_PRGRM} -n ${NOMBRE_BASE} -i ${INTERVALO} -c ${CONTADOR} -r ${ANGULO}" +else + # Limite por tiempo + ssh -f "${MAQUINA}" "${DIR_PRGRM} -n ${NOMBRE_BASE} -i ${INTERVALO} -f ${T_FIN} -r ${ANGULO}" +fi + +######################################################################### +# PENDIENTE: # +# # +# LIMITE POR TIEMPO # +# sufixo s(egundos); m(inutos); h(oras); d(dias); S(emanas); M(eses) # +# # +# VALIDACION # +# # +#########################################################################