#!/bin/sh [ "$#" -eq 0 ] && { echo "Usage: tpbs [options] Options: None Select from top 30 results on fzf -f Feeling lucky, retrives top first result -u Update TPB mirror by looking for a healthy mirror -n Number of pages to query, 30 results/page (e.g., -n 3 = 90 results, 3 pages) Categories: Only show results from selected categories None All categories -a Audio -v Video -p Applications/Programs -g Games -o Other "; exit 1; } filesave() { filepath="$tmpdir/$(echo "$l" | sed 's|.*/torrent/\([^/]*\).*|\1|')"; curl -sSL "$l" > "$filepath"; } numbers() { cat $tmpdir/$(echo $l | sed -n 's|.*/torrent/\([^/]*\).*|\1|p'); } basic() { title=$(numbers | grep title | sed 's:.*\(.*\).*:\1:p' | head -n 1 | sed 's/.........................$//' | sed -e 's/&/\&/g' -e 's/"/\"/g' -e 's/–/\-/g' -e 's/“/“/g' -e 's/”/”/g') date=$(numbers | grep GMT | sed 's/^................//' | sed 's/...................$//' | head -n 1) category=$(numbers | grep "More from this category" | sed -n 's:.*\">\(.*\).*:\1:p' | sed "s/>/>/g") out=$(numbers | grep -C 2 "By:" | grep "" | sed -n 's:.*\(.*\).*:\1:p' | head -n 1) uploader=$( [ -z "$out" ] && numbers | grep user | sed -n 's|.*/user/\([^/]*\)/.*|\1|p' | head -n 1 || echo "$out" ) size=$(numbers | grep -C 1 "Size" | grep nbsp | sed 's/^................//' | sed 's/ / /g' | sed 's/(.*//' | head -n 1) seeders=$(echo "Seeders:" $(numbers | grep -C 2 "Seeders" | grep "
" | sed -n 's:.*
\(.*\)
.*:\1:p' | head -n 1)) leechers=$(echo "Leechers:" $(numbers | grep -C 1 "Leechers" | grep "
" | sed -n 's:.*
\(.*\)
.*:\1:p' | head -n 1)) } mirror="https://tpb.party"; lucky=0; lastpage=1 [ -z "$1" ] && { echo "Error: No search query."; exit 1; } while getopts "favpgon:u" opt; do case $opt in f) lucky=1 ;; a) a=1 ;; v) v=1 ;; p) p=1 ;; g) g=1 ;; o) o=1 ;; n) lastpage="$OPTARG" ;; u) curl -s "$mirror/search/test/1/99/0" | grep -q "/torrent/" && echo "Current mirror '$mirror' already works" && exit 0; [ -w "$0" ] || { echo "Error: You cannot perform this operation unless you are root."; exit 1; } curl -sSL "https://piratebay-proxylist.com" | grep "td" | sed -n 's/.*href="\([^"]*\)".*/\1/p' | while read -r i; do curl -s "${i}/search/test/1/99/0" | grep -q "/torrent/" && echo "Mirror found: $i" && sed -i "s%mirror=\"[^\"]*\"%mirror=\"$i\"%g" "$0" && break done; exit 1 ;; esac done shift $((OPTIND-1)) [ "$a$v$p$g$o" ] || { a=1; v=1; p=1; g=1; o=1; } [ "$a" ] && cate=100 [ "$v" ] && cate=${cate:+$cate,}200 [ "$p" ] && cate=${cate:+$cate,}300 [ "$g" ] && cate=${cate:+$cate,}400 [ "$o" ] && cate=${cate:+$cate,}600 page=1 r=$(while curl -sSL "$mirror/search/$(printf '%s' "$*" | sed 's/ /%20/g')/$page/99/$cate" | grep "/torrent/" | sed -n 's/.*href="\([^"]*\)".*/\1/p' | sed -e "s/\[/%5D/g" -e "s/\]/%5B/g"; do page=$((page + 1)); [ $page -gt $lastpage ] && break; done) [ -n "$r" ] || { echo "No results for query or no internet connection."; exit 1; } tmpfile=$(mktemp -t tpbs.XXXXXXXXXXX) tmpdir=$(mktemp -d) trap "rm -rf \"$tmpdir\"" EXIT [ "$lucky" -eq 0 ] && { for l in $r; do ( filesave basic seeders_num=$(echo "$seeders" | tr -cd '0-9') [ -z "$seeders_num" ] && seeders_num=0 printf "%05d\t%-90s%-14s%-26s%-14s%-16s%-16s%-17s%s\n" \ "$seeders_num" "$title" "$date" "$category" "$size" "$seeders" "$leechers" "$uploader" "$l" >> "$tmpfile" ) & done wait l=$(sort -r -n "$tmpfile" | cut -f2- | fzf --exact --reverse --no-sort) rm -f "$tmpfile" [ -z "$l" ] && { echo "Error: No result selected."; exit 1; } true } || { l=$(echo $r | awk '{print $1}') filesave } basic filenumber=$(echo "Files: $(numbers | sed -n 's/.*return false[^>]*>\(.*\)<\/a>.*/\1/p')") spoken=$(numbers | grep "Spoken" > /dev/null 2>&1 && echo "Spoken language(s): $(numbers | grep -A5 "Spoken" | grep '
' | sed 's:.*
\(.*\)
.*:\1:p' | head -n 1)") texted=$(numbers | grep "Texted" > /dev/null 2>&1 && echo "Texted language(s): $(numbers | grep -A5 "Texted" | grep '
' | sed 's:.*
\(.*\)
.*:\1:p' | head -n 1)") description=$(numbers | sed -n '/
/,/<\/pre>/ { /
/d; /^<\/pre>$/d; s/<\/pre>//g; p }' | sed '1s/^.................//' | sed -e "s/'/'/g" -e "s/'/'/g" -e 's/&/\&/g' -e 's/"/\"/g' -e 's/>/>/g' | sed -zE 's/\n(http[^<]*<\/a>)([^<]*)/\1\2/g' | sed 's# \n]*href="([^"]+)"[^>]*>[^<]*#\1#g' | sed '/email-protection/ s##[FILENAME REDACTED BY TPB | flagged as email address due to '\''@'\'']#g') link=$(echo $l | awk '{print $NF}') filelist=$(numbers | sed -E 's/]*>/\n/g' | grep 'td align="left"' | sed -E 's/ / /g' | sed 's#.*##' | sed '/email-protection/ s##[FILENAME REDACTED BY TPB | flagged as email address due to '\''@'\'']#g' | awk -v w=$(tput cols) -F']*>' '{ s=$4; nw=w-length(s)-1; n=length($2)>nw ? substr($2,1,nw-3)"..." : $2; printf "%-*s %s\n", nw, n, s }') magnet=$(numbers | sed -n 's/.*href="\(magnet:[^"]*\)".*/\1/p' | head -n 1) [ -z "$spoken" ] && { printf "%-90s\n\t%-25s%-25s%-25s%-25s\n\t%-25s%-25s%-25s%-25s\n\n%s\n\n\t%s\n\n%s\n\n%s\n" "$title" "$seeders" "$size" "$uploader" "$filenumber" "$leechers" "$date" "$category" "$texted" "$description" "$link" "$filelist" "$magnet"; } [ -n "$spoken" ] && [ -z "$texted" ] && { printf "%-90s\n\t%-25s%-25s%-25s%25s\n\t%-25s%-25s%-25s%-25s\n\n%s\n\n\t%s\n\n%s\n\n%s\n" "$title" "$seeders" "$size" "$uploader" "$spoken" "$leechers" "$date" "$category" "$filenumber" "$description" "$link" "$filelist" "$magnet"; } [ -n "$spoken" ] && [ -n "$texted" ] && { printf "%-90s\n\t%-25s%-25s%-25s%-25s%25s\n\t%-25s%-25s%-25s%-25s\n\n%s\n\n\t%s\n\n%s\n\n%s\n" "$title" "$seeders" "$size" "$uploader" "$spoken" "$filenumber" "$leechers" "$date" "$category" "$texted" "$description" "$link" "$filelist" "$magnet"; } rm -rf "${TMPDIR:-/tmp}"/tpbs.*