scripts/youtube.embed

212 lines
4.8 KiB
Plaintext
Raw Normal View History

#!/bin/sh
# Vars {{{
readonly PROGNAME=$(basename "${0}")
readonly PROGDIR=$(readlink -m $(dirname "${0}"))
readonly ARGS="${*}"
readonly NBARGS="${#}"
[ -z "${DEBUG}" ] && DEBUG=0
## Export DEBUG for sub-script
export DEBUG
## Colors
readonly PURPLE='\033[1;35m'
readonly RED='\033[0;31m'
readonly RESET='\033[0m'
readonly COLOR_DEBUG="${PURPLE}"
# }}}
usage() { # {{{
cat <<- EOF
usage: $PROGNAME
Try to open the given Youtube URL in embed mode in Browser
EXAMPLES:
- Try with GhostBuster song
${PROGNAME} https://www.youtube.com/watch?v=_0SeGAi3II8
OPTIONS:
-d,--debug
Enable debug messages.
-h,-help
Print this help message.
-u,-url
Youtube URL to use.
EOF
}
# }}}
define_vars() { # {{{
## Test if BROWSER is already defined (by parent script,…)
[ -z "${BROWSER}" ] && BROWSER="qutebrowser"
YOUTUBE_EMBED_URL_BASE="https://www.youtube.com/embed/"
## ID is empty by default
YOUTUBE_VIDEO_ID=""
}
# }}}
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}"
return 0
}
# }}}
error_message() { # {{{
local_error_message="${1}"
local_error_code="${2}"
## Print message if DEBUG is enable (=0)
[ "${DEBUG}" -eq "0" ] && printf '%b\n' "ERROR ${PROGNAME}: ${RED}${local_error_message}${RESET}"
exit "${local_error_code:=66}"
}
# }}}
is_youtube_url() { # {{{
local_youtube_url="${1}"
## By default it's not a valid URL
return_is_youtube_url="1"
if printf -- '%s' "${local_youtube_url}" | grep --quiet --ignore-case --extended-regexp -- "youtube.com.*v="; then
debug_message "is_youtube_url \
The given argument seems to be a Youtube URL : ${local_youtube_url}."
return_is_youtube_url="0"
else
debug_message "is_youtube_url \
Verify that given URL really comes from Youtube with an ID (v=…) : ${local_youtube_url}."
fi
return "${return_is_youtube_url}"
}
# }}}
extract_video_id() { # {{{
local_youtube_url="${1}"
## By default ID is not valid
return_extract_video_id="1"
local_youtube_video_id=$(printf -- '%s' "${local_youtube_url}" | sed -e 's;.*youtube.com.*v=\(.*\);\1;' -e 's;&.*;;')
#local_youtube_video_id=""
## If an ID was found
if [ -n "${local_youtube_video_id}" ]; then
debug_message "extract_video_id \
successfully extract Youtube video ID : ${local_youtube_video_id}."
YOUTUBE_VIDEO_ID="${local_youtube_video_id}"
return_extract_video_id="0"
else
debug_message "extract_video_id \
Error while extracting video ID (${local_youtube_video_id}), please check the URL."
fi
return "${return_extract_video_id}"
}
# }}}
open_in_browser() { # {{{
local_url="${1}"
debug_message "open_in_browser \
Try to open ${RED}${local_url}${COLOR_DEBUG} in ${BROWSER}."
sh -c "${BROWSER} ${local_url}"
}
# }}}
main() { # {{{
## Define all vars
define_vars
## Verify given argument
is_youtube_url "${YOUTUBE_URL}" \
|| exit 2
## Try to extract the video ID
extract_video_id "${YOUTUBE_URL}" \
|| exit 3
## Try to open embed version in browser
open_in_browser "${YOUTUBE_EMBED_URL_BASE}${YOUTUBE_VIDEO_ID}"
}
# }}}
# Manage arguments # {{{
## If there is argument(s)
if [ ! "${NBARGS}" -eq "0" ]; then
## If the first argument is not an option
if ! printf -- '%s' "${1}" | grep -q -E -- "^-+";
then
## Use this argument for Youtube URL
YOUTUBE_URL="${1}"
## Switch to the next argument
shift
manage_arg=$((manage_arg+1))
fi
manage_arg="0"
# Parse all options (start with a "-") one by one
while printf -- '%s' "${1}" | grep -q -E -- "^-+"; do
case "${1}" in
-d|--debug ) ## Enable debug mode
## Enable DEBUG
DEBUG="0"
;;
-h|--help ) ## help
usage
## Exit after help informations
exit 0
;;
-u|--url ) ## URL
## Move to the next argument
shift
## Set value to YOUTUBE_URL
YOUTUBE_URL="${1}"
;;
* ) ## 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 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
usage
error_message "Expect at least one argument (the Youtube URL)."
fi
# }}}
main
exit 255