updated on Tue Jan 17 20:03:13 UTC 2012
[aur-mirror.git] / multicut_light / multicut_light_20100518.sh
blob6440975cf237959bdd856b3a5160076258351f23
1 #!/bin/bash
2 # multicut_light.sh
3 # Benutzung auf eigene Gefahr !!!
4 # Anleitung -> http://wiki.onlinetvrecorder.com/index.php/Cutlist-Austausch/Linux-Skripte
5 # Diskussion -> http://otrforum.com/showthread.php?t=38342
7 Stand="18.05.2010"
9 # Konfiguration
10 ADversion="2.5" # Version von Avidemux (2.4 oder 2.5)
11 ConvertUTF=1 # Bei Problemen mit Umlauten
12 moveOtrkey=1 # Otrkey nach dem dekodieren verschieben
13 SortOrder=3 # 0: rating 1: ratingbyauthor 2: ratingcount 3: Algorithmus
14 useSuggestedMovieName=1 # Vorgeschlagene Dateinamen benutzen
15 useCommentsforMovieName=0 # Kommentare mit in Vorschlaege einbeziehen
16 replaceWhitespace=1 # Im vorg. Dateinamen Leerzeichen durch Unterstriche ersetzen
17 Auto=0 # Automatik modus
18 Smart=1 # Zuerst Cutlists auswaehlen, danach schneiden
19 News=0 # Skript-Versionen anzeigen
20 removeEDL=1 # EDL-Datei nach dem Anzeigen löschen
21 searchby="name" # suchen anhand von "name", oder "size"
22 tempdir="/tmp/multicut/" # Verzeichnis für temporaere Dateien
23 rateCutlist=1 # Bewertung nach dem Schneiden abgeben
24 nachlauf=5 # Nachlauf zum Ueberpruefen mit dem mplayer
25 vorlauf=10 # Vorlauf zum Ueberpruefen mit dem mplayer
26 HQcutwithVD=0 # VirtualDub (via wine) fuer HQ benutzen
27 convertHQ2MKV=0 # HQ-AVIs in MKVs verwandeln
28 username=$(whoami) # Username fuer VD-Pfad
29 vdubdir=$(ls /home/$username | grep VirtualDub) # VD-Pfad
30 vdub="/home/$username/$vdubdir/vdub.exe" #
31 c_rot="\033[01;37;41m" # Rot
32 c_blau="\033[01;37;44m" # Blau
33 c_normal="\033[00m" # Standardwert, nicht aendern
34 # Ende der Konfiguration - Konfigurationsblock kann auch unter ~/.multicut_light.rc gespeichert werden!
36 if [ -e ~/.multicut_light.rc ] ; then
37 echo "Benutze Konfigurations-Datei ..."
38 source ~/.multicut_light.rc
41 # Funktionen
42 checkUp () { # System ueberpruefen und vorbereiten
43 rm -r $tempdir/cutlist* $tempdir/project* $tempdir/autoname* $tempdir/autoselect $tempdir/result* $tempdir/sugestedNames $tempdir/Comments* 2>/dev/null
44 if [ ! -e ~/.cutlist.at ] ; then # pers. URL schon gespeichert ?
45 CutListAT="http://www.cutlist.at" # Nein -> Standard URL verwenden
46 if [ $rateCutlist -eq 0 ] ; then
47 printf "\n$c_rot Du hast rateCutlist=0 eingestellt und verwendest $c_normal "
48 printf "\n$c_rot keine pers. URL von cutlist.at !! $c_normal "
49 printf "\n$c_rot So kommen von dir keine Bewertungen ins Cutlist-System! $c_normal "
50 printf "\n$c_rot Das ist nicht fair, bitte melde dich bei cutlist.at an $c_normal\n\n"
51 read -p "Weiter mit <Enter>: " eingabe
52 echo
55 else
56 CutListAT=$(cat ~/.cutlist.at | head -n 1) # Ja -> URL auslesen
59 if ! for i in avidemux{,2}{,_cli,_gtk,_qt4}; do
60 # auf Existenz testen und ausschließen, dass es kein Link ist
61 pfad=$(which $i) && ls -l $pfad | grep -v ^lrwx > /dev/null && avidemux=$i && break
62 done
63 then
64 printf "\n$c_rot Schneiden leider nicht moeglich, da avidemux nicht vorhanden ist $c_normal "
65 printf "\n$c_rot Bitte installiere es, auf Debian basierten Systemen z.B. mit: $c_normal "
66 printf "\n$c_rot apt-get install avidemux $c_normal \n\n "
67 exit 1
70 if [ $convertHQ2MKV -eq 1 ] ; then
71 if ! type mkvmerge > /dev/null 2>/dev/null ; then # Ist mkvmerge installiert?
72 echo -e "\nmkvmerge ist nicht verfuegbar.\nBitte installiere es oder setze convertHQ2MKV=0!"
73 exit 1
74 fi
77 if [ $useSuggestedMovieName -eq 1 ] ; then
78 if ! type dialog > /dev/null 2>/dev/null ; then # Ist dialog installiert?
79 echo -e "\nPaket 'dialog' ist nicht installiert.\nBitte installiere es (apt-get install dialog) oder setze useSuggestedMovieName=0!"
80 exit 1
81 fi
84 if [ ! -d cut ] ; then mkdir cut;fi;cutdir=${PWD%/}/cut
85 if [ ! -d uncut ] ; then mkdir uncut;fi;uncutdir=${PWD%/}/uncut
86 if [ ! -d decoded ] ; then mkdir decoded;fi;decodeddir=${PWD%/}/decoded
87 if [ ! -d $tempdir ] ; then mkdir $tempdir || (echo "Kann temporaeren Ordner nicht erstellen! Exit." && exit 1);fi
89 tempdir=${tempdir%/}
90 startdir=$PWD
91 SmartIndex=1
92 Datum=$(date +%Y%m%d)
93 logFile="$tempdir/multicut_light_$Datum.log"
94 writeLog "------------"
95 if [ $Smart -eq 1 ] ; then writeLog "Smart: yes"; fi
96 if [ $Auto -eq 1 ] ; then writeLog "Auto: yes"; fi
98 cleanUp () { # System vor dem Schliessen wieder bereinigen
99 rm -r $tempdir/cutlist $tempdir/project.js $tempdir/project.syl $tempdir/autoselect $tempdir/result.xml $tempdir/result2.xml $tempdir/sugestedNames 2>/dev/null
100 limitreached=0
101 dontCut=0
102 filename=`cd ${file%/*} 2>/dev/null ; pwd`/${file##*/} # absoluten dateinamen ermitteln
103 aviname=${filename##*/}
104 writeLog $aviname
105 uncutname="$uncutdir/$aviname"
107 parseXmlTag () { # XML Tags auslesen
108 sed -n '/<\/'$1'>/p' $tempdir/result2.xml | sed -n ''$2'p' | sed 's/<'$1'>//' | sed 's/<\/'$1'>//g' | sed 's/^[ \t]*//'
110 getXml () { # Cutlist Uebersicht vom Server holen
111 if [ $searchby == "size" ] ; then # Nach der Groesse suchen
112 videoSize=$( stat -c %s $filename )
113 echo;echo $1
114 echo "Hole Uebersicht (nach Groesse) von cutlist.at ..."
115 wget -U "multicut_light.sh/$Stand" -q -O $tempdir/result.xml "$CutListAT/getxml.php?version=0.9.8.0&ofsb=$videoSize"
116 if [ $? -ne 0 ] || [ $(cat $tempdir/result.xml | wc -l) -eq 0 ] ; then
117 if [ $(cat $tempdir/result.xml | wc -l) -eq 0 ] ; then
118 printf "$c_rot cutlist.at hat (noch) keine Uebersicht! $c_normal"
119 else
120 printf "$c_rot cutlist.at antwortet nicht! $c_normal"
124 else # Nach dem Dateinamen suchen
125 search=$(echo $1 | sed 's/.otrkey//g' | sed 's/DivFix++.//g' | sed 's/DivFix.//g' )
126 echo;echo $1
127 echo "Hole Uebersicht (nach Namen) von cutlist.at ..."
128 wget -U "multicut_light.sh/$Stand" -q -O $tempdir/result.xml "$CutListAT/getxml.php?name=$search&version=0.9.8.0"
129 if [ $? -ne 0 ] || [ $(cat $tempdir/result.xml | wc -l) -eq 0 ] ; then
130 if [ $(cat $tempdir/result.xml | wc -l) -eq 0 ] ; then
131 printf "$c_rot cutlist.at hat (noch) keine Uebersicht! $c_normal"
132 else
133 printf "$c_rot cutlist.at antwortet nicht! $c_normal"
137 readXml
139 readXml () { # Uebersicht auslesen
140 cat $tempdir/result.xml | sed 's/<rating><\/rating>/<rating>0.00<\/rating>/g'> $tempdir/result2.xml
141 if [ $ConvertUTF -eq 1 ] ; then
142 iconv -f iso-8859-1 -t utf-8 $tempdir/result2.xml --output $tempdir/result3.xml
143 mv $tempdir/result3.xml $tempdir/result2.xml 2>/dev/null
146 number=$(sed -n '2p' $tempdir/result.xml | cut -d'"' -f2)
147 if [ $(cat $tempdir/result.xml | wc -l) -eq 0 ] ; then
148 printf "\n$c_rot Es wurde keine Cutlist gefunden! $c_normal \n"
149 number=0
150 else
151 echo "$number Cutlists gefunden"
152 echo
153 index=1
154 while [ $index -le $number ] ; do
155 Cutlist_id[$index]=$(parseXmlTag "id" $index)
156 Cutlist_id[$index]=${Cutlist_id[$index]%[[:cntrl:]]}
157 Cutlist_name[$index]=$(parseXmlTag "name" $index)
158 Cutlist_name[$index]=${Cutlist_name[$index]%[[:cntrl:]]}
159 Cutlist_rating[$index]=$(parseXmlTag "rating" $index)
160 Cutlist_rating[$index]=${Cutlist_rating[$index]%[[:cntrl:]]}
161 Cutlist_ratingcount[$index]=$(parseXmlTag "ratingcount" $index)
162 Cutlist_ratingcount[$index]=${Cutlist_ratingcount[$index]%[[:cntrl:]]}
163 Cutlist_downloadcount[$index]=$(parseXmlTag "downloadcount" $index)
164 Cutlist_downloadcount[$index]=${Cutlist_downloadcount[$index]%[[:cntrl:]]}
165 Cutlist_author[$index]=$(parseXmlTag "author" $index)
166 Cutlist_author[$index]=${Cutlist_author[$index]%[[:cntrl:]]}
167 Cutlist_ratingbyauthor[$index]=$(parseXmlTag "ratingbyauthor" $index)
168 Cutlist_ratingbyauthor[$index]=${Cutlist_ratingbyauthor[$index]%[[:cntrl:]]}
169 Cutlist_actualcontent[$index]=$(parseXmlTag "actualcontent" $index)
170 Cutlist_actualcontent[$index]=${Cutlist_actualcontent[$index]%[[:cntrl:]]}
171 Cutlist_usercomment[$index]=$(parseXmlTag "usercomment" $index)
172 Cutlist_usercomment[$index]=${Cutlist_usercomment[$index]%[[:cntrl:]]}
173 Cutlist_cuts[$index]=$(parseXmlTag "cuts" $index)
174 Cutlist_cuts[$index]=${Cutlist_cuts[$index]%[[:cntrl:]]}
175 Cutlist_withframes[$index]=$(parseXmlTag "withframes" $index)
176 Cutlist_withframes[$index]=${Cutlist_withframes[$index]%[[:cntrl:]]}
177 Cutlist_filename[$index]=$(parseXmlTag "filename" $index)
178 Cutlist_filename[$index]=${Cutlist_filename[$index]%[[:cntrl:]]}
179 Cutlist_filename_original[$index]=$(parseXmlTag "filename_original" $index)
180 Cutlist_filename_original[$index]=${Cutlist_filename_original[$index]%[[:cntrl:]]}
181 Cutlist_autoname[$index]=$(parseXmlTag "autoname" $index)
182 Cutlist_autoname[$index]=${Cutlist_autoname[$index]%[[:cntrl:]]}
183 Cutlist_duration[$index]=$(parseXmlTag "duration" $index)
184 Cutlist_duration[$index]=${Cutlist_duration[$index]%[[:cntrl:]]}
185 Cutlist_errors[$index]=$(parseXmlTag "errors" $index)
186 Cutlist_errors[$index]=${Cutlist_errors[$index]%[[:cntrl:]]}
187 Cutlist_othererrordescription[$index]=$(parseXmlTag "othererrordescription" $index)
188 Cutlist_othererrordescription[$index]=${Cutlist_othererrordescription[$index]%[[:cntrl:]]}
189 index=$((index+1))
190 done
192 return $number
194 showSelect () { # Uebersicht auf dem Bildschirm darstellen
195 if [ $SortOrder -eq 3 ] ; then # Sortierung
196 index=1 # Sortierung vorbereiten
197 while [ $index -le $number ] ; do
198 if [ ${Cutlist_ratingbyauthor[$index]} -gt 3 ] ; then
199 if [ ${Cutlist_ratingcount[$index]} -gt 1 ] ; then
200 if [ $(echo "(${Cutlist_ratingbyauthor[$index]} - ${Cutlist_rating[$index]} + 1) * 100" | bc | egrep -o ^[0-9]*) -lt 150 ] ; then
201 Cutlist_ratingshow[$index]="$(echo "${Cutlist_ratingbyauthor[$index]} + ${Cutlist_rating[$index]} + (${Cutlist_ratingcount[$index]} / 10)" | bc)"
202 else
203 Cutlist_ratingshow[$index]=${Cutlist_rating[$index]}
205 else
206 Cutlist_ratingshow[$index]=$((Cutlist_ratingbyauthor[$index]-1))
208 else
209 Cutlist_ratingshow[$index]=${Cutlist_ratingbyauthor[$index]}
211 echo -e "${Cutlist_ratingshow[$index]}\t$index" >> $tempdir/autoselect
212 index=$((index+1))
213 done
214 else
215 index=1 # Sortierung vorbereiten
216 while [ $index -le $number ] ; do
217 if [ $SortOrder -eq 0 ] ; then
218 echo -e "${Cutlist_rating[$index]}\t$index" >> $tempdir/autoselect
220 if [ $SortOrder -eq 1 ] ; then
221 echo -e "${Cutlist_ratingbyauthor[$index]}\t$index" >> $tempdir/autoselect
223 if [ $SortOrder -eq 2 ] ; then
224 echo -e "${Cutlist_ratingcount[$index]}\t$index" >> $tempdir/autoselect
226 index=$((index+1))
227 done
230 index=1
231 for line in $(sort -gr $tempdir/autoselect | cut -f2); do # Sortieren
232 showindex[$index]=$line
233 index=$((index+1))
234 done
236 index=1
237 if [ $(echo ${Cutlist_autoname[${showindex[$index]}]} | wc -w) -ne 0 ] ; then
238 printf "\t$c_rot$aviname$c_normal\n"
239 if [ $(echo $aviname | grep mpg.HQ.avi | wc -l) -ne 0 ] ; then
240 Cutlist_autoname[${showindex[$index]}]="${Cutlist_autoname[${showindex[$index]}]}""_HQ"
242 if [ $(echo $aviname | grep mpg.HD.avi | wc -l) -ne 0 ] ; then
243 Cutlist_autoname[${showindex[$index]}]="${Cutlist_autoname[${showindex[$index]}]}""_HD"
245 printf "\t$c_rot%s$c_normal\n" "${Cutlist_autoname[${showindex[$index]}]}"
246 if [ $Smart -eq 1 ] ; then
247 echo ${Cutlist_autoname[${showindex[$index]}]} > $tempdir/autoname$SmartIndex
248 else
249 echo ${Cutlist_autoname[${showindex[$index]}]} > $tempdir/autoname
251 else
252 printf "\t$c_rot$aviname$c_normal\n"
254 while [ $index -le $number ] ; do # Uebersicht anzeigen
255 echo
256 if [ $(echo ${Cutlist_withframes[${showindex[$index]}]} | wc -c) == "1" ] ; then
257 FramesOrSeconds="(??????)"
258 else
259 if [ ${Cutlist_withframes[${showindex[$index]}]} == "1" ] ; then
260 FramesOrSeconds="(Frameangaben)"
261 else
262 FramesOrSeconds="(Zeitangaben)"
265 if [ $(echo ${Cutlist_author[${showindex[$index]}]} | wc -c) == "1" ] ;then
266 Cutlist_author[${showindex[$index]}]="n/a"
268 if [ $(echo ${Cutlist_duration[${showindex[$index]}]} | wc -c) == "1" ] ;then
269 Cutlist_Duration="??:??:??"
270 else
271 Cutlist_Duration=$(date -u -d @$(echo "${Cutlist_duration[${showindex[$index]}]}" | bc ) +%T)
273 if [ $(echo ${Cutlist_cuts[${showindex[$index]}]} | wc -c) == "1" ] ;then
274 Cutlist_cuts[${showindex[$index]}]="?"
276 if [ $(echo ${Cutlist_downloadcount[${showindex[$index]}]} | wc -c) == "1" ] ;then
277 Cutlist_downloadcount[${showindex[$index]}]="???"
279 if [ $(echo ${Cutlist_name[${showindex[$index]}]} | grep .HQ.avi | wc -w) -eq 1 ] ; then
280 Format="HQ!"
281 elif [ $(echo ${Cutlist_name[${showindex[$index]}]} | grep .HD.avi | wc -w) -eq 1 ] ; then
282 Format="HD!"
283 else
284 Format="avi"
286 printf " $c_rot [%d] $c_normal \tSchnitte: $c_blau %s $c_normal %s \tSpielzeit: $c_blau %s $c_normal (hh:mm:ss)\n %s \tBewertung: $c_blau %s (%s/%s) $c_normal \tAutor:\t $c_blau %s (%s) $c_normal\n" $index ${Cutlist_cuts[${showindex[$index]}]} $FramesOrSeconds $Cutlist_Duration $Format ${Cutlist_rating[${showindex[$index]}]} ${Cutlist_ratingcount[${showindex[$index]}]} "${Cutlist_downloadcount[${showindex[$index]}]}" "${Cutlist_author[${showindex[$index]}]}" "${Cutlist_ratingbyauthor[${showindex[$index]}]}"
287 writeLog "verfuegbare Cutlist ID:${Cutlist_id[$index]} Autor:${Cutlist_author[$index]}"
288 if [ ! ${Cutlist_errors[${showindex[$index]}]} == "000000" ] ; then # Fehlerangaben
289 printf "\tFehler: $c_rot"
290 if [ $(echo ${Cutlist_errors[${showindex[$index]}]} | cut -c1) -eq 1 ] ; then
291 printf " Anfang fehlt! "
293 if [ $(echo ${Cutlist_errors[${showindex[$index]}]} | cut -c2) -eq 1 ] ; then
294 printf " Ende fehlt! "
296 if [ $(echo ${Cutlist_errors[${showindex[$index]}]} | cut -c3) -eq 1 ] ; then
297 printf " Video! "
299 if [ $(echo ${Cutlist_errors[${showindex[$index]}]} | cut -c4) -eq 1 ] ; then
300 printf " Audio! "
302 if [ $(echo ${Cutlist_errors[${showindex[$index]}]} | cut -c5) -eq 1 ] ; then
303 printf " Fehler: ${Cutlist_othererrordescription[${showindex[$index]}]} "
305 if [ $(echo ${Cutlist_errors[${showindex[$index]}]} | cut -c6) -eq 1 ] ; then
306 printf " EPG: ${Cutlist_actualcontent[${showindex[$index]}]} "
308 printf "$c_normal\n"
311 if [ $(echo ${Cutlist_usercomment[${showindex[$index]}]} | wc -w) -ne 0 ] ; then
312 printf "\tKommentar: $c_blau %s $c_normal\n" "${Cutlist_usercomment[${showindex[$index]}]}"
313 if [ $Smart -eq 1 ] && [ $useCommentsforMovieName -eq 1 ] ; then
314 echo ${Cutlist_usercomment[${showindex[$index]}]} >> $tempdir/Commentscutlist$SmartIndex
317 if [ $(echo ${Cutlist_filename_original[${showindex[$index]}]} | wc -w) -ne 0 ] ; then
318 printf "\tDateiname: $c_blau %s $c_normal\n" "${Cutlist_filename_original[${showindex[$index]}]}"
319 if [ $Smart -eq 1 ] ; then
320 echo ${Cutlist_filename_original[${showindex[$index]}]} >> $tempdir/Commentscutlist$SmartIndex
323 index=$((index+1))
324 done
326 if [ $overview -eq 1 ] ; then
327 echo;read -p "Mit der Eingabe Taste bestaetigen ..."
328 dontCut=1
329 else
330 printf "\n $c_rot [%d] $c_normal \tKeine Auswahl. Diesen Film nicht schneiden.\n\n\n" 0
332 selected=""
333 if [ $Auto -eq 1 ] ; then
334 selected="1"
335 printf "$c_rot Automatikmodus: Waehle die erste Cutlist! $c_normal \n"
336 else
337 read -p "Auswahl: " select
338 showindex[0]="0"
339 selected=${showindex[$select]}
341 echo
343 if [ $selected -ne 0 ] ; then
344 if [ $Smart -eq 1 ] ; then
345 echo $filename >> $tempdir/cutlist$SmartIndex
346 echo $aviname >> $tempdir/cutlist$SmartIndex
347 echo $uncutname >> $tempdir/cutlist$SmartIndex
348 echo "$CutListAT/getfile.php?id=${Cutlist_id[$selected]}" >> $tempdir/cutlist$SmartIndex
349 SmartIndex=$((SmartIndex+1))
350 else
351 wget -U "multicut_light.sh/$Stand" -q -O $tempdir/cutlist "$CutListAT/getfile.php?id=${Cutlist_id[$selected]}"
353 writeLog "gewaehlte Cutlist ID:${Cutlist_id[$selected]} Autor:${Cutlist_author[$selected]}"
354 else
355 dontCut=1
356 rm $tempdir/autoname$SmartIndex $tempdir/autoname $tempdir/Commentscutlist$SmartIndex 2>/dev/null
360 project_start () { # Projektdatei fuer Avidemux oeffnen
361 cat << HEADER > $tempdir/project.js
362 //AD
363 var app = new Avidemux();
364 //** Video **
365 // 01 videos source
366 app.load("$filename");
368 // 0$numberofCuts segments
369 app.clearSegments();
370 HEADER
372 project_end () { # Projektdatei fuer Avidemux schliessen
373 if [ $ADversion == "2.5" ] ; then
374 cat << FOOTER >> $tempdir/project.js
375 app.video.setPostProc(3,3,0);
376 app.video.fps1000=$fpsAD;
377 app.video.codec("Copy","CQ=4","0 ");
378 app.audio.reset();
379 app.audio.codec("copy",128,0,"");
380 app.audio.normalizeMode=0;
381 app.audio.normalizeValue=0;
382 app.audio.delay=0;
383 app.audio.mixer="NONE";
384 app.audio.scanVBR="";
385 app.setContainier="AVI";
386 setSuccess(app.save("$cutname"));
387 FOOTER
388 else
389 cat << FOOTER >> $tempdir/project.js
390 app.video.setPostProc(3,3,0);
391 app.video.setFps1000($fpsAD);
392 app.video.codec("Copy","CQ=4","0 ");
393 app.audio.reset();
394 app.audio.codec("copy",128,0,"");
395 app.audio.normalizeMode=0;
396 app.audio.normalizeValue=0;
397 app.audio.delay=0;
398 app.audio.mixer("NONE");
399 app.audio.scanVBR();
400 app.setContainer("AVI");
401 setSuccess(app.save("$cutname"));
402 FOOTER
405 VDproject_start () { # Projektdatei fuer VirtualDub oeffnen
406 cat << HEADER > $tempdir/project.syl
407 VirtualDub.Open("$filename",0,0);
408 VirtualDub.audio.SetMode(0);
409 VirtualDub.video.SetMode(1);
410 VirtualDub.video.SetSmartRendering(1);
411 VirtualDub.video.SetCompression(0x53444646,0,10000,0);
412 HEADER
414 VDproject_compData () { # Projektdatei fuer VirtualDub 4:3 Modus
415 cat << COMPDATA >> $tempdir/project.syl
416 VirtualDub.video.SetCompData(2847,"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");
417 COMPDATA
419 VDproject_compData169 () { # Projektdatei fuer VirtualDub 16:9 Modus
420 cat << COMPDATA169 >> $tempdir/project.syl
421 VirtualDub.video.SetCompData(2853,"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");
422 COMPDATA169
424 VDproject_end () { # Projektdatei fuer VirtualDub schliessen
425 cat << FOOTER >> $tempdir/project.syl
426 VirtualDub.SaveAVI("$cutname");
427 VirtualDub.Close();
428 FOOTER
430 showCuts () {
431 checktime[0]=0
432 index=0
433 while [ $index -lt $numberofCuts ] ; do # Zeitpunke fuer mplayer festlegen
434 helpindex=$index
435 index=$((index+1))
436 checktime[$index]=$(echo "(${checktime[$helpindex]} + ${durationTime[$index]})" | bc)
437 echo -e "$(echo "${checktime[$helpindex]} + $nachlauf" | bc )\t $(echo "${checktime[$index]} - $vorlauf" | bc ) \t 0" >> $cutname.edl
438 counter=250 # Untertitel Countdown
439 while [ $counter -ne 0 ] ; do
440 echo "{$(echo "(${checktime[$index]} * $fps) - $counter - 10" | bc | cut -d"." -f1)}{$(echo "(${checktime[$index]} * $fps) - $counter + 15" | bc | cut -d"." -f1)}Schnitt #$index in $(echo "($counter / $fps)" | bc) Sekunden" >> $cutname.sub
441 counter=$((counter-25))
442 done
443 echo "{$(echo "(${checktime[$index]} * $fps) - $counter - 10" | bc | cut -d"." -f1)}{$(echo "(${checktime[$index]} * $fps) - $counter + 15" | bc | cut -d"." -f1)}=-> SCHNITT <-=" >> $cutname.sub
444 done
445 echo "Schnitte mit mplayer zeigen -> Eingabetaste";read
446 mplayer -edl $cutname.edl -sub $cutname.sub -osdlevel 3 $cutname 1>/dev/null 2>/dev/null
447 rm $cutname.edl $cutname.sub
449 if [ $rateCutlist -ne 0 ] ; then
450 bewerten
453 showEDL () {
454 numberofCuts=$(grep ^Start\= $tempdir/cutlist | wc -l)
455 fps=$( grep FramesPerSecond $tempdir/cutlist | tr -d "\r" | sed 's/FramesPerSecond=//' )
456 startFrames=$(grep ^Start\= $tempdir/cutlist | cut -d"=" -f2)
457 index=1
458 for frame in $startFrames ; do # Startframes festlegen
459 frame=${frame%[[:cntrl:]]}
460 if [ $frame == "0" ] ; then
461 frame="1.00"
463 startFrame[$index]=$frame
464 index=$((index+1))
465 done
467 durationFrames=$(grep ^Duration\= $tempdir/cutlist | cut -d"=" -f2)
468 index=1
469 for frame in $durationFrames ; do # Duration Frames festlegen
470 frame=${frame%[[:cntrl:]]}
471 durationFrame[$index]=$frame
472 index=$((index+1))
473 done
475 index=0
476 echo "mplayer zeigt folgende Zeitintervalle an:";echo
477 while [ $index -lt $numberofCuts ] ; do # Schnittzeiten auf dem Bildschirm ausgeben
478 helpindex=$index
479 index=$((index+1))
480 echo -e "$(date -u -d @$(echo "${startFrame[$index]} + 0" | bc ) +%T) -> $(date -u -d @$(echo "${durationFrame[$index]} + ${startFrame[$index]}" | bc ) +%T) hh:mm:ss"
481 done
483 durationFrame[0]=0
484 startFrame[0]=0
485 numberofCuts=$((numberofCuts+1))
486 startFrame[$numberofCuts]=1000000
487 index=0
488 while [ $index -lt $numberofCuts ] ; do # Schnittzeiten in edl Datei schreiben
489 helpindex=$index
490 index=$((index+1))
491 echo -e "$(echo "${durationFrame[$helpindex]} + ${startFrame[$helpindex]}" | bc )\t $(echo "0 + ${startFrame[$index]}" | bc ) \t 0" >> $filename.edl
492 done
494 echo
495 echo "mplayer steuern: (weiteres mit man mplayer)"
496 echo "o Zeitinformationen ein/aus!"
497 echo "<- / -> Vor / Zurueck (10 Sekunden)"
498 echo "hoch / runter Vor / Zurueck (1 Minute)"
499 echo "pgup / pgdown Vor / Zurueck (10 Minuten)"
500 echo "p / Leertaste Pause (Weiter)"
501 echo "f Vollbild"
502 echo "m Stumm"
503 echo "9 / 0 Leiser / Lauter"
504 echo
505 mplayer -edl $filename.edl $filename 1>/dev/null 2>/dev/null
506 if [ $removeEDL -eq 1 ] ; then
507 rm $filename.edl 2>/dev/null
509 if [ $rateCutlist -eq 1 ] ; then
510 printf "\n$c_rot mplayer -edl zeigt die Schnitte leider nicht ganz genau an $c_normal \n"
511 printf "$c_rot Im Zweifelsfall bitte eine bessere Bewertung angeben! $c_normal \n"
512 bewerten
514 exit 0
516 cutFilm () { # Film schneiden
517 pathname=$(echo $filename | sed "s/$aviname//g")
518 if [ $(echo $filename | grep "\.otrkey" | wc -l) -eq 1 ] ; then # Vorher dekodieren?
519 filename=$(echo $filename | sed 's/\.otrkey//g')
520 aviname=${filename##*/}
521 pathname=$(echo $filename | sed "s/$aviname//g")
522 Decode $filename.otrkey $aviname $uncutdir
523 filename="$uncutdir/$aviname"
524 uncutname="$uncutdir/$aviname"
525 echo
528 mplayer -vo null -nosound -frames 1 "$filename" 2>&1 | # Pruefe ob der Index defekt ist
529 while read line; do
530 if [[ $line == "Could not determine number of frames"* ]] ; then
531 printf "$c_rot Der Index ist defekt, repariere ... $c_normal\n"
532 writeLog "repariere Index: $filename"
533 mencoder -msglevel all=0 -msglevel statusline=5 -idx -ovc copy -oac copy -o $filename.indexed $filename
534 echo;echo
535 mv $filename $filename.original.avi
536 mv $filename.indexed $filename
538 done
539 if [ $Smart -eq 1 ] ; then
540 printf "$c_rot Schneide $aviname $c_normal\n"
543 frameData=$(grep ^StartFrame $tempdir/cutlist | wc -l)
544 numberofCuts=$(grep NoOfCuts= $tempdir/cutlist | cut -d"=" -f2)
545 numberofCuts=${numberofCuts%[[:cntrl:]]}
546 fps=$( grep FramesPerSecond $tempdir/cutlist | tr -d "\r" | sed 's/FramesPerSecond=//' )
547 fpsAD=$(echo "$fps*1000" | bc | egrep -o ^[0-9]*)
548 if [ $frameData -ne 0 ] ; then # Werte zum schneiden festlegen
549 echo "Verwende Frameangaben"
550 echo "Framerate : $fps fps"
551 writeLog "schneide $aviname (Frameangaben)"
552 startFrames=$(grep ^StartFrame $tempdir/cutlist | cut -d"=" -f2)
553 index=1
554 for frame in $startFrames ; do # Startframes festlegen
555 startFrame[$index]=${frame%[[:cntrl:]]}
556 index=$((index+1))
557 done
558 durationFrames=$(grep ^DurationFrames $tempdir/cutlist | cut -d"=" -f2)
559 index=1
560 for frame in $durationFrames ; do # Duration Frames festlegen
561 durationFrame[$index]=${frame%[[:cntrl:]]}
562 index=$((index+1))
563 done
564 else
565 echo "keine Frameangaben gefunden, rechne Zeitangaben in Frames um"
566 echo "Framerate : $fps fps"
567 writeLog "schneide $aviname (Zeitangaben)"
568 startFrames=$(grep ^Start $tempdir/cutlist | cut -d"=" -f2)
569 index=1
570 for frame in $startFrames ; do # Startframes festlegen
571 frame=${frame%[[:cntrl:]]}
572 if [ $frame == "0" ] || [ $(echo $frame | grep -F 0.00 | wc -l) -eq 1 ] ; then frame="0.04";fi
573 startFrame[$index]=$(echo "$frame * $fps + 0.5" | bc | egrep -o ^[0-9]*)
574 index=$((index+1))
575 done
576 durationFrames=$(grep ^Duration $tempdir/cutlist | cut -d"=" -f2)
577 index=1
578 for frame in $durationFrames ; do # Duration Frames festlegen
579 frame=${frame%[[:cntrl:]]}
580 durationFrame[$index]=$(echo "$frame * $fps + 0.5" | bc | egrep -o ^[0-9]*)
581 if [ -z "${durationFrame[$index]}" ] ; then durationFrame[$index]="0";fi
582 index=$((index+1))
583 done
585 durationTimes=$(grep ^Duration= $tempdir/cutlist | cut -d"=" -f2)
586 index=1
587 for frame in $durationTimes ; do # Duration Frames festlegen
588 frame=${frame%[[:cntrl:]]}
589 durationTime[$index]=$frame
590 if [ -z "${durationTime[$index]}" ] ; then durationTime[$index]="0";fi
591 index=$((index+1))
592 done
594 if [ $(echo $filename | grep mpg.H[QD].avi | wc -l) -eq 0 ] || [ $HQcutwithVD -eq 0 ] ; then # Pruefe ob HQ vorliegt
595 if [ $(grep -c ^MERGED $tempdir/cutlist) -ne 0 ] ; then
596 printf "\n $c_blau Merging $c_normal\n\n"
597 cd $pathname
598 Merged=$(grep ^MERGED $tempdir/cutlist | cut -d"=" -f2 | sed 's/;/\n/g')
599 for merge in $Merged ; do
600 if [ -e $pathname/$merge ] ; then
601 echo "$merge existiert"
602 else
603 if [ -e $pathname/$merge.otrkey ] ; then
604 echo "$merge.otrkey existiert -> dekodiere"
605 Decode $merge.otrkey $merge $pathname
606 else
607 echo "Datei ist nicht vorhanden! Abbruch!"
608 exit 1
611 done
612 Merged=$(grep ^MERGED $tempdir/cutlist | cut -d"=" -f2 | sed 's/;/ /g')
613 mv $Merged $uncutdir 2>/dev/null
614 mv $filename $uncutdir 2>/dev/null
615 cd $uncutdir
616 avimerge -i $aviname $Merged -o $(echo $filename | sed 's/TVOON_DE/MERGED/g')
617 aviname=$(echo $aviname | sed 's/TVOON_DE/MERGED/g')
618 filename=$(echo $filename | sed 's/TVOON_DE/MERGED/g')
619 cd $pathname
620 uncutname="$uncutdir/$aviname"
622 project_start # Wenn nicht dann verwende avidemux
623 getAspect "$filename"
624 aspectRatio=$?
625 if [ $aspectRatio -eq 1 ] ; then
626 echo "Aspect Ratio : 4:3"; echo
628 if [ $aspectRatio -eq 2 ] ; then
629 echo "Aspect Ratio : 16:9"; echo
631 index=1
632 while [ $index -le $numberofCuts ] ; do # Schnitte in AD Projekt Datei einfuegen
633 echo "app.addSegment(0,${startFrame[$index]},${durationFrame[$index]})" >> $tempdir/project.js
634 writeLog "Schnitt: ${startFrame[$index]},${durationFrame[$index]}"
635 if [ $Smart -eq 1 ] ; then
636 echo "${durationFrame[$index]}" >> $tempdir/project.smart$Smartindex
637 echo "${durationTime[$index]}" >> $tempdir/projectTimes.smart$Smartindex
639 index=$((index+1))
640 done
641 if [ $(echo $filename | grep mpg.HQ.avi | wc -l) -ne 0 ] ; then
642 cutname="$cutdir/${aviname%.mpg.HQ.avi}-cut.HQ.avi"
643 elif [ $(echo $filename | grep mpg.HD.avi | wc -l) -ne 0 ] ; then
644 cutname="$cutdir/${aviname%.mpg.HD.avi}-cut.HD.avi"
645 else
646 cutname="$cutdir/${aviname%.mpg.avi}-cut.avi"
648 project_end
649 nice -n 15 $avidemux --force-smart --run $tempdir/project.js --quit 1>/dev/null
650 echo;echo
651 mv $filename $uncutname 2> /dev/null
652 else # sonst verwende VirtualDub via wine
653 if [ -e $vdub ] ; then # VD installiert?
654 VDproject_start
655 getAspect "$filename"
656 aspectRatio=$?
657 if [ $aspectRatio -eq 1 ] ; then
658 echo "Aspect Ratio : 4:3"; echo
659 VDproject_compData
661 if [ $aspectRatio -eq 2 ] ; then
662 echo "Aspect Ratio : 16:9"; echo
663 VDproject_compData169
665 echo "VirtualDub.subset.Clear();" >> $tempdir/project.syl
666 index=1
667 while [ $index -le $numberofCuts ] ; do # Schnitte in VD Projekt Datei einfuegen
668 echo "VirtualDub.subset.AddRange(${startFrame[$index]},${durationFrame[$index]});" >> $tempdir/project.syl
669 writeLog "Schnitt: ${startFrame[$index]},${durationFrame[$index]}"
670 if [ $Smart -eq 1 ] ; then
671 echo "${durationFrame[$index]}" >> $tempdir/project.smart$Smartindex
672 echo "${durationTime[$index]}" >> $tempdir/projectTimes.smart$Smartindex
674 index=$((index+1))
675 done
676 cutname="$cutdir/${aviname%.mpg.HQ.avi}-cut.HQ.avi"
677 if [ $(echo $filename | grep mpg.HQ.avi | wc -l) -ne 0 ] ; then
678 cutname="$cutdir/${aviname%.mpg.HQ.avi}-cut.HQ.avi"
679 elif [ $(echo $filename | grep mpg.HD.avi | wc -l) -ne 0 ] ; then
680 cutname="$cutdir/${aviname%.mpg.HD.avi}-cut.HD.avi"
682 VDproject_end
683 cd $tempdir
684 wine "$vdub" /s project.syl /x 2>&1 |
685 while read line; do # Warten bis VD beendet wird
686 vdpid=$(pgrep vdub.exe)
687 if [ "$line" == "fixme:avifile:AVIFileExit (): stub!" ] ; then
688 kill -s 9 "$vdpid";
690 done
691 cd $startdir
692 if [ $? -eq 0 ] && [ -f "$cutname" ] ; then # VD erfolgreich?
693 mv $filename $uncutname 2> /dev/null
694 if [ $convertHQ2MKV -eq 1 ] ; then
695 printf "\n$c_rot Zu Matroska Format konvertieren ... $c_normal\n\n"
696 mkvmerge -o $cutname.mkv $cutname # zu mkv konvertieren
697 echo
698 mv $cutname $cutname.backup.avi
699 mv $cutname.mkv $cutname
701 else
702 printf "\n$c_rot Es ist ein Fehler aufgetreten, die Datei wurde nicht geschnitten $c_normal \n"
703 echo
704 exit 1
706 else
707 printf "\n$c_rot VirtualDub ist nicht installiert!? Schneiden nicht moeglich. $c_normal \n"
708 echo
709 exit 1
713 bewerten () { # Bewertung abgeben
714 if [ $Auto -eq 0 ] ; then
715 printf "\n$c_rot Bitte eine Bewertung fuer die Cutlist abgeben... $c_normal\n\n"
716 echo "[0] Dummy oder keine Cutlist"
717 echo "[1] Anfang und Ende grob geschnitten"
718 echo "[2] Anfang und Ende halbwegs genau geschnitten"
719 echo "[3] Schnitt ist annehmbar, Werbung entfernt"
720 echo "[4] doppelte Szenen wurde nicht entfernt oder schoenere Schnitte moeglich"
721 echo "[5] Saemtliches unerwuenschtes Material wurde framegenau entfernt"
722 echo "[#] Jetzt nicht bewerten"
723 echo
724 read -p "Auswahl: " bewertung
725 while [ "$bewertung" == "" ] ; do
726 read -p "Auswahl: " bewertung
727 done
728 if [ $bewertung == "#" ] ; then
729 echo
730 else
731 writeLog "Sende Bewertung:$bewertung fuer Cutlist-ID:${Cutlist_id[$selected]}"
732 wget -U "multicut_light.sh/$Stand" -q -O - "$CutListAT/rate.php?rate=${Cutlist_id[$selected]}&rating=$bewertung" | tee -a $logFile
733 writeLog ""
734 echo
738 ReNameFile () { # Vorgeschlagene Dateinamen benutzen
739 if [ $Smart -eq 1 ] ; then
740 cp $tempdir/Commentscutlist$Smartindex $tempdir/sugestedNames 2>/dev/null
741 cp $tempdir/autoname$Smartindex $tempdir/autoname 2>/dev/null
742 else
743 if [ $localCutlist -eq 1 ] ; then
744 grep SuggestedMovieName= $tempdir/cutlist | cut -d"=" -f2 > $tempdir/sugestedNames2
745 if [ $useCommentsforMovieName -eq 1 ] ; then
746 grep UserComment= $tempdir/cutlist | cut -d"=" -f2 >> $tempdir/sugestedNames2
748 sed -e "/^ *$/d" $tempdir/sugestedNames2 > $tempdir/sugestedNames
749 else
750 index=1
751 while [ $index -le $number ] ; do # Dateinamen und Kommentare auslesen
752 if [ $(echo ${Cutlist_filename[$index]} | wc -w) -ne 0 ] ; then
753 echo ${Cutlist_filename[$index]} >> $tempdir/sugestedNames
755 if [ $(echo ${Cutlist_usercomment[$index]} | wc -w) -ne 0 ] && [ $useCommentsforMovieName -eq 1 ] ; then
756 echo ${Cutlist_usercomment[$index]} >> $tempdir/sugestedNames
758 index=$((index+1))
759 done
763 autoname=$(cat $tempdir/autoname 2>/dev/null)
764 if [ $(echo $autoname | wc -w) -ne 0 ] ; then
765 if [ $replaceWhitespace -eq 1 ] ; then
766 autoname=$(echo $autoname | tr " " "_")
768 printf "$c_rot Autoname: %s.avi $c_normal \n" "$autoname"
769 mv -i "$cutname" "$cutdir/$autoname.avi"
770 writeLog "autoname $autoname.avi"
771 else
772 printf "$c_rot Waehle einen Dateinamen zum editieren aus: $c_normal\n\n"
773 if [ -e $tempdir/sugestedNames ] ; then # Vorschlaege ausgeben
774 index=1
775 sort $tempdir/sugestedNames | uniq |
776 while read line ; do
777 printf " $c_rot [%d] $c_normal \t " $index
778 echo $line
779 index=$((index+1))
780 done
781 else
782 sugestedName=$aviname
785 echo
786 printf " $c_rot [#] $c_normal \t %s \n" "$(echo ${aviname%.mpg.avi}-cut.avi | sed 's/_TVOON_DE//g')"
787 printf " $c_rot [0] $c_normal \t Eigenen Namen eingeben \n"
788 echo
790 read -p "Auswahl: " auswahl
791 if [ $auswahl == "#" ] ; then # Umbenennen nach Auswahl
792 sugestedName="$(echo ${aviname%.mpg.avi}-cut.avi | sed 's/_TVOON_DE//g')"
793 mv -i "$cutname" "$cutdir/$sugestedName"
794 writeLog "rename $sugestedName"
795 else
796 if [ $auswahl -eq 0 ] ; then
797 sugestedName="$(echo ${aviname%.mpg.avi}-cut.avi | sed 's/_TVOON_DE//g')"
798 else
799 if [ $replaceWhitespace -eq 0 ] ; then
800 sugestedName=$(sort $tempdir/sugestedNames | uniq | head -n$auswahl | tail -n1).avi
801 else
802 sugestedName=$(sort $tempdir/sugestedNames | uniq | head -n$auswahl | tail -n1 | tr " " "_").avi
805 dialog --inputbox "Dateiname editieren:" 7 70 "$sugestedName" 2> $tempdir/sugfile
806 if [ $? -eq 1 ] ; then # kein Vorschlag bei Abbruch
807 echo
808 else
809 sugestedName=$(cat $tempdir/sugfile)
810 rm $tempdir/sugfile
811 mv -i "$cutname" "$cutdir/$sugestedName"
812 writeLog "rename $sugestedName"
816 rm $tempdir/sugestedNames $tempdir/sugestedNames2 $tempdir/autoname 2>/dev/null
817 echo
819 showNews () { # Skript Versionen anzeigen
820 StandWiki=$(wget -q -O - "http://wiki.onlinetvrecorder.com/index.php/Cutlist-Austausch/Linux-Skripte" | grep "Version vom:" | cut -d">" -f3 | cut -d"<" -f1 | head -n1)
821 printf "\nSkript-Versionen - Lokal: $Stand - Wiki: $StandWiki"
822 if [ ! $Stand == $StandWiki ] ; then
823 printf " $c_rot !!! Neue Version verfügbar !!! $c_normal\n"
825 echo
827 Decode () { # Otrkey entschluesseln
828 if type otrdecoder &> /dev/null ; then
829 otrdecoder=$(type otrdecoder)
830 else
831 printf "$c_rot otrdecoder nicht gefunden! $c_normal\n"
832 exit 1
834 if [ ! -e ~/.otrdecoder ] ; then # decoder config vorhanden ?
835 printf "$c_rot decoder config nicht gefunden! $c_normal\n"
836 exit 1
837 else
838 email=$(cat ~/.otrdecoder | grep mail | awk '{ print $3 }')
839 password=$(cat ~/.otrdecoder | grep password | awk '{ print $3 }')
841 printf "$c_rot Dekodiere $2.otrkey $c_normal\n"
842 writeLog "dekodiere $2.otrkey"
843 nice -n 15 $otrdecoder -q -i $1 -o $3 -e $email -p $password 2>> $logFile
844 if [ $? -ne 0 ] ; then
845 echo "Fehler $? aufgetreten!"
846 exit 1
848 if [ ! -e $uncutdir/$2 ] ; then
849 echo "Fehler aufgetreten, dekodierte Datei nicht vorhanden!"
850 exit 1
852 if [ $moveOtrkey -eq 1 ] ; then
853 if [ ! -d decoded ] ; then mkdir decoded;fi;decodeddir=${PWD%/}/decoded
854 mv $1 $decodeddir
857 Download () { # Otrkey download
858 if [ ! -d decoded ] ; then mkdir decoded;fi;decodeddir=${PWD%/}/decoded
859 if type otrdecoder &> /dev/null ; then
860 otrdecoder=$(type otrdecoder)
861 else
862 printf "$c_rot otrdecoder nicht gefunden! $c_normal\n"
863 exit 1
865 if [ ! -e ~/.otrdecoder ] ; then # decoder config vorhanden ?
866 printf "$c_rot decoder config nicht gefunden! $c_normal\n"
867 exit 1
868 else
869 email=$(cat ~/.otrdecoder | grep mail | awk '{ print $3 }')
870 password=$(cat ~/.otrdecoder | grep password | awk '{ print $3 }')
872 printf "$c_rot Dekodiere $2 $c_normal\n"
873 nice -n 15 $otrdecoder -q -i $1 -C $tempdir/cutlist -o $3 -e $email -p $password
874 if [ $? -ne 0 ] ; then
875 echo "Fehler aufgetreten!"
876 exit 1
878 if [ $moveOtrkey -eq 1 ] ; then
879 if [ ! -d decoded ] ; then mkdir decoded;fi;decodeddir=${PWD%/}/decoded
880 mv $2 $2.segments $decodeddir
883 getAspect () { # Aspect Ratio erfassen
884 aspectR=$(
885 mplayer -vo null -nosound "$1" 2>&1 |
886 while read line; do # Warten bis mplayer aspect-infos liefert oder anfaengt zu spielen
887 [[ $line =~ Aspe[ck]t.is.*1\.33:1 ]] && echo 1 && break
888 [[ $line =~ Aspe[ck]t.is.*0\.56:1 ]] || [[ $line =~ Aspe[ck]t.is.*1\.78:1 ]] && echo 2 && break
889 [[ $line == "VO: [null]"* ]] && echo 0 && break
890 done
891 pkill -n mplayer
893 return $aspectR # returns 1 (4:3), 2 (16:9) oder 0 (Aspect Ratio nicht erkannt)
895 writeLog () { # schreibe Log-Datei
896 echo "$(date +%H:%M:%S) $1" >> $logFile
898 smartModus () { # Smart-Modus
899 SmartNo=$(ls $tempdir/cutlist* 2>/dev/null | wc -l)
900 Smartindex=1
901 while [ $Smartindex -le $SmartNo ] ; do # schneiden
902 printf " $c_blau Smart-Modus $Smartindex/$SmartNo $c_normal\n\n"
903 filename=$(cat $tempdir/cutlist$Smartindex | tail -n4 | head -n1)
904 aviname=$(cat $tempdir/cutlist$Smartindex | tail -n3 | head -n1)
905 uncutname=$(cat $tempdir/cutlist$Smartindex | tail -n2 | head -n1)
906 cutlisturl=$(cat $tempdir/cutlist$Smartindex | tail -n1)
907 wget -U "multicut_light.sh/$Stand" -q -O $tempdir/cutlist $cutlisturl
908 fps=$( grep FramesPerSecond $tempdir/cutlist | tr -d "\r" | sed 's/FramesPerSecond=//' )
909 echo "$fps" > $tempdir/fps.$Smartindex
910 fpsAD=$(echo "$fps*1000" | bc | egrep -o ^[0-9]*)
911 if [ $(cat $tempdir/cutlist | wc -l) -ne 0 ] ; then
912 cutFilm $filename
913 else
914 cat $tempdir/cutlist
916 rm $tempdir/cutlist
917 Smartindex=$((Smartindex+1))
918 done
920 Smartindex=1 # Pruefen, bewerten und umbenennen
921 while [ $Smartindex -le $SmartNo ] ; do
922 printf " $c_blau Smart-Modus $Smartindex/$SmartNo $c_normal\n\n"
923 aviname=$(cat $tempdir/cutlist$Smartindex | tail -n3 | head -n1 | sed 's/\.otrkey//g')
924 if [ $(echo $aviname | grep HQ.avi | wc -l) -eq 1 ] ; then
925 cutname="$cutdir/${aviname%.mpg.HQ.avi}-cut.HQ.avi"
926 elif [ $(echo $aviname | grep HD.avi | wc -l) -eq 1 ] ; then
927 cutname="$cutdir/${aviname%.mpg.HD.avi}-cut.HD.avi"
928 else
929 cutname="$cutdir/${aviname%.mpg.avi}-cut.avi"
931 if [ ! -e $cutname ] ; then
932 aviname=$(echo $aviname | sed 's/TVOON_DE/MERGED/g')
933 cutname=$(echo $cutname | sed 's/TVOON_DE/MERGED/g')
935 printf "$c_rot Pruefe $aviname $c_normal\n"
936 numberofCuts=$(cat $tempdir/project.smart$Smartindex 2>/dev/null | wc -l)
937 durationFrames=$(cat $tempdir/project.smart$Smartindex)
938 durationTimes=$(cat $tempdir/projectTimes.smart$Smartindex)
939 fps=$(cat $tempdir/fps.$Smartindex)
940 index=1
941 for frame in $durationFrames ; do # Duration Frames festlegen
942 durationFrame[$index]=${frame%[[:cntrl:]]}
943 index=$((index+1))
944 done
945 index=1
946 for frame in $durationTimes ; do # Duration Times festlegen
947 durationTime[$index]=${frame%[[:cntrl:]]}
948 index=$((index+1))
949 done
950 Cutlist_id[$selected]=$(cat $tempdir/cutlist$Smartindex | tail -n1 | cut -d"=" -f2)
951 if [ $rateCutlist -eq 1 ] ; then
952 showCuts
954 if [ $useSuggestedMovieName -eq 1 ] ; then
955 ReNameFile
957 Smartindex=$((Smartindex+1))
958 done
961 help () { # Hilfe (Optionen) anzeigen
962 cat << END
963 Aufruf:
964 $0 [options] files
966 Moegliche Optionen:
968 -s Anhand der Dateigroesse anstatt des Dateinamens suchen
969 -c Lokale Cutlist benutzen:
970 multicut_light.sh -c (path/to/)Film.cutlist Film.mpg.avi(.otrkey)
971 -edl nicht schneiden, edl-Datei fuer mplayer erstellen und starten
972 -ue Nur die Übersicht anzeigen
973 -rate Schnitte anzeigen und bewerten
974 -remote Schnitte nicht anzeigen und nicht bewerten
975 -auto Automatik-Modus
976 -smart Zuerst Cutlists auswaehlen, danach schneiden
977 -url persöhnliche Cutlist.at URL speichern
978 ( -url http://www.cutlist.at/user/0123456789abcdef
979 ohne letzten Schraegstrich ! )
980 -name Vorgeschlagene Dateinamen benutzen
981 -news Skript-Versionen anzeigen
983 (c) bowmore@otrforum $Stand
984 HQ-Unterstuetzung von MKay@otrforum
986 exit 1
989 # Start
990 overview=0
991 edl=0
992 localCutlist=0
994 while [ "$1" != "${1#-}" ] ; do # uebergebene Parameter abfragen
995 case ${1#-} in
996 s) searchby="size"; shift;;
997 c) localCutlist=1; Smart=0; rateCutlist=0; shift; localCutlistPath="${1#-}"; shift;;
998 edl) edl=1;Smart=0; shift;;
999 ue) overview=1;Smart=0; shift;;
1000 rate) rateCutlist=1; shift;;
1001 remote) rateCutlist=0; shift;;
1002 auto) Auto=1; shift;;
1003 smart) Smart=1; shift;;
1004 url) shift;echo $1 > ~/.cutlist.at;exit 0;;
1005 name) useSuggestedMovieName=1;shift;;
1006 news) showNews;exit 1;;
1007 *) help; exit 1;;
1008 esac
1009 done
1011 checkUp $1
1013 if [ $News -eq 1 ] ; then showNews ; fi # Version anzeigen
1014 for file in ${@:-*.mpg*.avi*}; do # einzelne Dateien durchgehen
1015 cleanUp
1016 if [ $localCutlist -eq 1 ] ; then
1017 number=1
1018 else
1019 getXml $aviname # Uebersicht holen
1021 if [ $number -ne 0 ] ; then # Cutlists vorhanden?
1022 if [ $(echo $file | grep -c http://) -eq 1 ] ; then
1023 Smart=0
1025 if [ $localCutlist -eq 1 ] ;then
1026 cp $localCutlistPath $tempdir/cutlist
1027 else
1028 showSelect # Ja -> anzeigen
1030 if [ $(echo $file | grep -c http://) -eq 1 ] || [ $(echo $file | grep -c ftp://) -eq 1 ] ; then
1031 Download $file $aviname $cutdir
1032 exit 1
1034 if [ $limitreached -eq 0 ] && [ $dontCut -eq 0 ] && [ $Smart -eq 0 ] ; then # Limit? keine Auswahl?
1035 if [ $edl -eq 1 ] ; then # edl fuer mplayer erstellen?
1036 showEDL
1037 else
1038 cutFilm $filename # Film schneiden
1040 if [ ! $Auto -eq 1 ] && [ $rateCutlist -eq 1 ] ; then # Schnitte mit mplayer anzeigen ?
1041 showCuts
1043 if [ $useSuggestedMovieName -eq 1 ] && [ $Auto -eq 0 ] ; then
1044 ReNameFile # Datei umbenennen
1048 done
1050 if [ $Smart -eq 1 ] ; then smartModus ;fi # Smart Modus
1051 if [ -e ~/.multicut_light_finish.sh ] ; then ~/.multicut_light_finish.sh ;fi # pers. Skript zum Ende ausfuehren
1053 exit 0