Как стать автором
Обновить

Комментарии 63

Как-то искал демон для торрентов и остановился на deluge — удобный, есть нативные клиенты, а также web-based. Есть встроенный простенький планировщик, которого мне хватало.
Ну и классика — transmission, но ИМХО, он сливает deluge по функционалу.
я в свое время отказался от deluge из-за его прожорливости и нестабильности. Но это было, года 4 назад.

а как же qbittorrent? на своем сервисе именно он развернут, чтобы откуда угодно зайти и поставить на скачку какой то фильм на 80гб.

Я как раз это делаю из web версии, так то очень удобно

А что с qbittorrent не так? Отличный клиент :)

дак вот и я о чем, но все снизу пишут про deluge b transmission)))

Какого рода функционал есть в deluge и нет в transmission. У меня transmission начал свою жизнь на роутере D-Link DIR-320 лет много назад, а сейчас перебрался на Atom-«сервер», но я никогда особо не страдал по какому-то функционалу, по-моему всё есть. И по ресурсам он меня тоже устраивает, хотя у меня только 100 торентов раздаётся:
Uploaded: 55.2 TB
Downloaded: 1.61 TB
Ratio: 34.0
Running Time: 1196 days
Возможно это отличный демон, я лично пытался на него перейти 3 раза, когда надоедало патчить исходники rtorrent. Из того что я в нем не нашел:
1) Автоматический парсер дирректорий с поддиректориями с нахождением .torrent файлов и закачкой в другое место с сохранением структуры каталогов.То-есть у меня есть .../autoload/films .../autoload/music .../autoload/iso и тому подобное все что помещается ниже .../autoload/ будет скачано в .../download/ с сохранением структуры каталогов и не нужно это все описывать для каждого подкаталога. Для удобной коллекции это удобней, чем руками разгребать помойку.
2) Автоматическая сортировка контента, если заранее не определен его тег, то-есть скачанное с треккера lostfilm.tv, novafilm и тому подобное, автоматически попадает в фильмы, даже если я не выбирал директорию.
3) Автоматическое слежение за треккерами с автоперезакачкой торрента, если обновился (я смотрю сериалы и многие треккеры ведут раздачи путем добавления новых серий в тот же треккер).
4) Способность уверенно держать на раздаче более 10000 торрентов на сервер, не вешаясь наглухо и не теряя раздачи как трансмиссия и делюга.
5) Возможность полного консольного управления. Удобно для своих скриптов.
6) Хорошая интеграция с кучей морд, включая мобильные, сидя в маршрутке на телефоне я могу нажать скачать торрент с треккера и он начнет качаться на домашнем сервере.
7) Интеграция с RSS, я всегда знаю когда скачалась новая серия сериала.
Можно еще вспоминать, но влом, я пытался соскочить на другие качалки, но то одного нет, то другого. Ставится местами геморройно, часть опций можно понять только вкурив исходники, но те плюшки по кастомизации и логике, что он умеет из коробки это компенсируют.
Да, с автоматизацией и производительностью rtorrent явно в другой весовой категории, это как Linux way против несчастных Windows потуг))
Именно поэтому я спрашивал о разнице между deluge и transmission и не трогал rtorrent. Я не заморачивался с rtorrent по нескольким причинам:
1) мне не нужно держать 10000 торрентов
2) мне не хотелось стрелять из пушки по воробьям да ещё и ставить PHP для rutorrent
3) я не такой заядлый видеоман, что мне нужно следить за раздачами, обычно я смотрю фильмы с запазданием лет в 5-10))
4) нынче для просмотра «видео-торрентов» использую Popcorn Time и не маюсь с предзагрузкой, да, безлимитный круглосуточный интернет развращает.
Много убивал времени на rtorrent. В итоге перешел на transmission. Уже года три проблем не знаю. Ничего собирать не надо, не надо прикручивать веб морду с бубном. Да и вообще, TR кажется хорошо продуманным продуктом, после набора костылей в RT.

По вашим пунктам. Есть совершенно отличный cli которым легко многие ваши задачи можно автоматизировать. Стандартная веб морда нормально работает под всем устройствами, и сделана качественно. Она не навороченная, но посмотреть и добавить торрент на работе или с мобильного хватает. Для остального у меня например Transmission Remote GUI. Терминальные клиенты тоже есть.

Автоперезакачка торрента — А как это вообще устроено? Как же авторизация, и т.д?
п.с. А вам не страшно держать столько торрентов?
Автоперезакачка торрента — А как это вообще устроено? Как же авторизация, и т.д?

По крону раз в 10 минут плагин заходит на треккер и проверяет не изменилась ли контрольная сумма торрент файла, если изменилась — перекачивает. Авторизация реализована несколькими вариантами, как по логину и паролю от треккера, так и по куки. При этом еще и есть удобный поисковик по ряду треккеров прямо из вебморды.
А вам не страшно держать столько торрентов?

Держал 60000 раздач на 6 серверах в одном коммерческом проекте, тогда и познакомился с rtorrent и перековырял все доступные реализации, так его и стал использовать везде, включая домашний сервер, дома само-собой мне столько не надо.
А так на вкус и цвет понятно все фломастеры разные, но для меня альтернативы нет, особенно в плане каталогизации коллекции, для того-же XBMC просто сказочно удобно, все другие качалки подразумевали ручную каталогизацию контента с ручной правкой имен.
1) Автоматический парсер дирректорий с поддиректориями с нахождением .torrent файлов и

Для трансмишена когдато впилил

там где стартует демон вписал
nohup /root/scripts/notyfy.sh /opt/samba/torrent/video/ /opt/HDD/video/ &
nohup /root/scripts/notyfy.sh /opt/samba/torrent/music/ /opt/HDD/music/ &
nohup /root/scripts/notyfy.sh /opt/samba/torrent/distr/ /opt/HDD/distr/ &



и сам скрипт
#!/bin/bash
#как запустить в фоне
#nohup /root/scripts/notyfy.sh /opt/samba/torrent/video/ /opt/HDD/video/ &
#inotify-tools не забудьте поставить

[ $# -ne 2 ] && { echo Usage: $0 [/torrent/watch/dir/] [/when/torrent/download/]; exit; }
DIR=$1
DWN=$2

###Авторизация для трансмишеа
AUTH=" 192.168.1.1:9091 -n user:password "

while RES=$(inotifywait -e create $DIR --format %f .)
do 
 if [ ! -z `expr $RES : '.*\(torrent$\)'` ]; then

    transmission-remote $AUTH -a $DIR/$RES --download-dir $DWN;
    rm -f $DIR/$RES;

  fi
done



как только появляется торрент файл в папке, он тут же скармливается и удаляется. inotifywait фича ядреная, так что не нагружает.
Не совсем то, у вас надо каждый раз создавать для программы новую связку, если я например скачаю в /opt/samba/torrent/book/, но он не описан в вашем скрипте, то торрент на закачку либо не встанет, либо встанет в дефолтную директорию (в случае поддиректории описанной в скрипте). В моем случае сохраняется именно структура директорий, я могу на лету в .../autoload/ создавать или удалять любые каталоги и именно в таком виде они и перенесутся в download. Простой пример, на том же лосте я качаю сериалы, но они выходят по одной серии, создавать для каждого сериала каждый раз отдельный скрипт, чтоб он качался именно в .../autoload/serial/serial-name не совсем удобно, потом удалять, помнить что надо вычистить из скрипта, что добавить. В принципе ваш скрипт можно адаптировать и для такого варианта, добавив рекурсивный поиск торрент файлов от заданного пути, но остальной описанный мной функционал получить значительно сложнее, например, слежение за изменением раздач можно организовать через TorrentMonitor, а вот работу с RSS и поиск сразу на куче треккеров прямо из клиента уже так просто не выйдет. Я не говорю что это нереально, но сил по допиливанию и адаптации выйдет гарантированно не меньше чем настроить rtorrent.
Проблем-то нагенерировать связок, это первое, второе там можно подкрутить чтобы учитывались подпапки через рекурсию, ключ -r и просто другой формат отдачи поймого события и будет тоже что вы описали до RSS. Вообщем, под свою задачу — своё решение.

А так, в итоге отказался этого мониторинга папки, у меня всё что требуется выполняет скрипт по завершению скачки:
«script-torrent-done-filename»: "/var/lib/transmission/.config/transmission/do.sh",

он вынимает ссылку из торрент файла на то место откуда был скачан( сейчас все любят в поле Comment URL страницы скидывать) если нет там url, то парсит выдачу с яндекса- ищется где файл аннонсирован.
Далее если кинцо, то кидает в кино, парсит страницу -> переименовывает, парсит кинопоиск -> вкидывает описание и прочее.
Всё.

Автокачем и докачем не занимался, сериалы смотрю уже когда вышли серии.
Может скриптом поделитесь, думаю будет полезно не только вам, да и прикрутить его можно к любой качалке, а так чуток другой кейс использования клиента.
вкидывает описание и прочее.

Куда именно вкидывается описание? XBMC или какой-то свой каталогизатор?
Сливает в бд, а с бд уже работает самописный сайт с которого тыкаю что воспроизводить на ТВ.
кусочек php
<?php
include_once("http.php");

class KinoPoisk {

        public function Parse($subject) {

                $p = '#itemprop="name">(.*)</h1>#';
                preg_match($p, $subject, $matches);
                $name=strip_tags($matches[1]);

                $altname="";
                $p = '#itemprop="alternativeHeadline">(.*)</span>#';
                preg_match($p, $subject, $matches);
                if(count ($altname)!=0)
                        $altname=$matches[1];

                $p = '#<a href="/lists/m_act%5Byear%5D/(.*)/"#';
                preg_match($p, $subject, $matches);
                $year=$matches[1];

                $p = '#<img width="205" src="(.*)" alt#';
                preg_match($p, $subject, $matches);
                $img=$matches[1];


                $p = '#itemprop="description">(.*)</div>#';
                preg_match($p, $subject, $matches);
                $desc=$matches[1];

                $p = '#IMDb:(.*)</div>#';
                preg_match($p, $subject, $matches);
                $imdb=$matches[1];

                $p = '#rating_ball">(.*)</span>#';
                preg_match($p, $subject, $matches);
                $rating=$matches[1];


                $p = '#itemprop="genre">(.*)#';
                preg_match($p, $subject, $matches);
                $genre=strip_tags($matches[1]);
                return array("name"=> mysql_real_escape_string(html_entity_decode($name)),
                                        "altname" => mysql_real_escape_string(html_entity_decode($altname)),
                                        "img"=>$img,
                                        "year"=>$year,
                                        "genre"=>mysql_real_escape_string(html_entity_decode($genre)),
                                        "desc"=>mysql_real_escape_string(html_entity_decode($desc)),
                                        "IDMb"=>mysql_real_escape_string(html_entity_decode($imdb)),
                                        "rate"=>mysql_real_escape_string(html_entity_decode($rating)));

        }
        public function GetAndParse($film) {
                $curl = new HttpBurn();
                $html = $curl->Get($film);
                $data = $this->Parse(iconv('cp1251','utf-8',$html)) + array("URL"=>$film);
                return $data;
        }

        public function Find($film) {
                $curl = new HttpBurn();
                $f = $curl->Get("www.kinopoisk.ru/index.php?first=no&what=&kp_query=".rawurlencode($film));
                $p = '#<p class="pic"><a href=\"(.*)\"><img#';
                preg_match($p, $f, $matches);
                $f = $matches[1];
                $p = '#film/(.*)/sr/#';
                preg_match($p, $f, $matches);
                $html = $curl->Get("http://www.kinopoisk.ru/film/".$matches[1]);
                $data = $this->Parse(iconv('cp1251','utf-8',$html)) + array("URL"=>"http://www.kinopoisk.ru/film/".$matches[1]);
                return $data;
        }


}


cat http.php


<?php


class HttpBurn {
        public $UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0";
        public $headers = array
        (
                'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8',
                'Accept-Language: ru,en-us;q=0.7,en;q=0.3',
                'Accept-Encoding: deflate',
                'Accept-Charset: utf-8,windows-1251;q=0.7,*;q=0.7'
        );
        public $refer = "http://ya.ru";

        public function Get($URL){
                if($ch = curl_init($URL)){
                        curl_setopt ($ch, CURLOPT_USERAGENT, $this->UserAgent);
                        curl_setopt($ch, CURLOPT_HTTPHEADER,$this->headers);
                        curl_setopt($ch, CURLOPT_REFERER, $this->refer);
                        curl_setopt($ch, CURLOPT_COOKIEJAR, "kino_coo.txt");
                        curl_setopt($ch, CURLOPT_COOKIEFILE, "kino_coo.txt");
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                        $result = curl_exec($ch);
                        curl_close($ch);
                        return $result;
                }
                return null;
        }
        public function Post($url,$post){
                if( $curl = curl_init($url) ) {
                        curl_setopt ($curl, CURLOPT_USERAGENT, $this->UserAgent);
                        curl_setopt($curl, CURLOPT_HTTPHEADER,$this->headers);
                        curl_setopt($curl, CURLOPT_REFERER, $this->refer);
                        curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
                        curl_setopt($curl, CURLOPT_POST, true);
                        curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
                        $out = curl_exec($curl);
                        curl_close($curl);
                        return $out;
                }
                return null;
        }

}




Там на целую статью, данный кусок просто ищет в кинопоиске запрошенный фильм,

$o = new KinoPoisk();
$film = $o->Find("а зори здесь тихие");
var_dump($film);

Но момент,- на сайте кинопоиска лучше искать через гуглю. Весь обвес выложу статьей.
А не поделитесь своим конфигом, особенно инересует п.1 и п.2?
П1 — плагин для rutorrent, пункт автодобавление.
П2- Плагин, тот что выше + этот плагин + клиент nativa для OS X, который умеет условия.
Спасибо большое.
Ну и классика — transmission, но ИМХО, он сливает deluge по функционалу.

А сам deluge сливает пасскеи, за что забанен на некоторых трекерах (пруф 1, пруф 2)
Спасибо за статью.Тоже долгое время пользуюсь rtorrent-ом, знакомство с ним началось с его установки на роутере ASUS WL-500gP с 32 мегабайтами оперативки.
Перепробовал все доступные torrent-клиенты под Linux, но так и остался на rtorrent+rutorrent из за его стабильности и нетребовательности к ресурсам.
Для меня киллер-фича rutorrent — это возможность выбора директории для закачки на сервере, при добавлениии торрента.

Ни у transmission, ни у deluge, ни у utorrent такого не нашел — нужно писать путь ручками.
Для меня киллер-фича rtorrent — это возможность выбора директории для закачки на сервере, при добавлениии торрента.

Поддерживаю. Самый простой интерфейс взаимодействия с пользователем, который напрочь отсутствует в других клиентах по непонятным причинам.
Альтернативные интерфейсы вроде rutorrent у меня как-то не прижились — ставить php только ради rutorrent неохота

В моём случае rtorrent и rutorrent живут на разных машинах, общаясь через xmlrpc (не хотелось мне обновлять php на NAS, поэтому веб-интерфейс поставил на ноутбук, благо LAMP на последнем есть всегда).
в копилку к мультиплатформеным торент-клиентам и небольшой патчик к нему с тех времён, когда трекеры любили банить за низкий аплоад и неизвестные торент-клиенты. к слову, умеет не только торрент, а ещё кучу p2p протоколов, в том числе и edonkey, из-за чего я на него лет 15 назад сел и менять не хочется.
НЛО прилетело и опубликовало эту надпись здесь
Сорсами не поделитесь? Скрин тот еще костыль.
НЛО прилетело и опубликовало эту надпись здесь
У меня 093, на 094 rutorrent нормально не работает, много надо допиливать, так что то, что нужно 092 и 093 не сильно отличаются, сам патч адаптирую. Спасибо.
НЛО прилетело и опубликовало эту надпись здесь
Кто поможет советом? Есть сервер, он же хранилище. Процессор с запасом — там Core i5. Есть десктоп с Kubuntu 14.04. Базовый торрент-клиент — ktorrent. Обычно я качаю в браузере торрент-файл и сразу открываю его в ktorrent, не сохраняя. Есть ли возможность аналогичного использования, но с подхватыванием файла сервером? Чтобы не лезть каждый раз в веб-интерфейс, не заливать файл. Я просто очень не люблю качать все в одну кучу, а лью сразу туда и с тем названием, которое будет в дальнейшем. В результате тот же xbmc сразу хватает название фильма, а торрент- клиент спокойно раздает, несмотря на другое название.
Да есть, тут варианта 3, первый автоматом сохранять торрент фаил в директорию для автозакачки сервером, для ubuntu — это будет однострочник на любом скриптовом языке. Второй вариант готовое приложение, например для OS X — это Nativa, для убунты сказать затрудняюсь, но должно быть. Третий — использовать API самой качалки и скрипт обвязку, тоже пару строк кода.
Я просто думал, что есть десктопные клиенты для серверной части, с которыми можно файловую ассоциацию забить.
На сколько я знаю трансмиссия и делюга позволяет клиенту общаться с сервером не на локалхосте, а удаленным.
Посмотрю, спасибо. Хоть и gtk инородно в kde выглядит.
У Transmission есть qt клиент, а не только gtk.

Ну и при желании стиль gtk приложений можно дотюнинговать до кдешного состояния.
Нашёл. Transmission remote GUI. То, что нужно для меня.
Transmission Remote GUI как раз использует GTK, который вам не нравится.

Чем вас transmission-qt не устроил? Он может как собственную сессию стартовать, так и управлять демоном по сети.
Может? Тогда его потыкаю. Спасибо.
Хоть сам rtorrent-ом не пользуюсь, но автору за техническое наполнение статьи спасибо. Побольше бы подобной подачи материала.
Я сам давний фанат rtorrent, однако до сих пор не сумел сделать в нем такое простое действие, как перенести загруженый файл/каталог в другое место (продолжая раздачу, разумеется). Кто нибудь?
Я хардлинки для этого использую.

ln downloaded_file new_file

Когда с раздачи ухожу, downloaded_file удаляется, new_file на месте остается. Так как это именно линк, лишнее место на диске не занимается.
Плагин autotool для rutorrent переносит правильно и раздача продолжается, на чистом rtorrent либо линковать либо использовать внешний скрипт перемещения + api.
# Если качается в папку incomplete (по умолчанию) - переместить данные завершённой закачки в папку complete

system.method.insert = finished_set4single,simple,"d.set_custom=incomplete,/home/torrents/incomplete"

system.method.insert = finished_set4multi,simple,"d.set_custom=incomplete,$cat=\{/home/torrents/incomplete/\\,$d.get_base_filename=\}"

system.method.insert = finished_if,simple,"equal={d.get_directory=,d.get_custom=incomplete}"

system.method.insert = finished_do,simple,"d.set_directory=/home/torrents/complete/;execute=mv,-u,$d.get_base_path=,/home/torrents/complete/"

system.method.set_key = event.download.finished,finished_event,"branch={$d.is_multi_file=,finished_set4multi=,finished_set4single=};branch={$finished_if=,finished_do=}"
Фаил то переместится, а вот раздача отвалится.
а может для начала попробовать, а уже потом утверждать? :)
Опробовано, неоднократно, часть раздач потом не подхватывается при таком перемещении, особенно когда все не из корневой папки, а много подпапок.
и всё-таки я настаиваю попробовать банальным копи-пастом (только пути подправить) :)
у меня с этим куском проработало более года: ни одной проблемы не было замечено
У меня путей править, как на всю эту заметку вместе с комментариями получится, говорю же разветвленная структура, куча подпапок, примонтированных удаленных шар и прочего. Когда все качаем в одну директорию, перемещаем в другую — это работает, а мне надо сохранять структуру, скачанный фильм переместить в фильмы, сериал в сериалы, образ залить в образы на удаленной шаре, музыку перелить на удаленный хостинг и т.п. Плагин нормально дружит с сохранением структуры, сам rtorrent — не очень. Попробуйте сами в папке для недокачанного создать несколько подпапок и с качать не в корень, а в них, перенесет ли ваша конструкция всю структуру?
дык, а в чём проблема вместо одной проверки на нахождение завершившейся закачки в «incomplete» сделать несколько проверок?
например: если в incomplete/music — перемещаем в complete/music, если в incomplete/movies — перемещаем в complete/movies.

в общем, я Вас услышал: не хотите морочиться и пользуете плагин к вэб-морде. Ваше право :)
Именно, просто если у меня появился новый подкаталог — он должен подхватиться автоматом и перенести структуру, а не я должен лезть каждый раз в конфиг и добавлять новый путь. Вот банальный пример, захотелось мне послушать классику, делаю подкаталог music и кидаю туда торрент файлы, они сразу начинают качаться в /torrent/incomplete/music/classic/ после закачки переместятся в /torrent/download/music/classic/ надоело — убил каталог, rtorrent увидел что файлов нет — удалил раздачу, все. В вашем случае путь займет примерно так:
1) зашел в конфиг и добавил пути
2) рестартнул rtorrent
3) дальше как у меня
4) зашел в конфиг удалил пути
5) рестартнул rtorrent
Не понятно зачем лишние телодвижения с правкой конфига под каждый новый подкаталог, я в начале примерно так же делал как вы, затем писал свой скрипт, который рекурсивно проверяет структуру и перемещает файлы, после чего через api меняет путь раздачи в rtorrent. В принципе работало, но потом поставил плагин, а оно уже все есть из коробки и работает как надо сразу, почесал репу и выкинул свои скрипты. Я смотрю некоторые сериалы с лоста, там выходят они по одной серии, обнаруживаются и качаются автоматом, представьте какая будет помойка если каждая новая серия будет качаться в общую директорию, мне их ручками разносить не улыбается совсем, а так пока сезон снимается создал каталог, все качается туда автоматом, сезон закончился удалил каталог, в конфиг при этом лазить не нужно.
Не понятно зачем лишние телодвижения

У меня ничего лишнего :) меня лень-матушка пробивает не реже Вашего, просто не заморачиваюсь так сильно со структурой директорий на качалке. В моём понимании качалка — чтобы качать, а хранилка — чтобы хранить, и я их между собой не связывал.

Поэтому утверждение
Фаил то переместится, а вот раздача отвалится.

было поспешным
Кто-нибудь видел фичу в каком-нибудь клиенте, чтобы просканировать оперделенные папки, найти в них файлы из имеющихся раздач, и поставить на раздачу (по имени и/или хэшу)? При условии, что файлы могут быть раскиданы не так, как в раздаче. Я было начал писать плагин к deluge, но не хватило терпения.
Для одиночных файлов реализация должна быть не очень сложной, что-то типа, вычисляем хеш всех файлов в директории, сравниваем с хешами мертвых раздач, если совпало, через апик меняем путь раздачи на путь к файлу, основной геморрой как мне видится будет с раздачами, где раздается целая папка (те же сериалы, игры, музыка и тп.) ведь если в директорию попадет хоть один «левый» файл, ее хеш уже не совпадет при пересчете и я даже на уровне логики не представляю как такой момент автоматизировать.
Да просто, главное понять, зачем (мне) это надо: есть несколько раздач, в которых файлы одни и те же, но разные имена и структура директорий. Если я выкачал (или уже имел) хотя бы часть файлов, хочется их «подтянуть», при чем во все из упомянутых раздач, а недостающие файлы докачать.
Поэтому алгоритм такой: добавляем раздачу, ищем подходящие к ней имеющиеся файлы. Нашли — в торрент-клиенте меняется путь к каждому файлу по отдельности. При чем найденные файлы могут сами лежать в разных местах и иметь произвольные имена. То, что не нашлось, скачивается в папку с раздачей. Deluge нормально с этим работает, мне просто лень дописывать плагин :)
Ну и удобно было бы взять старые .torrent'ы и натравить этот алгоритм на ~/downloads, чтобы автоматически встать на как можно большее число раздач, не мучаясь с «куда я это дел» и «ааа, я переименовал половину»
Такой плагин написать невозможно.

Битторрент при работе рассматривает все файлы в раздаче вместе, как один блок данных, разбивает его на блоки по 2^N байт и передаёт блоками.

В торрент файле хранятся (и то, как я понял, не всегда) хэш суммы блоков, но не хэши отдельных файлов. (см.вики).

Один и тот же файл в различных раздачах практически со 100% вероятностью будет разбит на блоки по-разному: если не из-за размера блока, так из-за различного набора файлов до него, что приведёт к разному смещению начала блока от начала файла. Ну а по набору хешей разных блоков невозможно установить, что это один и тот же файл.

Но поставленную задачу можно решить, просто другим подходом. Для этого нужно или хранить раздачи на файловой системе с онлайн дедупликацией (ZFS) или регулярно делать оффлайн дедупликацию (например, встроенными средствами Btrfs или банально хардлинками с помощью Fslint или fdupes).
Файл можно представить как блоки, на которые он побит, плюс «хвосты» в начале и в конце. Поэтому его можно найти и поставить на раздачу, а хвосты, принадлежащие другим файлам, торрент-клиент скачает, перепроверит и запишет в соотв. файлы в других местах.
А задачи найти одинаковые файлы по набору хешей не стоит, или я вас не понял, к чему это.
Смотрите, допустим 2 раздачи, размер блока одинаковый:

 ____________________
|        |        |  |
|cover.jp|gsong1.m|p3|
|________|________|__|

 __________
|        | |
|song1.mp|3|
|________|_|


Вот вроде song1.mp3 общий для двух раздач файл, но совпадающих блоков не наблюдается.
Я то ли понял наконец вашу идею, то ли придумал сам возможный подход со стороны торрент-клиента.

1) При добавлении раздачи для каждого файла F, на который приходится хотя бы один целый блок, ищем среди уже раздающихся файлов из других раздач совпадающие по размеру. Это кандидаты на то, чтобы считаться «тем же самым файлом»;
2) Читаем из кандидатов куски, соответствующие целиком попавшим в наш F блокам и сверяем их хэши с хэшами блоков из F. Если хэши совпали, то считаем, что это «тот же самый файл» и меняем путь для сохранения F в добавляемой раздаче на путь к совпавшему кандидату.

Всё же мне кажется, что средствами файловой системы дедуплицировать удобнее, но у такого подхода есть свой плюс: можно дедуплицировать между разными файловыми системами (но зачем?).
Да, как-то так я и начинал делать ;)
Думал про дедупликацию, но не нашел как сделать для домашней винды.
Долго им пользовался, но пришлось отказаться и перейти на transmission, бо столкнулся с тем что начали попадаться торренты, которые он не качал от слова вообще. При этом другими клиентами они скачивались на ура…
Я настроил автозакачку при добавлении файла в директорию, как автор, и настроил NFS для этой директории на сервере и у клиентов. Таким образом для загрузки торрента клиенту нужно просто скачать файл в определённую директорию (ту, к которой примонтирован NFS). Со временем хочу доработать это решение так, чтобы когда NFS недоступен, файлы сохранялись локально, а при возобновлении связи копировались на сервер.
Большое спасибо за статью! Документации по rtorrent мало и она неполна, поэтому появление такого обзора — безусловно большая радость.

Я тоже настраивал себе автоматическую закачку после копирования *.torrent файла в директорию и копирование загруженных файлов в целевую директорию в зависимости от местонахождения *.torrent файла.

Но вот копирование файлов с магнет-линков у меня настроить так и не получилось. Когда магнет-линк скачан rtorrent теряет файлы с раздачи и считает их нескачанными. Происходит это, как я понимаю, из-за отсутствия соответствующего раздаче *.torrent файла. Может кто знает, как это побороть?
Возможно после добавления magnet-ссылки rtorrent создаёт .torrent-файл в каталоге session.path. В этом случае скорее всего его можно скопировать в обычный каталог по какому-то событию.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации