Автоматизация загрузки только новых серий torrent-раздач (.bat + curl + aria2c) [HowTo]

от автора

За ужином интересно посмотреть что-то взрывное престольное или из позднего.
И совсем неприятно, когда стол накрыт, а ты начинаешь лихорадочно проверять по всем раздачам «а не появилось ли чего нового».
И в лучшем случае дальше будет надпись в uTorrent — «Осталось 5-10-15 минут». А стол стынет.

Так дела не делаются.

Задача:

  • автоматическая загрузка только новых серий/выпусков torrent-раздач с rutracker и rutor
  • уведомление о новых загрузках
  • обойтись только Windows и сторонними консольными программами

Решение:

Создание файла-списка раздач с номерами последних скачанных серий (get.txt).

Запуск по расписанию bat-скрипта (get.bat), который для каждой раздачи:

  1. скачивает torrent-файл,
  2. проверяет «есть ли новое?»,
  3. скачивает новое,
  4. обновляет номер последней серии в файле настроек (get.txt),
  5. создает запись в журнале загрузок (log.txt),
  6. копирует ярлык на «журнал загрузок» в «панель у пуска»

Результат:

Если загружена новая серия, то в панель «Ссылки» будет скопирован ярлык на журнал загрузок (иконка на картинке — желтая звезда).

Если после просмотра всего нового «звездочку» удалять руками, то будет работать примета:
«Есть звездочка — есть новое кино, нет звездочки — нового нет».

Установка:

  1. Создать папку программы (например, d:\AutoTorrent) #
  2. Скачать консольную утилиту для загрузки torrent-файлов curl #
  3. Скачать консольную утилиту для работы с torrent-файлами aria2c #
  4. Скачать bat-скрипт проверки новых серий (get.bat) #
  5. Скорректировать настройки bat-скрипта (логин-пароль на rutracker.org) #
  6. Создать файл-список отслеживаемых раздач (get.txt) #
  7. Создать файл-журнал (log.txt) #
  8. Создать ярлык для журнала (Новые серии.lnk) #
  9. Запланировать периодическое выполнение скрипта #

Подробнее:

1. Папка программы

Так как помимо bat-скрипта создаются-используются еще другие файлы и папки, то удобно все это локализовать в отдельном месте.

2. Утилита curl

Используется для загрузки torrent-файлов.
Чтобы скачать torrent-файл с rutracker, нужно в cookies добавить параметр bb_dl=%torrent_id%.
Aria2 тоже может загружать файлы, но подружить с cookies rutracker не получилось.

3. Утилита aria2c

Умеет качать отдельные файлы из раздачи.
Из-за особенностей torrent, при загрузке отдельного файла, частично скачиваются соседние файлы, поэтому в папке раздачи возможно появление кусков соседних файлов.
Также оказалось, что файлы в раздачах могут идти не по порядку. Поэтому для определения новых файлов используется сортировка по названиям файлов-серий.

Пример не упорядоченной раздачи

*** BitTorrent File Information ***
Comment: rutracker.org/forum/viewtopic.php?t=4400218
Files:
idx|path/length
===+===========================================================================
1|./Игра престолов Сезон 3 (LostFilm)/Game.of.Thrones.s03e10.avi
|609MiB (638,871,552)
—+—————————————————————————
2|./Игра престолов Сезон 3 (LostFilm)/Game.of.Thrones.s03e07.avi
|606MiB (635,699,200)
—+—————————————————————————
3|./Игра престолов Сезон 3 (LostFilm)/Game.of.Thrones.s03e08.avi
|604MiB (634,238,976)
—+—————————————————————————
4|./Игра престолов Сезон 3 (LostFilm)/Game.of.Thrones.s03e02.avi
|602MiB (631,814,144)
—+—————————————————————————
5|./Игра престолов Сезон 3 (LostFilm)/Game.of.Thrones.s03e04.avi
|602MiB (631,265,280)
—+—————————————————————————
6|./Игра престолов Сезон 3 (LostFilm)/Game.of.Thrones.s03e06.avi
|601MiB (631,037,952)
—+—————————————————————————
7|./Игра престолов Сезон 3 (LostFilm)/Game.of.Thrones.s03e03.avi
|601MiB (630,517,760)
—+—————————————————————————
8|./Игра престолов Сезон 3 (LostFilm)/Game.of.Thrones.s03e05.avi
|601MiB (630,310,912)
—+—————————————————————————
9|./Игра престолов Сезон 3 (LostFilm)/Game.of.Thrones.s03e01.avi
|598MiB (627,965,952)
—+—————————————————————————
10|./Игра престолов Сезон 3 (LostFilm)/Game.of.Thrones.s03e09.avi
|557MiB (584,220,672)
—+—————————————————————————
>>> Printing the contents of file ‘rutracker_4400218.torrent’…
4. bat-скрипт get.bat

Написано на bat из спортивного интереса.
Были сложности в работе с кириллицей — с редактированием файла в блокноте, выводом на экран и записью в лог-файл. Поэтому используются многократные финты с chcp.
Из-за сложностей с использованием локальных переменных, появилось много подпрограмм call - exit /b.
В справке по if /? выдается оператор сравнения EQL, хотя bat на него ругается и воспринимает EQU. //Microsoft Windows [Version 6.1.7601]

5. Настройки bat-скрипта get.bat

В тексте скрипта есть группа параметров, для которых необходимо задать актуальные значения:

  • workdir=_workdir — Рабочая папка, для сохранения временных файлов и загруженных torrent-файлов, создается автоматически при запуске bat-скрипта.
  • rutracker_login=login — Логин на трекере rutracker.org .
  • rutracker_password=password — Пароль на трекере rutracker.org .
  • video_dir=d:\video — Папка куда сохранять загружаемые файлы раздачи (при загрузке структура папок раздачи воссоздается как обычно).
  • lnk_name=«Новые серии.lnk» — Ярлык на файл журнала загрузок log.txt .
  • lnk_dest=«C:\Users\Admin\Favorites\Ссылки» — Путь куда копируется ярлык при загрузке нового файла. В данном примере, это путь до моей панели инструментов возле кнопки «Пуск».
6. Файл-список отслеживаемых раздач (get.txt)

Формат строк:

  • код трекераrutor или rutracker
  • код раздачи — число из ссылки на раздачу (напр. rutracker.org/forum/viewtopic.php?t=3192884)
  • номер последней скачанной серии — счетчик будет увеличиваться по мере загрузки новых серий
  • комментарий — любой текст для понятности списка

Пример файла get.txt:

rutor 227513 24 "Теория большого взрыва" (Сезон 6) rutracker 3799523 19 Познер rutracker 4400218 10 Игры престолов 
7. Журнал загрузок (log.txt)

В него заносится информация о скачанных новых файлах. Новые записи добавляются сверху.
При нажатии на «звездочку», открывается этот журнал в блокноте.

Пример содержимого

21.05.2013 21:16:57.50: [rutracker 3799523 13 Познер] ./Pozner-2_[rutracker.org]/P2-141_Maksim_Kantor.avi
21.05.2013 20:07:44.66: [rutor 227513 24 «Теория большого взрыва» (Сезон 6)] ./The.Big.Bang.Theory.S06.1080p.WEB-DL.Rus.Eng.HDCLUB/The.Big.Bang.Theory.S06E24.1080p.WEB-DL.Rus.Eng.HDCLUB.mkv
21.05.2013 19:03:35.11: [rutracker 86939 46 ###для теста###] ./Брат-1, Брат-2/2001 — Брат 1/13 — Nautilus Pompilius — Люди на холме (demo).mp3
20.05.2013 19:03:35.08: [rutracker 86939 45 ###для теста###] ./Брат-1, Брат-2/2001 — Брат 1/12 — Nautilus Pompilius — Зверь.mp3
8. Ярлык для журнала (.lnk)

Для оповещения о загрузке нового, используется копирование ярлыка в заметное место — «Рабочий стол», панель «Ссылки». Сам ярлык нужно создать в папке bat-скрипта. Если файла журнала еще не существует, то его нужно создать.

9. Планирование задания

Для периодического исполнения bat-скрипта нужно создать задачу в планировщике задач (Панель управления\Все элементы панели управления\Администрирование\Планировщик заданий).
Из необычного — полный путь к скрипту указывается в кавычках, а рабочая папка без. Хотя в пути есть пробелы.
При каждом исполнении скрипта открывается cmd-окно.
Если кириллица не читабельна — для окна cmd нужно в свойствах выбрать шрифт Lucida.
Если нужно выполнение без cmd-окна, то можно вызывать get.vbs.

Итого

Все работает без вмешательства уже больше месяца.
Для сидирования достаточно открыть скачанный torrent-файл в uTorrent.

Ссылки:
habrahabr.ru/sandbox/51123/
ubuntu.opentomsk.net/discussion/viewtopic.php?id=3220

Файлы:

get.bat

@echo off rem  rem 13.05.2013  Tucker56  http://habrahabr.ru/post/180173/ rem  rem Загрузка новых серий/файлов из torrent-раздач rem rem Шаги: rem - создание списка отслеживаемых раздач - файл get.txt (описание ниже) rem - создание пустого файла журнала загрузок log.txt rem - создание ярлыка (Новые серии.lnk) на журнал загрузок log.txt  rem - указание внутренних параметров (ниже в этом файле) rem - создание периодической задачи запуска этого файла в планировщике задач rem rem Результат (при появлении новых файлов в отслеживаемых раздачах): rem - файлы скачиваются в заданную папку (%video_dir%) rem - в панели Ссылки появляется ярлык на журнал загрузок rem rem Особенности: rem - если в окне выполнения программы вместо кириллицы отображается ЄЁаЁ««Ёж , нужно в свойствах окна выставить шрифт Lucida   @SetLocal EnableDelayedExpansion rem Сохранение исходной кодировки сеанса CMD, для дальнейшей работы программы в cp1251, что нужно для возможности править этот файл в Блокноте for /f "tokens=2 delims=:" %%a in ('chcp') do set /a chcp_cmd=%%a  rem Для восприятия кириллицы в параметрах и отображения кириллицы текстов сообщений в консоли chcp 1251 >nul    rem Сохранение исходной кодировки, для локальных изменений (chcp) for /f "tokens=2 delims=:" %%a in ('chcp') do set /a chcp=%%a  rem -------------------------------------------------------------- rem - ВНУТРЕННИЕ ПАРАМЕТРЫ --------------------------------------- rem workdir=_workdir - рабочая папка, для сохранения временных файлов и загруженных torrent-файлов  rem rutracker_login=login - Логин на трекере http://rutracker.org rem rutracker_password=password - Пароль на трекере http://rutracker.org rem video_dir=d:\video - Папка куда сохранять загружаемые файлы раздачи (при загрузке создается путь до файла как указано в torrent-файле) rem lnk_name="Новые серии.lnk" - Ярлык на файл журнала загрузок log.txt rem lnk_dest="C:\Users\Admin\Favorites\Ссылки" - Путь куда копируется ярлык при загрузке нового файла  set workdir=_workdir set rutracker_login=login set rutracker_password=password set video_dir=d:\Video set lnk_name="Новые серии.lnk" set lnk_dest="C:\Users\Admin\Favorites\Ссылки"  rem - ВНЕШНИЕ ПАРАМЕТРЫ ------------------------------------------ rem Файл get.txt - cписок отслеживаемых torrent-ов rem ----- rem формат записи:  rem идентификатор_трекера{rutracker, rutor} номер_торрента{номер из URL} номер_последней_скаченной_серии{автоматически обновляется после загрузки новых}  rem ----- rem Пример файла get.txt:  rem rutracker 86939 46 rem rutracker 4400218 7  rem rutor 227513 22   rem -------------------------------------------------------------- rem --------------------------------------------------------------    rem Создание рабочей папки, если ее еще не существует mkdir !workdir! >nul 2>nul  rem Один вход на RuTracker, чтобы получить cookie-файл для последующих загрузок torrent-файлов curl -s -c "%workdir%\cookie_rutracker.txt" -A "Opera/10.00 (Windows NT 5.1; U; ru)" ^ 	-d "login_username=!rutracker_login!&login_password=!rutracker_password!&login=%C2%F5%EE%E4" ^ 	"http://login.rutracker.org/forum/login.php" > nul 	del /q !workdir!\~get.txt.new.tmp 2>nul   rem Обход по отслеживаемым раздачам из файла настройки get.txt for /F "tokens=1,2,3*" %%i in (get.txt) do ( 	set tracker_id=%%i 	set torrent_id=%%j 	set last_file_id=%%k 	set torrent_comment=%%l 	set torrent_file=!tracker_id!_!torrent_id!.torrent 	set err=  	rem Загрузка torrent-файла с RuTracker или RuTor 	echo !tracker_id! !torrent_id! !last_file_id!: Загрузка файла раздачи '!torrent_file!' 	if "%%i" == "rutracker" ( 		curl -s -A "Opera/10.00 (Windows NT 5.1; U; ru)" ^ 			-b "%workdir%\cookie_rutracker.txt" ^ 			-b "bb_dl=!torrent_id!" ^ 			"http://dl.rutracker.org/forum/dl.php?t=!torrent_id!" -o "!workdir!\!torrent_file!" 	) else ( 	if "%%i" == "rutor" ( 		curl -s -A "Opera/10.00 (Windows NT 5.1; U; ru)" ^ 			"http://d.rutor.org/download/!torrent_id!" -o "!workdir!\!torrent_file!" 	) else ( 		set err=X 		echo !tracker_id! !torrent_id! !last_file_id!: Неизвестный трекер: '!tracker_id!'  	)  	)   	if !err! NEQ X ( 		 		rem Обработка torrent-файла через call, чтобы можно было в for in использовать --show-files !workdir!\!torrent_file! 		call :process !torrent_file! 	)  	rem Создание обновленного списка отслеживаемых раздач (формирование нового get.txt) 	echo !tracker_id! !torrent_id! !last_file_id! !torrent_comment!>> !workdir!\~get.txt.new.tmp 	echo. )  rem Обновление файла со списком отслеживаемых раздач (get.txt) move /y !workdir!\~get.txt.new.tmp get.txt >nul 2>nul  rem Удаление технического файла работы aria2c del /Q !video_dir!\*.aria2  >nul 2>nul  rem Индикация о новых загрузках в панели "Ссылки" - в if /? указан EQL WTF?! if "!has_new!" EQU "X" copy /Y %lnk_name% %lnk_dest% >nul  rem Возврат кодировки сеанса CMD chcp !chcp_cmd! >nul  rem Для паузы в конце выполнения программы, нужно раскомментировать следующую строчку rem pause exit /b                                                                          rem Обработка torrent-файла - анализ, загрузка новых файлов rem %1 - имя torrent-файла = !torrent_file!, но %1 нужен для использования в for in :process 		echo !tracker_id! !torrent_id! !last_file_id!: Обработка раздачи '!torrent_file!'  		rem [доп инфо] в CMD /U тут без chcp 866 не работал find /c "+" 		for /f "tokens=1" %%a in ('aria2c.exe --show-files %workdir%^\%1 ^| findstr /R "^---+----*" ^| find /c "+"') do set cnt=%%a 		rem Если количество файлов в раздаче больше чем в настройке, то загружаем новые 		if !last_file_id! LSS !cnt! (  			rem В torrent-файле порядок серий может быть не последовательным (http://rutracker.org/forum/viewtopic.php?t=4400218),  			rem поэтому ориентация на сортировку по имени файлов 			del /q !workdir!\~sort.tmp 2>nul 			for /f "tokens=1,2 delims=|" %%x in ('aria2c.exe --show-files %workdir%^\%1 ^| findstr /BRC:"^[ ]*[0-9][0-9]*"') do echo %%y ^| %%x >> !workdir!\~sort.tmp  			set /a skip=last_file_id 			rem Загрузка новых файлов. Через call, чтобы работало skip=%skip% 			call :download_new_files   		) else ( 			echo !tracker_id! !torrent_id! !last_file_id!: Новых файлов нет 		) exit /b  rem Загрузка новых файлов :download_new_files 		rem 1-3) Список файлов раздачи в кодировке UTF-8, поэтому в ней и читаем 		chcp 65001 > nul  		rem Новые - это последние в отсортированном по имени списке файлов раздачи 		for /f "skip=%skip% tokens=1,2 delims=|" %%o in ('sort %workdir%^\~sort.tmp') do ( 			rem 2-3) Возврат кодировки после 65001 			chcp !chcp! >nul  			set /a down=%%p  			rem Через call 			rem 1) чтобы в echo выводить кириллицу нормально и в заголовке сообщениия, и в имени файла, и в консоль, и в журнал 			rem 2) чтобы время %time% обновлялось для каждого нового файла 			call :down_file %%o 		)  		rem 3-3) Возврат кодировки после 65001 		chcp !chcp! >nul  		rem Удаление временных файлов 		del /q !workdir!\~sort.tmp 2>nul  exit /b   rem Загрузка нового файла из раздачи rem %* = имя нового файла :down_file 		 	set /a last_file_id=last_file_id+1 			echo !tracker_id! !torrent_id! !last_file_id!: Загрузка файла '%*'  			aria2c --dir=!video_dir! ^ 				--seed-time=0 ^ 				--file-allocation=none ^ 				--summary-interval=0 ^  				--console-log-level=error ^ 				--max-overall-download-limit=1M ^ 				--allow-overwrite=true ^ 				--select-file=!down! ^ 				!workdir!\!torrent_file!  rem Еще полезно-интересные параметры: rem				--quiet=true ^ rem Параметр, чтобы от процесса загрузки никакого вывода на экран не было  rem				--allow-overwrite=true ^ rem Параметр, чтобы удалять файлы torrent-а, все кроме только скаченного rem Позволяет поддерживать отсутствие недокаченных частей ненужных соседних файлов в torrent-е rem При скачивании сразу нескольких файлов, останется только последний   			rem Ведение журнала загрузок log.txt - новые события сверху 			rem Если в %time% непосредственно в for, то для каждого файла время не обновляется, нужно через call  			copy log.txt !workdir!\~log.txt.tmp >nul 2>nul 			echo %date% %time%: [!tracker_id! !torrent_id! !last_file_id! !torrent_comment!] %* >log.txt 			type !workdir!\~log.txt.tmp >>log.txt  2>nul 			del /q !workdir!\~log.txt.tmp >nul 2>nul   			rem Флаг для оповещения о загрузке новых файлов 			set has_new=X exit /b 
get.vbs

Dim oShell Set oShell = WScript.CreateObject ("WSCript.shell") oShell.run "get.bat", 0 Set oShell = Nothing  

ссылка на оригинал статьи http://habrahabr.ru/post/180173/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *