This repository has been archived by the owner on May 2, 2024. It is now read-only.
forked from zzeneg/docker-mergesrt
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmergesrt.sh
165 lines (151 loc) · 6.89 KB
/
mergesrt.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
159
160
161
162
163
164
165
#!/bin/sh
sendToWebhook() {
if [ -n "$WEBHOOK_URL" ] && [ -n "$WEBHOOK_TEMPLATE" ]; then
data=$(eval "echo \"$WEBHOOK_TEMPLATE\"")
curl -s -S -X POST -d "$data" -H "Content-Type: application/json" $WEBHOOK_URL
fi
}
# MKVMERGE COMMANDS -------------------------------------------------------------------
merge() {
output=$1
input=$2
import=$3
ext=$4
type=$5
lang=$6
case $ext in
srt|ass)
if [ "$type" == "sdh" ] || [ "$type" == "hi" ] || [ "$type" == "cc" ]; then
mkvmerge -o "$output" "$input" --language 0:$lang --track-name 0:$type --hearing-impaired-flag 0:true "$import"
elif [ "$type" == "forced" ]; then
mkvmerge -o "$output" "$input" --language 0:$lang --track-name 0:$type --forced-display-flag 0:true "$import"
else
mkvmerge -o "$output" "$input" --language 0:$lang --track-name 0:$lang "$import"
fi
return
;;
idx)
mkvmerge -o "$output" "$input" "$import"
return
;;
esac
}
# PROCESS FILE INFORMATION HERE ---------------------------------------------------------
process() {
IMPORT_FILE=$1
echo "--------------------------- START PROCESS --------------------------"
echo -e "\e[1;34mImported file: $IMPORT_FILE\e[m"
# PARSE FILE COMPONENTS ------------------------------------------------------------
EXT=$(echo "$IMPORT_FILE" | rev | cut -d'.' -f1 | rev)
echo -e "\e[1;34mExtension: $EXT\e[m"
case "$EXT" in
srt|ass)
# Check file endings against a ISO 639-1 and ISO 639-2 list to determine if valid LANG
F2="$(curl -s -L https://datahub.io/core/language-codes/r/1.csv | grep -ow $(echo "$IMPORT_FILE" | rev | cut -d'.' -f2 | rev))"
F3="$(curl -s -L https://datahub.io/core/language-codes/r/1.csv | grep -ow $(echo "$IMPORT_FILE" | rev | cut -d'.' -f3 | rev))"
# Check Language
if [ -n "$F2" ] && [ -z "$F3" ]; then # Check if first valid after .EXT
LANG=$(echo "$IMPORT_FILE" | rev | cut -d'.' -f2 | rev)
TYPE=$(echo "$IMPORT_FILE" | rev | cut -d'.' -f3 | rev)
TYPE_LOC=2
elif [ -n "$F3" ] && [ -z "$F2" ]; then # Check if second valid after .EXT
LANG=$(echo "$IMPORT_FILE" | rev | cut -d'.' -f3 | rev)
TYPE=$(echo "$IMPORT_FILE" | rev | cut -d'.' -f2 | rev)
TYPE_LOC=1
elif [ -n "$F2" ] && [ -n "$F3" ]; then # Check if both valid (edge case of using hi)
# Use hi as TYPE (should help prevent Hindu 2 lang code issues)
if [ $(echo "$IMPORT_FILE" | rev | cut -d'.' -f2 | rev) == 'hi' ]; then
LANG=$(echo "$IMPORT_FILE" | rev | cut -d'.' -f3 | rev)
TYPE=$(echo "$IMPORT_FILE" | rev | cut -d'.' -f2 | rev)
TYPE_LOC=1
else
LANG=$(echo "$IMPORT_FILE" | rev | cut -d'.' -f2 | rev)
TYPE=$(echo "$IMPORT_FILE" | rev | cut -d'.' -f3 | rev)
TYPE_LOC=2
fi
else
echo -e "\e[0;31mCould not determine file language, skipping\e[m"
return
fi
echo -e "\e[1;34mSubtitle language: $LANG\e[m"
#Check TYPE
if [ "$TYPE" == 'sdh' ] || [ "$TYPE" == 'forced' ] || [ "$TYPE" == 'hi' ] || [ "$TYPE" == 'cc' ]; then
echo -e "\e[1;34mSubtitle type: $TYPE\e[m"
else
TYPE_LOC=0
fi
# Generate Correct File Name
case $TYPE_LOC in
0)
FILE_NAME=$(echo "$IMPORT_FILE" | sed 's|\.'"$LANG"'\.'"$EXT"'||')
;;
1)
FILE_NAME=$(echo "$IMPORT_FILE" | sed 's|\.'"$LANG"'\.'"$TYPE"'\.'"$EXT"'||')
;;
2)
FILE_NAME=$(echo "$IMPORT_FILE" | sed 's|\.'"$TYPE"'\.'"$LANG"'\.'"$EXT"'||')
;;
esac
;;
idx)
FILE_NAME=$(echo "$IMPORT_FILE" | sed 's|\.'"$EXT"'||')
;;
esac
echo -e "\e[1;34mFile name: $FILE_NAME\e[m"
FILE_EXT='.mkv'
VIDEO_FILE=$FILE_NAME$FILE_EXT
# CHECK IF VIDEO EXISTS -------------------------------------------------------------
if [ ! -f "$VIDEO_FILE" ]; then
FILE_EXT='.mp4'
VIDEO_FILE=$FILE_NAME$FILE_EXT
fi
if [ ! -f "$VIDEO_FILE" ]; then
echo -e "\e[0;31mFile $VIDEO_FILE does not exist, skipping\e[m"
return
fi
echo -e "\e[1;32mSTARTING MERGE\e[m"
MERGE_FILE=$FILE_NAME'.merge'
CURR_SUB_COUNT="$(mkvmerge --identify "$VIDEO_FILE" | grep -c 'subtitle')" # Count the number of subs in the pre processed file
merge "$MERGE_FILE" "$VIDEO_FILE" "$IMPORT_FILE" "$EXT" "$TYPE" "$LANG"
# When doing large batches sometimes the merge does not seem to work correctly.
# this is used to keep running the merge until the file has detected a new subtitle.
NEXT_SUB_COUNT="$(mkvmerge --identify "$MERGE_FILE" | grep -c 'subtitle')" # Count the number of subs in the post processed file
while [ "$CURR_SUB_COUNT" -gt "$NEXT_SUB_COUNT" ]
do
echo -e "\e[0;31mSubtitle is missing from merge file. Rerunning merge\e[m"
rm "$MERGE_FILE"
merge "$MERGE_FILE" "$VIDEO_FILE" "$IMPORT_FILE" "$EXT" "$TYPE" "$LANG"
NEXT_SUB_COUNT="$(mkvmerge --identify "$MERGE_FILE" | grep -c 'subtitle')"
done
RESULT=$?
# CLEAN UP --------------------------------------------------------------------------
if [ "$RESULT" -eq "0" ] || [ "$RESULT" -eq "1" ]; then
RESULT=$([ "$RESULT" -eq "0" ] && echo -e "\e[1;32mMERGE SUCCEEDED\e[m" || echo -e "\e[1;33mMERGE COMPLETED WITH WARNINGS\e[m")
echo "$RESULT"
echo "Delete $IMPORT_FILE"
rm "$IMPORT_FILE"
if [ "$EXT" == 'idx' ]; then
rm "$FILE_NAME.sub"
fi
echo "Delete $VIDEO_FILE"
rm "$VIDEO_FILE"
echo "Rename $MERGE_FILE to $FILE_NAME$FILE_EXT"
mv "$MERGE_FILE" "$FILE_NAME$FILE_EXT"
echo "---------------------------- END PROCESS ---------------------------"
else
echo -e "\e[0;31mMERGE FAILED\e[m"
fi
sendToWebhook
}
DATA_DIR='/data'
# LOOK FOR FILES ON STARTUP -------------------------------------------------------------
find "$DATA_DIR" -type f -name "*.srt" -o -name "*.idx" -o -name "*.ass" |
while read file; do
process "$file"
done
# MONITOR FOR NEW FILES IN DIR ----------------------------------------------------------
inotifywait -m -r $DATA_DIR -e create -e moved_to --include '(.srt|.idx|.ass)' --format '%w%f' |
while read file; do
echo "The file '$file' was created/moved"
process "$file"
done