Skip to content

Commit e50f2f2

Browse files
init
0 parents  commit e50f2f2

File tree

2 files changed

+377
-0
lines changed

2 files changed

+377
-0
lines changed

.gitignore

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
8+
# Runtime data
9+
pids
10+
*.pid
11+
*.seed
12+
*.pid.lock
13+
14+
# Directory for instrumented libs generated by jscoverage/JSCover
15+
lib-cov
16+
17+
# Coverage directory used by tools like istanbul
18+
coverage
19+
20+
# nyc test coverage
21+
.nyc_output
22+
23+
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
24+
.grunt
25+
26+
# Bower dependency directory (https://bower.io/)
27+
bower_components
28+
29+
# node-waf configuration
30+
.lock-wscript
31+
32+
# Compiled binary addons (https://nodejs.org/api/addons.html)
33+
build/Release
34+
35+
# Dependency directories
36+
node_modules/
37+
jspm_packages/
38+
39+
# TypeScript v1 declaration files
40+
typings/
41+
42+
# Optional npm cache directory
43+
.npm
44+
45+
# Optional eslint cache
46+
.eslintcache
47+
48+
# Optional REPL history
49+
.node_repl_history
50+
51+
# Output of 'npm pack'
52+
*.tgz
53+
54+
# Yarn Integrity file
55+
.yarn-integrity
56+
57+
# dotenv environment variables file
58+
.env
59+
60+
# next.js build output
61+
.next
62+
63+
#Private working folder(s)
64+
tools/
65+
olderversions/
66+
olderVersions/
67+
oldertests/
68+
olderTests/
69+
dev/
70+
junk/
71+
72+
#Thumbs.db on windows
73+
Thumbs.db

argparse.sh

Lines changed: 304 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,304 @@
1+
#!/bin/bash
2+
3+
shopt -s extglob
4+
progName="${0}"
5+
scriptFolder="$( dirname ${BASH_SOURCE[0]} )"
6+
scriptName="$( basename ${BASH_SOURCE[0]} )"
7+
#available arguments
8+
avArgs=(
9+
-m --mv --move
10+
-c --merge --combine
11+
-n --num --number
12+
-e --ext --extension
13+
--hex
14+
--dryRun
15+
-p --pat --pattern
16+
--progress --prog
17+
--noinfo
18+
-q --quiet
19+
)
20+
args=("$@")
21+
optStr="?([[:space:]])?(-)-*?([[:space:]])"
22+
logRED='\033[0;31m'
23+
logGREEN='\033[0;32m'
24+
logBLUE='\033[0;34m'
25+
logCYAN='\033[0;36m'
26+
logNEUT='\033[0m'
27+
clearLINE='\033[K'
28+
29+
declare trgtFolder
30+
declare mvFolder
31+
declare mergeFileName
32+
declare -i maxProcessed
33+
declare extension
34+
declare hex
35+
declare dryRun
36+
declare -i nFiles
37+
declare pattern
38+
declare noProgress=1
39+
declare noInfo
40+
declare quiet
41+
42+
helpStr="$(sed 's/^\s*//' <<EOL
43+
> ˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅
44+
> 03-2023 - Ibrahim Tanyalcin - MIT LICENSE
45+
> version 0.0.1
46+
> -m --mv --move : Move the generated .mp4 files to specified folder. If merge
47+
> option is given, also move the generated .mkv file to there
48+
> -c --merge --combine: Concat the resulting .mp4 files to a single .mkv file
49+
> -n --num --number : Max amount of directories to be processed
50+
> -e --ext --extension: Extension of input files. Defaults to "media"
51+
> --hex : If input files names are not unix epoch, append a random
52+
> hex string to differentiate
53+
> --dryRun : Do not do anything, just preview
54+
> -p --pat --pattern : A pattern to filter folder basename. Only folders with
55+
> basename matching the pattern are processed.
56+
> --progress --prog : Show progress bar
57+
> --noinfo : Do not show info on what is being done
58+
> -q --quiet : Suppress "ffmpeg" and "mkvmerge" messages/warnings
59+
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
60+
EOL
61+
)"
62+
63+
function includes() {
64+
local haystack="${@:1: $#-1}"
65+
local needle="${@: -1}"
66+
#if [[ " ${haystack[*]} " =~ " ${needle} " ]];
67+
if [[ " ${haystack[*]} " == $needle ]];
68+
then
69+
return 0
70+
fi
71+
return 1
72+
}
73+
74+
#https://stackoverflow.com/questions/1527049/how-can-i-join-elements-of-a-bash-array-into-a-delimited-string#answer-17841619
75+
function join_by {
76+
local d=${1-} f=${2-}
77+
if shift 2; then
78+
printf %s "$f" "${@/#/$d}"
79+
fi
80+
}
81+
82+
function dateOrSelf() {
83+
if [[ "$1" == [1-9]+([0-9]) ]];
84+
then
85+
echo "$(date -d @${1%%_*} "+%Y%m%d-%H%M%S")"
86+
else
87+
echo "$1${hex:+_$(hexdump -vn16 -e'4/4 "%08X" 1 "\n"' /dev/urandom)}"
88+
fi
89+
}
90+
91+
function progress() {
92+
if [[ -n $noProgress ]];
93+
then
94+
return 1
95+
fi
96+
frac=$((${3:=20}*$1/$2))
97+
done=$(($frac > $3 ? $3 : $frac < 0 ? 0 : $frac))
98+
remaining=$((${3:-20}-"${done}"))
99+
left=$(seq -s█ "$done"|tr -d '[:digit:]')
100+
right=$(seq -s░ "$remaining"|tr -d '[:digit:]')
101+
echo -en "${logGREEN}${4:-progress: }${left}${right}${logNEUT}"
102+
}
103+
104+
function issueWarning() {
105+
printf "${logRED}---::WARNING::---\n$1\n---::---${logNEUT}\n" ${@: 2};
106+
}
107+
108+
function issueInfo() {
109+
if [[ -z $noInfo ]];
110+
then
111+
printf "${logCYAN}---::INFO: ""$1 ""::---${logNEUT}\n" ${@: 2};
112+
fi
113+
}
114+
115+
function depsOK() {
116+
if ! hash 2>/dev/null ffmpeg || ! hash 2>/dev/null mkvmerge;
117+
then
118+
issueWarning "$(
119+
join_by $'\n' \
120+
"Looks like the dependencies are not installed" \
121+
"You need %s and %s." \
122+
"Do 'sudo snap install ffmpeg' or " \
123+
"'sudo apt install ffmpeg' and" \
124+
"'sudo apt install mkvtoolnix'"
125+
)" "ffmpeg" "mkvmerge"
126+
exit 1;
127+
fi
128+
}
129+
130+
#if [[ "$*" == ?(*[[:space:]])?(-)-help?([[:space:]]*) ]]
131+
if includes "$*" *+(--help|-h)*;
132+
then
133+
echo "${helpStr}";
134+
exit 1;
135+
fi
136+
137+
depsOK;
138+
139+
for (( i=0; i<"${#args[@]}"; ++i ))
140+
do
141+
case "${args[$i],,}" in
142+
-e|--ext|--extension)
143+
(( ++i ))
144+
if includes "${args[$i]}" $optStr;
145+
then
146+
issueWarning "$(
147+
join_by $'\n' \
148+
"-e|--ext|--extension arguments expects a value." \
149+
"For example: .media"
150+
)"
151+
exit 1;
152+
fi
153+
extension="${args[$i]}"
154+
;;
155+
-n|--num|--number)
156+
(( ++i ))
157+
if includes "${args[$i]}" $optStr;
158+
then
159+
issueWarning "$(
160+
join_by $'\n' \
161+
"-n|--num|--number arguments expects an integer value." \
162+
"For example: 1000"
163+
)"
164+
exit 1;
165+
fi
166+
maxProcessed="${args[$i]}"
167+
;;
168+
-m|--move|--mv)
169+
(( ++i ))
170+
if includes "${args[$i]}" $optStr;
171+
then
172+
issueWarning "$(
173+
join_by $'\n' \
174+
"-m|--mv|--move arguments expects a folder name." \
175+
"For example: someFolderName"
176+
)"
177+
exit 1;
178+
fi
179+
mvFolder="${args[$i]}"
180+
;;
181+
-c|--combine|--merge)
182+
(( ++i ))
183+
if includes "${args[$i]}" $optStr;
184+
then
185+
issueWarning "$(
186+
join_by $'\n' \
187+
"-c|--merge|--combine arguments expects a file name" \
188+
"without extension." \
189+
"For example: someFileName"
190+
)"
191+
exit 1;
192+
fi
193+
mergeFileName="${args[$i]}"
194+
;;
195+
-p|--pat|--pattern)
196+
(( ++i ))
197+
if includes "${args[$i]}" $optStr;
198+
then
199+
issueWarning "$(
200+
join_by $'\n' \
201+
"-p|--pat|--pattern arguments expects a quoted pattern." \
202+
"For example: \"some*folder\""
203+
)"
204+
exit 1;
205+
fi
206+
pattern="${args[$i]}"
207+
;;
208+
--hex)
209+
hex=1
210+
;;
211+
--dryrun)
212+
dryRun=1
213+
;;
214+
-q|--quiet)
215+
quiet=1
216+
;;
217+
--noinfo)
218+
noInfo=1
219+
;;
220+
--prog|--progress)
221+
noProgress=
222+
;;
223+
!(--*|-*))
224+
trgtFolder="${args[$i]}"
225+
;;
226+
?(-)-*)
227+
issueWarning "UNKNOWN OPTION %s" ${args[$i]}
228+
echo "${helpStr}";
229+
exit 1;
230+
;;
231+
esac
232+
done
233+
234+
issueInfo "CD %s" "${trgtFolder}"
235+
#do not do [[ -z "$dryRun" ]] &&, report if the folder does not exist
236+
cd "${trgtFolder}" || issueWarning "%s does not seem to exist" "${trgtFolder}";
237+
j=0;
238+
k=$(find . -maxdepth 1 -mindepth 1 ! -name '.*' -type d | wc -l)
239+
for d in */; do
240+
echo -en "\r${clearLINE}"
241+
if [[ -n "$pattern" && "${d%/*}" != $pattern ]];
242+
then
243+
issueInfo "IGNORING: %s" "${trgtFolder}/$d"
244+
continue
245+
fi
246+
issueInfo "PROCESSING: %s" "${trgtFolder}/$d"
247+
if [[ -n "$dryRun" ]];
248+
then
249+
continue
250+
fi
251+
progress "$j" "$k" 40
252+
while IFS= read -r line; do
253+
echo -en "\r${clearLINE}"
254+
[[ -z "$quiet" ]] && echo "$line"
255+
done <<< "$(
256+
ffmpeg \
257+
-y \
258+
-safe 0 \
259+
-f concat \
260+
-i <(find "${trgtFolder}/$d/" -type f -name "*.${extension:=media}" -printf "file '%p'\n" | sort) \
261+
-c copy \
262+
-crf 18 \
263+
"${trgtFolder}/$d/$(dateOrSelf "$(sed -e 's/\(\/.*$\|_.*$\)//g' <(echo "$d"))").mp4" \
264+
$([[ -n "$quiet" ]] && echo "-nostats -loglevel 0" || echo "") \
265+
2>&1
266+
)";
267+
((++j));
268+
if [[ "$j" -ge "${maxProcessed:=$(((2**32)))}" ]]; then
269+
issueWarning "MAX (%s) DIRECTIORIES REACHED" "${maxProcessed}"
270+
break;
271+
fi
272+
done
273+
274+
[[ -z "$dryRun" ]] && nFiles=$(find . -type f -name "*.mp4" | wc -l)
275+
if [[ nFiles -le 0 ]];
276+
then
277+
issueInfo "NO FILES PROCESSED"
278+
[[ -z "$dryRun" ]] && exit
279+
fi
280+
281+
#no ${mvFolder+x}, no empty string allowed
282+
if ! [[ -z "$mvFolder" ]];
283+
then
284+
mvFolder="$trgtFolder/${mvFolder##*/}"
285+
issueInfo "MOVING FILES TO %s" "$mvFolder"
286+
if [[ -z "$dryRun" ]];
287+
then
288+
mkdir -p "$mvFolder"
289+
find . -type f -name "*.mp4" -print0 | xargs -0 -I {} mv {} "$mvFolder"
290+
fi
291+
else
292+
mvFolder="$trgtFolder"
293+
fi
294+
295+
if ! [[ -z "$mergeFileName" ]];
296+
then
297+
issueInfo "MERGING FILES into %s.mkv" "${mvFolder}/${mergeFileName}"
298+
if [[ -z "$dryRun" ]];
299+
then
300+
mkvmerge -o "${mvFolder}/${mergeFileName}.mkv" \
301+
$(find "$mvFolder" -type f -name "*.mp4" ! -size 0 -printf "%p\n" | sort | sed ':a;N;$!ba;s/\n/ \+ /g') \
302+
$([[ -n "$quiet" ]] && echo "-q" || echo "")
303+
fi
304+
fi

0 commit comments

Comments
 (0)