вторник, 26 августа 2014 г.

Linux (CentOS 6.5) + Transmission + http://www.lostfilm.tv/rssdd.xml + bash script = автоматическое скачивание торрентов с Lostfilm.tv

Предисловие (дано)

  • Есть такой замечательный ресурс - Lostfilm.tv, где можно скачать целую пачку отличных релизов сериалов. За что ребятам спасибо!
  • Есть любимая жена, которая смотрит оттуда сериалы
  • Каждый день она заглядывает туда в надежде, что выложили новую серию
  • Есть NAS (Network Attached Storage), работающий под управлением CentOS 6.5
  • И есть я, который любит экономить время за счёт компьютеров =)
Забегая вперёд, хоть я и чайник в линукс, оказалось не так уж сложно...

Итак, поехали

1. Transmission должен быть установлен

Детально описывать здесь это я не буду, вот пара ссылок, которыми я пользовался:

      ВАЖНО

      • Чтобы установить из YUM нужно, чтобы репозиторий EPEL был добавлен, я его добавлял давно по другим гайдам, но в ссылках выше что-то об этом есть.
      • Перед редактированием конфигурации "/var/lib/transmission/.config/transmission/settings.json" убедитесь, что демон остановлен (service transmission-daemon stop), иначе затрёт ваши правки
      • Капитаню, но не забудьте в iptables открыть порты для GUI и для входящих соединений. У меня это сделано так:
        -A INPUT -s 10.9.10.0/24 -m state --state NEW -m tcp -p tcp --dport 9091 -j ACCEPT
        -A INPUT -i ppp0 -m state --state NEW -m tcp -p tcp --dport 51413 -j ACCEPT
         
      Клиента можно скачать отсюда: https://code.google.com/p/transmisson-remote-gui/downloads/list
       

      2. Создаём скрипт для проверки новых серий

      Я его положил в /opt/lostfilm/lostfilm.sh
      Пока создавал скрипт, вдохновлялся:
      По разным причинам копипаст либо не взлетал либо не нравился деталями и у меня получилось вот что (важные моменты отмечены маркером, комментарии см. ниже):
      #!/bin/bash
      #exec &>> /var/log/lostfilm.$(date +%F).log
      exec &>> /var/log/lostfilm.log

      echo -e "==========================================================================="
      echo `date` checking torrents

      # === Prepare dirs
      cd /opt/lostfilm/
      source lostfilm.conf

      TMP1=tmp.rss
      TMP2=tmp.mkv_torrents
      TMP3=tmp.interested
      TMP4=tmp.toqueue

      rm -f tmp.*

      # === Качаем RSS
      wget -O $TMP1 $lfrss

      # === Отбираем файлы с нужным качеством
      cat $TMP1 | grep -ioe 'http.*torrent'| grep -ie $INTERESTED_QUALITY > $TMP2
      echo -e '\nTorrents found (filtered by quality):' ; cat $TMP2

      # === Отбираем только интересные нкам сериалы
      cat $TMP2 | grep -ie $INTERESTED_IN_REGEXP > $TMP3
      echo -e "\nInterested torrents:" ; cat $TMP3

      # === проверяем, какие уже скачаны, а какие нет
      SEEN=torrents.seen
      touch $SEEN

      rm -f $TMP4
      touch $TMP4

      while read -r l; do
         tor=`echo $l | cut -d';' -f2`
         echo Considering torrent: $tor

         isSeen=`cat $SEEN |grep $tor`
         if [ ! $isSeen ]
         then
            echo Ok, will download: $tor
            echo $tor >>$TMP4
            echo $tor >>$SEEN
            /usr/bin/wget -nc -O "$tor" --referer="$lfrss" --user-agent="$ua" --no-cookies --header="$lfcookie" "$l"
            mv "$tor" "$TRANSMISSION_WATCH_DIR/"
         else
            echo Already have: $tor
         fi
      done <$TMP3
      echo -e "\nScheduled torrents:" ; cat $TMP4

      # === Sending email with results if any
      if [ -s $TMP4 ]
      then
         echo Mail notification to be sent
         cat $TMP4 |/opt/smail.sh $EMAIL_NOTIFICATION_TO "Новые серии с Lostfilm поставлены на скачивание"
      else
         echo No torrents queued, no email notification
      fi

      rm -f tmp.*

      echo Checking torrents completed at `date`
      echo -e "===========================================================================\n\n"


      И отдельно конфиг файл /opt/lostfilm/lostfilm.conf
      INTERESTED_IN_REGEXP='\(Extant\|Defiance\|Marvel\|Under\|Game\|Falling\)'
      INTERESTED_QUALITY=mkv

      lfcookie="Cookie: uid=UID; pass=PASS; usess=USESS; phpbb2mysql_data=DATA"

      TRANSMISSION_WATCH_DIR=/var/nas/z_queue
      EMAIL_NOTIFICATION_TO=someone1@gmail.com,
      someone2@gmail.com

      lfrss="http://www.lostfilm.tv/rssdd.xml"
      ua="Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.9.168 Version/11.50"


      Итак, по маркерам 

      • "Sending email with results if any" - захотите вы сделать отправку почты или нет - дело вкуса. В итоге я решил воспользоваться командой mailx (обернул её в скрипт smail.sh, чтобы там инкапсулировать авторизацию на smtp сервере)
      • "\(Extant\|Defiance\|Marvel\|Under\|Game\|Falling\)" - простенькая регулярка для отбора торентов по первому слову в названии файла. Здесь нужно перечислить ваши сериалы
      • "mkv" - я выбрал mkv, но там же есть ещё avi и mp4 - решать вам (разница по сути в качестве, а в итоге и в размере файла)
      • "UID",  "PASS", "DATA" - значения эти берём из куков браузера. Вариантов, как это сделать много, уверен вы знаете как, только сначала залогиньтесь.
      • "USESS" - нужно взять из профиля на lostfilm.tv. Ну вот вы зарегистрировались, вошли и кликайте на ссылку "ПРОФИЛЬ" и там внизу будет маленьким шрифтом что-то вроде usess=84802e442ef4c9941a6455d633471261
      • "/var/nas/z_queue" - предполагается, что сюда смотрит transmission-daemon. Речь о вот этих конфигурационных параметрах:
        "watch-dir": "/var/nas/z_queue",
        "watch-dir-enabled": true
      • "someone1@gmail.com,someone2@gmail.com" - если использовать отправку email, то предполагается здесь через запятую указать получателей

      3. Добавляем задачу в cron

      Никакого rocket since, просто добавил строку в /etc/crontab
      */15 * * * * root /opt/lostfilm/lostfilm.sh

      4. Грабли

      1. Отправка почты (чтение тела письма)

      Оказалось, что
      /opt/smail.sh "someone@gmail.com" "Новые серии с Lostfilm поставлены на скачивание" <$TMP4
      ...и...
      cat $TMP4 |/opt/smail.sh "someone@gmail.com" "Новые серии с Lostfilm поставлены на скачивание"
      ...ОЧЕНЬ разные вещи! 
      Подозреваю, что здесь как-то замешан SELinux, но решил, что я не админ и добить разгадку я не должен.
      Анамнез: первый вариант отлично работает (письмо отправляется, тело есть) из командной строки, но не работает (письмо отправляется, тела нет - пустое) из крона. Второй вариант работает и из крона и из командной строки.

      2. Отправка почты (gmail)

      Я отправлял на gmail и он жёстко резал, обзываясь спамом. Я нашёл несколько вариантов, как отправлять пользуясь smtp сервером gmail, но что-то мне эти варианты не понравились и я нашёл как воспользоваться smtp сервером моего провайдера.
      Без указания smtp сервера команды mail и mailx отправляют очень непрезентабельные письма.