Как с помощью systemd автоматизировать медиа-сервер

или сказ о том, как я дал возможность жене скачивать любые фильмы

linux config

Началось все с того, что я поднял дома торренто-качалку. Не ахти какое событие, сейчас их существует вагон и маленькая тележка.

Ну казалось бы, поднял и поднял, прокинул по самбе директорию в которую скачивается на компы дома и расслабился. Но через некоторое время я, как бонус, поднял еще и медиа-сервер, чтобы наконец-то отказаться от кинопоиска с его цензурой и смотреть то, что нравится в любой непонятной ситуации. Но возникла проблема - фильмы я смотрю не очень много, больше аниме, а вот жена ровно наоборот. И если для меня не составляло труда зайти на сервак и раскидать все по нужным директориям, то вот для человека, не очень близкого к таким вещам, этот квест вполне себе мог стать проблемой. Тогда я сел и задумался - а как можно организовать так, чтбоы сервак все сам растаскивал куда нужно и еще и данные подтягивал?

Итак, вводные. Домашний сервак, на нем поднята торренто-качалка и медиа-сервер. Задача - пользователь скачивает фильм (на самом деле, что угодно - сериал, аниме, мультик) и он сразу же перетаскивается в нужное место и к нему подтягивается метадата. Для уточнения стоит сказать, что домашний медиа-сервер разные библиотеки хранит в разных директориях на уровне файловой системы, что чуточку упростило задачу.

Решение, которое существует на данный момент - в директории загрузки торренто-качалки существует еще 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 и пытаются строить костыли там, где они не нужны.

Previous Post