Author Archives: AJ

Очередная качалка торрентов с lostfilm.tv

Предыстория.

Я давно написал bash-скрипт для парсинга и загрузки с лостфильма торрентов нужных мне сериалов. Работал он как часы, и поэтому я был настолько уверен в своём творении, что даже не удивлялся отсутствию новых серий последние пару месяцев. А оказывается как раз пару месяцев назад на сайте поменялся дизайн, вёрстка и многое другое. Об этих изменениях узнал случайно — пришла рассылка, что, мол, мы изменили дизайн сайта и всё такое. Я из интереса зашёл на сайт посмотреть и обнаружил, что есть новые серии сериалов, которые у меня почему-то не скачались. Сел рыть дальше и понял, что надо переделывать скрипт. Поменялось многое.

Результатом хочу поделиться. Может кому ещё сгодится. После тела скрипта будет разбор полётов, что там и к чему.

#!/bin/bash

# lostfilm.tv smart rss parser and torrent downloader, version 2.2
# 2017.04.03 by jack
# required external programs: curl, wget, lynx

INPUT="/home/jack/.rtorrent.rc"
OUTPUT="/data/video"
LYNX="eval lynx -nonumbers -stdin -dump -listonly -hiddenlinks=ignore|uniq"

LC_ALL=c wget --timeout=5 --tries=1 --timestamping -P /tmp http://www.lostfilm.tv/rss.xml 2>&1 >/dev/null|grep -q "not retrieving"
if [[ ${PIPESTATUS[0]} -ne 0 || ${PIPESTATUS[1]} -eq 0 ]]; then exit; fi

for LINE in `grep -o 'video.*torrent' $INPUT`; do
    STRING=`expr $LINE : '.*\(/.*\.\)'`                          # extract everything between / and .
    SERIAL=${STRING//[!a-z]/}                                    # remove everything except [a-z]
    STRINGS=`egrep "series.*$SERIAL" /tmp/rss.xml`               # search for link with serial in rss
    if [[ -n $STRINGS ]]; then
        for STRING in $STRINGS; do
            STRING=${STRING//}; LINK=${STRING/<\/link>/}         # clean link from  and  tags
            STRING=${LINK//[!0-9]/ }                             # remove from link everything except digits
            set $STRING; SEASON=$1; EPISODE=$2                   # get season and episode
            STRING=`curl -sL $LINK|egrep -o 'PlayEpisode\(.*\)'` # search on the page string with serial id
            STRING=${STRING//[!0-9]/ }                           # remove everything except digits
            set $STRING; SERIALID=$1                             # get serial id
            URL_REDIRECT=`curl -sLb "lf_session=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" "http://www.lostfilm.tv/v_search.php?c=${SERIALID}&s=${SEASON}&e=${EPISODE}"|$LYNX`
            URL_TORRENT=`curl -sL $URL_REDIRECT|$LYNX|head -2|tail -1|sed 's/+/%2B/g'`
            wget -q -nc --content-disposition -P $OUTPUT $URL_TORRENT
#            echo -e "$SERIAL $SERIALID $SEASON $EPISODE\n$LINK\n$URL_REDIRECT\n$URL_TORRENT"
        done
    else
        rm -f $OUTPUT/*$SERIAL*.torrent
    fi
done

Итак, для начала список сериалов берётся из конфига rtorrent. Интересующие нас строки там имеют вид:

schedule = watch_directory_6,0,5,"load_start=/data/video/Vikings*.torrent,d.set_directory=/data/video/Vikings"

Если кому интересно, расшифрую: rtorrent каждые 5 секунд проверяет каталог /data/video на предмет появления в нём файлов Vikings*.torrent. Как только появляется такой файл, он добавляется в загрузку, а данные из торрента качаются в каталог /data/video/Vikings.

Конечно, этот конфиг не является обязательным. Список сериалов можно передать в виде списка из внешнего файла или прямо в теле скрипта. Единственное условие — это должно быть одно слово, и такое, чтобы уникально идентифицировать только один сериал. Мне так удобнее, так как я указываю сериалы только в одном файле. Для сравнения в первой версии скрипта у меня было два списка.

Идём дальше. Переменная OUTPUT задаёт каталог, куда будут складываться скачанные торрент-файлы. По описанию выше ясно, зачем я так делаю.

Третьим важным входным параметром является куки lf_session для авторизации на сайте. Без неё торрент-файл не получить. Я брал её из браузера после авторизации. В старой версии сайта название куки было другим и их было два. Теперь стало проще. Кука действует до 2038 года, так что хватит надолго.

На этом из самого необходимого вроде как всё.

Теперь, для тех, кого интересует bash-программирование, хочу немого остановиться на логике. Может мои решения не самые оптимальные, но они могут дать пищу для размышлений и отправную точку для дальнейшего усовершенствования скрипта или использования идей в других решениях.

Итак, всё начинается с загрузки rss-ленты. Скрипт выполняется по крону каждые 15 минут. Чтобы не тиранить почём зря сервер лостфильма, я не качаю файл полностью, а для начала только проверяю его временную метку. За это отвечает параметр timestamping в wget. Если файл не менялся, он не скачивается и скрипт завершает свою работу (exit). Это проверяется наличием в выхлопе wget’а фразы «not retrieving». LC_ALL=c перед вызовом нужно потому, что если wget локализован, ответ будет на соответствующем языке и grep’ать нужно будет другую фразу.

Два PIPESTATUS нужны для того, чтобы завершить скрипт по двум причинам: файл не удалось скачать (проверить его временную метку) или он не изменился. Первое может быть вызвано кучей причин: сайт лежит, нет сети, файл более недоступен по данному адресу и т.п. Второе описано выше.

lynx используется сугубо для выдирания гиперссылок из html-страницы. Решение топорное, но писать свой парсер html мне очень не хотелось.

Важным моментом является определение переменной URL_TORRENT. Это фактически ссылка на торрент-файл. Лостфильм обычно даёт для каждой серии три варианта: SD, HD и FullHD (480p, 720p и 1080p соответственно). Я качаю сугубо 1080p. Поэтому конструкция из head и tail выбирает из списка только одну ссылку. Можно подкрутить это место так, чтобы качались, например, все три варианта или только 720p. Но это уже кому как захочется.

Также здесь важным является замена плюсов в ссылке на %2B. Как я не экранировал это дело, так и не смог добиться того, чтобы bash не бил ссылки из-за плюсов в них. В итоге такой вот костыль.

Чтобы скрипт не качал торрент повторно, если он уже есть в каталоге назначения, wget’у передается параметр -nc (no-clobber). То есть если в ленте была серия одного сериала (и она уже была скачана) и появилась ещё одна, то скачается торрент-файл только новой серии. Хотя здесь может получиться накладка. Честно говоря, не знаю, как отработает скрипт, если в ленте будет несколько серий сериала. Надо будет проверить это дело. Таки да, была проблема. Добавил ещё один цикл. Теперь из rss-ленты качаются все серии сериала.

Вывод переменных echo нужен только для отладки.

Поскольку список серий идёт в rss как по конвейеру, то когда сериал выпадает из ленты, соответствующие торрент-файлы этого сериала удаляются из каталога назначения (rm -f). У меня настроена 5-кратная раздача торрентов, после чего они останавливюется. Торрент-файл, соответственно, больше не нужен. Таким образом rtorrent не захлямляется тоннами старых раздач. Если кто-то хочет вручную контролировать удаление торрентов, могут переделать на своё усмотрение.

UPD: чуток подправил скрипт, так как из-за обновления то ли lynx, то ли сайта, скачивался торрент на SD-качество, а не FullHD.

Скрупулёзный

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

Потрясение сравнимо с тем, когда я узнал, что шпорты — это просто копчёная килька, а не отдельный вид рыбы.

ex.ua unban

Сегодня случайно обнаружил, что снова могу редактировать и создавать объекты. И я даже догадываюсь почему.

Хорошая попытка, но нет. Репутация у них теперь окончательно испорчена, и ни хрена я не буду заливать.

Mennen Speed Stick vs …

mennen speed stick

Синему флакону слева 10(!) лет. На днях я соскрёб с поршня в нём последние остатки белого вещества и решился таки расстаться с опустевшей формой. Но не хотелось так просто отправлять в мусорное ведро такую часть моей жизни, и я решил хотя бы написать о ней. Панихиду и торжественное захоронение устраивать не будем, хватит упоминания в блоге.

Вообще я не приверженец дезодорантов. Я предпочитаю чаще мыться. :) Но, наверное, в жизни каждого мужчины наступает такой момент, когда чистые носки проще купить (c). То есть дезодорант таки иногда нужен, типа, когда уж совсем лень брить/мыть подмышки, подкрыски и подкошки.

Уже не помню, по какому поводу я купил этот Mennen Speed Stick. но покупка оказалась на удивление удачной. Шутка ли продержаться 10 лет и не надоесть запахом, не потеряться, пережить три переезда и трёх Жо и оказаться на удивление хорошим товаром. Хорошим потому, что со своей задачей эта хрень справляется на 100%. Хрен с ним, с приятным, запахом, но подмышки реально тупо перестают потеть на пару дней. Типа, то самый пресловутый антиперспирант.

Что ещё сказать? Вроде и так уже достаточно дифирамбов напел. Это не джинса на заказ. Просто такая хорошая вещь, которой хочется поделиться.

В общем надеюсь, что потомок успешно продержится следующие 10 лет. Запах у него тот же, исполнение тоже. Отличия только в этикетке. Я, кстати, вообще не ожидал, что они ещё производятся, а тут в первом же супермаркете увидел. Для сравнения мой любимый шампунь Shamtoo для жирных волос сейчас хрен найдёшь. Последний флакон кончается, и я бы сейчас ведро купил на будущее.

Киев -> Ирпень

Вчера, когда я ехал в машине с нажитым барахлом, попытался прикинуть, сколько же лет я прожил в Киеве. Получилось что-то вроде 13 лет, если брать отсчёт от 2002-го года.

За это время я успел побывать на 6 работах, в 5 местах жительства, приобрёл не один десяток друзей, с которыми поддерживаю контакт по сей день, женился, обзавёлся дочерью, подобрал кота в подъезде. Одним словом серьёзная веха в моей жизни.

В общем добро пожаловать в гости в Ирпень. Это 10-15 мин на маршрутке от Академгородка. На кухне у нас теперь дофига места, на балконе ещё больше.

adiós ex.ua

Внезапно получил сегодня ридонли на сайте:

Доступ ограничен из-за несоблюдения правил пользования порталом.

Видимо, не понравилась им моя критика :)
И меня походу «пасли». Шутка ли — 8-е место в рейтинге. Более 42 терабайт залитого контента.

Ну пусть идут накуй. С такой политикой удаления контента мне с ними не по пути. Абсолютно никакого сожаления.

UPD: блокировка, скорее всего, произошла автоматически из-за ключевого слова — fs.to
Я как раз писал личное сообщение пользователю. Так что доступ можно без проблем восстановить. Но чё-то мне неохота. Накуй, так накуй :)

+1 летучая мышь

Фишман этой ночью поймал очередную летучую мышь.

И съёл её.

Надо что ли счёт им вести. Потому что не могу вспомнить, третья это или четвёртая.

Неспешно продаю свой GuruPlug Server Plus (ПРОДАНО)

Piccy.info - Free Image Hosting
Piccy.info - Free Image Hosting

Железка в своё время была довольно уникальной, а сегодня аналогичных продуктов пруд пруди (тот же C.H.I.P. за 9 баксов). Проработала у меня в шкафу несколько лет, а потом отправилась на покой, уступив место более быстрым братьям. Предназначена скорее для линуксоидов, но и виндузяникам тоже может пригодится (на таком железе виндовый сервер хрен поднимешь, а линуксовый под кучу задач — запросто).

Итак, основные характеристики:

  • процессор 1,2 ГГц ARM Marvell Kirkwood 88F6281
  • ОЗУ 512 МБ
  • NAND 512 МБ
  • два гигабитных порта Ethernet
  • Wi-Fi 802.11 b/g
  • Bluetooth 2.1 + EDR
  • один разъём microSD
  • два разъёма USB 2.0
  • один разъём eSATA
  • отладочные порты JTAG, UART + RS232
  • потребляемая мощность — до 5(!) Вт

eSATA реально рулит. Скорость записи на диск через этот интерфейс соизмерима с USB 3.0 (~60 МБ/с). На железке развёрнута ОС Debian 7.8 armel (Whezzy). Можно обновиться до стабильной ветки, f можно накатить родное ядро и корневую файловую систему (Debian Lenny). Грузиться можно как со встроенной флэш-памяти NAND, так и с microDS-карты или USB-носителя. Гигабитные сетевухи дают скорость ~50 МБ/с.

Как видно на фото, система в разобранном состоянии: на чипы процессора, памяти и Wi-Fi я установил радиаторы, а штатный шумный вентилятор заменил более крупным и тихим. При использовании не в замкнутом пространстве можно оставить пассивное охлаждение. Старый вентилятор также есть в наличии, и при желании можно собрать всё обратно:

GuruPlug Server Plus

 

Теперь цена. Сегодня за GuruPlug Server (не Plus, то есть c одной сетевухой и без microSD и eSATA) + JTAG-коробочку просят 142 USD. И это ещё без доставки из США. Однако по сегодняшним меркам цена за такую комплектацию высоковата, посему я прошу за старого друга 50 баксов или 1000 грн.

В комплекте идёт модифицированный GuruPlug Server Plus (с радиаторами и большим кулером), вилка под розетку, кабель питания, JTAG-коробочка. Я в своё время за 60 баксов только сам JTAG покупал. С его помощью, кстати, можно восстановить систему даже с убитым загрузчиком. В общем балуйся по самые не хочу. Программно систему убить невозможно.