в Администририрование

Нахрен долгое вступление. Если на вопрос «Нравится автоматизировать и любишь посмотреть кино?» ты неосознанно ответишь положительно, то то что здесь написано — тебе понравится. Итак, наверняка у тебя есть своя железяка, которая стоит дома/офисе где-то в уголочке и выполняет роль файлошары/торрентокачалки и Джа знает ещё чего.

Железяка (4 фотки в 1)
Hardware:
Мать MSI C847IS-P33
Камень Распаян на плате, Intel(R) Celeron(R) CPU 847 @ 1.10GHz / 2 ядра
Память DDR3 @ 2 Gb
SDD (система) Kingston @ 8 Gb
HDD (данные) WG Green @ 2 Tb

Что такое RSS torrent?

Это RSS лента, в которой вместо привычных новостей публикуются ссылки на .torrent файлы выбранной тобой тематики. Придумали это давно, и прогрессивный народ активно этим пользуется. Есть даже сервисы, такие как:

Которые этим и живут. Конечный пользователь приходит, выбивает интересный ему контент, получает ссылку на свою ленту, кормит её своему торрент-клиенту (который в свою очередь должен поддерживать torrent rss) — получая в конечном счете новые серии любимых сериалов/фильмов определенной тематики почти без задержки и лишних действий. Пиздец как удобненько.

Почему bash и Transmission?

Раньше скрипт был написан на питоне. Но поставить его — задача не из самых тривиальных, особенно на стареньких системах. Зависимости, сторонние библиотеки.. А bash — он считай что везде, да и в конкретной реализации нет никаких экзотичных требований.
Transmission в свою очередь — потому как очень шустрый, имеет адекватную веб-морду, да и с поддержкой у него — всё в порядке. Единственное серьезное «но» — это отсутствие поддержки RSS, и как раз исправлением этого недочета мы сейчас и займемся. Наш скрипт будет запускаться кроном с заданным интервалом, ссылки на .torrent файлы из RSS будут нежно извлекаться, записываться в файл, и передаваться RPC Transmission.

Его настройки:

USE_WGET Использовать wget (принимает значения 1|0)
WGET_PATH Путь до расположения wget (строка)
USE_CURL Использовать curl (принимает значения 1|0)
CURL_PATH Путь до расположения curl (строка)
USE_PROXY Использовать прокси (да/нет) (принимает значения 1|0)
PROXY_SCHEME Схема прокси (строка, например http, https, socks и т.п.)
PROXY_ADDR Адрес прокси (строка)
PROXY_PORT Порт прокси (строка)
PROXY_USER Пользователь на прокси (строка)
PROXY_PASS Пароль пользователя на прокси (строка)
FEED_URLS_AND_DIRS Массив со ссылками на RSS ленты. Что очень важно — указывается URL первой ленты, а следующим элементом массива — директория, куда скачивать из URL торренты. И так далее. Пример:
FEED_URLS_AND_DIRS=(\
  'http://link.to/rss/feed1.xml' '/path/to/dir1/' \
  'http://link.to/rss/feed2.xml' '/path/to/dir2/' \
  'http://link.to/rss/feed3.xml' '/path/to/dir3/' \
);
TRANSMISSION_REMOTE Путь до transmission-remote (строка)
TRANSMISSION_RPC_USER Пользователь transmission-remote (строка)
TRANSMISSION_RPC_PASS Пароль пользователя transmission-remote (строка)
TRANSMISSION_RPC_HOST Адрес transmission-remote (строка)
TRANSMISSION_RPC_PORT Порт transmission-remote (строка)
REMOVE_TRANSMISSION_COMPLETED_TASKS Удалять уже завершенные закачки из Transmission (принимает значения 1|0)
HISTORY_FILE Путь до текстового файла для хранения ссылок, которые были переданы в transmission-remote (строка)
COLOR_OUTPUT Использовать цветную выдачу в STDOUT (принимает значения 1|0)

Скачать

Установка

Переходим в нужную директорию и скачиваем исходник скрипта (потребуются wget и unzip):

$ wget -O src.zip https://goo.gl/TFfcgU; unzip src.zip; rm -f src.zip
$ mv ./6f*d2-master/* ./; rm -Rf ./6f*d2-master/
$ ls -l *.sh
-rw-r--r-- 1 kot nginx 10598 янв 22 10:21 get_torrents.sh

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

$ crontab -e
# Добавляем примерно следующую строку:
  5     8-23   *     *    * /usr/bin/nice -n 15 /usr/bin/bash ~/get_torrents.sh

# -     -      -     -    - ----------------------------------------------------------------
# |     |      |     |    |
# |     |      |     |    +----- day of week (0 - 6) (Sunday=0)
# |     |      |     +------- month (1 - 12)
# |     |      +--------- day of month (1 - 31)
# |     +----------- hour (0 - 23)
# +------------- min (0 - 59)

Запускать через nice вовсе не обязательно, но как-то правильнее, что-ли. Наслаждайся, мудачина :)

+ Bonus

Просто как рекомендация, не более. Есть такое средство для организации и просмотра (в браузере или через DLNA) библиотеки твоих фильмов/сериалов как Plex. Очень рекомендую — вещь просто ахрененная. Написана на питоне, не требует установленного веб-сервера и СУБД. Просто ставишь — и пользуешься. Подробнее об этом почитай здесь, да и вообще — поищи в сети ссылки и описания. Ещё раз — это простая рекомендация, но проверенная лично.

  1. скачал ваш скрипт! вываливает ошибка во время разбора rss

    [15:17:55] Content length is 91930 characters
    sed: 1: "/item/{s/.*\(.*\) ...": extra characters at the end of p command
    [15:17:55] We found        1  feed section(s)
    sed: 1: "/link/{s/.*\(.*\) ...": extra characters at the end of p command
    [15:17:55] And extract        1 link(s) from  section(s)

    подскажите что вы делаете sed меняете что-то? пытался понять но именно в синтаксисе ошибка и не понимаю что делаете!

    echo "$data" | tr '\n' ' ' | sed -r "s/<$tag_name/\n<$tag_name/g" | sed -n "/$tag_name/{s/.*\(.*\).*/\1/;p}";

    Большое спасибо за ответ

    • Читайте исходник :)
      Без примеров всех входных данных ничего сказать не смогу

      • в то что и дело что я вижу где ошибка! я прислал вам строку

        echo "$data" | tr '\n' ' ' | sed -r "s/<$tag_name/\n<$tag_name/g" | sed -n "/$tag_name/{s/.*\(.*\).*/\1/;p}";

        в ней синтаксическая ошибка !
        именно синтаксис sed , я ис правдивая что вы пытаетесь сделать данной командой?
        Может у вас есть ехайл куда можно написать и более подробно обсудить данный вопрос?

        • Ошибка? А у меня работает :)
          Мыло есть, но обсуждать там это не стоит. Есть гист, и там есть комментарии. Пишите туда, если есть желание :)

          • Понятное дело что у вас работает :) не выкладывали бы если не работало!
            пытаюсь запустить на freebsd , вы наверное на какой-то другой системе где у sed другой синтаксис! вот и вываливается ошибка… Не могилы вы описать что вы делаете sed’ом что бы я исправил под freebsd может кому-то пригодиться :)

              • ломается на месте sed -n «/$tag_name/{s/.*\(.*\).*/\1/;p}

                именно команда ;p ему не нравится!
                Вот и пытаюсь у вас узнать что вы делаете…

                -n вывести строку содержащую /$tag_name/
                s/ заменить
                а что такое ;p не могу найти

                Подскажите пожалуйста !

                • pprint
                  ;combined several sed commands on one line

                  Могу предположить, что он спотыкается из-за отсутствия принудительной фильтрации в $tag_name, из-за чего регулярочка ломается. Но чтоб это подтвердить — вам нужно перечитать мой первый комментарий ;)

Комментирование наглухо закрыто