1
uploader_tools/massdl.sh
2012-04-07 17:42:32 +04:00

197 lines
8.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# For NNM-Club Uploaders
# Copyright (c) 2012 Valdos Sine <fat0troll at yandex dot ru>
#
# Usage:
#
# ./massdl.sh [mode] [forum]
#
# For getting help, execute ./massdl.sh without params
UNIXTIME=`date +%s`
TMPDIR=`mktemp -d`
CURDIR=`pwd`
LOG_FILE="$UNIXTIME-massdl.log"
SUBFORUMSDL=0
wget_func () {
# Wget helper, which makes many wget usages more stable
# Usage wget_func [path_to_redirect] [anything (wget params, such as -O...)]
wget -t 99 --wait=1 --post-data="username=$USERNAME&password=$PASSWORD&autologin=on&login=%C2%F5%EE%E4&redirect=${1}" "http://nnm-club.ru/forum/login.php" ${2} -a $CURDIR/$LOG_FILE
if [[ $? -gt 0 ]] ; then
echo -ne "..ошибка загрузки, повтор.."
wget_func "${1}" "${2}"
fi
}
# Checking if we have parameter, otherwise show help in Russian
if [[ ${@} == "" ]] ; then
echo "massdl.sh — скрипт для пакетной загрузки торрент-файлов из разделов NNM-club.ru."
echo "Использование:"
echo -ne "\n\t./massdl.sh [режим] [номер_раздела]\n\n"
echo "где [режим] это режим загрузки (от имени пользователя, указанного в конфигурации скрипта — значение user, или же от имени фрилич-пользователя — значение freeleech), аомерорума] — номер раздела на NNM-club.ru (например, для форума '*Nix Игры' это 316)."
echo -ne "Примеры:\n\n\t./massdl.sh freeleech 316 — скачивание форума '*Nix Игры' от фрилич-пользователя\n\t./massdl.sh user 332 — скачивание форума 'Русский рок' от собственного, указанного в скрипте, имени\n\n"
echo "Автор: Valdos 'fat0troll' Sine."
echo "Основано на технологиях GNU."
echo "Версия 0.5"
exit 0
else
echo "Выполняется скрипт ${0}."
echo "Строка параметров работы: ${@}."
echo -ne "Проводим разбор строки..."
# Script configuration
case "x${1}" in
"xuser" )
# TYPE YOUR USERNAME AND PASSWORD HERE!
USERNAME=user
PASSWORD=password
echo -ne "пользователь $USERNAME"
;;
"xfreeleech" )
# Freeleech user credentials
USERNAME=freeleech_user
PASSWORD=freeleech_password
echo -ne "фрилич"
;;
* )
# ERROR!
echo -ne "ошибка, неправильный режим работы скрипта! Разрешённые режимы — freeleech или же user.\nЗавершение...\n"
exit 1
;;
esac
FORUM=${2}
echo -ne ", номер форума ${FORUM}.\n"
echo "Начинаем работу..."
fi
# Heading log file
cat > $LOG_FILE << EOF
================================================================================
= Скрипт скачки раздела NNM-Club для Linux и Unix-like ОС. =
= Построен на технологиях GNU. =
Дата запуска: `date`.
================================================================================
EOF
# Downloading main page of the selected forum
wget_func `echo 'viewforum.php?f='$FORUM` "-O $TMPDIR/page0.html"
FORUMNAME=`cat $TMPDIR/page0.html | iconv -f cp1251 -t utf-8 | grep maintitle | cut -d '>' -f 4 | cut -d '<' -f 1 | sed 's/\//_/g'`
echo "Скачиваем форум \"${FORUMNAME}\"..."
ITERATOR=0
THREADS=0
# Downloading all pages
while [ `cat $TMPDIR/page$ITERATOR.html | iconv -f cp1251 -t utf-8 | grep "След."| grep 'start' | wc -l` == "2" ]
do
iconv -f cp1251 -t utf-8 $TMPDIR/page$ITERATOR.html > $TMPDIR/page$ITERATOR.utf8.html
cat $TMPDIR/page$ITERATOR.utf8.html | grep "DL:" | grep topictitle | sed 's/.*<a href=\([^>]*\).*/\1/' | cut -d '"' -f 2 >> $TMPDIR/alllinkz.txt
THREADS=$(($THREADS + 50))
ITERATOR=$(($ITERATOR + 1))
START=$(($ITERATOR * 50))
echo "Скачиваем страницу $((${ITERATOR} + 1))..."
wget_func `echo 'viewforum.php?f='$FORUM'%26start='$START` "-O $TMPDIR/page$ITERATOR.html"
done
# Last loop ending :)
iconv -f cp1251 -t utf-8 $TMPDIR/page$ITERATOR.html > $TMPDIR/page$ITERATOR.utf8.html
cat $TMPDIR/page$ITERATOR.utf8.html | grep "DL:" | grep topictitle | sed 's/.*<a href=\([^>]*\).*/\1/' | cut -d '"' -f 2 >> $TMPDIR/alllinkz.txt
# Detecting subforums
cat $TMPDIR/page0.utf8.html | grep viewforum | grep forumlink | grep -v "images" | cut -d '"' -f 14 | cut -d '=' -f 2 >> $TMPDIR/subforumz.txt
if [[ `cat $TMPDIR/subforumz.txt | wc -l` -gt 0 ]] ; then
echo "Выявлены подфорумы!"
while read subline
do
echo "Добавляем в очередь закачки форум $subline..."
echo "${0} ${1} $subline" >> $TMPDIR/$UNIXTIME-subforumsdl.sh
done < $TMPDIR/subforumz.txt
chmod +x $TMPDIR/$UNIXTIME-subforumsdl.sh
SUBFORUMSDL=1
fi
# You can use it as statistic :)
THREADS=`cat $TMPDIR/alllinkz.txt | wc -l`
echo -ne "Выявлено $THREADS топиков, содержащих торренты! Скачиваем...\n"
# And this is what we need -- getting threads and torrents!
# Torrents will be saved in folders like 100, 200, 300... Every folder contains
# 100 torrents (except the last one).
THREAD=0
mkdir "$FORUMNAME"
while read line
do
pushd "${FORUMNAME}" >> /dev/null
mkdir "$(($THREAD / 100))" 2>> /dev/null
THREAD=$(($THREAD + 1))
echo -ne "Скачиваем торрент $THREAD/$THREADS."
# Temporary solution until will be finded way to use cookie.txt...
wget_func $line "-O $TMPDIR/out_$THREAD.html"
# :3
TOPICHDR=`cat $TMPDIR/out_$THREAD.html | grep maintitle | cut -d '>' -f 4 | cut -d '<' -f 1 | iconv -f cp1251 -t utf-8`
TOPICLNK=`cat $TMPDIR/out_$THREAD.html | grep maintitle | cut -d '"' -f 10`
echo -ne "."
wget_func `cat $TMPDIR/out_$THREAD.html | iconv -f cp1251 -t utf-8 | grep download.php | sed 's/.*<a href=\([^>]*\).*/\1/' | cut -d '"' -f 2 | tail -1 -` "-P "$(($THREAD / 100))/" --content-disposition"
# Check for bad wget saving...
if [[ -f login.php ]] ; then
echo -ne ".имя файла потеряно. используется сгенерированное скриптом.."
mv login.php "$(($THREAD / 100 ))"/$THREAD.torrent
# Check if file is real torrent. If not... get an error
if [[ `file "$(($THREAD / 100 ))"/$THREAD.torrent | grep BitTorrent` ]] ; then
echo -ne ".файл сохранён как $(($THREAD / 100 ))/$THREAD.torrent.."
else
echo -ne ".скачан не BitTorrent-файл! После завершения работы скрипта проверьте файл $UNIXTIME-error.log — там будет ссылка на нескачанный топик!\n"
echo -ne "Пишем информацию в лог-файл.."
echo "Топик $THREAD: ошибка скачивания $TOPICHDR [https://nnm-club.ru/forum/$TOPICLNK]" >> $CURDIR/$UNIXTIME-error.log
rm "$(($THREAD / 100 ))"/$THREAD.torrent
fi
fi
echo -ne "."
# Check sanity: torrents must equal threads. If not -- post a warning ;)
sanity_error () {
echo -ne ".кажется, топик не отдал нам файла. После завершения работы скрипта проверьте $UNIXTIME-error.log — там будет ссылка на проблемный топик!\n"
echo -ne "Пишем информацию в лог-файл.."
echo "Топик $THREAD: подозрительный $TOPICHDR [https://nnm-club.ru/forum/$TOPICLNK]" >> $CURDIR/$UNIXTIME-error.log
}
actualize_delta () {
# Actualizes delta between files count and expected count: when we switching
# folder delta should be nulled!
if [[ $(($THREAD / 100)) -gt $LAST_ERROR ]] ; then
ERROR_DELTA=0
else
if [[ x$ERROR_DELTA == "x" ]] ; then
ERROR_DELTA=0
fi
fi
}
add_delta () {
# Adding delta
LAST_ERROR=$(($THREAD / 100))
ERROR_DELTA=$(($ERROR_DELTA + 1))
}
actualize_delta
if [[ $(($THREAD / 100)) -eq '0' ]] ; then
if [[ `ls $(($THREAD / 100))/*.torrent | wc -l` -eq $(($THREAD - $(($THREAD / 100 * 100)) - $ERROR_DELTA)) ]] ; then
echo -ne ""
else
sanity_error
add_delta
fi
else
if [[ `ls $(($THREAD / 100))/*.torrent | wc -l` -eq $(($THREAD - $(($THREAD / 100 * 100)) + 1 - $ERROR_DELTA)) ]] ; then
echo -ne ""
else
sanity_error
add_delta
fi
fi
echo -ne ".\n"
popd >> /dev/null
done < $TMPDIR/alllinkz.txt
# Downloading subforums
if [[ "x$SUBFORUMSDL" == "x1" ]] ; then
$TMPDIR/$UNIXTIME-subforumsdl.sh
fi
# Cleaning up...
rm -r $TMPDIR