#!/usr/bin/env bash # # Behavior # Userscript for qutebrowser which casts the url passed in $1 to the default # ChromeCast device in the network using the program `castnow` # # Usage # You can launch the script from qutebrowser as follows: # spawn --userscript ${PATH_TO_FILE} {url} # # Then, you can control the chromecast by launching the simple command # `castnow` in a shell which will connect to the running castnow instance. # # For stopping the script, issue the command `pkill -f castnow` which would # then let the rest of the userscript execute for cleaning temporary file. # # Thanks # This userscript borrows Thorsten Wißmann's javascript code from his `mpv` # userscript. # # Dependencies # - castnow, https://github.com/xat/castnow # # Author # Simon Désaulniers if [ -z "$QUTE_FIFO" ] ; then cat 1>&2 <&2 else echo "message-$cmd '${msg//\'/\\\'}'" >> "$QUTE_FIFO" fi } js() { cat < The video is being cast on your ChromeCast device.

In order to restore this particular video click here.

"; replacement.style.position = "relative"; replacement.style.zIndex = "100003000000"; replacement.style.fontSize = "1rem"; replacement.style.textAlign = "center"; replacement.style.verticalAlign = "middle"; replacement.style.height = "100%"; replacement.style.background = "#101010"; replacement.style.color = "white"; replacement.style.border = "4px dashed #545454"; replacement.style.padding = "2em"; replacement.style.margin = "auto"; App.all_replacements[i] = replacement; App.backup_videos[i] = video; video.parentNode.replaceChild(replacement, video); } function restore_video(obj, index) { obj = App.all_replacements[index]; video = App.backup_videos[index]; console.log(video); obj.parentNode.replaceChild(video, obj); } /** force repainting the video, thanks to: * http://web.archive.org/web/20151029064649/https://martinwolf.org/2014/06/10/force-repaint-of-an-element-with-javascript/ */ var siteHeader = document.getElementById('header'); siteHeader.style.display='none'; siteHeader.offsetHeight; // no need to store this anywhere, the reference is enough siteHeader.style.display='block'; EOF } printjs() { js | sed 's,//.*$,,' | tr '\n' ' ' } echo "jseval -q $(printjs)" >> "$QUTE_FIFO" tmpdir=$(mktemp -d) file_to_cast=${tmpdir}/qutecast program_=$(command -v castnow) if [[ "${program_}" == "" ]]; then msg error "castnow can't be found..." exit 1 fi # kill any running instance of castnow pkill -f "${program_}" # start youtube download in stream mode (-o -) into temporary file youtube-dl -qo - "$1" > "${file_to_cast}" & ytdl_pid=$! msg info "Casting $1" >> "$QUTE_FIFO" # start castnow in stream mode to cast on ChromeCast tail -F "${file_to_cast}" | ${program_} - # cleanup remaining background process and file on disk kill ${ytdl_pid} rm -rf "${tmpdir}"