Pull to refresh

Удаленный торрент клиент (transmission-daemon+firefox plugin+php)

Reading time 4 min
Views 8K
Давно уже зрела мысль поставить на домашнем linux сервере торрент клиент, да не простой а максимально удобный для удаленного использования. Простого web интерфейса для этого было не достаточно, хотелось чего-то более удобного.

После долгих поисков в интернете, нашел интересную вещь. Плагин к firefox позволяющий в 2 клика мышкой добавить torrent фаил к списку загрузок transmission. Решено было попробовать.



Установка transmission-daemon на сервер не вызвала никаких трудностей, благо он есть в пакетах.
Аналогично с плагином для огнелиса.

Попользовав это дело сразу был обнаружен огромный минус: при попытке скачать с torrents.ru, вылазила ошибка.

Решено было не отчаиваться, а попытаться допилить, чтобы torrents.ru заработал.

Плагин для огнелиса — xpi фаил. Это всего лишь переименнованый zip архив. Распаковав его и покапавшись в внутриностях, обнаружил, что он всего лишь посылает ссылку на торрент фаил transmission'у, а тот уже сам качает его. То есть, нужно сделать некую проксю, которая бы сама скачивала файл и отдавала его торрент-клиенту.

На php + wget быстро накалякал такой код:
<?php
if(!$_REQUEST['url']) exit(0);
$url = trim($_REQUEST['url']);
$filename = 'tor.torrent'; //default name

if(preg_match("/http:\/\/[\w\.]*torrents.ru/",$url,$mass)){
// torrents.ru!!!!
if(preg_match("/^http.*\?t=([0-9]*)$/",$url,$mass))
{
$filename = "[torrents.ru].t".$mass[1].".torrent";
}
$login = 'ЛОГИН';
$pass = 'ПАРОЛЬ';
$cmd_login = "wget -nv --post-data 'login_username=".$login."&login_password=".$pass."&ses_short=1&login=Вход' --save-cookies=tor-cookie login.torrents.ru/forum/login.php --referer=http://torrents.ru/forum/index.php -O ./logintest.html";
$cmd_download = "wget --keep-session-cookies --load-cookies=tor-cookie --save-cookies=tor-cookie ".$url." -O ".$filename;
$mime_good = "BitTorrent file";
$cmd_mime = "file -b ";
//Try download use old cookies
$ret = shell_exec($cmd_download);
//Check torrent file
if($mime_good != trim(shell_exec($cmd_mime.$filename))){
// download fail, must login
$ret = shell_exec($cmd_login);
sleep(1);
$ret = shell_exec($cmd_download);
if($mime_good != trim(shell_exec($cmd_mime.$filename))){
echo "ERROR!!!";
exit(0);
}
}
// torrent file loaded, now we can upload it
header( "Content-Type: application/x-bittorrent;" );
header( "Content-Disposition: inline; filename=\"".$filename."\"" );

readfile($filename);

unlink($filename);
}// if torrents.ru
else
{
// NO torrents.ru
$filename = basename($url);
header( "Content-Type: application/x-bittorrent;" );
header( "Content-Disposition: inline; filename=\"".$filename."\"" );

readfile($url);
}

?>


Алгоритм таков:
1. Если ссылка переданная в параметре url на torrents.ru то
1.1 Попытка скачать файл используя сохраненные cookies. Если не удалось то
1.1.1 Логинимся на torrents.ru используя ЛОГИН и ПАРОЛЬ и сохраняем переданные cookies
1.1.2 Качаем фаил с новыми cookies. Если и это не получилось, то выход с криками «ERROR!»
1.2 Передача хедеров файла.
1.3 Передача самого файла.
2. Если ссылка не на torrents.ru то
2.1 Передача хедеров.
2.2 Скачка и передача файла.

Конечно можно было не городить огород с wget, а воспользоваться curl входящим в пхп, но с curl я плохо знаком, а вот с wget уж давно работаю.

Осталось только заставить transmission качать торрент фаилы через эту проксю.
Решение было очень простым. В плагине к огнелису в файле content/overlay.js нужно заменить функцию addTorrent этим:
addTorrent: function(torrentURL, callback) {
autotrans.log(autotrans.strings.getString("extensions.autotrans.adding_url") + ": " + torrentURL);
var transURL = autotrans.prefService.getCharPref("extensions.autotrans.url");
torrentURL = torrentURL.replace(/&/g,"%26");
torrentURL = torrentURL.replace(/:\/\//g,"%3A%2F%2F");
torrentURL = torrentURL.replace(/\?/g,"%3F");
torrentURL = torrentURL.replace(/=/g,"%3D");
torrentURL = "http://localhost/torrent.php?url=".concat(torrentURL);
autotrans.ajaxToUrl(transURL, autotrans.jsonService.encode({ method: "torrent-add", arguments: { filename: torrentURL } }), callback);
},


Собираем обратно плагин, импортируем его в firefox, сохраняем скрипт на php в корневом каталоге web сервера (web сервер должен быть там же где и торрент клиент) в файле torrent.php и проверяем.

Теперь плагин работает как надо. Но остался еще один неприятный момент. Если включить функцию фильтрации показа меню Torrent it!, то на сайте torrents.ru он перестает появляться. Покапавшись немного в коде можно решить и эту проблемму. Просто заменить функцию contextMenuVisible этим:
contextMenuVisible: function() {
if (autotrans.prefService.getBoolPref("extensions.autotrans.extfilter")) {
// Only show context menu item if selected file has torrent extension or mime-type
var visible = false;
if (gContextMenu.onLink) {
/*try {
var request = new XMLHttpRequest();
request.open("HEAD", gContextMenu.linkURL, true);
request.onreadystatechange = function() {
if (request.readyState == 4) {
var mime = request.getResponseHeader("Content-Type");
autotrans.showContextMenu(mime == "application/x-bittorrent");
}
}
request.send(null);
} catch (e) {
autotrans.log(autotrans.strings.getString("extensions.autotrans.error") + ": " + e);
}*/
visible = /\.torrent$/.test(gContextMenu.linkURL);
if(!visible ) visible = /\.torrent$/.test(gContextMenu.linkText());
}
return visible;
} else {
return true;
}
},


в новой реализации отключена проверка по mime-type и добавленна проверка по тексту ссылки.

Теперь все работает как надо.

Вот и все.

Для любителей нативных клиентов есть проэкт transmisson-remote-gui, интерфейс которого сильно похож на интерфейс utorrent.
Tags:
Hubs:
+10
Comments 40
Comments Comments 40

Articles