SaveTV Download Script Version 2
Features
-
Download von SaveTV-Aufnahmen
-
Parallele Downloads
-
Geschwindigkeitsbegrenzung pro Download
-
Dateinamen von SaveTV-Server holen
-
Dateinamen bereinigen
-
Kundennummer aus Dateinamen entfernen
-
Resume
-
Neustart bei Fehler
-
Kein PHP, Apache oder sonstiger Webserver wird benötigt
-
Dateidatum wird auf das Datum vom Server gesetzt
-
Anzeige der Datei-Größen
-
Anzeige des freien Speichers nach dem Download
Fehlende Funktionen
-
Links direkt von der SaveTV-Seite holen (Aufwendiger)
-
Leider kein vollwertiger Download-Manager für SaveTV (Noch Aufwendig)
-
…
Vorraussetzungen
Screenshot
Bedinungsanleitung
Konfiguration
-
Script mit einem Text-Editor öffnen
-
Den folgenden Block in den Script suchen
-
Parameter anpassen
-
Script speichern und den Text-Editor beenden
1 2 3 4 5 6 7 8 9 10 11 12 |
######## #Config ######## TEMPDIR="./.tmp-savetv" LOOPSLEEP="2" LOCKFILE="/tmp/dl-savetv.pid" DLLINKSFILE="./download.txt" MAXDONWLOADS="2" KUNDENNUMMER="_123456789" SPEED="250k" DOWNLOADDIR="." CURLWAITTIME="100" |
Parameter
-
TEMPDIR:
In diesem Ordner werden die Downloads verwaltet und die laufenden Downloads zwischengespeichert
(Sollte möglichst auf der gleichen Partion sein wie das DOWNLOADDIR). -
LOOPSLEEP:
Zeit zwischen aktuallisierungen der Anzeige. Sollte die Anzeige flackern, muss der Wert erhöht werden. (Dieser Wert sollte zwischen 2 und 10 sein). -
LOCKFILE:
Datei in der das Script die PID Einträg. Diese Datei muss vom Benutzer/Script geschrieben und gelöscht werden können. -
DLLINKSFILE:
In diese Datei müssen die neuen Links für den Download Eingetragen werden. Diese Datei muss vom Benutzer/Script geschrieben und gelöscht werden können. -
MAXDONWLOADS:
Anzahl der gleichzeitigen Downloads. -
KUNDENNUMMER:
SaveTV Kundennummer (SaveTV scheibt die Kundennummer ans Ende vom Dateinamen. Das Script entfernt diese Nummer aus dem Dateinamen. Der „_“ vor der Kundennummer sollte entfernt zusätzlich den unnötigen „_“ im Dateinamen.) -
SPEED:
Downloadgeschwindigkeit pro Download
10240 = 10kb/sec
20k = 20kb/sec
2M = 2048kb/sec -
DOWNLOADDIR:
In diesen Ordner werden die Heruntergeladenen Dateien abgelegt. (Sollte möglichst auf der gleichen Partion sein wie das TEMPDIR). -
CURLWAITTIME:
Sollte ein Download durch einen Fehler (z.B. 24h Disconnet) gestört werden, wird vor dem erneuten Start diese Zeit abgewartet.
60 = 60 Sekunden = 1 minute
100 = 100 Sekunden = 1 Minute 40 Sekunden
Downloads hinzufügen
Die Download-Links müssen manuel mit dem Web-Browser von der SaveTV-Seite in die $DLLINKSFILE z.B. download.txt kopiert werden.
Downloads starten
Zum Starten des Downloads muss das Script ausgeführt werden. Am besten startet man das Script in einer Screen-Session. Sollte das Script bereits laufen, werden die neuen Links aus XX der Job-Liste hinzugefügt. Die neue Instanz von dem Script beendet sich nach dem hinzufügen der Downloads in die Warteschlange.
Script Herunterladen
Downloads
SaveTV Download Script Version 2.11.4 herunterladen!
SaveTV Download Script Version 2.11.1 herunterladen!
SaveTV Download Script Version 2.11 herunterladen!
SaveTV Download Script Version 2.10 herunterladen!
SaveTV Download Script Version 2.08 herunterladen!
SaveTV Download Script Version 2.06 herunterladen!
Changelog
2.11.4
-
Bugfix: Curl Parameter entfernt, welcher bei aktuelleren Ubuntu-Versionen zu Fehlern geführt hat.
-
Bugfix: Mehrer kleinere Bugs beseitigt
2.11.1
-
Bugfix: Anzeige wurde durch Fehler-Ausgaben gestört
2.11
-
Anzeige des Freien Speichers hinzugefügt
-
Anzeige des verbleibenden Speichers nach dem Download hinzugefügt
-
Anzeige der noch fehlenden Datenmenge
2.10
-
Änderungsdatum von der heruntergeladen Datei wird auf das vom Server übermittelte Datum gesetzt
-
Dateigröße wird in Jobfile abgelegt (Vorbereitung für Anzeige der Dateigrößen)
2.08
-
Anzeige der Aktiven Downloads verbessert
-
Anzeige der Beendeten Download
-
Zusätzliche Download Log Dateien (Downloaded-Files.txt, Last-Download.txt)
-
Kleinere Bug-Fixes (mehrmals „2>/dev/null“ hinzugefügt)
2.06
-
1. Veröffentlichte Version
Script (aktuelle Version)
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 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 |
#!/bin/bash #Name: dl2.sh Description="SaveTV-Download-Script v" #Dependencies: curl, bc, sleep, ps, tail, mv, let, tr, (screen) #Author: Thomas Jungbauer #Author-e-Mail: thomas@jungbauer-online.net #License: WTFPL #License-Text-Url: http://sam.zoy.org/wtfpl/COPYING Version="2.11.4" #Relase-Date: 02.06.2011 #Last-change-Date: 18.08.2012 ######## #Config ######## TEMPDIR="./.tmp-savetv" LOOPSLEEP="2" LOCKFILE="/tmp/dl-savetv.pid" DLLINKSFILE="./download.txt" MAXDONWLOADS="2" KUNDENNUMMER="_123456789" SPEED="250k" DOWNLOADDIR="." CURLWAITTIME="100" DF="/mnt/smb/savetv/debug.txt" ######## #Funktionen: Hier kommen die Funktionen, welche später benutzt werden. ######## function exit_all { #Diese Funktion wird bei STRG+C ausgeführt. #Hier wird aufgeräumt und die CURL-Prozesse beendet. echo "Heruntergeladen aufnahmen:" cat $TEMPDIR/Logs/Last-Download.txt 2>/dev/null ||echo "-" echo "Download-Script wird vorzeitig beendet!" PID=`cat $LOCKFILE` for CPID in `ps h --ppid $PID -o pid`; do #CPID von 1. Child Prozess (dl2.sh) for CURLPID in `ps h --ppid $CPID -o pid`; do kill -9 $CURLPID 2>/dev/null done kill -9 $CPID 2>/dev/null done exit 0 } trap exit_all SIGINT function create_temp_dirs { #Diese Funktion erstellt die Temp-Ordner TEMPSUBFOLDERS="01-New-Jobs 02-Queue 03-Queue2 04-Download 05-Finish 11-Retry-Later 12-Duplicate Logs DownloadTemp" for SUBDIR in $TEMPSUBFOLDERS ; do if [ ! -d $TEMPDIR/$SUBDIR ]; then mkdir --parents $TEMPDIR/$SUBDIR fi done } function jobs_back_to_queue { #Diese Funktion verschiebt die unvollendeten Jobs zurück in die Warteschlange. if [ `ls -1 $TEMPDIR/04-Download/*.job 2>/dev/null |wc -l` != 0 ]; then mv $TEMPDIR/04-Download/*.job $TEMPDIR/03-Queue2/ fi } function add_jobs_to_queue { #Diese Funktion teilt die $DLLINKFILE in einzeile Jobs auf. count=0 if [ -f $DLLINKSFILE ]; then for LINK in `cat $DLLINKSFILE`; do echo $LINK >$TEMPDIR/01-New-Jobs/`date +%Y%m%d-%H%M%S`-$count.job let count=count+1 rm $DLLINKSFILE touch $DLLINKSFILE done else touch $DLLINKSFILE fi echo $count "Jobs wurden der Download-Warteschlange hinzugefügt." } function filter_duplicate { #Hier werden die Duplicate nach 12-Duplicate aussortiert. #Die andern Job kommen nach 03-Queue2 if [ `ls -1r $TEMPDIR/02-Queue/*.job 2>/dev/null |wc -l` != 0 ]; then FILE=`ls -1r $TEMPDIR/02-Queue/*.job | tail -n 1` #URL=`cat $FILE |grep http:` URL=`tail -n 1 $FILE ` DUPLICATE=`cat $TEMPDIR/03-Queue2/*.job $TEMPDIR/04-Download/*.job $TEMPDIR/05-Finish/*.job 2>/dev/null | grep $URL | wc -l` if [ $DUPLICATE != 0 ]; then #Duplicat: Datei wird nach 12-Duplicate verschoben echo "Bereits heruntergeladen:" `sed -n '2p' $FILE` >>$TEMPDIR/Logs/Last-Download.txt mv $FILE $TEMPDIR/12-Duplicate else #Kein Duplicat: Datei wir nach 03-Queue2 verschoben mv $FILE $TEMPDIR/03-Queue2 fi fi } function add_filname_to_job { #Diese Funktion fügt den Dateinamen dem Jobfile hinzu #Manchmal bekommt man keinen Namen, dann wird der #Job später nochmal probiert URL=`cat $1 |grep http` curl -s -g --head $URL >$TEMPDIR/headertmp.txt 2>/dev/null FNAME=`cat $TEMPDIR/headertmp.txt | grep Content-Disposition | awk -F '[=\r]' '{print $2}'` FSIZE=`cat $TEMPDIR/headertmp.txt | grep Content-Length | cut -c 17- ` FDATE=`cat $TEMPDIR/headertmp.txt | grep Last-Modified | cut -c 16- ` FETAG=`cat $TEMPDIR/headertmp.txt | grep Etag | cut -c 7- | xargs ` rm $TEMPDIR/headertmp.txt #Umlaute un komische Zeichen werden durch _ Ersetzt FNAME=`echo $FNAME | tr '\200'-'\377' _ ` #Kundennummer wird entfernt FNAME=`echo ${FNAME//$KUNDENNUMMER/""}` FNAMELENGTH=`echo $FNAME | wc -m` #echo $FNAME if [ $FNAMELENGTH -ge 3 ]; then #Die while-Schleifen sorgen dafür, das keine vorhandene Datei #überschrieben wird. #In seltenen Fällen kommt es vor, das 2 unterschiedliche #URLs den gleichen Dateinamen ergeben. while [ -e $TEMPDIR/DownloadTemp/$FNAME ]; do FNAME=`echo $FNAME-1.avi` done while [ -e $DOWNLOADDIR/$FNAME ]; do FNAME=`echo $FNAME-2.avi` done #TODO: Hier müssen noch die Dateinamen von den Jobs in der Warteschlange ###### überprüft werden. (02-Queue und 03-Queue2) #Zeile 1: URL #Zeile 2: Filename #Zeile 3: Dateigröße #Zeile 4: Dateidatum #Zeile 5: Etag echo $FNAME >>$1 echo $FSIZE >>$1 echo $FDATE >>$1 echo $FETAG >>$1 mv $1 $TEMPDIR/02-Queue/ else mv $1 $TEMPDIR/11-Retry-Later/ fi } function get_filenames { #Hohlt die Dateinamen vom Server. #Pro Aufruf wir nur 1 Datei bearbeitet!!! #Benötigt die folgenden Funktionen #add_filname_to_job if [ `ls -1r $TEMPDIR/01-New-Jobs/*.job 2>/dev/null |wc -l` != 0 ]; then FILE=`ls -1r $TEMPDIR/01-New-Jobs/*.job | tail -n 1` #Dateiname wird dem Job hinzugefügt add_filname_to_job $FILE else #Es werden die Retrys zurück in den Ausgangsordner kopiert mv $TEMPDIR/11-Retry-Later/*.job $TEMPDIR/01-New-Jobs/ 2>/dev/null fi } function start_download_file { #Hier wird 1 Download-Job gestartet (Als Background-Job) FILE=`ls -1r $TEMPDIR/03-Queue2/*.job | tail -n 1` URL=`cat $FILE|grep http` #FILENAME=`cat $FILE| tail -n 1` FILENAME=`sed -n '2p' $FILE` FDATE=`sed -n '4p' $FILE` mv $FILE $TEMPDIR/04-Download FILE=`echo ${FILE//"03-Queue2"/"04-Download"}` while $stat ; do curl -C - --limit-rate $SPEED $URL --output $TEMPDIR/DownloadTemp/$FILENAME 2>$TEMPDIR/Logs/$FILENAME.txt && stat=false || sleep $CURLWAITTIME done touch -d "$FDATE" $TEMPDIR/DownloadTemp/$FILENAME 2>/dev/null mv $TEMPDIR/DownloadTemp/$FILENAME $DOWNLOADDIR mv $FILE $TEMPDIR/05-Finish echo $FILENAME >>$TEMPDIR/Logs/Downloaded-Files.txt echo $FILENAME >>$TEMPDIR/Logs/Last-Download.txt } function start_download { #Downloads werden bei Bedarf gestartet AKTIVEDL=`ls -1 $TEMPDIR/04-Download/*.job 2>/dev/null |wc -l ` QUEUEDL=`ls -1 $TEMPDIR/03-Queue2/*.job 2>/dev/null |wc -l ` clear cat $TEMPDIR/Logs/Status.txt 2>/dev/null if [ $QUEUEDL != 0 ]; then if [ $AKTIVEDL -lt $MAXDONWLOADS ]; then #Es wird 1 Download gestartet start_download_file & sleep 1 fi fi } function gen_status { STATUSFILE="$TEMPDIR/Logs/Status.txt" AKTIVEDL=`ls -1 $TEMPDIR/04-Download/*.job 2>/dev/null |wc -l ` QUEUEDL=`ls -1 $TEMPDIR/03-Queue2/*.job 2>/dev/null |wc -l ` FREEDLDIRBYTES=`df --portability --block-size=1 $DOWNLOADDIR |tail -1 |xargs |cut -d ' ' -f 4` FREEDLDIRHR=`df -h --portability $DOWNLOADDIR |tail -1 |xargs |cut -d ' ' -f 4` QUEUEBYTES="0" for QUEUEJOB in $TEMPDIR/03-Queue2/*.job do if [ -f $QUEUEJOB ]; then JOBBYTES=`sed -n '3p' $QUEUEJOB |tr -d [:cntrl:]` if [ $JOBBYTES -ge 1 ]; then QUEUEBYTES=`echo -n $QUEUEBYTES"+"$JOBBYTES` fi fi done echo $QUEUEBYTES >$TEMPDIR/bc.tmp QUEUEBYTES=`cat $TEMPDIR/bc.tmp |bc` rm $TEMPDIR/bc.tmp ADLBYTES="0" for ADLJOB in $TEMPDIR/04-Download/*.job do if [ -f $ADLJOB ]; then JOBBYTES=`sed -n '3p' $ADLJOB |tr -d [:cntrl:]` if [ $JOBBYTES -ge 1 ]; then ADLBYTES=`echo -n $ADLBYTES"+"$JOBBYTES` fi fi done echo $ADLBYTES >$TEMPDIR/bc.tmp ADLBYTES=`cat $TEMPDIR/bc.tmp |bc` rm $TEMPDIR/bc.tmp echo $ADLBYTES"+"$QUEUEBYTES"-"`du -sb $TEMPDIR/DownloadTemp |cut -f1` >$TEMPDIR/bc.tmp TODLBYTES=`cat $TEMPDIR/bc.tmp |bc` rm $TEMPDIR/bc.tmp echo $FREEDLDIRBYTES"-"$TODLBYTES >$TEMPDIR/bc.tmp FREEAFTERDLBYTES=`cat $TEMPDIR/bc.tmp |bc` rm $TEMPDIR/bc.tmp echo $FREEAFTERDLBYTES"/1024/1024" >$TEMPDIR/bc.tmp FREEAFTERDLMB=`cat $TEMPDIR/bc.tmp |bc` rm $TEMPDIR/bc.tmp echo $TODLBYTES"/1024/1024" >$TEMPDIR/bc.tmp TODLMB=`cat $TEMPDIR/bc.tmp |bc` rm $TEMPDIR/bc.tmp echo $QUEUEBYTES"/1024/1024" >$TEMPDIR/bc.tmp QUEUEMB=`cat $TEMPDIR/bc.tmp |bc` rm $TEMPDIR/bc.tmp #clear echo $Description$Version >$STATUSFILE echo -n "Aktive Downloads: "$AKTIVEDL >>$STATUSFILE echo " Wartende Downloads: "$QUEUEDL >>$STATUSFILE echo -n "Frei Speicher:" $FREEDLDIRHR >>$STATUSFILE echo " Freier Speicher bei Downloadende: "$FREEAFTERDLMB "MiB" >>$STATUSFILE echo -n "Zum Download: "$TODLMB "MiB" >>$STATUSFILE echo " Warteschlange: "$QUEUEMB "MiB" >>$STATUSFILE #echo "TODLBYTES:" $TODLBYTES Bytes >>$STATUSFILE #echo "QUEUEBYTES:" $QUEUEBYTES Bytes >>$STATUSFILE #echo "ADLBYTES:" $ADLBYTES Bytes >>$STATUSFILE #echo "FREEDLDIRBYTES:" $FREEDLDIRBYTES Bytes>>$STATUSFILE #echo "FREEAFTERDLBYTES:" $FREEAFTERDLBYTES Bytes>>$STATUSFILE echo >>$STATUSFILE echo "Laufende Downloads:" >>$STATUSFILE for DLFILES in `ls -1 $TEMPDIR/DownloadTemp/* 2>/dev/null `;do TMP=`du -h $DLFILES 2>/dev/null` TMP=`echo ${TMP//$TEMPDIR/""}` TMP=`echo ${TMP//DownloadTemp/""}` TMP=`echo $TMP | tr -d '/' ` echo $TMP >>$STATUSFILE done echo >>$STATUSFILE echo "Fertige Downloads:" >>$STATUSFILE cat $TEMPDIR/Logs/Last-Download.txt >>$STATUSFILE 2>/dev/null ||echo "-" >>$STATUSFILE } ####### #Ab hier werden die Funktionen von oben aufgerufen ####### ####### # Init: Hier wird die Umgebung geprüft ####### #Mehrfach-Start überprüfen #Lockfile setzen #FIRSTSTART: Variable in der gespeichert wird, ob das Script schonmal gestartet wurde #0 = script läuft noch nicht, 1 script läuft bereits FIRSTSTART=0 if [ -f $LOCKFILE ]; then #LOCKFILE ist vorhanden PID=`cat $LOCKFILE` SCRIPTNAME=`echo $0` TMP=`ps h -p $PID |grep $SCRIPTNAME |grep $PID |wc -l ` if [ $TMP != 0 ]; then #Prozess läuft FIRSTSTART=1 else #Prozess läuft nicht FIRSTSTART=0 echo $$ >$LOCKFILE fi else #LOCKFILE nicht vorhanden, Prozess läuft nicht echo $$ >$LOCKFILE FIRSTSTART=0 fi ###### #INIT1: Nur bei erneutem Starten der Anwendung ###### if [ $FIRSTSTART = 1 ];then #Job 1: Weiter Jobs hinzufügen #Links splitten und in Warteschlange schieben. #Später müssten Duplicate entfernt werden. add_jobs_to_queue #Job 2: Allgemein Informationen ausgeben echo $0 läuf bereits. echo Die Links von $DLLINKSFILE wurden der Warteschlange hinzugefügt. #ENDE!!! (keine Weitere Ausführung) exit 0 fi ###### #INIT2: Nur bei erststart der Anwendung ###### if [ $FIRSTSTART = 0 ];then #Job 1: Temp-Verzeichnisse bei bedarf anlegen create_temp_dirs #Job 2: Jobs von "In-Arbeit" zurück in die Warteschlange schieben jobs_back_to_queue #Job 3: Weiter Jobs hinzufügen #Links splitten und in Warteschlange schmeißen #(Später müssten Duplicate entfernt werden) #Input-Daten bereinigen / Löschen add_jobs_to_queue #Löschen der Last-Download-Log.txt rm $TEMPDIR/Logs/Last-Download.txt 2>/dev/null #Danach wird der Loop ausgeführt fi ######## # Main-Loop (läuft solange, wie Download arbeiten) # Hier sind nur die Sachen, welche immer wieder ausgfeführt werden müssen # Wird nur ausgeführt, wenn das Script noch nicht läuft ######## if [ $FIRSTSTART = 0 ];then RUNLOOP=true while $RUNLOOP ; do #JOB 1: Dateiname ermitteln (Warteschlange erstellen) get_filenames #Job 2: Dublikat-Check filter_duplicate #JOB 3: Download-Jobs starten (bei bedarf) #Generieren von Status-Anzeige wird hier auch noch erledigt gen_status start_download #Job 5: Ermitteln, ob alle Aufgaben erledigt sind, und das Script beendet werden kann ls -1 $TEMPDIR/0[1-4]*/*.job >/dev/null 2>/dev/null ||RUNLOOP=false if [ $RUNLOOP = false ]; then echo "Warten auf Jobs" wait echo "Heruntergeladen aufnahmen:" cat $TEMPDIR/Logs/Last-Download.txt 2>/dev/null fi sleep $LOOPSLEEP done fi exit 0 |
Funktionsweise / Anleitung
(Kommt noch)
Roadmap
2.1x
-
Anzeige von Downloads in der Warteschlange -
Anzeige Dateigrößen (Download + Warteschlange) -
Gesamt MB Anzeige (XX MB von YY MB heruntergeladen) -
Bugfixes
2.2x
-
Anzeige der Warteschlange (Mit DL-Größen)
2.3x
-
Überprüfung des freien Festplatten-Speichers
2.4x
-
e-Mail Benachrichtigungen bei fertigen Downloads
-
e-Mail Benachrichtigung bei Platz-Mangel
-
Dateigröße und Dateidatum vom Server hohlen -
Downloads überprüfen
-
Dateidatum setzten(funktioniert ab Version 2.10)
2.5x
-
….
Quellen
Die folgende Zeile habe ich irgendwo her kopiert … leider weiß ich nicht mehr woher :-(
Der Rest ist aber von mir :-)
1 |
FNAME=`curl -s -g --head $URL | grep Content-Disposition |awk -F '[=\r]' '{print $2}'` |
Leave a Reply
You must be logged in to post a comment.