From 7c6894a240d94f4d739d732cd74ec72f47fb3bdc Mon Sep 17 00:00:00 2001 From: Salvador Chinesta Llobregat Date: Sat, 15 Apr 2023 23:17:08 +0200 Subject: [PATCH 1/5] Add ignore directories functionality. --- .gitignore | 2 + README.md | 1 + docker-compose.yml | 27 +++++++ rootfs/etc/services.d/autovideoconverter/run | 80 +++++++++++++------- 4 files changed, 84 insertions(+), 26 deletions(-) create mode 100644 .gitignore create mode 100644 docker-compose.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2868744 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +config + diff --git a/README.md b/README.md index 95b5ac7..a5e5a2a 100644 --- a/README.md +++ b/README.md @@ -147,6 +147,7 @@ of this parameter has the format `=`. |`AUTOMATED_CONVERSION_HANDBRAKE_CUSTOM_ARGS`| Custom arguments to pass to HandBrake when performing a conversion. | (no value) | |`AUTOMATED_CONVERSION_INSTALL_PKGS`| Space-separated list of Alpine Linux packages to install. This is useful when the automatic video converter's hooks require tools not available in the container image. See https://pkgs.alpinelinux.org for the list of available Alpine Linux packages. | (no value) | |`AUTOMATED_CONVERSION_USE_TRASH`| When set to `1`, the automatic video converter uses the trash directory. So when the automatic video converter is configured to *not* keep sources, it will move them to the trash directory (`/trash` inside the container) instead of deleting them. | `0` | +|`AUTOMATED_CONVERSION_IGNORE_DIRECTORIES`| Space-separated list of directories which should be ignored. | (no value) | #### Deployment Considerations diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..8f7ef74 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,27 @@ +version: "3" +services: + handbrake: + #build: ./ + image: salvachll/handbrake + restart: always + user: 0:0 + volumes: + - "./config:/config:rw" + - "/mnt/dirToWatch/:/watch:rw" + - "/mnt/dirToWatch/:/output:rw" + ports: + - 5800:5800 + environment: + - USER_ID=0 + - GROUP_ID=0 + - KEEP_APP_RUNNING=1 + - CONTAINER_DEBUG=1 + - AUTOMATED_CONVERSION=1 + - AUTOMATED_CONVERSION_PRESET=General/Super HQ 1080p30 Surround + - AUTOMATED_CONVERSION_FORMAT=mp4 + - AUTOMATED_CONVERSION_VIDEO_FILE_EXTENSIONS=avi # Convert just .avi files + - AUTOMATED_CONVERSION_OUTPUT_SUBDIR=SAME_AS_SRC # Output folder should be the same as the original file + - AUTOMATED_CONVERSION_NON_VIDEO_FILE_ACTION=ignore # Ignore non matching files + - AUTOMATED_CONVERSION_CHECK_INTERVAL=3600 # Check every hour + - AUTOMATED_CONVERSION_SOURCE_STABLE_TIME=2 + - AUTOMATED_CONVERSION_IGNORE_DIRECTORIES=ignore alsothis diff --git a/rootfs/etc/services.d/autovideoconverter/run b/rootfs/etc/services.d/autovideoconverter/run index eeb89d7..6010848 100755 --- a/rootfs/etc/services.d/autovideoconverter/run +++ b/rootfs/etc/services.d/autovideoconverter/run @@ -75,7 +75,15 @@ log_hb_encode_progress_yad() { WATCHDIR_HASH_calculate() { WATCHDIR="$1" - find "$WATCHDIR" -follow -type f -not -path '*/\.*' -printf '%T@:%s:%p:%m\n' | md5sum | cut -d' ' -f1 + echo ----------------------------------------------------------------- + echo ----------------------------------------------------------------- + echo ----------------------------------------------------------------- + eval find "$WATCHDIR" -follow -type f $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf '%T@:%s:%p:%m\n' + echo ----------------------------------------------------------------- + echo ----------------------------------------------------------------- + echo ----------------------------------------------------------------- + + eval find "$WATCHDIR" -follow -type f $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf '%T@:%s:%p:%m\n' | md5sum | cut -d' ' -f1 } WATCHDIR_HASH_isset() { @@ -408,7 +416,15 @@ process_watch_folder() { # First, get the list of files in the watch folder, filtering all files # files under VIDEO_TS or BDMV and keeping only their parent directory. - find "$WF" -follow -type f -not -path '*/\.*' -printf "%T@ %p\n" | \ + echo ----------------------------------------------------------------- + echo ----------------------------------------------------------------- + echo ----------------------------------------------------------------- + eval find "$WF" -follow -type f $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf "\"%T@ %p\n\"" + echo ----------------------------------------------------------------- + echo ----------------------------------------------------------------- + echo ----------------------------------------------------------------- + + eval find "$WF" -follow -type f $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf "\"%T@ %p\n\"" | \ sort -n | \ cut -d' ' -f2- | \ sed 's|/\([^/]*\)/VIDEO_TS/.*$|/\1|g' | \ @@ -460,6 +476,41 @@ process_watch_folder() { [ -f "$FAILED_CONVERSIONS" ] || touch "$FAILED_CONVERSIONS" [ -f "$SUCCESSFUL_CONVERSIONS" ] || touch "$SUCCESSFUL_CONVERSIONS" + +set_default_settings() { + # Set default settings. + AC_PRESET="${AUTOMATED_CONVERSION_PRESET:-Very Fast 1080p30}" + AC_FORMAT="${AUTOMATED_CONVERSION_FORMAT:-mp4}" + AC_SOURCE_STABLE_TIME="${AUTOMATED_CONVERSION_SOURCE_STABLE_TIME:-5}" + AC_SOURCE_MIN_DURATION="${AUTOMATED_CONVERSION_SOURCE_MIN_DURATION:-10}" + AC_SOURCE_MAIN_TITLE_DETECTION="${AUTOMATED_CONVERSION_SOURCE_MAIN_TITLE_DETECTION:-0}" + AC_OUTPUT_DIR="${AUTOMATED_CONVERSION_OUTPUT_DIR:-/output}" + AC_OUTPUT_SUBDIR="${AUTOMATED_CONVERSION_OUTPUT_SUBDIR:-UNSET}" + AC_KEEP_SOURCE="${AUTOMATED_CONVERSION_KEEP_SOURCE:-1}" + AC_VIDEO_FILE_EXTENSIONS="${AUTOMATED_CONVERSION_VIDEO_FILE_EXTENSIONS:-}" + AC_NON_VIDEO_FILE_ACTION="${AUTOMATED_CONVERSION_NON_VIDEO_FILE_ACTION:-ignore}" + AC_NON_VIDEO_FILE_EXTENSIONS="${AUTOMATED_CONVERSION_NON_VIDEO_FILE_EXTENSIONS:-jpg jpeg bmp png gif txt nfo}" + AC_NO_GUI_PROGRESS="${AUTOMATED_CONVERSION_NO_GUI_PROGRESS:-0}" + AC_HANDBRAKE_CUSTOM_ARGS="${AUTOMATED_CONVERSION_HANDBRAKE_CUSTOM_ARGS:-}" + AC_OVERWRITE_OUTPUT="${AUTOMATED_CONVERSION_OVERWRITE_OUTPUT:-0}" + AC_IGNORE_DIRECTORIES="${AUTOMATED_CONVERSION_IGNORE_DIRECTORIES:-}" + + IGNORED_DIRECTORIES_PARAMS="" + for ignored_dir in $AC_IGNORE_DIRECTORIES; do + IGNORED_DIRECTORIES_PARAMS="$IGNORED_DIRECTORIES_PARAMS -not -path '*$ignored_dir*'" + done + echo IGNORED_DIRECTORIES_PARAMS $IGNORED_DIRECTORIES_PARAMS + echo AC_IGNORE_DIRECTORIES $AC_IGNORE_DIRECTORIES + + # Apply per-watch folder settings. + if [ -n "${DIR#*/watch}" ]; then + for VAR in PRESET FORMAT SOURCE_STABLE_TIME SOURCE_MIN_DURATION SOURCE_MAIN_TITLE_DETECTION OUTPUT_DIR OUTPUT_SUBDIR KEEP_SOURCE VIDEO_FILE_EXTENSIONS NON_VIDEO_FILE_ACTION NON_VIDEO_FILE_EXTENSIONS NO_GUI_PROGRESS HANDBRAKE_CUSTOM_ARGS OVERWRITE_OUTPUT IGNORE_DIRECTORIES + do + eval "AC_$VAR=\"\${AUTOMATED_CONVERSION_${VAR}_${DIR#*/watch}:-\$AC_$VAR}\"" + done + fi +} + while true; do for i in $(seq 1 ${AUTOMATED_CONVERSION_MAX_WATCH_FOLDERS:-5}); do DIR="/watch$i" @@ -467,29 +518,7 @@ while true; do DIR="/watch" fi - # Set default settings. - AC_PRESET="${AUTOMATED_CONVERSION_PRESET:-Very Fast 1080p30}" - AC_FORMAT="${AUTOMATED_CONVERSION_FORMAT:-mp4}" - AC_SOURCE_STABLE_TIME="${AUTOMATED_CONVERSION_SOURCE_STABLE_TIME:-5}" - AC_SOURCE_MIN_DURATION="${AUTOMATED_CONVERSION_SOURCE_MIN_DURATION:-10}" - AC_SOURCE_MAIN_TITLE_DETECTION="${AUTOMATED_CONVERSION_SOURCE_MAIN_TITLE_DETECTION:-0}" - AC_OUTPUT_DIR="${AUTOMATED_CONVERSION_OUTPUT_DIR:-/output}" - AC_OUTPUT_SUBDIR="${AUTOMATED_CONVERSION_OUTPUT_SUBDIR:-UNSET}" - AC_KEEP_SOURCE="${AUTOMATED_CONVERSION_KEEP_SOURCE:-1}" - AC_VIDEO_FILE_EXTENSIONS="${AUTOMATED_CONVERSION_VIDEO_FILE_EXTENSIONS:-}" - AC_NON_VIDEO_FILE_ACTION="${AUTOMATED_CONVERSION_NON_VIDEO_FILE_ACTION:-ignore}" - AC_NON_VIDEO_FILE_EXTENSIONS="${AUTOMATED_CONVERSION_NON_VIDEO_FILE_EXTENSIONS:-jpg jpeg bmp png gif txt nfo}" - AC_NO_GUI_PROGRESS="${AUTOMATED_CONVERSION_NO_GUI_PROGRESS:-0}" - AC_HANDBRAKE_CUSTOM_ARGS="${AUTOMATED_CONVERSION_HANDBRAKE_CUSTOM_ARGS:-}" - AC_OVERWRITE_OUTPUT="${AUTOMATED_CONVERSION_OVERWRITE_OUTPUT:-0}" - - # Apply per-watch folder settings. - if [ -n "${DIR#*/watch}" ]; then - for VAR in PRESET FORMAT SOURCE_STABLE_TIME SOURCE_MIN_DURATION SOURCE_MAIN_TITLE_DETECTION OUTPUT_DIR OUTPUT_SUBDIR KEEP_SOURCE VIDEO_FILE_EXTENSIONS NON_VIDEO_FILE_ACTION NON_VIDEO_FILE_EXTENSIONS NO_GUI_PROGRESS HANDBRAKE_CUSTOM_ARGS OVERWRITE_OUTPUT - do - eval "AC_$VAR=\"\${AUTOMATED_CONVERSION_${VAR}_${DIR#*/watch}:-\$AC_$VAR}\"" - done - fi + set_default_settings # Process watch folder. process_watch_folder "$DIR" @@ -498,4 +527,3 @@ while true; do sleep "${AUTOMATED_CONVERSION_CHECK_INTERVAL:-5}" done -# vim:ft=sh:ts=4:sw=4:et:sts=4 From c382beed769d9a860c999df018464f1000fa7e46 Mon Sep 17 00:00:00 2001 From: Salvador Chinesta Llobregat Date: Sat, 15 Apr 2023 23:56:31 +0200 Subject: [PATCH 2/5] If AUTOMATED_CONVERSION_VIDEO_FILE_EXTENSIONS is set, find returns files with these extensions --- rootfs/etc/services.d/autovideoconverter/run | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/rootfs/etc/services.d/autovideoconverter/run b/rootfs/etc/services.d/autovideoconverter/run index 6010848..aecfc2b 100755 --- a/rootfs/etc/services.d/autovideoconverter/run +++ b/rootfs/etc/services.d/autovideoconverter/run @@ -78,12 +78,12 @@ WATCHDIR_HASH_calculate() { echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- - eval find "$WATCHDIR" -follow -type f $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf '%T@:%s:%p:%m\n' + eval find "$WATCHDIR" -follow -type f $FILE_EXTENSIONS_PARAMS $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf '%T@:%s:%p:%m\n' echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- - eval find "$WATCHDIR" -follow -type f $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf '%T@:%s:%p:%m\n' | md5sum | cut -d' ' -f1 + eval find "$WATCHDIR" -follow -type f $FILE_EXTENSIONS_PARAMS $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf '%T@:%s:%p:%m\n' | md5sum | cut -d' ' -f1 } WATCHDIR_HASH_isset() { @@ -418,13 +418,11 @@ process_watch_folder() { # files under VIDEO_TS or BDMV and keeping only their parent directory. echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- - echo ----------------------------------------------------------------- - eval find "$WF" -follow -type f $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf "\"%T@ %p\n\"" - echo ----------------------------------------------------------------- +eval find "$WF" -follow -type f $FILE_EXTENSIONS_PARAMS $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf "\"%T@ %p\n\"" echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- - eval find "$WF" -follow -type f $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf "\"%T@ %p\n\"" | \ + eval find "$WF" -follow -type f $FILE_EXTENSIONS_PARAMS $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf "\"%T@ %p\n\"" | \ sort -n | \ cut -d' ' -f2- | \ sed 's|/\([^/]*\)/VIDEO_TS/.*$|/\1|g' | \ @@ -499,8 +497,13 @@ set_default_settings() { for ignored_dir in $AC_IGNORE_DIRECTORIES; do IGNORED_DIRECTORIES_PARAMS="$IGNORED_DIRECTORIES_PARAMS -not -path '*$ignored_dir*'" done - echo IGNORED_DIRECTORIES_PARAMS $IGNORED_DIRECTORIES_PARAMS - echo AC_IGNORE_DIRECTORIES $AC_IGNORE_DIRECTORIES + + FILE_EXTENSIONS_PARAMS="" + if [[ ! -z $AC_VIDEO_FILE_EXTENSIONS ]]; then + for file_extension in $AC_VIDEO_FILE_EXTENSIONS; do + FILE_EXTENSIONS_PARAMS="$FILE_EXTENSIONS_PARAMS -iname '*.$file_extension'" + done + fi # Apply per-watch folder settings. if [ -n "${DIR#*/watch}" ]; then From fcd6815ee30362bffa5dbc43974d7de9ae8424ca Mon Sep 17 00:00:00 2001 From: Salvador Chinesta Llobregat Date: Sun, 16 Apr 2023 00:16:34 +0200 Subject: [PATCH 3/5] Fix find for using -o(or) while filtering by extensions --- docker-compose.yml | 2 +- rootfs/etc/services.d/autovideoconverter/run | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 8f7ef74..eea786f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,7 +19,7 @@ services: - AUTOMATED_CONVERSION=1 - AUTOMATED_CONVERSION_PRESET=General/Super HQ 1080p30 Surround - AUTOMATED_CONVERSION_FORMAT=mp4 - - AUTOMATED_CONVERSION_VIDEO_FILE_EXTENSIONS=avi # Convert just .avi files + - AUTOMATED_CONVERSION_VIDEO_FILE_EXTENSIONS=avi mp4 # Convert just .avi files - AUTOMATED_CONVERSION_OUTPUT_SUBDIR=SAME_AS_SRC # Output folder should be the same as the original file - AUTOMATED_CONVERSION_NON_VIDEO_FILE_ACTION=ignore # Ignore non matching files - AUTOMATED_CONVERSION_CHECK_INTERVAL=3600 # Check every hour diff --git a/rootfs/etc/services.d/autovideoconverter/run b/rootfs/etc/services.d/autovideoconverter/run index aecfc2b..a3a5376 100755 --- a/rootfs/etc/services.d/autovideoconverter/run +++ b/rootfs/etc/services.d/autovideoconverter/run @@ -500,9 +500,12 @@ set_default_settings() { FILE_EXTENSIONS_PARAMS="" if [[ ! -z $AC_VIDEO_FILE_EXTENSIONS ]]; then + FILE_EXTENSIONS_PARAMS="\\( " for file_extension in $AC_VIDEO_FILE_EXTENSIONS; do - FILE_EXTENSIONS_PARAMS="$FILE_EXTENSIONS_PARAMS -iname '*.$file_extension'" + FILE_EXTENSIONS_PARAMS="$FILE_EXTENSIONS_PARAMS -iname '*.$file_extension' -o" done + FILE_EXTENSIONS_PARAMS="${FILE_EXTENSIONS_PARAMS::-2} \\)" + echo FILE_EXTENSIONS_PARAMS $FILE_EXTENSIONS_PARAMS fi # Apply per-watch folder settings. From 7cd1006cf7ed9b598525368f48beba6b6b58a12f Mon Sep 17 00:00:00 2001 From: Salvador Chinesta Llobregat Date: Sun, 16 Apr 2023 00:33:38 +0200 Subject: [PATCH 4/5] Show command to execute --- rootfs/etc/services.d/autovideoconverter/run | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rootfs/etc/services.d/autovideoconverter/run b/rootfs/etc/services.d/autovideoconverter/run index a3a5376..ff9bd9d 100755 --- a/rootfs/etc/services.d/autovideoconverter/run +++ b/rootfs/etc/services.d/autovideoconverter/run @@ -78,7 +78,7 @@ WATCHDIR_HASH_calculate() { echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- - eval find "$WATCHDIR" -follow -type f $FILE_EXTENSIONS_PARAMS $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf '%T@:%s:%p:%m\n' + echo find "$WATCHDIR" -follow -type f $FILE_EXTENSIONS_PARAMS $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf '%T@:%s:%p:%m\n' echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- @@ -418,6 +418,7 @@ process_watch_folder() { # files under VIDEO_TS or BDMV and keeping only their parent directory. echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- +echo find "$WF" -follow -type f $FILE_EXTENSIONS_PARAMS $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf "\"%T@ %p\n\"" eval find "$WF" -follow -type f $FILE_EXTENSIONS_PARAMS $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf "\"%T@ %p\n\"" echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- From 8b31007db4bcea3d9ca00378e1bf518f2a8d1035 Mon Sep 17 00:00:00 2001 From: Salvador Chinesta Llobregat Date: Sun, 16 Apr 2023 00:40:21 +0200 Subject: [PATCH 5/5] Remove find logs. Duplicate execution --- rootfs/etc/services.d/autovideoconverter/run | 1 - 1 file changed, 1 deletion(-) diff --git a/rootfs/etc/services.d/autovideoconverter/run b/rootfs/etc/services.d/autovideoconverter/run index ff9bd9d..1eadffd 100755 --- a/rootfs/etc/services.d/autovideoconverter/run +++ b/rootfs/etc/services.d/autovideoconverter/run @@ -419,7 +419,6 @@ process_watch_folder() { echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- echo find "$WF" -follow -type f $FILE_EXTENSIONS_PARAMS $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf "\"%T@ %p\n\"" -eval find "$WF" -follow -type f $FILE_EXTENSIONS_PARAMS $IGNORED_DIRECTORIES_PARAMS -not -path '*/\.*' -printf "\"%T@ %p\n\"" echo ----------------------------------------------------------------- echo -----------------------------------------------------------------