From d08a4e2bcfc4388901941f6f7bc33985cd7cfbe8 Mon Sep 17 00:00:00 2001 From: Gardouille Date: Sun, 22 May 2022 17:07:24 +0200 Subject: [PATCH] New multimedia player controller script Expect to be able to manage audio and video player. Start mpd if no music player is running Send command to MPV player (if running with IPC socket) Send command to kodi player Send command to mpd --- multimedia.controller.sh | 250 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100755 multimedia.controller.sh diff --git a/multimedia.controller.sh b/multimedia.controller.sh new file mode 100755 index 0000000..af9dcfe --- /dev/null +++ b/multimedia.controller.sh @@ -0,0 +1,250 @@ +#!/bin/sh +# +# Purpose {{{ +# This script will try to send multimedia controls to correct player +# 1. Send selected command to MPV if running +# 2. Send selected command to Kodi if running +# 3. Send selected command to MPD if running +# 4. Start mpd if nothing runs +# … +# +# 2022-05-22 +# }}} +# Vars {{{ +readonly PROGNAME=$(basename "${0}") +readonly PROGDIR=$(readlink -m $(dirname "${0}")) +readonly ARGS="${*}" +readonly NBARGS="${#}" +[ -z "${DEBUG}" ] && DEBUG=1 +## Export DEBUG for sub-script +export DEBUG + +## Default values for some vars +readonly MPV_PROC_REGEXP="mpv.*--input-ipc-server" +readonly KODI_PROC_REGEXP="kodi.bin" +readonly MPD_PROC_REGEXP="mpd.*systemd" + +readonly MULTIMEDIA_COMMAND_DEFAULT="toggle" + +## Colors +readonly PURPLE='\033[1;35m' +readonly RED='\033[0;31m' +readonly RESET='\033[0m' +readonly COLOR_DEBUG="${PURPLE}" +# }}} +usage() { # {{{ + + cat <<- HELP +usage: $PROGNAME [-c|-d|-h] + +This script will try to send multimedia controls to correct player + 1. Send selected command to MPV if running + * Latest instance only with an IPC socket. + 2. Send selected command to Kodi if running + 3. Send selected command to MPD if running + 4. Start mpd if nothing runs + +EXAMPLES : + - Send TOGGLE command to the first media player running + ${PROGNAME} --command toggle + +OPTIONS : + -c,--command + Send some command to running media player (MPV, Kodi, MPD,…). + + -d,--debug + Enable debug messages. + + -h,--help + Print this help message. + +HELP + +} +# }}} +debug_message() { # {{{ + + local_debug_message="${1}" + + ## Print message if DEBUG is enable (=0) + [ "${DEBUG}" -eq "0" ] && printf '\e[1;35m%-6b\e[m\n' "DEBUG − ${PROGNAME} : ${local_debug_message}" + + unset local_debug_message + + return 0 +} +# }}} +error_message() { # {{{ + + local_error_message="${1}" + local_error_code="${2}" + + ## Print message + printf '%b\n' "ERROR − ${PROGNAME} : ${RED}${local_error_message}${RESET}" + + exit "${local_error_code:=66}" +} +# }}} +define_vars() { # {{{ + + ## If MULTIMEDIA_COMMAND wasn't defined (argument) {{{ + if [ -z "${MULTIMEDIA_COMMAND}" ]; then + ## Use default value + readonly MULTIMEDIA_COMMAND="${MULTIMEDIA_COMMAND_DEFAULT}" + fi + ## }}} + +} +# }}} +is_proc_absent() { # {{{ + + local_proc_pattern="${1}" + + ## Proc is absent by default + return_proc_absent="0" + + local_count_proc_pattern="$(pgrep -f -- "${local_proc_pattern}" | wc -l)" + + case "${local_count_proc_pattern}" in + 0 ) ## No procs related to this pattern are running + return_proc_absent="0" + ;; + * ) ## At least one proc seems running + return_proc_absent="1" + ;; +esac + + ## Simple debug message to valid current variables + debug_message "is_proc_absent − \ +procs running (with the pattern: ${RED}${local_proc_pattern}${COLOR_DEBUG}) on the current host: ${RED}${local_count_proc_pattern}${COLOR_DEBUG}." + + return "${return_proc_absent}" + +} +# }}} +is_proc_running() { # {{{ + + local_proc_pattern="${1}" + + local_count_proc_pattern="$(pgrep -f -- "${local_proc_pattern}" | wc -l)" + + case "${local_count_proc_pattern}" in + 0 ) ## No procs related to this pattern are running + return_proc_running="1" + ;; + * ) ## At least one proc seems running + return_proc_running="0" + ;; +esac + + ## Simple debug message to valid current variables + debug_message "is_proc_running − \ +procs running (with the pattern: ${RED}${local_proc_pattern}${COLOR_DEBUG}) on the current host: ${RED}${local_count_proc_pattern}${COLOR_DEBUG}." + + return "${return_proc_running}" + +} +# }}} + +main() { # {{{ + + ## Define all vars + define_vars + + ## If MPV with an IPS-socket is running {{{ + ### AND Send multimedia command to MPV sub-script + ### AND exit 0 + is_proc_running "${MPV_PROC_REGEXP}" \ + && debug_message "Try to send ${RED}${MULTIMEDIA_COMMAND}${COLOR_DEBUG} to ${RED}MPV${COLOR_DEBUG}." \ + && mpv.controller.sh --command "${MULTIMEDIA_COMMAND}" \ + && exit 0 + ## }}} + ## If kodi is running {{{ + ### AND Send multimedia command to Kodi sub-script + ### AND exit 0 + is_proc_running "${KODI_PROC_REGEXP}" \ + && debug_message "Try to send ${RED}${MULTIMEDIA_COMMAND}${COLOR_DEBUG} to ${RED}Kodi${COLOR_DEBUG}." \ + && kodi.controller.sh --command "${MULTIMEDIA_COMMAND}" \ + && exit 0 + ## }}} + ## If mpd is running {{{ + ### AND Send multimedia command to MPD sub-script + ### AND exit 0 + is_proc_running "${MPD_PROC_REGEXP}" \ + && debug_message "Try to send ${RED}${MULTIMEDIA_COMMAND}${COLOR_DEBUG} to ${RED}MPD${COLOR_DEBUG}." \ + && mpd.controller.sh --command "${MULTIMEDIA_COMMAND}" \ + && exit 0 + ## }}} + ## If mpd is not running {{{ + ### AND Start it with user's systemd + ### AND exit 0 + is_proc_absent "${MPD_PROC_REGEXP}" \ + && debug_message "Start default player ${RED}mpd with systemd${COLOR_DEBUG}." \ + && systemctl --user start mpd.service \ + && exit 0 + ## }}} + +} +# }}} + +# Manage arguments # {{{ +# This code can't be in a function due to argument management + +if [ ! "${NBARGS}" -eq "0" ]; then + + manage_arg="0" + + ## If the first argument is not an option + if ! printf -- '%s' "${1}" | grep -q -E -- "^-+"; + then + ## Use it as default multimedia command + MULTIMEDIA_COMMAND="${1}" + fi + + # Parse all options (start with a "-") one by one + while printf -- '%s' "${1}" | grep -q -E -- "^-+"; do + + case "${1}" in + -c|--command ) ## Define MULTIMEDIA_COMMAND + ## Move to the next argument + shift + ## Define var + readonly MULTIMEDIA_COMMAND="${1}" + ;; + -d|--debug ) ## debug + DEBUG=0 + ;; + -h|--help ) ## help + usage + ## Exit after help informations + exit 0 + ;; + * ) ## unknow option + printf '%b\n' "${RED}Invalid option: ${1}${RESET}" + printf '%b\n' "---" + usage + exit 1 + ;; + esac + + debug_message "Arguments management − \ +${RED}${1}${COLOR_DEBUG} option|command managed." + + ## Move to the next argument + shift + manage_arg=$((manage_arg+1)) + + done + + debug_message "Arguments management − \ +${RED}${manage_arg}${COLOR_DEBUG} argument(s) successfully managed." +else + debug_message "Arguments management − \ +No arguments/options to manage." +fi + +# }}} + +main + +exit 255