#!/bin/sh # # Multimedia wrapper for various file formats # cmd=$(basename $0) magic=/usr/share/misc/magic-mm dsp_progs=$(cat ~mats/.dsprc) kill_mmwrapper() { local pst pids p sig pst=$(ps xao pid,command | \ egrep '^ *[0-9]+ /bin/sh .*(mmwrapper|play_sid|play_ym)') if [ -n "$pst" ]; then pids=$(echo "$pst" | sed -E 's/^ *([0-9]+).*$/\1/') for p in $pids; do if [ $p -ne $$ ]; then kill $p >/dev/null 2>&1; fi done fi for p in $dsp_progs; do sig=; if [ "$p" = "mplayer" -o "$p" = "x64" ]; then sig="-9"; fi killall $sig $p >/dev/null 2>&1 done nawk 'BEGIN { while(("chkdsp /dev/dsp" | getline) > 0) { if ($0 == 1) break } }' # mixer pcm 76 >/dev/null 2>&1 } do_mp3() { kill_mmwrapper echo playing "$@" ximp3 -l "$@" } do_xmms() { kill_mmwrapper xmms "$@" /dev/null 2>&1 } do_midi() { kill_mmwrapper while tim -id "$@"; do :; done } do_abc() { abc2midi "$1" -o /tmp/abctmp.mid do_midi /tmp/abctmp.mid } do_mod() { local oldvol kill_mmwrapper # mikmod -q -f 44100 -i -hq "$@" mixer pcm 85 xmms "$@" } do_sid() { kill_mmwrapper sidplay -f48000 -16 "$@" } do_ym() { kill_mmwrapper stsoundc "$@" } do_wav() { kill_mmwrapper vplay "$@" } do_au() { kill_mmwrapper sox "$@" -t ossdsp /dev/dsp } do_real() { kill_mmwrapper realplay "$@" } do_image() { local scale scale=1 if [ -n "$s2_flag" ]; then scale=2 elif [ -n "$s3_flag" ]; then scale=3 fi # showimg -z $scale "$@" showimg "$@" } do_movie() { if [ -z "$2" ]; then kill_mmwrapper; fi if [ -n "$s2_flag" ]; then size="-xy 2" elif [ -n "$s3_flag" ]; then size="-xy 3" elif [ -n "$fs_flag" ]; then size="-fs" fi mplayer $size -format 16 "$@" } do_anim() { if [ -n "$s2_flag" ]; then size="+Ss2.0" elif [ -n "$s3_flag" ]; then size="+Ss3.0" elif [ -n "$fs_flag" ]; then size="+Ss4.0" fi xanim +Av80 +f $size "$@" } do_ps() { psview "$@" } do_djvu() { /usr/compat/linux/usr/bin/djview -fs "$@" } do_zip() { local oifs slp if [ -z "$tmpdir" ]; then tmpdir=$(mktemp -d ~/.$cmd.XXXXXX) || exit 1 fi unzip -o -d $tmpdir "$@" slp= oifs="$IFS" IFS=" " for f in $(find $tmpdir -type f); do if [ "$IFS" != "$oifs" ]; then IFS="$oifs"; fi if [ -n "$slp" ]; then sleep 1; fi do_file "$f" slp=1 done rm -rf $tmpdir/*; rm -rf $tmpdir/.* } do_lha() { local oifs slp if [ -z "$tmpdir" ]; then tmpdir=$(mktemp -d ~/.$cmd.XXXXXX) || exit 1 fi lha eqfw=$tmpdir "$@" slp= oifs="$IFS" IFS=" " for f in $(find $tmpdir -type f); do if [ "$IFS" != "$oifs" ]; then IFS="$oifs"; fi if [ -n "$slp" ]; then sleep 1; fi do_file "$f" slp=1 done rm -rf $tmpdir/*; rm -rf $tmpdir/.* } do_file() { local ts t ext f f=$1 # Get the real path if called by Mozilla if [ -n "$MOZILLA_FIVE_HOME" ]; then case "$f" in /usr/tmp/*) f="/usr/compat/linux$f" esac fi case "$f" in # URL http://*) if [ -n "$urltype" ]; then if [ -n "$user" -a -n "$pass" ]; then f="http://$user:$pass@${f#http://}" fi case "$urltype" in movie) do_movie "$f";; movie-nk) do_movie "$f" nokill;; mp3) do_xmms "$f";; esac fi return;; # PNG image *.[Pp][Nn][Gg]) do_image "$f" return;; # JBIG image *.[Jj][Bb][Gg]) do_image "$f" return;; esac ts="$(file -m $magic "$f")" t="${ts#*: }" case "$t" in # Images GIF\ image\ data* | JPEG\ image\ data* | PC\ bitmap\ data* | \ IFF\ data,\ ILBM* | TIFF\ image\ data* | Targa\ image\ data* | \ Sun\ raster\ image\ data* | RLE\ image\ data* | \ Kodak\ Photo\ CD\ image\ pack\ file* | \ Netpbm\ PBM* | Netpbm\ PGM* | Netpbm\ PPM* | \ GIMP\ XCF\ image\ data* | JPEG\ 2000\ image\ data*) do_image "$f";; X\ pixmap\ image\ *) sxpm "$f";; # Sounds MP3*) do_xmms "$f";; Standard\ MIDI\ data*) do_midi "$f";; RIFF\ *,\ WAVE\ audio*) do_wav "$f";; Sun/NeXT\ audio\ data*) do_au "$f";; RealAudio*) do_real "$f";; 4-channel\ Protracker\ module\ sound\ data* | \ 4-channel\ Startracker\ module\ sound\ data* | \ 4-channel\ Fasttracker\ module\ sound\ data* | \ 6-channel\ Fasttracker\ module\ sound\ data* | \ 8-channel\ Fasttracker\ module\ sound\ data* | \ Fasttracker\ II\ module\ sound\ data* | \ 8-channel\ Oktalyzer\ module\ sound\ data* | \ Screamtracker\ 2\ module\ sound\ data* | \ ScreamTracker\ III\ Module\ sound\ data* | \ Impulse\ Tracker\ module\ sound\ data* | \ extended\ 669\ module\ data* | \ Farandole\ Module\ sound\ data* | \ ULT\(imate\)\ Module\ sound\ data* | \ MultiTracker\ Module\ sound\ file*) do_mod "$f";; PlaySID*) do_sid "$f";; YM2149\ chip\ music*) do_ym "$f";; # Movies and animations MPEG\ system\ stream\ data* | RIFF\ *,\ AVI* | Microsoft\ ASF* | \ Apple\ QuickTime\ movie*) do_movie "$f";; MPEG\ video\ stream\ data*) do_movie "$f" nokill;; FLI\ file* | FLC\ file*) do_movie "$f" nokill;; IFF\ data,\ ANIM*) do_anim "$f";; RealMedia*) do_real "$f";; # PostScript, PDF PostScript\ document\ text* | PDF\ document*) do_ps "$f";; # Archives Zip\ archive\ data*) do_zip "$f";; LHa\ * | LHarc\ *) do_lha "$f";; # Check extension for files not identified by type *) case "$f" in *.[Pp][Cc][XxCc] | *.[Mm][Aa][Cc] | *.[Pp][Ii][13] | \ *.[Xx][Bb][Mm] | *.[Xx][Pp][Mm] | *.[Pp][GgPp][Mm].[Bb][Zz]2) do_image "$f";; *.[Mm]3[Uu]|*.[Pp][Ll][Ss]) do_xmms "$f";; *.[Rr][Aa][Mm]|*.[Rr][Mm][Mm]) do_real "$f";; *.[Aa][Bb][Cc]) do_abc "$f";; *.[Pp][Ss]|*.[Ee][Pp][Ss]|*.[Aa][Ii]) do_ps "$f";; *.[Dd][Jj][Vv] | *.[Dd][Jj][Vv][Uu]) do_djvu "$f";; *) echo "mmwrapper: Couldn't determine the file type of \`$f'" >&2;; esac;; esac } cleanup() { if [ -n "$tmpdir" ]; then rm -rf $tmpdir; fi exit } usage() { echo "usage: $cmd [-2|-3|-f] [-l] file ... $cmd -t type [-u username -p password] [-2|-3|-f] [-l] URL ... $cmd -k" >&2 exit 1 } ########################################################################## while getopts ":23flt:u:p:k" c do case "$c" in 2) s2_flag=1;; 3) s3_flag=1;; f) fs_flag=1;; l) lp_flag=1;; t) urltype=$OPTARG;; u) user=$OPTARG;; p) pass=$OPTARG;; k) kl_flag=1;; :|'?') usage;; esac done if [ -n "$kl_flag" ]; then kill_mmwrapper; exit; fi shift $(($OPTIND - 1)) if [ $# -lt 1 ]; then usage; fi trap '' 1 trap 'cleanup' 2 3 15 exec >/dev/null 2>&1 slp= while :; do for f in "$@"; do if [ -n "$slp" ]; then sleep 1; fi do_file "$f" slp=1 done if [ -z "$lp_flag" ]; then break; fi done cleanup .