#!/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.me/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.51"
  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 "download.php" -B 2 | 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 'download.php' -B 2 | 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 "$FORUM-$FORUMNAME"
while read line
do
  pushd "$FORUM-${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