-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAutoDVD.sh
388 lines (326 loc) · 8.87 KB
/
AutoDVD.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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
#!/usr/bin/env bash
unmountAfterReading=true # unmount disk drive automatically for quicker disk swap
diskAutodetect=true # can only be used if unmountAfterReading=true
titleMinlength=300 # 300 seconds = 5 minutes
prefix="[\e[36mAutoDVD\e[0m] "
workingPath="$(eval echo "~$(whoami)")/.AutoDVD"
packages=("coreutils" "makemkv-bin" "makemkv-oss" "util-linux" "screen")
if readlink /proc/$$/exe | grep -q "dash"; then
echo -e "${prefix}Please run this script with bash."
exit
fi
# functions
function ln ()
{
echo -e "${prefix}${1}"
}
function br ()
{
echo ""
}
function error ()
{
br
ln "\e[31mERROR\e[0m> ${1}"
br
exit
}
function warning ()
{
ln "\e[33mWARNING\e[0m> ${1}"
}
function banner ()
{
br
br
echo " █████╗ ██╗ ██╗████████╗ ██████╗ ██████╗ ██╗ ██╗██████╗ "
echo " ██╔══██╗██║ ██║╚══██╔══╝██╔═══██╗ ██╔══██╗██║ ██║██╔══██╗"
echo " ███████║██║ ██║ ██║ ██║ ██║ ██║ ██║██║ ██║██║ ██║"
echo " ██╔══██║██║ ██║ ██║ ██║ ██║ ██║ ██║╚██╗ ██╔╝██║ ██║"
echo " ██║ ██║╚██████╔╝ ██║ ╚██████╔╝ ██████╔╝ ╚████╔╝ ██████╔╝"
echo " ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═══╝ ╚═════╝ "
br
echo " ----------------------------------------------------------------"
br
echo " by Oliver Vollborn "
echo " `tput smul`https://github.com/vollborn`tput rmul`"
br
warning "Copying DVDs may be `tput bold`\e[31millegal\e[0m`tput sgr0` in your country."
warning "Please check your legal boundaries before using AutoDVD."
warning "I do not take responsibilty for your actions."
br
}
function prompt ()
{
if [[ -n ${1} ]]; then
printf "[${1}]» "
else
printf "» "
fi
}
function readPrompt ()
{
read input
if [[ ! -n ${input} ]]; then
echo ${1}
else
echo ${input}
fi
}
function pause()
{
read -s -n 1
}
function checkRoot ()
{
rootTest=$(sudo echo "success")
if [[ ! "${rootTest}" == "success" ]]; then
error "Please run this script as root."
fi
ln "Sudo check completed."
}
function checkRequiredPackages ()
{
for index in "${packages[@]}"; do
$(dpkg -s ${index} &> /dev/null) || echo "missing"
done
}
function checkPackages ()
{
if [[ ! -n $(checkRequiredPackages) ]]; then
ln "All dependencies are installed."
else
br
ln "Some dependencies need to be installed."
ln "Adding repositories..."
sudo add-apt-repository -y ppa:heyarje/makemkv-beta &> /dev/null
sudo apt-get update &> /dev/null
ln "Installing packages..."
sudo apt-get install -y ${packages[@]} &> /dev/null
ln "Checking installation..."
if [[ ! -n $(checkRequiredPackages) ]]; then
ln "Installation succeeded!"
br
else
error "Installation failed."
fi
fi
}
function cleanTemporaryDirectory ()
{
sudo rm -r ${tmpPath}/*.* &> /dev/null
}
function createTemporaryDirectory ()
{
# Create working directory
if [[ ! -d ${workingPath} ]]; then
sudo mkdir ${workingPath} &> /dev/null
if [[ ! -d ${workingPath} ]]; then
error "Working directory \"${workingPath}\" could not be created."
fi
fi
# Specify and create tmpPath
tmpPath="${workingPath}/${driveName}"
if [[ -d ${tmpPath} ]]; then
cleanTemporaryDirectory
else
sudo mkdir ${tmpPath} &> /dev/null
if [[ ! -d ${tmpPath} ]]; then
error "Temporary directory \"${tmpPath}\" could not be created."
fi
fi
sudo chown -R ${owner} ${tmpPath} &> /dev/null
}
function checkUnmountAfterReading ()
{
if ${unmountAfterReading}; then
ln "The drive will be automatically unmounted after reading."
fi
}
function checkTitleMinlength ()
{
[[ ${titleMinlength} -eq 0 ]] && titleMinlength=0 # 0 if value is invalid
if [[ ${titleMinlength} -eq 1 ]]; then
ln "The minimal title length is set to 1 second."
else
ln "The minimal title length is set to ${titleMinlength} seconds."
fi
}
function validateUser ()
{
if id -u "${1}" &> /dev/null; then
echo "1"
else
if [[ ${1} == *:* ]]; then
name=$(echo ${1} | cut -d":" -f2)
group=$(echo ${1} | cut -d":" -f1)
if id -u "${name}" &> /dev/null; then
if id -g "${group}" &> /dev/null; then
echo "1"
return
fi
fi
fi
fi
}
function hasDrive ()
{
drives=$(lsblk | grep "rom" | cut -d" " -f1)
for i in ${drives}; do
if [[ "${i}" == "${1}" ]]; then
echo "exists"
break
fi
done
}
function beep ()
{
echo -en "\a" #> /dev/tty5
}
function setDrivePath ()
{
defaultDriveName=$(lsblk | grep "rom" | cut -d" " -f1 | cut -d$'\n' -f1)
br
ln "Please specify your DVD drive name."
while [[ ! -n $(hasDrive "${driveName}") ]]; do
if [[ -n ${driveName} ]]; then
ln "This drive does not exist."
fi
prompt ${defaultDriveName}
driveName=$(readPrompt ${defaultDriveName})
done
drivePath="/dev/${driveName}"
}
function setDestinationPath ()
{
defaultDestinationPath="/media"
br
ln "Please specify the path to your destination directory."
while [[ ! -d ${destinationPath} ]]; do
if [[ -n ${destinationPath} ]]; then
ln "This directory does not exist."
fi
prompt ${defaultDestinationPath}
destinationPath=$(readPrompt ${defaultDestinationPath})
done
}
function setMediaOwner()
{
defaultOwner=$(whoami)
br
ln "Please specify a user who should own the created files."
while [[ ! -n $(validateUser "${owner}") ]]; do
if [[ -n ${owner} ]]; then
ln "This user does not exist."
fi
prompt ${defaultOwner}
owner=$(readPrompt ${defaultOwner})
done
}
function performDiskAutodetect ()
{
br
ln "Please insert a new disk."
while [[ ! -n ${mountedPath} ]]; do
mountedMatch=$(findmnt -S "${drivePath}" | grep "${drivePath}")
mountedPath=${mountedMatch%% ${drivePath}*}
printf "."
sleep 1s
done
br
br
}
function performWaitForDisk ()
{
while [[ ! -n ${mountedPath} ]]; do
ln "Please insert a DVD and continue by pressing any key."
pause
mountedPath=$(mount | grep ${drivePath} | cut -d" " -f3)
if [[ ! -n ${mountedPath} ]]; then
ln "Mount point cannot be found."
br
fi
done
}
# program start
banner
checkRoot
checkPackages
checkUnmountAfterReading
checkTitleMinlength
setDrivePath
setDestinationPath
setMediaOwner
createTemporaryDirectory
br
ln "Configuration completed."
br
ln "Drive Path » ${drivePath}"
ln "Destination Path » ${destinationPath}"
ln "Media Owner » ${owner}"
br
# main loop
counter=0
while true; do
counter=$((${counter}+1))
if ${diskAutodetect} && ${unmountAfterReading}; then
performDiskAutodetect
else
performWaitForDisk
fi
mountedBasename=$(basename "${mountedPath}")
ln "Disk ${counter}: ${mountedPath}"
ln "Please specify the name of this DVD."
prompt "${mountedBasename}"
diskName=$(readPrompt "${mountedBasename}")
destination="${destinationPath}/${diskName}.mkv"
if [[ -f $destination ]]; then
br
warning "${destination} does already exist."
warning "The file will get overwritten after reading the DVD."
br
fi
logFile="${tmpPath}/${driveName}.log"
screenName="auto-dvd-${driveName}"
ln "Reading DVD..."
ln "This may take a while."
br
screen -dmS ${screenName} bash -c "makemkvcon --messages=${logFile} --minlength=${titleMinlength} mkv dev:${drivePath} all ${tmpPath}" &> /dev/null
sleep 2s
while true; do
clear
banner
ln "Temporary directory content:"
br
ls -lh ${tmpPath}
br
ln "Console output:"
br
tail -n 15 ${logFile}
if [[ ! -n $(screen -ls | grep "${screenName}") ]]; then
break
fi
sleep 2s
done
br
ln "Moving created file..."
largestFile=$(find ${tmpPath} -maxdepth 1 -printf '%s %p\n' | sort -nr | head -n 1 | cut -d" " -f2-) # Assuming the largest title is the actual movie
if [[ "${largestFile}" == "${tmpPath}" || "${largestFile}" == "${logFile}" ]]; then
error "Title file could not be found"
fi
sudo mv "${largestFile}" "${destination}"
if [[ ! -f ${destination} ]]; then
error "Output file could not be created."
fi
ln "Set file owner..."
sudo chown ${owner} "${destination}"
ln "${mountedBasename} saved to ${destination}"
if ${unmountAfterReading}; then
ln "Unmounting ${mountedPath}..."
umount "${mountedPath}"
sleep 2s # wait for unmounting
fi
mountedPath=""
cleanTemporaryDirectory
beep
done