-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplaycli.sh
executable file
·158 lines (153 loc) · 4.27 KB
/
playcli.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#!/bin/bash
echo 'Author: ShouChen' >&2
echo 'Version: v0.13'
echo '' >&2
fun_print_help() {
echo 'Usage:' >&2
echo ' playcli.sh <your vedio> [offset_seconds [speed]]' >&2
echo '' >&2
echo 'Example:' >&2
echo ' playcli.sh 1.mkv' >&2
echo ' playcli.sh 1.mkv 114' >&2
echo ' playcli.sh 1.mkv 514 10' >&2
echo '' >&2
echo 'Github: https://github.com/ShouChenICU/playcli' >&2
echo '' >&2
}
if [[ $# == 0 ]];
then
echo -e "Invalid args!\n" >&2
fun_print_help
exit -1
elif [[ ! -f $1 ]];
then
echo -e "File not found!\n" >&2
fun_print_help
exit -1
fi
type 'ffmpeg' >/dev/null 2>&1
if [[ $? != 0 ]];
then
echo "ffmpeg not found! Please install ffmpeg in your system" >&2
exit -2
fi
type 'jp2a' >/dev/null 2>&1
if [[ $? != 0 ]];
then
echo "jp2a not found! Please install jp2a in your system" >&2
exit -2
fi
# Init variables
export COLORTERM=truecolor
FILE=$1
START_OFFSET=0
if [[ $# > 1 && `echo "scale=3; $2 > 0" | bc` == 1 ]];
then
START_OFFSET=`printf '%.3f' $2`
fi
SPEED=1
if [[ $# > 2 && `echo "scale=3; $3 != 0" | bc` == 1 ]];
then
SPEED=`printf '%.3f' $3`
fi
DURATION=`ffprobe -v quiet -show_format "$FILE" | awk -F '=' '/^duration/{print $2}'`
DURATION=`printf '%.3f' $DURATION`
TIME_START=`date +%s.%N`
TIME_OFFSET=0
WIN_SIZE=(`stty size | tr "[:space:]" "\n"`)
# Calculate time offset
fun_calc_time_offset() {
TIME_NOW=`date +%s.%N`
TIME_OFFSET=`echo "scale=3; ($TIME_NOW - $TIME_START) * $SPEED + $START_OFFSET" | bc`
TIME_OFFSET=`printf '%.3f' $TIME_OFFSET`
}
# Render frame buffer
fun_render() {
WIN_SIZE=(`stty size | tr "[:space:]" "\n"`)
FRAME_BUFFER=`ffmpeg -v quiet -ss $TIME_OFFSET -i "$FILE" -f apng -an -c:v apng -frames 1 - | jp2a --color --fill --chars=" " --size=${WIN_SIZE[1]}"x"$[${WIN_SIZE[0]} - 1] -`
}
# Setting timeline style
if [[ "$TIMELINE_STYLE" == 'trans' ]];
then
# Trans style
fun_print_timeline() {
TIMELINE=`echo "\033[36m$TIME_OFFSET\033[0ms / \033[33m$DURATION\033[0ms"`
local len=$[${#TIMELINE} - 30]
local str_len=`echo "scale=0;(${WIN_SIZE[1]} - $len - 4) * $TIME_OFFSET / $DURATION" | bc`
local left=''
local left_ts=''
for((i=0; i < str_len; i++))
do
case `echo "$i % 6" | bc` in
0)
local ch='\033[38;5;45m='
;;
1)
local ch='\033[38;5;218m='
;;
2)
local ch='\033[38;5;231m='
;;
3)
local ch='\033[38;5;218m='
;;
4)
local ch='\033[38;5;45m='
;;
5)
local ch='\033[38;5;231m='
;;
esac
local left_ts="$left_ts$ch"
local left="$left="
done
local str_len=$[${WIN_SIZE[1]} - $len - 5 - ${#left}]
local right=''
for((i=0; i < str_len; i++))
do
local right="$right-"
done
echo -en "$TIMELINE [$left_ts\033[32m@\033[0m$right]"
}
else
# Clasic style
fun_print_timeline() {
TIMELINE=`echo "\033[36m$TIME_OFFSET\033[0ms / \033[33m$DURATION\033[0ms"`
local len=$[${#TIMELINE} - 30]
local str_len=`echo "scale=0;(${WIN_SIZE[1]} - $len - 4) * $TIME_OFFSET / $DURATION" | bc`
local left=''
for((i=0; i < str_len; i++))
do
local left="$left="
done
local str_len=$[${WIN_SIZE[1]} - $len - 5 - ${#left}]
local right=''
for((i=0; i < str_len; i++))
do
local right="$right-"
done
echo -en "$TIMELINE [\033[32m$left\033[32m@\033[0m$right]"
}
fi
echo 'Playing...'
fun_calc_time_offset
if [[ "$AUDIO_ENABLE" != '0' && $SPEED == 1 ]];
then
ffplay -v quiet -nodisp -sn -vn -ss $START_OFFSET -autoexit "$FILE" &
PID_AUDIO=$!
fi
while [ `echo "scale=3; $DURATION >= $TIME_OFFSET" | bc` -eq 1 ]
do
fun_render
echo -en "\033[0;0H"
echo "$FRAME_BUFFER"
fun_print_timeline
fun_calc_time_offset
if [[ `echo "scale=3; $TIME_OFFSET < 0" | bc` == 1 ]];
then
break
fi
done
wait
echo ''
echo 'Play done.'