diff --git a/bin/album_seekpoint b/bin/album_seekpoint
index 850eceb..f7951cc 100755
--- a/bin/album_seekpoint
+++ b/bin/album_seekpoint
@@ -1,24 +1,184 @@
#!/bin/bash
+#-----------------------------------------------------------------------------------------------------------------------------------
+#
+# Album SeekPoint
+#
+# Copyright (C) 2016-2026 Arnaud G. GIBERT
+# mailto:arnaud@rx3.net
+#
+# This is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; If not, see
+# .
+#
+#-----------------------------------------------------------------------------------------------------------------------------------
-if [[ "$1" == "-h" ]]
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Includes
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+: "${RX3_LIB_DIR:=/usr/lib/rx3}"
+. "${RX3_LIB_DIR}/music_tools.bash"
+
+
+
+
+
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Global Variables
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+declare -g VERSION="1.0.0"
+declare -g NAME="album_seekpoint"
+declare -g HELP="usage: [-h | --help] | [-V | --version] | [-T | --test] [-v | --verbose] "
+
+declare -g SOURCE_DIR=""
+declare -g TARGET_DIR=""
+declare -g SEEK_POINT_DELAY=""
+
+declare -g MODE="DEFAULT"
+declare -g VERBOSE="FALSE"
+declare -g DRY_RUN="FALSE"
+
+
+
+
+
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Version Print
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+as_version_print()
+{
+ version_print
+}
+
+
+
+
+
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Help Print
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+as_help_print()
+{
+ as_version_print
+ help_print
+}
+
+
+
+
+
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Arg Parse
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+as_args_parse()
+{
+ tmp_args=$(getopt -o ThVv --long test,help,version,verbose -n "${NAME}" -- "$@")
+
+ if [ $? != 0 ]
+ then
+ echo "Terminating..." >&2
+ exit 1
+ fi
+
+ # Note the quotes around `$TEMP': they are essential!
+ eval set -- "${tmp_args}"
+
+ while true
+ do
+ case "$1" in
+ # Options
+
+ # Mode switches
+ -T|--test) MODE="TEST"; shift;;
+
+ -h|--help) MODE="EXIT"; as_help_print; shift;;
+ -V|--version) MODE="EXIT"; as_version_print; shift;;
+
+ # Global options
+ -v|--verbose) VERBOSE="TRUE"; shift;;
+
+ #
+ --) shift; break;;
+ *) echo "args_parse internal error [$1] !"; exit 1;;
+ esac
+ done
+
+ if [[ "${MODE}" != "EXIT" ]]
+ then
+ if [[ "${#}" != "3" ]]
+ then
+ if [[ "${#}" -lt "3" ]]
+ then
+ echo_error "Not enough args!"
+ else
+ echo_error "Too many args!"
+ fi
+
+ MODE="EXIT"
+ as_help_print
+ else
+ SOURCE_DIR="$1"
+ TARGET_DIR="$2"
+ SEEK_POINT_DELAY="$3"
+ fi
+ fi
+}
+
+
+
+
+
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Main
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+as_args_parse "$@"
+
+
+
+if [[ "${MODE}" == "EXIT" ]]
then
- echo "album_seekpoint [-h] | "
- exit
+ exit 0
+else
+ if [[ "${MODE}" == "TEST" ]]
+ then
+ DRY_RUN="TRUE"
+ fi
fi
- source_dir="$1"
- target_dir="$2"
-seek_point_delay="$3"
-for file in ${source_dir}/*.flac
+echo_error "${NAME}: Mode: [${MODE}] Verbose: [${VERBOSE}] Source_Dir: [${SOURCE_DIR}] Target_Dir: [${TARGET_DIR}] Seek_Point_Delay: [${SEEK_POINT_DELAY}]"
+
+if [[ ! -d "${TARGET_DIR}" ]]
+then
+ echo_error "Target directory doesn't exist!"
+ exit -1
+fi
+
+for file in "${SOURCE_DIR}"/*@(.flac)
do
- target_file="${target_dir}/$(basename $file)"
+ id="$(basename "${file}" | sed -e "s/-.*//")"
+ target_file="${TARGET_DIR}/$(basename "${file}")"
- if [[ "${file}" != "${target_file}" ]]
- then
- cp "${file}" "${target_file}"
- fi
+ if [[ "${file}" != "${target_file}" ]]
+ then
+ cmd_exec cp "${file}" "${target_file}"
+ fi
- metaflac --remove --block-type=SEEKTABLE "${target_file}"
- metaflac --add-seekpoint "${seek_point_delay}"s "${target_file}"
+ cmd_exec metaflac --remove --block-type=SEEKTABLE "${target_file}"
+ cmd_exec metaflac --add-seekpoint "${SEEK_POINT_DELAY}s" "${target_file}"
done
diff --git a/bin/music_check b/bin/music_check
index d9d26fc..33481b5 100755
--- a/bin/music_check
+++ b/bin/music_check
@@ -1,19 +1,183 @@
#!/bin/bash
+#-----------------------------------------------------------------------------------------------------------------------------------
+#
+# Music Check
+#
+# Copyright (C) 2016-2026 Arnaud G. GIBERT
+# mailto:arnaud@rx3.net
+#
+# This is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; If not, see
+# .
+#
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+
+
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Includes
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+: "${RX3_LIB_DIR:=/usr/lib/rx3}"
+. "${RX3_LIB_DIR}/music_tools.bash"
+
+
+
+
+
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Global Variables
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+declare -g VERSION="1.0.0"
+declare -g NAME="music_check"
+declare -g HELP="usage: [-h | --help] | [-V | --version] | [-T | --test] [-v | --verbose] "
+
+declare -g SOURCE_DIR=""
+
+declare -g MODE="DEFAULT"
+declare -g VERBOSE="FALSE"
+declare -g DRY_RUN="FALSE"
+
+
+
+
+
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Version Print
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+mc_version_print()
+{
+ version_print
+}
+
+
+
+
+
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Help Print
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+mc_help_print()
+{
+ mc_version_print
+ help_print
+}
+
+
+
+
+
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Arg Parse
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+mc_args_parse()
+{
+ tmp_args=$(getopt -o ThVv --long test,help,version,verbose -n "${NAME}" -- "$@")
+
+ if [ $? != 0 ]
+ then
+ echo "Terminating..." >&2
+ exit 1
+ fi
+
+ # Note the quotes around `$TEMP': they are essential!
+ eval set -- "${tmp_args}"
+
+ while true
+ do
+ case "$1" in
+ # Options
+
+ # Mode switches
+ -T|--test) MODE="TEST"; shift;;
+
+ -h|--help) MODE="EXIT"; mc_help_print; shift;;
+ -V|--version) MODE="EXIT"; mc_version_print; shift;;
+
+ # Global options
+ -v|--verbose) VERBOSE="TRUE"; shift;;
+
+ # End of options
+ --) shift; break;;
+ *) echo "args_parse internal error [$1] !"; exit 1;;
+ esac
+ done
+
+ if [[ "${MODE}" != "EXIT" ]]
+ then
+ if [[ "${#}" != "1" ]]
+ then
+ if [[ "${#}" -lt "1" ]]
+ then
+ echo_error "Not enough args!"
+ else
+ echo_error "Too many args!"
+ fi
+
+ MODE="EXIT"
+ mc_help_print
+ else
+ SOURCE_DIR="$1"
+ fi
+ fi
+}
+
+
+
+
+
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Main
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+mc_args_parse "$@"
+
+
+
+if [[ "${MODE}" == "EXIT" ]]
+then
+ exit 0
+else
+ if [[ "${MODE}" == "TEST" ]]
+ then
+ DRY_RUN="TRUE"
+ fi
+fi
+
+
+echo_error "${NAME}: Mode: [${MODE}] Verbose: [${VERBOSE}] Source_Dir: [${SOURCE_DIR}]"
+
+if [[ ! -d "${SOURCE_DIR}" ]]
+then
+ echo_error "Source directory doesn't exist!"
+ exit -1
+fi
i=1
-for file in $(find /opt/music/src -name '*.flac' | sort)
+find "${SOURCE_DIR}" -name '*.flac' -print0 | sort -z | while IFS= read -r -d '' file
do
- echo -ne "\r \r"
-
- printf "%05d: " $i; echo -n "${file}: "
- flac --test "${file}" >/dev/null 2>&1
-
- if [[ "$?" == "0" ]]
- then
- echo -n "OK"
- else echo "KO"
- fi
-
- i=$(($i+1))
-done
\ No newline at end of file
+ echo_line "${file}: " "${i}"
+ cmd_exec flac --test "${file}" >/dev/null 2>&1
+ if [[ $? -eq 0 ]]
+ then
+ echo "OK"
+ else
+ echo "KO"
+ fi
+ i=$((i+1))
+done
diff --git a/etc/bash_completion.d/album_convert b/etc/bash_completion.d/album_convert
index 61b2e98..e8689c6 100644
--- a/etc/bash_completion.d/album_convert
+++ b/etc/bash_completion.d/album_convert
@@ -21,7 +21,6 @@
# .
#
#-----------------------------------------------------------------------------------------------------------------------------------
-# -*- mode: shell; sh-basic-offset: 4; indent-tabs-mode: nil; -*-
diff --git a/etc/bash_completion.d/album_merge b/etc/bash_completion.d/album_merge
index ddcba35..6294c02 100644
--- a/etc/bash_completion.d/album_merge
+++ b/etc/bash_completion.d/album_merge
@@ -21,7 +21,6 @@
# .
#
#-----------------------------------------------------------------------------------------------------------------------------------
-# -*- mode: shell; sh-basic-offset: 4; indent-tabs-mode: nil; -*-
diff --git a/etc/bash_completion.d/album_metadata_load b/etc/bash_completion.d/album_metadata_load
index 168c0ed..63902b2 100644
--- a/etc/bash_completion.d/album_metadata_load
+++ b/etc/bash_completion.d/album_metadata_load
@@ -21,7 +21,6 @@
# .
#
#-----------------------------------------------------------------------------------------------------------------------------------
-# -*- mode: shell; sh-basic-offset: 4; indent-tabs-mode: nil; -*-
diff --git a/etc/bash_completion.d/album_metadata_save b/etc/bash_completion.d/album_metadata_save
index cd7de2e..936e1cb 100644
--- a/etc/bash_completion.d/album_metadata_save
+++ b/etc/bash_completion.d/album_metadata_save
@@ -21,7 +21,6 @@
# .
#
#-----------------------------------------------------------------------------------------------------------------------------------
-# -*- mode: shell; sh-basic-offset: 4; indent-tabs-mode: nil; -*-
diff --git a/etc/bash_completion.d/album_name_fix b/etc/bash_completion.d/album_name_fix
index 062ff99..d0f3878 100644
--- a/etc/bash_completion.d/album_name_fix
+++ b/etc/bash_completion.d/album_name_fix
@@ -21,7 +21,6 @@
# .
#
#-----------------------------------------------------------------------------------------------------------------------------------
-# -*- mode: shell; sh-basic-offset: 4; indent-tabs-mode: nil; -*-
diff --git a/etc/bash_completion.d/album_rename b/etc/bash_completion.d/album_rename
index bce7966..502b811 100644
--- a/etc/bash_completion.d/album_rename
+++ b/etc/bash_completion.d/album_rename
@@ -21,7 +21,6 @@
# .
#
#-----------------------------------------------------------------------------------------------------------------------------------
-# -*- mode: shell; sh-basic-offset: 4; indent-tabs-mode: nil; -*-
diff --git a/etc/bash_completion.d/album_seekpoint b/etc/bash_completion.d/album_seekpoint
new file mode 100644
index 0000000..4a129ec
--- /dev/null
+++ b/etc/bash_completion.d/album_seekpoint
@@ -0,0 +1,95 @@
+#!/bin/bash
+#-----------------------------------------------------------------------------------------------------------------------------------
+#
+# Album SeekPoint Bash Completion
+#
+# Copyright (C) 2016-2026 Arnaud G. GIBERT
+# mailto:arnaud@rx3.net
+#
+# This is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; If not, see
+# .
+#
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+
+
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Album SeekPoint Completion
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+_album_seekpoint_completion()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ local prev="${COMP_WORDS[COMP_CWORD-1]}"
+ local opts="-h --help -V --version -T --test -v --verbose"
+
+ local pos=0
+ local i
+
+ COMPREPLY=()
+
+ # Complete options if current word starts with '-'
+ if [[ "${cur}" == -* ]]
+ then
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
+ return 0
+ fi
+
+ # Count non-option positional arguments already provided
+ for (( i=1; i.
+#
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+
+
+#-----------------------------------------------------------------------------------------------------------------------------------
+# Music Check Completion
+#-----------------------------------------------------------------------------------------------------------------------------------
+
+_music_check_completion()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ local prev="${COMP_WORDS[COMP_CWORD-1]}"
+ local opts="-h --help -V --version -T --test -v --verbose"
+
+ local pos=0
+ local i
+
+ COMPREPLY=()
+
+ # Complete options if current word starts with '-'
+ if [[ "${cur}" == -* ]]
+ then
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
+ return 0
+ fi
+
+ # Count non-option positional arguments already provided
+ for (( i=1; i