-#!/bin/sh
-
-SELF="${0##*/}"
-
-if [ -z "$TMPDIR" ]; then
- TMPDIR=/tmp
-elif [ -d "${TMPDIR}/volatile" ]; then
- TMPDIR="${TMPDIR}/volatile"
-fi
-export TMPDIR
-TMPDIR=$(mktemp -dp "$TMPDIR" mutt.XXXXXXXXXX)
-cleanup() { cd / && notify_output && rm -rf "$TMPDIR"; }
-trap cleanup 1 2 3 4 5 6 7 8 10 11 12 13 14 15
-
-cd "$TMPDIR"
-
-notify() {
- if [ -x "$(command -v awesome-client)" ]; then
- awesome-client <<-_eof
- local naughty = require("naughty")
- naughty.notify({ preset = naughty.config.presets.low,
- title = "$3",
- text = [[stdout:
- $(sed -e 's,\",\\\",g' "$1")
- stderr:
- $(sed -e 's,\",\\\",g' "$2")]]
- })
- _eof
- fi
-}
-
-notify_output() {
- if [ -s "$TMPDIR/output.stdout" ] || [ -s "$TMPDIR/output.stderr" ]; then
- notify $TMPDIR/output.stdout $TMPDIR/output.stderr \
- "Output from mutt/$SELF on $BASENAME"
- fi
-}
-
-guess_extension() {
- python -c "import mimetypes; print(mimetypes.guess_extension('$1'))"
-}
-
-launch_viewer() {
- run-mailcap --action=view "$1":"$2" > output.stdout 2> output.stderr
-}
-
-MIMETYPE="$1"; shift
-
-get_file() {
- local t
- if [ -z "$1" ]; then
- t=$(tempfile -d . -p mutt -s $(guess_extension "$MIMETYPE"))
- cat > "$t"
- echo "$t"
- else
- t="$(echo ${1##*/} | sed -re 's![^[:alnum:],.@%^+=_-]!_!gi')"
- cp "$1" "$t"
- echo "$t"
- fi
-}
-
-case "$SELF" in
- (bgrun)
- # make a copy of the file, then launch a shell process in the background
- # to divert to run-mailcap, after which the temporary directory gets
- # cleaned up.
- FILE="$(get_file "${1:-}")"
- (
- launch_viewer "$MIMETYPE" "$FILE"
- sleep 1
- cleanup
- ) &
- trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
- ;;
- (bgrun-fifo)
- # hack to stay around until the viewer has read the file: make a fifo and
- # wait for the cat process to finish writing to it, which means that it
- # must have been consumed on the other end.
- FILE="$(get_file "${1:-}")"
- FIFO="${FILE%/*}/fifo-${FILE##*/}"
- mkfifo "$FIFO"
- cat "$FILE" > "$FIFO" &
- # For some reason, we do have to write a tempfile and cannot seem to
- # redirect stdin directly to the fifo, i.e. this does not work instead of
- # the previous three lines:
- ## cat > "$FIFO" &
- launch_viewer "$MIMETYPE" "${FIFO}"
- wait
- cleanup
- ;;
- (bgrun-delay)
- # hack to stay around for a fixed period of time after the viewer process
- # returns control to the caller, so that we can clean up. This is for
- # cases when the FIFO method doesn't work, because e.g. Firefox randomly
- # chooses it needs to read HTML files twice.
- FILE="$(get_file "${1:-}")"
- (launch_viewer "$MIMETYPE" "${FILE}") &
- (
- sleep 1m
- echo Cleaning up $TMPDIR… > $TMPDIR/output.stderr
- cleanup
- ) &
- ;;
-esac