diff --git a/youtube.embed b/youtube.embed new file mode 100755 index 0000000..b22dcd4 --- /dev/null +++ b/youtube.embed @@ -0,0 +1,211 @@ +#!/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