Началось все с того, что я поднял дома торренто-качалку. Не ахти какое событие, сейчас их существует вагон и маленькая тележка.
Ну казалось бы, поднял и поднял, прокинул по самбе директорию в которую скачивается на компы дома и расслабился. Но через некоторое время я, как бонус, поднял еще и медиа-сервер, чтобы наконец-то отказаться от кинопоиска с его цензурой и смотреть то, что нравится в любой непонятной ситуации. Но возникла проблема - фильмы я смотрю не очень много, больше аниме, а вот жена ровно наоборот. И если для меня не составляло труда зайти на сервак и раскидать все по нужным директориям, то вот для человека, не очень близкого к таким вещам, этот квест вполне себе мог стать проблемой. Тогда я сел и задумался - а как можно организовать так, чтбоы сервак все сам растаскивал куда нужно и еще и данные подтягивал?
Итак, вводные. Домашний сервак, на нем поднята торренто-качалка и медиа-сервер. Задача - пользователь скачивает фильм (на самом деле, что угодно - сериал, аниме, мультик) и он сразу же перетаскивается в нужное место и к нему подтягивается метадата. Для уточнения стоит сказать, что домашний медиа-сервер разные библиотеки хранит в разных директориях на уровне файловой системы, что чуточку упростило задачу.
Решение, которое существует на данный момент - в директории загрузки торренто-качалки существует еще 4 невидимых для самбы директории - для фильмов, сериалов, аниме и мультиков. Как только торрент скачан, он перемещается из директории incomplete
в одну из четырех директорий, которую юзер должен выбрать до начала скачивания. А на сервере висит systemd-юнит, триггер которого настроен на появление файла в одной из директорий. После того, как файл появился, он перемещается в соответствующую директорию медиа-сервера, который, в свою очередь, при обнаружении файла, запускает сканирование Кинопоиска/MovieDB и далее по списку.
Сам systemd-юнит состоит из двух частей - path и service. Path служит триггером для service. Пример одного из юнитов для аниме:
*.path:
[Unit]
Description=Trigger when new anime has been downloaded
[Path]
DirectoryNotEmpty=/srv/torrents/anime
[Install]
WantedBy=multi-user.target
*.service:
[Unit]
Description=Move downloaded animes to media dir
[Service]
Type=oneshot
ExecStart=/usr/local/bin/tor-anime
Как видно из юнитов, приведенных выше, при появлении файла дергается сервис, который, в свою очередь дергает скрипт, перемещающий аниме и запускающий обновление мета-данных.
Данную заметку я пишу скорее потому что огромное количество людей вокруг даже не догадываются о том, насколько мощный инструмент systemd и пытаются строить костыли там, где они не нужны.