Hello
I'm writing a handler for ffmpeg, and having troubles to catch some exceptions that may occour with certain files.
In order to parse for video & subtitle maps, i've had to make the raw data easier to handle, until now this worked well, but basicly i've just been lucky...
The input data is looking like this (beeing in $TMP.info):
Stream #0:0(eng): Video: h264 (High), yuv420p, 1920x1080, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
Stream #0:1(eng): Audio: truehd, 48000 Hz, 5.1(side), s32 (default)
Stream #0:2(eng): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s
Stream #0:3(eng): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s
Stream #0:4(eng): Subtitle: hdmv_pgs_subtitle
Stream #0:5(eng): Subtitle: hdmv_pgs_subtitle
Stream #0:6(fre): Subtitle: hdmv_pgs_subtitle
Stream #0:7(spa): Subtitle: hdmv_pgs_subtitle
Stream #0:8(ger): Subtitle: hdmv_pgs_subtitle
Stream #0:9(ara): Subtitle: hdmv_pgs_subtitle
Stream #0:10(bul): Subtitle: hdmv_pgs_subtitle
Stream #0:11(cze): Subtitle: hdmv_pgs_subtitle
Stream #0:12(dan): Subtitle: hdmv_pgs_subtitle
Stream #0:13(hrv): Subtitle: hdmv_pgs_subtitle
Stream #0:14(fin): Subtitle: hdmv_pgs_subtitle
Stream #0:15(gre): Subtitle: hdmv_pgs_subtitle
Stream #0:16(heb): Subtitle: hdmv_pgs_subtitle
Stream #0:17(hin): Subtitle: hdmv_pgs_subtitle
Stream #0:18(hun): Subtitle: hdmv_pgs_subtitle
Stream #0:19(ice): Subtitle: hdmv_pgs_subtitle
Stream #0:20(nor): Subtitle: hdmv_pgs_subtitle
Stream #0:21(pol): Subtitle: hdmv_pgs_subtitle
Stream #0:22(rum): Subtitle: hdmv_pgs_subtitle
Stream #0:23(srp): Subtitle: hdmv_pgs_subtitle
Stream #0:24(slo): Subtitle: hdmv_pgs_subtitle
Stream #0:25(slv): Subtitle: hdmv_pgs_subtitle
Stream #0:26(swe): Subtitle: hdmv_pgs_subtitle
Stream #0:27(tur): Subtitle: hdmv_pgs_subtitle
Stream #0:28(rus): Subtitle: hdmv_pgs_subtitle
The mal-function parsing this input data:
listIDs() { # [VIDEO]
# Prints a basic table of stream ID CONTENT (and if found) LANG
# If VIDEO is not passed, it is assumed that $TMP.info contains the current data
[[ -z $1 ]] && \
cmd="cat \"$TMP.info\"" || \
cmd="StreamInfo \"$1\""
eval $cmd | while read strs maps kinds other;do
kind="${kinds:0:-1}"
lang="${maps:5:3}"
id="${maps:3:1}"
printf "$id \t $lang \t $kind\n"
done
}
Yes i am aware that strs
and other
are not used, but otherwise maps
and kinds
would contain to much data.
(for me to handle at least)
And then beeing processed by listIDs
it looks like:
0 eng Video
1 eng Audio
2 eng Audio
3 eng Audio
4 eng Subtitle
5 eng Subtitle
6 fre Subtitle
7 spa Subtitle
8 ger Subtitle
9 ara Subtitle
1 (bu Subtitle
1 (cz Subtitle
1 (da Subtitle
1 (hr Subtitle
1 (fi Subtitle
1 (gr Subtitle
1 (he Subtitle
1 (hi Subtitle
1 (hu Subtitle
1 (ic Subtitle
2 (no Subtitle
2 (po Subtitle
2 (ru Subtitle
2 (sr Subtitle
2 (sl Subtitle
2 (sl Subtitle
2 (sw Subtitle
2 (tu Subtitle
2 (ru Subtitle
So, i need help to:
1) get the 2 digits shown
2) where there should be 2 digits, print all 3 letters of the language, rather than a leading '('
Thank you in advance for any advice.
---------- Post updated at 23:07 ---------- Previous update was at 23:00 ----------
lol...
Right after posting, something i've just learned recently, came up in mind....
lang="${maps/*\(/}"
lang="${lang:0:-2}"
id="${maps/\(*/}"
id="${id:3}"
Did the trick.
0 eng Video
1 eng Audio
2 eng Audio
3 eng Audio
4 eng Subtitle
5 eng Subtitle
6 fre Subtitle
7 spa Subtitle
8 ger Subtitle
9 ara Subtitle
10 bul Subtitle
11 cze Subtitle
12 dan Subtitle
13 hrv Subtitle
14 fin Subtitle
15 gre Subtitle
16 heb Subtitle
17 hin Subtitle
18 hun Subtitle
19 ice Subtitle
20 nor Subtitle
21 pol Subtitle
22 rum Subtitle
23 srp Subtitle
24 slo Subtitle
25 slv Subtitle
26 swe Subtitle
27 tur Subtitle