Привет всем!
Я слегка подправил стандартный пример. Теперь, если отказаться от закачки,
то можно сохранить ссылку в файл. И добавил еще одну задачу, которая мониторит процесс
закачки wget-а, и, если файл докачан, приступает к закачке следующего.
################################
# URL monitor
################################
SET WgetPath=S:\wget\Config\
SET WGETRC=%WgetPath%wget.cfg
#( WGET_task
: WGET-PAT S" /(http)|(ftp):\/\/[^ ]+?\.(zip)|(gz)|(rar)|(jpeg)|(jpg)|(exe)|(mp3)/i" ;
AsLoggedUser
VARIABLE WgetEnable
WatchClipboard: *
Rule: RE-MATCH: %CLIPBOARD% %WGET-PAT% RE-MATCH: "%USERNAME%" "/ivanitsa/i" AND
Action:
WgetEnable ON
RE-ALL: %CLIPBOARD% %WGET-PAT%
WgetEnable @
IF
QUERY: "Загрузить %$0%?"
IF
ShowNormal
START-APP: S:\SocksCap32 V26\Sc32.exe %WgetPath%wget.exe %$0%
ELSE
QUERY: "Поставить в очередь %$0%?"
IF
FILE-APPEND: "%WgetPath%links.wgt" "%$0%%crlf%"
WgetEnable OFF
THEN
THEN
ELSE
FILE-APPEND: "%WgetPath%links.wgt" "%$0%%crlf%"
THEN
;RE-ALL
)#
###############################
# LINK monitor
###############################
#( Wget_Refresh
AsLoggedUser
VARIABLE list-file
CREATE list-contents 258 ALLOT
VARIABLE log-file
CREATE log-contents 258 ALLOT
VARIABLE WGDownloadFlag
: fREL S>D log-file @ FILE-POSITION THROW D+ log-file @ REPOSITION-FILE THROW ;
: fREAD log-contents SWAP log-file @ READ-FILE THROW log-contents SWAP ;
Time: */20 * * * * *
Rule: PROC-EXIST: "wget.exe" NOT FILE-EXIST: "%WgetPath%links.wgt" AND
Action:
\ Выставляем переменные
\ WGDownloadFlag OFF
\ Читаем адрес из очереди
S" s:\wget\Config\Links.wgt" R/O OPEN-FILE-SHARED
\ Страховка на случай отсутствия файла
IF DROP EXIT THEN list-file !
list-contents 1+ 255 list-file @ READ-LINE THROW DROP
list-contents C!
\ Читаем адрес из log файла
S" s:\wget\Config\wgcron.out" R/O OPEN-FILE-SHARED
\ Страховка на случай отсутствия Log-файла
IF DROP list-file @ THEN log-file !
log-contents 1+ 255 log-file @ READ-LINE THROW DROP
log-contents C!
log-contents COUNT 14 /STRING log-contents PLACE
\ Теперь нужно сравнить эти ссылки,
\ и если они совпали, то проверить
log-contents COUNT list-contents COUNT COMPARE 0= IF
\ Совпали! Смотрим в конце лога:
\ Это обрыв или успешная закачка
log-file @ >EOF \ на EOF
-48 fREL
46 fREAD \ на стеке строка с концовкой лога
S" /(\;\snothing\sto\sdo\.)|(\ssaved\s\[)/i" RE-MATCH IF
\ используем переменные log-... для копирования
list-file @ CLOSE-FILE DROP \ сначала нужно
log-file @ CLOSE-FILE DROP \ закрыть дескрипторы
\ Переименовали файл Links.wgt
PAUSE: 1000
FILE-RENAME: "s:\wget\Config\links.wgt" "s:\wget\Config\links.old"
\ теперь выбрасаваем первую ссылку
S" s:\wget\Config\Links.old" R/O OPEN-FILE-SHARED THROW log-file !
log-contents 1+ 255 log-file @ READ-LINE THROW DROP
log-contents C!
\ а остальное сливаем в Links.wgt
BEGIN log-contents 1+ 255 log-file @ READ-LINE THROW WHILE
log-contents C!
FILE-APPEND: "%WgetPath%links.wgt" "%log-contents COUNT%%crlf%"
REPEAT
DROP
log-file @ CLOSE-FILE DROP
PAUSE: 1000
FILE-DELETE: "s:\wget\Config\links.old"
\ FILE-EXIST: "s:\wget\Config\links.wgt" IF WGDownloadFlag ON THEN
ELSE
\ Это случай докачки при обрыве
WGDownloadFlag ON
THEN
ELSE
WGDownloadFlag ON
THEN
WGDownloadFlag @ IF
START-APP: S:\SocksCap32 V26\Sc32.exe %WgetPath%wget.exe -bc -o %WgetPath%wgcron.out %list-contents COUNT%
THEN
list-file @ CLOSE-FILE DROP
log-file @ CLOSE-FILE DROP
)#
Логика работы должна быть понятна из комментариев. Замечания и более элегантные решения
приветствуються....