不太习惯 macOS 上的音乐播放器,所以手工写了个脚本程序播放音乐文件。
脚本运行起来是这样的:
第一列显示音乐文件序号,第二例是音乐时长,第三例是播放时间,两列都按小时:分钟:秒显示,第四列是音乐文件名称。
音乐播放采用 ffmpeg,所以要先下载安装 ffmpeg 包。
脚本完整内容如下:
#!/bin/zsh
##### Routines ########
function hide_cursor {
echo -n -e "\033[?25l"
}
function display_cursor {
echo -n -e "\033[?25h"
}
function clear_banner {
echo
}
function display_banner {
local prefix=$1
local dt=$2
local count=100
local st=$(date +%s)
local delta="1"
while [ $delta -le $dt ]
do
banner=$(printf $prefix $(s2hms $delta))
echo -n -e "$banner"
sleep 1
count=${#banner}
echo -n -e "\r"
now=$(date +%s)
delta=$((now - st))
done
}
function hms2s {
local t=$1
local h=0
local m=0
local s=0
t=$(echo $t | awk -F '.' '{print $1}')
h=$(echo $t | awk -F ':' '{print $1}')
m=$(echo $t | awk -F ':' '{print $2}')
s=$(echo $t | awk -F ':' '{print $3}')
t=$((h*3600 + m*60 + s))
echo $t
}
function s2hms {
local t=$1
local h=$((t/3600))
local m=$(((t - h*3600)/60))
local s=$((t - h*3600 - m*60))
printf "%02d:%02d:%02d" $h $m $s
}
function playmusic {
local count=1
local num="${#@}"
local song=( )
while [ $count -le $num ]
do
song[$count]=$1
shift
let count+=1
done
count=1
while [ $count -le $num ]
do
file="${song[$count]}"
etime=$(ffprobe $file 2>&1 |grep Duration|awk -F ',' '{print $1}' | awk '{print $2}')
ffplay -autoexit -nodisp -ss 0 -t $etime -i $file > /dev/null 2>&1 &
hide_cursor
cstr=$(printf "\033[35m[ %03d ]\033[0m \033[36m%08s\033[0m \033[37m%%08s\033[0m %-025s" $count $(echo $etime|sed 's/\.[0-9]*//') "$(basename $file)")
display_banner "$cstr" `hms2s $etime`
clear_banner
wait $(jobs -l|awk '{print $3}')
display_cursor
let count+=1
sleep 2
done
}
##### Main ###########
export LC_TYPE=zh_CN.UTF-8
trap "display_cursor; exit" 2 9 15
playmusic $@