воскресенье, 15 ноября 2009 г.

Автоматизация скачивания торрентов

Очень мне хотелось, чтобы новые серии любимых сериалов закачивались автоматически, а мне оставалось только их просмотреть =)

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

Для того чтобы авторизованно захадить и скачивать торрент файлы с трекеров, можно воспользоватся кукисами, тогда строка wget будет иметь вид
wget -nc --append-output=download_torrents.txt --load-cookies=cookies.txt --content-disposition http://host?id=654321&key=123456



-nc - закачки не будет если файл уже существует
-append-output - выведет информацию о скачанном торрентфайле в файл (может пригодится для мониторинга например)
Итак, приступим:

Определяем рсс ленту
#!/bin/php
<?
$url = "http://torrent/rss.php";
$rss = simplexml_load_file($url); //Интерпретирует XML-файл в объект
//цикл для обхода всей RSS ленты
$i=0;
Читаем рсс ленту
foreach ($rss->channel->item as $item) {
$masstitle[] = $item->title;
$massdesk[] = $item->description;
$massimg[] = $item->enclosure['url'];

$citydate[] = explode("SimpleXMLElement Object", $masstitle[$i][0]);
$masimg[] = explode("SimpleXMLElement Object", $massimg[$i]);
$i++;
}
Поиск нужных торрентов
for($j=0; $j<=count($citydate); $j++) { if(strstr($citydate[$j][0], "The Big Bang Theory") || strstr($citydate[$j][0], "House M.") || strstr($citydate[$j][0], "встретил вашу маму")) { $str2[] = $citydate[$j][0]; $massurls[] = $massimg[$j]; } }
Если в названии торрент файл есть ENG, то не закачивать его, но уведомление покажем (нелюблю фильмы без перевода ) в обратном случае скачивать торрент файл, и оповещать об этом.
for($ji=0; $ji<count($massurls); $ji++)
{
if(!strstr($str2[$ji], "ENG") && !strstr($str2[$ji], "встретил вашу маму"))
{
$download = "cd /home/username/torrents/watch/ && wget -nc --output-file=/home/username/scripts/torrent/torrent.log --content-disposition $massurls[$ji]";
exec($download);
sleep("3");
$ff = "cat /home/username/scripts/torrent/torrent.log | grep \" - \" | cut -d \"\`\" -f 2 | cut -d \"'\" -f 1";
$filename = exec($ff);
Если торрент скачан, то редактируем его
if($filename != "") {
$sed= "sed -e 's/announce65/announce68/' -i \"/home/username/torrents/watch/$filename\"; sed -e 's/pid[=][a-zA-Z,0-9]*/pid=yourpid/' -i \"/home/username/torrents/watch/$filename\"";
exec($sed);
sleep("4");
}
} //Условие проверки ENG
} //Цикл
Проверяем прошлые скачанные торренты, если вдруг они совпадают с нынешним, то не закачиваем и не сообщаем об этом торренте
$fil = fopen("/home/username/scripts/torrent/torrents","a");
for($i = 0; $i<count($str2); $i++)
{
$stroka = substr($str2[$i], 0, -5);
$eho = "cat /home/username/scripts/torrent/torrents | grep \"$stroka\"";
$t = exec($eho);

if($t == "")
{
$err = "$i";
}
}
fclose($fil);
Сохраняем запись о закаченном торренте, для будущих проверок и для коньков сгодится.
$fil = fopen("/home/username/scripts/torrent/torrents","w+");
for($i = 0; $i<count($str2); $i++)
{
$fw=fputs($fil,$str2[$i]." \n");
Формируем сообщение о появлении нового торрента
1.вариант - Для сообщения в ICQ(IRQ, gtalk)
if($err == "$i") {
$file= fopen("/home/username/scripts/torrent/mailto", "w+");
$textmail = "torrent.dml сообщает:
появился: $str2[$i]
скачать: $massurls[$i]\n";
$ff=fputs($file,$textmail);
Сообщаем
exec("cat /home/username/scripts/torrent/mailto | centerim -S a -s msg -p icq -t uin");
fclose($file);
sleep("3");
}
2. вариант для сообщения notify
Формируем сообщение
$notify = "notify-send 'Появился торент' '$str[$i]'";
Выводим уведомление
exec($notify);
fclose($file);
sleep("3");
}
?>
Редактируем таблицу incron
incrontab -e
и записываем туда запуск rtorrent'a
Там же должен быть записан скрипт перемещения создаваемых файлов.
Как сделать описано в этой статье

Комментариев нет: