Автоматизація завантаження контенту з торрентів

Опублікував Сергій Макаренко 22-03-2016 об 21:31

Побачивши пост в блозі Fluder мені стало цікаво що такого можна наколхозити для того, що б щось подібне запрацювало в мене. Перед цим трохи передісторії. На прикінці вересня я придбав HP ProLiant MicroServer, на який я перетягнув усе (майже), що до того працювало у мене на Mac Pro і Mac mini Server.

Не став винятком і торрент-клієнт Transmission, який протягом кількох років вірою і правдою служив мені працюючи на Mac Pro. Після переносу я вирішив продовжити користуватися Transmission через звичку і відсутність чіткого розуміння того, як я хочу заваніажувати файли з торрентів у новій конфігурації домашньої мережі.

Розуміння процесу обробки відеоконтенту з торрентів прийшло відносно недавно і формувалося до того кілька місяців. З стародавніх часів у мене залишилася структура папок, по яких я розкладав фільми. Сортував я їх по назвам треккерів, з яких вони були скачані. Цю структуру мені дуже кортіло зберегти і я думав над тим, як саме це можна реалізувати. Окрім цього я розмірковував над тим, що мені потрібно зробити, щоб в процесі обробки файлу виконувалося мінімум операцій з мого боку.

По-перше, спочатку я зробив коротке дослідження стосовно того, чи можна було натравити Transmission на кілька папок. Відповідь виявилася не втішно — не можна. В процесі було знайдено таски 3607, 3811 та 4231. Зважаючи на те, що всі вони класифіковані як enhancement, якому вже більше п’яти років надії на те, що всі ці запити на вдосконалення Transmission перетворяться на живу функціональність у мене не було.

По-друге, не можу не зазначити, що Transmission для Linux та OS X — це програми з різною функціональністю. І після багатьох років використання в OS X версія для Linux здавалася кастрованою. На дворі 2016 рік, а у веб-інтерфейсі немає можливості додавати мітки для файлів. Це суцільна стидоба. До того ж мейнтейнери Debian зібрали deb-пакет криво і налаштування в /etc/default/transmission-daemon не підхоплюються демоном при старті. Тому я вирішив попрощатися з Transmission і зупинив свій вибір на rtorrent.

Я вам скажу, що можливості по автоматизації rtorrent мене не просто вразили. Цей легковісний торрент-клієнт вміє робити все, що мені потрібно і при цьому дуже невибагливий до системних ресурсів. А тому я швиденько почав вивчати документацію, щоб зробити його частиною свого інструментарію на Linux. Отже передімною постали наступні задачі:

  • Подружити rtorrent з systemd;
  • Написати конфіг, в якому б було описано те, як rtorrent має себе поводити;
  • Причепити до нього якийсь веб-інтерфейс;
  • Зробити завантаження файлів автоматичним.

Мені подобається systemd і я вирішив зробити так, щоб rtorrent можна було керувати за допомогою systemctl. Файл rtorrent.service довелося писати самому, оскільки для Debian пакет з rtorrent окрім бінарніка та man-файла не містить більш нічого. Логічно, що я вирішив запускати rtorrent під окремим користувачем. Вміст файлу rtorrent.service приведено нижче.

[Unit]
Description=rTorrent
Documentation=https://github.com/rakshasa/rtorrent
After=network.target local-fs.target

[Service]
Type=forking
KillMode=none
User=rtorrent
Group=rtorrent
ExecStart=/usr/bin/tmux -S /var/lib/rtorrent/rtorrent.sock new-session -d -s rtorrent 'rtorrent -n -O import=/etc/rtorrent.rc'
ExecStop=/usr/bin/tmux -S /var/lib/rtorrent/rtorrent.sock send-keys -t rtorrent C-q
WorkingDirectory=/var/lib/rtorrent

[Install]
WantedBy=multi-user.target            

Наводити свій конфіг (тобто rtorrent.rc) у якості прикладу не буду, бо в гуглі повно подібного матеріалу на різні смаки і задачі. Буквально перші два посилання — і ви знайдете все для того, щоб написати свій конфіг за кілька хвилин, тому детально зупинятися на цьому пункті не має сенсу. Почати можна з темплейта на wiki від розробника.

Так виглядає ruTorrent

З веб-інтерфейсом теж все просто. Я довго не вагався і не шукав, а поставив собі ruTorrent. Вийшло дуже непогано. До речі, на відміну від убогого інтерфейсу Transmission в ruTorrent є все, що мені потрібно: сортування різних видів, можливість додавати мітки до завантажуваних файлів, купа різної статистики, яку час від часу корисно переглядати (особливо, якщо ви слідкуєте за своїм рейтнгом після реєстарції на новому трекері) і, що для мене виявилося приємною несподіванкою, наявність нотифікацій в Safari. Хоча для користувачів-естетів використання ruTorrent може стати мукою, бо веб-інтерфейс Transmission набагато красивіший. Але це все дрібниці, тому що функціональність ruTorrent компенсує його огидний зовнішній вигляд.

Ну і найцікавіше — автоматизація. Дуже стисло про домашню інфраструктуру. На HP ProLiant MicroServer у мене працює Plex Media Server (про нього я напишу пізніше). Всі завантажені з торренів фільми автоматично додаються до медіатеки Plex. Потім весь цей контент я переглядаю на телевізорі через програму Plex, встановлену на Apple TV четвертого покоління.

Тому мені потрібно було зробити так, щоб після того, як я завантажував на Mac Pro торрент-файл щось його передавало на Linux-сервер у відповідну папку із якої цей файл підбирав би rtorrent і завантажував в папку, з якої її вже б брав Plex Media Server. Для користувача, який би був не в курсі, що там під «капотом» все повинно б було виглядати так: файл завантажується в папку Downloads на Mac і через якийсь час фільм з’являється на екрані телевізора.

В OS X я не став писати ніяких скриптів, бо цей колхоз добре підходить для Linux, а в OS X є багато більш красивих рішень для цього. Тому для вирішення ціє частини задачі по автоматизації я придбав Hazel. Програма моніторить папку Downloads і коли там з’являється новий торрент-файл передає його по sftp на HP ProLiant MicroServer у відповідну папку. Цільова папка вибирається в залежності від того, з якого трекера файл завантажено.

Приклад правила для Hazel

З тієї папки фали дістає rtorrent і завантажує складаючи у відповідну папку, знову таки, в залежності від того, з якого трекера цей файл було скачано. До того ж, до файлу, що додається, прикріплюється матка, за допомогою якої його можна сортувати в веб-інтерфейсі. Після завантаження Plex Media Server сканує новий файл і відображає його у відповідній колекції.

schedule = watch_directory_example,5,5,"load.start=/var/lib/rtorrent/incoming/example.com/*.torrent,d.custom1.set=example.com,\"d.directory.set=/mnt/torrents/example.com/\""    

Вище наведено приклад правила з конфігураційного файла rtorrent, яке робить можливим автоматічне завантаження нових файлів. На жаль у rtorrent з документацією так собі (але на wiki є необхідний мінімум), тому розберемо цей рядок по частках.

  • schedule — дія, яка виконуватиметься за розкладом (тут коротке пояснення);
  • watch_directory_example — назва дії. У нашому випадку це моніторинг папки, в яку Hazel по sftp засилає файли;
  • 5 — це час в секундах, коли дія буде виконуватися;
  • 5 — це інтервал в секундах, через який дія буде повторюватися;
  • load.start — як не важко здогадатися з назви, команда наказує rtorrent почати завантажувати файл;
  • d.custom1.set — це мітка, якою буде позначено файл в веб-інтерфейсі rutorrent;
  • d.directory.set — це папка, в якій буде збережено завантажений файл.

Повний перелік параметрів можна знайти по цьому посиланню. Я його використовував як референсний документ, коли писав свій конфіг. Загалом я своїм теперішнім рішенням дуже задоволений і буду радий, якщо хтось зможе мій досвід знайти корисним для себе.