#!/bin/sh echo " ------------------------ SHELL RSS TORRENT v2.5 Script by Rafostar ------------------------ " INDENT1=" " INDENT2=" " UPPER="ABCDEFGHIJKLMNOPQRSTUVWXYZ/ĄĆĘŁŃÓŚŹŻ" LOWER="abcdefghijklmnopqrstuvwxyz/ąćęłńóśźż" UA="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/72.0" parse_config() { WatchDir=$(echo "$ConfigData" | xmllint --xpath "string(//config/watchdir[1]/text())" - 2> /dev/null) if [ "$?" -ne 0 ] then echo "Error: invalid config file" exit 1 fi Downloader=$(xmllint_from_config "string(//config/downloader[1]/text())") if [ ! -z "$Downloader" ] then echo "Using tag command" DwnPrint=$(xmllint_from_config "count(//config/downloader[1][@print='1'])") if [ -z "$WatchDir" ] then echo "Downloading without tag" fi else if [ ! -z "$WatchDir" ] then echo "Torrents will be downloaded to: $WatchDir" else echo "Error: no in config file" exit 1 fi fi HistoryPath=$(xmllint_from_config "string(//config/history[1]/text())") if [ ! -z "$HistoryPath" ] then echo "Using download history file: $HistoryPath" if [ -f "$HistoryPath" ] then HistoryData=$(cat "$HistoryPath") fi fi TimeMax=$(xmllint_from_config "string(//config/time-max[1]/text())") if [ ! -z "$TimeMax" ] then echo "Downloading releases within seconds: $TimeMax" fi FeedsCount=$(xmllint_from_config "count(//config/feed)") echo "Total feeds in config: $FeedsCount" echo "" feed=1 while [ $feed -le $FeedsCount ] do FeedUrl=$(xmllint_from_config "string(//config/feed[$feed]/@url)") if [ -z "$FeedUrl" ] then echo "Error: feed $feed has no url" else FeedUser=$(xmllint_from_config "string(//config/feed[$feed]/@user)") if [ ! -z "$FeedUser" ] then FeedUser="--user=$FeedUser" fi FeedPass=$(xmllint_from_config "string(//config/feed[$feed]/@pass)") if [ ! -z "$FeedPass" ] then FeedPass="--password=$FeedPass" fi FeedData=$(wget "$FeedUser" "$FeedPass" -U "$UA" -O - "$FeedUrl" 2> /dev/null) if [ -z "$FeedData" ] then FeedData=$(wget "$FeedUser" "$FeedPass" -O - "$FeedUrl" 2> /dev/null) fi if [ -z "$FeedData" ] then echo "Error: feed $feed has no data" else echo "feed $feed: $FeedUrl" for QueryFn in "starts-with" "contains" do find_in_feed $feed done find_in_feed_multi $feed fi fi feed=$(( feed + 1 )) done } find_in_feed() { QueryPath="//config/feed[$1]/$QueryFn" QueryCount=$(xmllint_from_config "count($QueryPath)") if [ "$QueryCount" -ge 1 ] then query=1 while [ $query -le $QueryCount ] do find_attributes_matches $query TorrentCount=$(xmllint_from_feed "count($Matches/link)") echo "$INDENT1 $QueryFn $query: $QueryText, found: $TorrentCount" if [ "$TorrentCount" -ge 1 ] then get_torrents fi query=$(( query + 1 )) done fi } find_in_feed_multi() { MultiPath="//config/feed[$1]/multi" MultiCount=$(xmllint_from_config "count($MultiPath)") if [ "$MultiCount" -ge 1 ] then multi=1 while [ $multi -le $MultiCount ] do MultiText="" CustomFeed="" for QueryFn in "starts-with" "contains" do QueryPath="$MultiPath[$multi]/$QueryFn" QueryCount=$(xmllint_from_config "count($QueryPath)") if [ "$QueryCount" -ge 1 ] then query=1 while [ $query -le $QueryCount ] do find_attributes_matches "$query" CustomFeed=$(xmllint_from_feed "$Matches") if [ ! -z "$MultiText" ] then MultiText="$MultiText | $QueryText" else MultiText="$QueryText" fi if [ ! -z "$CustomFeed" ] then CustomFeed="$CustomFeed" else CustomFeed="" echo "$INDENT1 multi $multi: $MultiText, found: 0" break fi query=$(( query + 1 )) done fi done if [ ! -z "$CustomFeed" ] then get_torrents_multi $multi CustomFeed="" fi multi=$(( multi + 1 )) done fi } find_attributes_matches() { QueryText=$(xmllint_from_config "string($QueryPath[$1]/text())") IgnoreCase=$(xmllint_from_config "count($QueryPath[$1][@ignore-case='1'])") if [ "$IgnoreCase" -eq 1 ] then ParsedQuery=$(xmllint_from_config "translate($QueryPath[$query]/text(), '$UPPER', '$LOWER')") Matches="//item[title[$QueryFn(translate(., '$UPPER', '$LOWER'), '$ParsedQuery')]]" else Matches="//item[title[$QueryFn(., '$QueryText')]]" fi } find_torrent_attr() { ATTR=$(xmllint_from_feed "count($Matches[$torrent]/$1)") if [ "$ATTR" -eq 1 ] then ATTR_TORRENT=$(xmllint_from_feed "count($Matches[$torrent]/$1[@type='application/x-bittorrent'])") if [ "$ATTR_TORRENT" -eq 1 ] then ATTR_URL=$(xmllint_from_feed "string($Matches[$torrent]/$1/@url)") if [ ! -z "$ATTR_URL" ] then echo "$ATTR_URL" fi fi fi } get_torrents() { torrent=1 while [ $torrent -le $TorrentCount ] do TorrentLink=$(find_torrent_attr "enclosure") if [ -z "$TorrentLink" ] then TorrentLink=$(xmllint_from_feed "string($Matches[$torrent]/link/text())") fi if [ ! -z "$TorrentLink" ] then if [ ! -z "$HistoryData" ] then case "$HistoryData" in *"$TorrentLink"*) echo "$INDENT2 torrent $torrent in download history" ;; *) try_download ;; esac else try_download fi else echo "$INDENT2 torrent $torrent without a link" fi torrent=$(( torrent + 1 )) done } get_torrents_multi() { TorrentCount=$(xmllint_from_feed "count($Matches/link)") echo "$INDENT1 multi $1: $MultiText, found: $TorrentCount" if [ "$TorrentCount" -ge 1 ] then get_torrents fi } xmllint_from_config() { RESULT=$(echo "$ConfigData" | xmllint --xpath "$1" - 2> /dev/null) echo "$RESULT" } xmllint_from_feed() { if [ ! -z "$CustomFeed" ] then XmlData="$CustomFeed" else XmlData="$FeedData" fi RESULT=$(echo "$XmlData" | xmllint --format --xpath "$1" - 2> /dev/null) echo "$RESULT" } write_to_history() { if [ ! -z "$HistoryPath" ] then echo "$1" >> "$HistoryPath" fi HistoryData=$(echo -e "$HistoryData\n$1") } try_download() { if [ ! -z "$TimeMax" ] then check_date else download_torrent "$TorrentLink" fi } check_date() { DateCount=$(xmllint_from_feed "count($Matches[$torrent]/pubDate)") if [ "$DateCount" -ge 1 ] then PubDate=$(xmllint_from_feed "string($Matches[$torrent]/pubDate/text())") if [ ! -z "$PubDate" ] then TorrentEpoch=$(date -d "$PubDate" +%s) CurrentEpoch=$(date +%s) Elapsed=$((CurrentEpoch - TorrentEpoch)) if [ "$Elapsed" -le $TimeMax ] then download_torrent "$TorrentLink" else echo "$INDENT2 torrent $torrent is too old" fi fi else download_torrent "$TorrentLink" fi } download_torrent() { echo "$INDENT2 torrent $torrent: $1" if [ ! -z "$Downloader" ] then Title=$(xmllint_from_feed "string($Matches[$torrent]/title/text())") if [ "$DwnPrint" -eq 1 ] then eval "$Downloader "$1"" else eval "$Downloader "$1"" > /dev/null 2> /dev/null fi if [ $? -eq 0 ] then write_to_history "$1" else echo "$INDENT1 $INDENT2 download failed" fi else wget -q --content-disposition -U "$UA" -P "$WatchDir" "$1" 2> /dev/null if [ $? -ne 0 ] then wget -P "$WatchDir" "$1" > /dev/null 2> /dev/null if [ $? -eq 0 ] then write_to_history "$1" else echo "$INDENT1 $INDENT2 download failed" fi else write_to_history "$1" fi fi } ConfigPath=$1 if [ -z "$ConfigPath" ] then ME=$(basename "$0") echo "Usage: $ME " else if [ -f "$ConfigPath" ] then XmlInstalled=$(xmllint --version > /dev/null 2> /dev/null) if [ $? -eq 0 ] then ConfigData=$(cat "$ConfigPath") parse_config else echo "Error: xmllint is not installed" exit 1 fi else echo "Error: file $ConfigPath does not exist" exit 1 fi fi