scripts/youtube.embed

212 lines
4.8 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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