Апофеоз ЛЕНИ, или как качать новые серии любимых сериалов с Лостфильма автоматически

Я являюсь гордым обладателем сетевой файлопомойки Netgear NV+.

А еще я сисадмин в душе.... И наверно как все сисадмины очень ленивый ;) - ну разумеется в хорошем смысле этого слова.

А еще я люблю иногда посматривать сериалы, которые переводит небезызвестный Lostfilm.

И захотелось мне как то - а почему бы моей файлопомойке - самой не скачивать новые серии оттуда? Тем более там линукс стоит - а уж с линуксом то мы что угодно можем почти накрутить.

Сказано - сделано. В общем сейчас я имеею такую картину - выходит новая серия любимого сериала на лостфильме - и она почти сразу же закачивается файлопомойкой. Ничего делать не надо - приходишь после работы, включаешь телевизор с медиаплеером (у меня стоит старенький POPCORN HOUR A110, который проигрывает фильмы расположенные на Netgear'е по сети) - и оп-па на, новая серия лежит уже готовая к просмотру.

Периодически только надо заходить в Transmission да чистить торренты, да вручную добавлять в скрипт новые сериалы (пока не сделал добаление через веб-рожу, но в принципе - можно. Останавливает только ЛЕНЬ :) )

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

Итак подробности.

Имеем:

Сетевая файлопомойка Netgear NV+ установленная, настроенная, заботливо проапгрейженная со стандартных 256мбайт оперативки до 1Гб и замененным вентилятором чтоб меньше шумел. На ней уже настроен ssh (я захожу сразу на железку и скрипты правлю там), есть perl, поставлен и настроен Transmission - именно он и будет скачивать за нас торренты. В коробке есть wget и cron.

Есть сайт Лостфильма, где выкладывают новые серии сериалов. Тут я пожалуй опущу свои долгие ковыряния и дебаги - расскажу сразу как я забираю нужные торренты. У Лостфильма есть rss-ка, где выкладываются последние релизы. Скрипт на перле выкачивает эту rss-ку, отбирает из нее только HD-релизы (я гурман :) ) и только тех сериалов что я смотрю (а список внушительный). Затем скачивает их - причем скачивает их с моей учетной записью на лосте, подставляя нужные параметры в куках. Затем новые торренты, если они еще не добавлялись в очередь, копирует в т.н. watch-каталог Transmission'а - т.е. каталог, в котором Transmission сам ищет новые торренты и если находит - запускает на скачку. Ну и после того как файл скачается Transmission переносит файл из временного каталога в основной, к которому уже цепляется медиа-плеер и собственно остается только его посмотреть.

Поскольку очередь transmission'а сама не чистится (по крайней мере я даже не искал эту фичу - проклятая лень) - надо периодически заходить и удалять готовые торренты. Также надо вручную добавлять в скрипт новые сериалы которые появляются на лосте если стало интересно. Привожу сам скрипт, по возможности с комментариями

#!/usr/bin/perl

#Это временная папка для закачивания rss-ки и торрентов
$dir="/c/media/Lostfilm.TV";

#Это каталог за которым наблюдает Transmisiion
$watch_dir="/c/media/BitTorrent/sources";

system("wget 'http://www.lostfilm.tv/rssdd.xml' -O$dir/sources/tmp_rss 2>>/dev/null 1>>/dev/null");

$found = 0;
open (FH, $dir."/sources/tmp_rss");
while($line=)
{
  if( $line =~ /\/ )
  {
    #Забираем только HD ;) парсю  можно наверно и красивее - но мне хватает
     if(( $line =~ /720p/ )||( $line =~ /\.HD\./ ))
     {
       ($v1, $v2) = split />/, $line; #будьте внимательны при копировании здесь знак больше ;)
       ($url, $v3) = split /</, $v2;  # а здесь меньше

       ($u1,$url_tor) = split /\;/, $url;
       $url =~ s/amp\;// ;
# дебаг ;) $url - полный урл торрента, $url_tor - название файла, используем потом чтобы отфильтровать нужные сериалы
       print $url_tor;
       print "\n";

#тут длинный список сериалов которые смотрим 
       if ( ( $url_tor =~ /Homeland/ ) ||
            ( $url_tor =~ /Endgame/ ) ||
            ( $url_tor =~ /Eureka/ ) ||
            ( $url_tor =~ /Dexter/ ) ||
            ( $url_tor =~ /Warehouse/ ) ||
            ( $url_tor =~ /Borgias/ ) ||
            ( $url_tor =~ /Boardwalk/ ) ||
            ( $url_tor =~ /Camelot/ ) ||
            ( $url_tor =~ /Castle/ ) ||
            ( $url_tor =~ /Secret\.Circle/ ) ||
            ( $url_tor =~ /Grimm/ ) ||
            ( $url_tor =~ /American\.Horror/ ) ||
            ( $url_tor =~ /Fringe/ ) ||
            ( $url_tor =~ /Leverage/ ) ||
            ( $url_tor =~ /Eagleheart/ ) ||
            ( $url_tor =~ /Stargate\.Universe/ ) ||
            ( $url_tor =~ /The\.Cape/ ) ||
            ( $url_tor =~ /Star\.Wars\.The\.Clone\.War/ ) ||
            ( $url_tor =~ /Interest/ ) ||
            ( $url_tor =~ /Mildred\.Pier/ ) ||
            ( $url_tor =~ /Game\.of\.Thrones/ ) ||
            ( $url_tor =~ /Sons\.of\.Anarchy/ ) ||
            ( $url_tor =~ /Falling\.Skies/ ) ||
            ( $url_tor =~ /Terra\.Nova/ ) ||
            ( $url_tor =~ /Breaking\.Bad/ ) ||
            ( $url_tor =~ /The\.Killing/ ) ||
            ( $url_tor =~ /Kennedys/ ) ||
            ( $url_tor =~ /Alphas/ ) ||
            ( $url_tor =~ /Haven/ ) ||
            ( $url_tor =~ /Sherlock/ ) ||
            ( $url_tor =~ /Hell\.on\.Wheels/ ) ||
            ( $url_tor =~ /Walking\.Dead/ ) ||
            ( $url_tor =~ /Californication/ ) ||
            ( $url_tor =~ /Alcatraz/ ) ||
            ( $url_tor =~ /Spartacus/ ) ||
            ( $url_tor =~ /Touch/ ) ||
            ( $url_tor =~ /Magic\.City/ ) ||
            ( $url_tor =~ /Falling\.Skies/ ) ||
            ( $url_tor =~ /Continuum/ ) ||
            ( $url_tor =~ /Arrow/ ) ||
            ( $url_tor =~ /Revolution/ ) ||
            ( $url_tor =~ /Anger\.Management/ ) ||
            ( $url_tor =~ /Last\.Resort/ ) ||
            ( $url_tor =~ /The\.Newsroom/ ) ||
            ( $url_tor =~ /Outcasts/ )  )
       {
         if (! ( -f "$watch_dir/$url_tor.added" )) # Когда Transmission добавляет torrent в очередь он к имени файла добавляет .added, соответственно если уже файл есть в очереди - смысла его заново качать - нет
         {
           system("wget -nc -P $dir/sources -a$dir/sources/wget_lf.log -O$dir/sources/$url_tor --header \"Cookie: uid=777; pass=777888999aaa000111222333444; usess=fff3335555ccc444666333666\" '$url'"); # а вот тут самое интересное - пояснения даются ниже
         }
       }
    }
  }
}
# собственно перемещаем из временного каталога в watch-каталог для Transmission'а, причем только *.torrent файлы (ибо других он там и не ждет)
system("mv $dir/sources/*.torrent $watch_dir");

У Transmission'а в файлике setting.json (у меня это /c/addons-config/Transmission/transmission-daemon/settings.json) надо обратить внимание на следующие параметры

{
   ...
    "download-dir": "/c/download",
   ...
    "incomplete-dir": "/c/media/BitTorrent/Incomplete",
    "incomplete-dir-enabled": true,
   ...
    "watch-dir": "/c/media/BitTorrent/sources/",
    "watch-dir-enabled": true
}

теперь подробнее про строчку в скрипте

           system("wget -nc -P $dir/sources -a$dir/sources/wget_lf.log -O$dir/sources/$url_tor --header \"Cookie: uid=777; pass=777888999aaa000111222333444; usess=fff3335555ccc444666333666\" '$url'"); 

вот эти три параметра uid, pass, usess - идентифицируют вас для Лостфильма. Здесь разумеется указаны "левые", вам надо подставить свои. Маленький мануальчик с картинками как их найти например в браузере Google Chrome

Разумеется первым делом надо зарегистрироваться на Лостфильме :)

Заходим в свой профиль на лосте - http://www.lostfilm.tv/my.php

Так находим “usess”

Потом заходим настройки хрома, в самом низу тыкаем в «Показать допольнительные настройки»

Выбираем настройки контента

Выбираем куки и вводим в поиске lostfilm.tv

и смотрим pass , потом точно также uid

Теперь этот скрипт надо поставить в крон. На своем Netgear NV+ я сделал так: в каталоге /etc/cron.d создал файл download_lostfilm следующего содержания

# /etc/cron.d/download_lostfilm: crontab fragment for lostfilm

45 * * * *     root   /root/dwnld_lostfilm.tv.pl &>/dev/null

т.е. запускается каждый час, в 45 минут. Сам скрипт положил соответственно под именем /root/dwnld_lostfilm.tv.pl

Что еще можно сделать (и возможно сделаю, когда преодолею ЛЕНЬ :) )

1. Список интересуемых сериалов вынести в отдельный файл - некий конфиг. Который будет можно отредактировать через веброжу (Netgear NV+ вполне позволяет php со всеми вытекающими)

2. Записи в этом конфиге будут хранится в виде - шаблон_поиска_имени : каталог куда нужно будет потом раскидывать файлы - чтоб каждый сериал в своей папочке

3. Раскиданные серии выкладывать в отдельную папочку симлинками - чтобы в этой папочке в одном месте были собраны все последние серии всех сериалов

Кстати по поводу пункта 3.

Есть просто у меня уже такая папочка куда складываются симлинками все новоскаченные фильмы, мультики и т.п. на файлопомойке выглядит так.

т.е. дата создания - название фильма. В подкаталоге LAST еще и самый самый "свежачок"

А вот скрипт который делает такие симлинки

#!/bin/sh

IFS=$'\n';

rm /c/download/##New/*.mkv
rm /c/download/##New/*.avi
rm /c/download/##New/Last/*.mkv
rm /c/download/##New/Last/*.avi
rm /c/download/##New/Serials/*.mkv
rm /c/download/##New/Serials/*.avi

for file in `find /c/download/#Films/*.avi \
                  /c/download/#Films/*.mkv \
                  /c/download/#Films_HDTV/*.avi \
                  /c/download/#Films_HDTV/*.mkv \
                  /c/download/#Мультики/*.avi \
                  /c/download/#Мультики/*.mkv \
                  -mtime +0 -mtime -120`; do
   filename=`basename "$file"`;

   day=`stat $file | grep "Change" | awk '{ print $2 }'`;

#   echo "$filename"
   if [ ! -f "/c/download/##New/$day $filename" ]; then
     ln -s "$file" "/c/download/##New/$day $filename"
   fi
done


for file in `find /c/download/#Films/*.avi \
                  /c/download/#Films/*.mkv \
                  /c/download/#Films_HDTV/*.avi \
                  /c/download/#Films_HDTV/*.mkv \
                  /c/download/#Мультики/*.avi \
                  /c/download/#Мультики/*.mkv \
                  -mtime +0 -mtime -30`; do
   filename=`basename "$file"`;

   day=`stat $file | grep "Change" | awk '{ print $2 }'`;

#   echo "$day - $filename";
   if [ ! -f "/c/download/##New/Last/$day $filename" ]; then
     ln -s "$file" "/c/download/##New/Last/$day $filename"
   fi
done

for file in `find /c/download/#Serials_HDTV/*/*.avi \
                  /c/download/#Serials_HDTV/*/*.mkv \
                  -mtime +0 -mtime -30`; do
   filename=`basename "$file"`;

   day=`stat $file | grep "Change" | awk '{ print $2 }'`;

#   echo "$day - $filename";
   if [ ! -f "/c/download/##New/Serials/$filename" ]; then
     ln -s "$file" "/c/download/##New/Serials/$filename"
   fi
done

сканирует определенные каталоги и делает симлинки если файл не старше 120 дней, и в подкаталог Last если не старше 30 дней. А вот в кроне я его запускаю только раз в день - в 5 утра (это на случай чтоб не убился симлинк когда я этот файл смотрю на медиаплеере :) )

Ну вот собственно и все. Спасибо за то что не ЛЕНЬ было дочитать до конца :)

tags: