Стороннім в кошерна настройка rtorrent і пояснення до конфігу
Кошерна настройка rtorrent і пояснення до конфігу .rtorrent.rc
Сьогодні ми будемо налаштовувати консольний rTorrent (файл конфіга
Синтаксис конфиг-файлу вельми специфічний, а повної документації в інтернеті не знайти, тому переказую як зрозумів.
Почнемо зі стандартних налаштувань:
schedule = watch_directory, 5, 5, "load_start = / RTORRENT / newtorrents / *. torrent, d.set_custom1 = / RTORRENT / DONE /"
Ця команда кожні 5 секунд перевіряє папку / RTORRENT / newtorrents /, відкриту на повний доступ, на наявність нових .torrent файлів. d.set_custom1 це команда, яка зберігає для кожного торрента його підсумкову папку призначення (куди він буде перенесений після закачування), докладніше буде в пункті "Мета 2". Також зручно виходить моніторити кілька папок.
Наприклад можна написати такі конфиг-рядки окремо для newtorrents / films, newtorrents / games, і т.д. і для кожної прописати свою підсумкову папку.
Хрін знає, чому 5 секунд вказано 2 рази, зате замість watch_directory можна написати що завгодно, цей ідентифікатор придумується самостійно.
Взагалі доступні команди мають вигляд "d.
Є клас команд для отримання якихось значень, вони відрізняються тим, що починаються з "$ d.", Наприклад "$ d.get_name =". Закінчуються також знаком "=". $ Схоже означає, що виклик повинен повернути значення, а не просто виконати будь то дія.
Як видно зі списку, є 6 custom-полів, які можна встановити, використовуючи в своїх потребах:
Index 42 String: 'd.custom1'
Index 43 String: 'd.custom1.set'
Тобто в команді d.set_custom1 вище ім'я не від балди взято.
Якщо є варіант з ".set", значить поле можна встановити, в цьому випадку команда записується як "d.set_ tied_to_file = / filename", якщо ні, значить поле тільки для читання, тоді використовувати його можна тільки так "$ d.get_ tied_to_file = ".
Для досягнення мети 1 залишилося при завантаженні нового торрента перенести його .torrent-файл в якусь нитку іншу папку, щоб він зник із загального доступу і стало ясно, що він підхопився.
Використовуємо таку команду
system.method.set_key = event.download.inserted_new. move_loaded, "execute = mv, -u, $ d.get_loaded_file =, $ d.get_meta_path =; d.set_tied_to_file = $ d.get_meta_path ="
Ось в душі не розумію, звідки беруться ці магічні заклинання (підкреслені), move_loaded - знову ж ідентифікатор, придумується від балди, далі йде команда: execute - виконується shell-команда, параметри перераховуються через кому. Команда переміщує .torrent-файл (шлях до нього повертає виклик $ d.get_loaded_file =) в нове місце - $ d.get_meta_path = (це кастомний метод, повертає повний шлях до .torrent-файлу в новій папці, створений вручну, про це нижче ) .Точка з коми означає закінчення поточної команди, як і в unix-shell. Можна написати багато команд поспіль.
Зрештою оновлюємо інфу для торрента: d.set_tied_to_file = $ d.get_meta_path =, цим встановили в tied_to_file новий шлях до .torrent-файлу.
Новий метод створюється наступним чином:
system.method.insert = d.get_loaded_basename, string | simple. "Execute_capture = basename, $ d.get_loaded_file ="
system.method.insert = d.get_meta_path, simple. "Cat = / RTORRENT / torrent /, $ d.get_loaded_basename ="
Перший метод повертає basename торрент-файлу, другий додає його до нової папці, в якій тимчасово зберігаються ці торрент-файли.
Імена d.get_loaded_basename і d.get_meta_path придумуються від балди, але з оглядкою на існуючі методи. "D." в них для однаковості з іншими. Перевизначати існуючі не пробував, але думаю нічого корисного не вийде.
Щоб перенести завантажений контент в папку для готових, скористаємося подією event.download.hash_done. Але спочатку заведемо пару допоміжних методів:
system.method.insert = movecheck1, simple. "And ="
system.method.insert = movedir1, simple. "D.set_directory = $ d.get_custom1 =; execute = mv, -u, $ d.get_base_path =, $ d.get_custom1 =; d.set_custom1 =; d.stop =; d.start ="
Перший перевіряє чи готовий дійсно торрент і чи є у нього папка призначення.
Другий власне встановлює закачування папку з поля custom1, переносить контент в цю папку, стирає поле custom1 (це важливо для іншої фічі), і перезапускає (stop / start), щоб оновилася вся інфа (взагалі хз, не пам'ятаю навіщо).
Ну а запускається все це пишність за подією:
system.method.set_key = event.download.hash_done. move_hashed1, "branch ="
Не зовсім розумію, яку роль тут грають, працює і без них, але варто звернути увагу, що movecheck1 записано з "$", бо це get-виклик, повертає boolean, а movedir1 = - без "$", бо це виклик команди.
Сюди ж запишемо ще одну фічу - видалення недокачанних контенту:
system.method.set_key = event.download.erased. rm_files, "branch = d.get_custom1 =," execute = ""
За подією видалення закачування (подвійне Ctrl + D в консолі клієнта), перевіряється, заповнене чи поле custom1, якщо заповнено - значить торрент недокачанних і виконується команда mv to / RM (для налагодження, можна і відразу видаляти командою rm -r). Якщо торрент докачаєте, як ми пам'ятаємо, у нього стирається поле custom1, а значить видалення закачаного торрента зі списку в клієнті не стирає файлів.
Мета 3 і 4
Для закриття закачування визначаються умови досягнення ratio (min і max - у відсотках):
ratio.enable =
ratio.min.set = 150
ratio.max.set = 300
ratio.upload.set = 20M
system.method.set = group.seeding.ratio.command. "Execute =
/scripts/rt_finished,$d.get_base_path=,$d.get_tied_to_file= ", d.close =, d.erase =
Тут чомусь вже method.set. замість method.set_key. Магія.
По досягненню ratio 1.5, викликається custom-скрипт, йому передається шлях до контенту і .torrent-файлу, коли скрипт відпрацьовує - викликається d.close = і d.erase =, закачування повністю закривається, зникає з клієнта, видаляється .torrent-файл, залишається тільки контент.
Важливо відзначити, що код виходу скрипта впливає на поведінку команди, якщо вийти з "exit 1", то клієнт відобразить в консолі помилкове повідомлення і закачування не вилучено.
Іноді хочеться видалити (закрити) готову закачування зі списку вручну, але щоб скрипт відпрацював так, як якщо б був достінгут ratio 1.5. Для цього додаємо такий рядок
system.method.set_key = event.download.erased, mv_film, "branch = $ d.get_complete =," execute =
Тобто за подією erased тепер відпрацьовує 2 ділянки конфіга: rm_files і mv_film. Але у них різні умови: перший стирає Недокачані закачування на підставі поля get_custom1, другий передає закачування скрипту на обробку на підставі прапора get_complete
schedule = throttle_1,18: 00: 00,24: 00: 00, download_rate = 1500
schedule = throttle_2,00: 00: 00,18: 00: 00, download_rate = 3000
Вночі та вдень, коли все на роботі - смажити по повній, 3Мб / с, ввечері - пригальмовувати.
Реалізація цієї мети повністю в custom-скрипті (див.також UPD нижче).
Для того, щоб фільми переносилися в окрему папку, при постановці нової закачування треба не полінуватися і назвати .torrent-файл повним українським ім'ям фільму. Якщо скрипт не знайде українських букв - він не прийме рішення про сортування і завершиться.
Тут потрібно відзначити, що rtorrent чекатиме завершення скрипта, і якщо фільм переноситься на іншу ФС, клієнт підвисне, поки файл не переміститься.
#! / Bin / sh
if [ "$ 1" = ""] || [ "$ 2" = ""]; then
echo "Usage: $ 0
exit 1
fi
DIRNAME = `dirname $ 0`
SORTING_LOCATION = "/ FILMS / на сортування"
LOGNAME = $ DIRNAME / rt_finished.log
# Ім'я .torrent-файлу без розширення .torrent
LEGAL_NAME = `basename" $ 2 "| sed 's / \. torrent $ //' `
# Є українські літери, значить торрент названий вручну
ACCEPTED_FOR_MOVE = `echo" $ LEGAL_NAME "| grep -oE "[а-яА-Я] +" | wc -l`
# Рік шукаємо в оригінальному імені файлу / папки
YEAR = `echo" $ 1 "| grep -oEi "(\ b (2 [0-1] [0-9] | 19 [0-9]) \ b)" `
EXTENSION = `echo" $ 1 "| grep -oEi "\. ([a-z0-9]) \ s * $" | grep -oEi "([a-z0-9])" `
EXTLIST = "avi | mkv"
if [. -e "$ 1"]; then
echo file $ 1 not exists >> $ LOGNAME
exit 1
fi;
if [-f "$ 1"]; then
IS_FILM = `echo" | $ EXTLIST | " | grep "| $ EXTENSION |" | wc -l`
else
IS_FILM = `ls" $ 1 "| grep -E "\. ($ EXTLIST)" | wc -l`
fi
if [ "$ YEAR"! = ""]; then
LEGAL_NAME = "$ LEGAL_NAME ($ YEAR)"
fi
# Перемещаем поки тільки фільми
if [$ IS_FILM = 0]; then
echo "$ 1 not a film" >> $ LOGNAME
exit 1
fi
# Тут доп.условія щодо прийняття рішення про переміщення: розмір, нове ім'я
# Не переносьте кіно, якщо в назві торрент-файлу немає українських букв!
if [$ ACCEPTED_FOR_MOVE = 0]; then
echo "$ LEGAL_NAME not accepted for move" >> $ LOGNAME
exit 0 # виходити краще зі статусом 0, інакше торрент приймає це за помилку
fi
NEW_LOCATION = "$ SORTING_LOCATION / $ LEGAL_NAME"
if [ "$ EXTENSION"! = ""]; then
NEW_LOCATION = "$ NEW_LOCATION. $ EXTENSION"
fi
echo "Move $ 1 to" $ NEW_LOCATION "($ IS_FILM, $ EXTENSION, $ YEAR)" >> $ LOGNAME
# Перемещаем фільм в папку для сортування
mv "$ 1" "$ NEW_LOCATION"
невеликий бонус
для налагодження подій і команд конфіга зручно використовувати сам консольний клієнт, в ньому можна виконувати команди ручками, досить вибрати стрілками якусь із закачувань в списку і натиснути Ctrl + X, відкриється запрошення на введення команди.
можна вводити, наприклад,
print = $ d.get_loaded_file =
d.stop =
print = "$ execute_capture = basename, $ d.get_loaded_file ="
Ще фінт: іноді ставиш пачку файлів гойдатися, і треба щоб один з них (фільм наприклад, який зараз дивитися будеш) скачати максимально швидко. Тоді ставиш все інше на паузу (Ctrl + K), і починаєш спокійно дивитися (особливо якщо торрент качає послідовно). Але потім ліниво знову лізти запускати всі інші торренти, або взагалі забути можна.
Допомагає така конфиг-рядок
system.method.set_key = event.download.finished, unpause_next, "d.multicall =, d.check_start ="
Вона після закінчення закачування, знімає з паузи всі інші.
Хотів розібратися як зробити, щоб знімалося по одному файлу за раз, але не подужав.
І ще: іноді вдома світло вимикають і сервак жорстко вирубується разом з віртуалкою (ІБП буває не вистачає, а зворотного зв'язку з серваке у нього немає, щоб погасити), коли світло дають - сервак заводиться, запускає виртуалки, але ось торрент-клієнт після таких аварій мені доводилося запускати руками. Тепер же дійшли руки і я прописав в /etc/rc.local такий рядок:
sudo -u myusername screen -UdmS rtorrent / bin / bash / home / myusername / scripts / run_rtorrent
Цей рядок запускає під моїм користувачем screen-сесію в режимі демона. а в ній - сам rtorrent. І коли я заходжу в консоль, я можу відкрити цей screen з уже працюють клієнтом.
UPD. Оновлення по пункту Ціль 6.
По-перше, кожен раз називати .torrent правильним ім'ям фільму незручно, по-друге, можна і помилитися в назві, по-третє, будь-який руссконазванний торрент типу вважається фільмом, це все ж не так.
І ще, треба відучити скрипт перенесення вішати торрент клієнт і веб-інтерфейс на час перенесення на іншу ФС.
Тому в справу була введена більш важка артилерія, ніж баш-скриптинг: PHP + Ліба BEncode / BDecode.
Був написаний більш складний php-скрипт замість початкового баш-скриптик.
Його функції:
- розкодування метаінформації з .torrent-файлу
- отримання списку файлів торрента і визначення по ньому, чи схожа закачування на кіно
- отримання URL з поля comment, рутрекере і ННМ-клуб зберігають там посилання на пости
- отримання HTML поля
Також з метаінфо торрента визначається рік випуску фільму. В результаті без зайвих рухів тіла маємо автоматичний пошук українського назви фільму і року, що і використовується для формування нормального назви фільму при перенесенні в папку призначення.
Якщо скрипт визначив все, що потрібно для перенесення (інакше він плюється різними exit-кодами), то переходимо до дії: Форкал процес, parent повертає 0 (типу все ок), child спокійно переносить фільм на іншу ФС.
Це запобігає подвисания торрент-клієнта; було особливо неприємно при перенесенні докачаєте HD фільмів.
UPD2:
деякі команди, що виконуються по Ctrl + X
command> ui.current_view.set = stopped # перемикання на вигляд stopped
command> d.multicall =, d.start = # запуск всіх зупинених закачувань
command> d.multicall = stopped, d.start = # запуск всіх зупинених завантажень в вікні stopped