112 lines
4.2 KiB
Bash
Executable File
112 lines
4.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Behavior:
|
|
# A qutebrowser userscript that plays Twitch, YouTube or Vimeo videos in Kodi via its
|
|
# API.
|
|
#
|
|
# Requirements:
|
|
# awk
|
|
# bash
|
|
# curl
|
|
#
|
|
# Kodi setup:
|
|
# Settings -> Services -> Control
|
|
# enable 'Allow remote control via HTTP'
|
|
# set Username and Password
|
|
# enable 'Allow remote control from applications on this system'
|
|
# Optional yet recommended, setup SSL within Kodi over via a proxy webserver
|
|
#
|
|
# userscript setup:
|
|
# create ~/.config/qutebrowser/kodi_rc with host and authentication information like:
|
|
#
|
|
# HOST="http://127.0.0.1:8080"
|
|
# or
|
|
# HOST="https://kodi.example.com"
|
|
#
|
|
# AUTH="user:password"
|
|
# or
|
|
# AUTH="bas64authenticationinformation"
|
|
#
|
|
# The base64 authentication is the output of
|
|
# `echo -ne "user:password" |base64 --wrap 0`
|
|
# reminder base64 is not encryption
|
|
#
|
|
# For vim users you might want to add '# vim: set nospell filetype=bash' to the
|
|
# kodi_rc file.
|
|
#
|
|
# qutebrowser setup:
|
|
# in ~/.config/qutebrowser/config.py add something like
|
|
#
|
|
# to send video link via hints:
|
|
# config.bind('X', 'hint links userscript kodi')
|
|
# to send current URL:
|
|
# config.bind('X', 'spawn --userscript kodi')
|
|
#
|
|
# troubleshooting:
|
|
# Errors detected within this userscript with have an exit of 231. All other exit
|
|
# codes will come from curl or awk. To test that the kodi_rc file is set up
|
|
# correctly, run the following command. It will display a 'It works!' notification within Kodi.
|
|
#
|
|
# source ~/.config/qutebrowser/kodi_rc ; curl --request POST "$HOST"/jsonrpc --header "Authorization: Basic $AUTH" --header "Content-Type: application/json" --data '{"id":1,"jsonrpc":"2.0","method":"GUI.ShowNotification","params":{"title":"It works!","message":"both HOST and AUTH are correct"}}'
|
|
#
|
|
# In case you miss the notification in Kodi the successful response is:
|
|
#
|
|
# {"id":1,"jsonrpc":"2.0","result":"OK"}
|
|
#
|
|
# Note, curl will display errors for some problems, but not all.
|
|
|
|
if [[ -z "$QUTE_FIFO" ]] ; then
|
|
echo "This script is designed to run as a qutebrowser userscript, not as a standalone script."
|
|
exit 231
|
|
fi
|
|
|
|
# configuration loading adapted from the password_fill userscript
|
|
QUTE_CONFIG_DIR=${QUTE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/qutebrowser/}
|
|
KODI_CONFIG=${PWFILL_CONFIG:-${QUTE_CONFIG_DIR}/kodi_rc}
|
|
if [[ -f "$KODI_CONFIG" ]] ; then
|
|
# shellcheck source=/dev/null
|
|
source "$KODI_CONFIG"
|
|
if [[ -z "$HOST" || -z "$AUTH" ]] ; then
|
|
echo "message-error 'HOST and/or AUTH not set in $KODI_CONFIG'" > "$QUTE_FIFO"
|
|
exit 231
|
|
fi
|
|
else
|
|
echo "message-error '$KODI_CONFIG not found'" > "$QUTE_FIFO"
|
|
exit 231
|
|
fi
|
|
|
|
# get real URL from twitter links
|
|
if [[ "$QUTE_URL" =~ ^https:\/\/t\.co ]] ; then
|
|
QUTE_URL=$(curl -o /dev/null --silent --head --write-out '%{redirect_url}' "$QUTE_URL" )
|
|
fi
|
|
|
|
# regex from https://github.com/dirkjanm/firefox-send-to-xbmc/blob/master/webextension/main.js
|
|
if [[ "$QUTE_URL" =~ ^.*twitch.tv\/([a-zA-Z0-9_]+)$ ]] ; then
|
|
NAME="${BASH_REMATCH[1]}"
|
|
JSON='{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"plugin://plugin.video.twitch/?mode=play&channel_name='$NAME'"}},"id":"2"}'
|
|
|
|
elif [[ "$QUTE_URL" =~ ^.*twitch.tv\/videos\/([0-9]+)$ ]] ; then
|
|
NAME="${BASH_REMATCH[1]}"
|
|
JSON='{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"plugin://plugin.video.twitch/?mode=play&video_id='$NAME'"}},"id":"2"}'
|
|
|
|
elif [[ "$QUTE_URL" =~ ^.*vimeo.com\/([0-9]+) ]] ; then
|
|
NAME="${BASH_REMATCH[1]}"
|
|
JSON='{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"plugin://plugin.video.vimeo/play/?video_id='$NAME'"}},"id":"2"}'
|
|
|
|
elif [[ "$QUTE_URL" =~ ^.*youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=([^#\&\?]*).* ]] ; then
|
|
NAME="${BASH_REMATCH[1]}"
|
|
JSON='{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"plugin://plugin.video.youtube/play/?video_id='$NAME'"}},"id":"2"}'
|
|
fi
|
|
|
|
if [[ "$JSON" ]] ; then
|
|
curl \
|
|
--request POST "$HOST"/jsonrpc \
|
|
--header "Authorization: Basic $AUTH" \
|
|
--header "Content-Type: application/json" \
|
|
--data "$JSON" \
|
|
--silent > /dev/null
|
|
else
|
|
URL=$(echo "$QUTE_URL" |awk -F/ '{print $3}')
|
|
echo "message-warning 'kodi userscript does not support this $URL'" > "$QUTE_FIFO"
|
|
fi
|