mad/hosts/kraken.sh
kittykat fa83163a58
# 2024.11.18 - [up_fileditch / fileditch] Add fileditch.com as upload and download host
# 2024.11.17 - [innocent] Fix "Fetching file info". Support resume downloads.
# 2024.11.16 - [mad] Fix reload on uploads.txt modified (uploads: filemode)
# 2024.11.16 - [up_*] Fix removal of upload ticket if filesize is not supported
# 2024.11.15 - [familleflender] Add famille-flender.fr as download host
# 2024.11.15 - [up_familleflender] Add famille-flender.fr as upload host
# 2024.11.15 - [up_filehaus] Finish the uploader (the server is back online)
2024-11-18 14:48:48 +00:00

378 lines
17 KiB
Bash
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.

#! Name: kraken.sh
#! Author: kittykat
#! Version: 2024.09.22
#! Desc: Add support for downloading and processing of urls for a new host
#! Usage: Copy this file into the ./${ScriptDir}/hosts/ folder
#!
#!
#! ------------ REQUIRED SECTION ---------------
#! @[UPDATE] HostAndDomainRegexes: This string is loaded into mad.sh and allows dynamic handling of new url data
#! Format: '/HostCode/HostNick/HostFuncPrefix:HostDomainRegex@'
#! HostCode: <aUniqueCodeForHost> (ie. 'fh' for filehaus -- cannot be used by other hosts)
#! HostNick: What is displayed throughout MAD output (ie. 'filehaus' -- "urls.txt has 10 filehaus.." will be displayed)
#! HostFuncPrefix: <aUniqueStringThatMustPrefixHostFunctions> (ie. 'fh' -- fh_DownloadFile(), fh_FetchFileInfo() .. )
#! * Note: Must begin with a letter a-z (functions beginning with numbers are no bueno)
#! HostDomainRegex: The regex used to verify matching urls
HostCode='kraken'
HostNick='kraken'
HostFuncPrefix='kraken'
HostUrls='krakenfiles.com'
HostDomainRegex='^(http|https)://(.*\.)?krakenfiles\.com'
#!
#! !! DO NOT UPDATE OR REMOVE !!
#! This merges the Required HostAndDomainRegexes into mad.sh
ListHostAndDomainRegexes=${ListHostAndDomainRegexes}'/'${HostCode}'/'${HostNick}'/'${HostFuncPrefix}'/'${HostUrls}':'${HostDomainRegex}'@'
#!
#!
#! ------------ (1) Host Main Download Function --------------- #
#!
#! @REQUIRED: Host Main Download function
#! Must be named specifically as such:
#! <HostFuncPrefix>_DownloadFile()
kraken_DownloadFile() {
local remote_url=${1}
local file_url=${1}
local filecnt=${2}
warnAndRetryUnknownError=false
exitDownloadError=false
exitDownloadNotAvailable=false
fileAlreadyDone=false
download_inflight_path="${WorkDir}/.inflight/"
mkdir -p "$download_inflight_path"
completed_location="${WorkDir}/downloads/"
tor_identity="${RANDOM}"
finalAttempt="false"
for ((z=0; z<=$MaxUrlRetries; z++)); do
if [ $z -eq $MaxUrlRetries ] ; then
finalAttempt="true"
fi
CLEANSTRING=${remote_url//[^a-zA-Z0-9]/}
trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; echo ""; tput cnorm; exit" 0 1 2 3 6 15
if kraken_FetchFileInfo "" $((i+1)) $finalAttempt && kraken_GetFile "${filecnt}" $((z+1)) $finalAttempt ; then
return 0
elif [ $z -lt $MaxUrlRetries ]; then
if [ "${fileAlreadyDone}" == "true" ] ; then
break
fi
if [[ "${warnAndRetryUnknownError}" == "true" ]] ; then
if [ "${DebugAllEnabled}" == "true" ] ; then
debugHtml "${remote_url##*/}" "error" "Retry due to an unknown issue: attempt #$((z+1)) of ${MaxUrlRetries}"
fi
fi
if [[ "${exitDownloadError}" == "true" || "${exitDownloadNotAvailable}" == "true" ]] ; then
if [ "${DebugAllEnabled}" == "true" ] ; then
debugHtml "${remote_url##*/}" "error" "Exit due to unrecoverable issue"
fi
rm -f "${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/}"
break
fi
echo -e "\n${YELLOW}A recoverable error occurred, retry attempt $((z+1))/${MaxUrlRetries}${NC}"
sleep 3
fi
done
rm -f "${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/}"
}
#!
#! ------------- (2) Fetch File Info Function ----------------- #
#!
kraken_FetchFileInfo() {
fileCnt=$1
retryCnt=$2
finalAttempt=$3
if grep -Eqi 'krakenfiles.com/download/' <<< "${remote_url}" ; then
fixed_url=${remote_url/krakenfiles.com\/download\//krakenfiles.com\/view\/}
else
fixed_url=${remote_url}
fi
if ! grep -Eqi '/file.html' <<< "${fixed_url}" ; then
fixed_url=${fixed_url}'/file.html'
fi
krak_id=${fixed_url%%\/file.htm*}
krak_id=${krak_id##*\/}
krak_id=${krak_id//[^a-zA-Z0-9]/}
echo -e "${GREEN}# Fetching file info…${NC}"
local num_attempt=$1
mkdir -p "${WorkDir}/.temp"
local max_attempts=${CircuitRetries}
local iter=0 instance_no="$fileCnt" time_out=5 instances="$2" kraken_cookie_jar="" tor_identity="" PAGE="" kraken_token="" kraken_action=""
mkdir -p "${WorkDir}/.temp"
for ((i=1; i<=5; i++)); do
printf " ."
kraken_cookie_jar=$(mktemp "${WorkDir}/.temp/kraken_cookies""${instance_no}"".XXXXXX")
tor_identity="${RANDOM}"
trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f ${kraken_cookie_jar}; echo ""; tput cnorm; exit" 0 1 2 3 6 15
PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -s -L -c "${kraken_cookie_jar}" "${fixed_url}")
if [ "${DebugAllEnabled}" == "true" ] ; then
debugHtml "${krak_id}" "kraken_token${num_attempt}_$i" "url: ${fixed_url}"$'\n'"krakenid: ${krak_id}"$'\n'"${PAGE}"
fi
if grep -Eqi 'sendFormCaptcha()' <<< "${PAGE}"; then
rm -f "$kraken_cookie_jar";
printf "\n"
echo -e "${RED}| Captcha required (Recaptcha)${NC}"
exitDownloadError=true
failedRetryDownload "${remote_url}" "Captcha required (Recaptcha)" ""
return 1
fi
if ! grep -Eqi 'name="token" value="' <<< "${PAGE}"; then
if grep -Eqi 'a page that either has been deleted or never existed' <<< "${PAGE}"; then
rm -f "$kraken_cookie_jar";
printf "\n"
echo -e "${RED}| The file has been deleted or does not exist.${NC}"
exitDownloadError=true
removedDownload "${remote_url}"
return 1
fi
if grep -Eqi 'class="alert-danger"' <<< "${PAGE}"; then
rm -f "$kraken_cookie_jar";
req_msg=$(grep -oP '(?<=class="alert-danger").*(?=</span>)' <<< "$PAGE")
req_msg=$(grep -oP '">\K[^>]+' <<< "$req_msg")
printf "\n"
echo -e "${RED}| ${req_msg}.${NC}"
exitDownloadError=true
failedRetryDownload "${remote_url}" "$req_msg" ""
return 1
fi
if grep -Eqi '521: Web server is down' <<< "${PAGE}"; then
rm -f "$kraken_cookie_jar";
printf "\n"
echo -e "${RED}| 521: Web server is down. Try again later${NC}"
exitDownloadError=true
failedRetryDownload "${remote_url}" "521: Web server is down. Try again later" ""
return 1
fi
if grep -Eqi 'Oops! Why youre here?' <<< "${PAGE}"; then
rm -f "$kraken_cookie_jar";
req_msg=$(grep -oP '(?<=nk-error-text">).*(?=</)' <<< "$PAGE")
printf "\n"
echo -e "${RED}| ${req_msg}.${NC}"
exitDownloadError=true
failedRetryDownload "${remote_url}" "$req_msg" ""
return 1
fi
else
kraken_token=$(grep -oP 'name="token" value="\K[^"]+' <<< "${PAGE}")
kraken_action=$(grep -oP 'form action="\K[^"]+' <<< "${PAGE}")
kraken_action="https://krakenfiles.com/download/${kraken_action##*/}"
if [[ $kraken_token ]]; then
if [[ -s kraken_token ]] || [[ -s kraken_action ]] ; then
continue
fi
printf "\n"
echo -e "${GREEN}| Kraken token found.${NC}"
break
fi
fi
done
echo -e "\n# Attempting to get download url"
CLEANSTRING=${remote_url//[^a-zA-Z0-9]/}
trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f ${kraken_cookie_jar}; echo ""; tput cnorm; exit" 0 1 2 3 6 15
down_request=$(tor_curl_request --insecure -L -s -b "${kraken_cookie_jar}" -c "${kraken_cookie_jar}" -F "token=${kraken_token}" "${kraken_action}")
if [ "${DebugAllEnabled}" == "true" ] ; then
debugHtml "${krak_id}" "kraken_url${num_attempt}_1" "action: ${kraken_action}, token: ${kraken_token}"$'\n'"${down_request}"
fi
if ! grep -Eqi '"status":"ok"' <<< "${down_request}"; then
echo -e "${RED}| Failed to get download url${NC}"
rm -f "$kraken_cookie_jar";
return 1
else
kraken_url=$(grep -oP '"url":"\K[^"]+' <<< "${down_request}")
download_url=${kraken_url//\\/}
download_url=${download_url//\/\//\/}
download_url=$(urlencode_literal_grouped_case_urlendingonly "$download_url")
echo -e "${GREEN}| Download url found.${NC}"
fi
CLEANSTRING=${remote_url//[^a-zA-Z0-9]/}
trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f ${kraken_cookie_jar}; echo ""; tput cnorm; exit" 0 1 2 3 6 15
file_header=$(tor_curl_request --insecure --head -L -s -b "${kraken_cookie_jar}" -c "${kraken_cookie_jar}" --referer "$kraken_action" "$download_url")
if [ "${DebugAllEnabled}" == "true" ] ; then
debugHtml "${krak_id}" "kraken_head$j" "download_url: ${download_url}"$'\n'"${file_header}"
fi
rm -f "$kraken_cookie_jar";
if [ ! -z "$file_header" ] ; then
if grep -Eqi '404 Not Found' <<< "${file_header}" ; then
echo -e "${RED}| The file has been removed (404).${NC}"
removedDownload "${remote_url}"
exitDownloadNotAvailable=true
return 1
fi
if grep -Eqi 'HTTP/2 522|HTTP/1.1 522' <<< $file_header ; then
echo -e "${RED}| The server returned an error (522).${NC} Try again later.${NC}"
failedRetryDownload "${remote_url}" "522: The requested resource could not be loaded because the server returned an error. Try again later." ""
exitDownloadNotAvailable=true
return 1
fi
if ! grep -Eqi 'HTTP/2 200|HTTP/1.1 200|200 OK' <<< $file_header ; then
echo -e "${RED}| Bad http response.${NC}"
if [ "${finalAttempt}" == "true" ] ; then
failedRetryDownload "${remote_url}" "" ""
fi
return 1
fi
if [ "$filename_override" == "" ] ; then
if grep -Eqi 'filename=' <<< "${file_header}" ; then
filename=$(grep -oP 'filename=\K.*$' <<< "${file_header}")
filename=${filename##filename}
filename=${filename//\"/}
filename=${filename//[$'\t\r\n']}
else
echo -e "${RED}| Failed to extract file name.${NC}"
if [ "${finalAttempt}" == "true" ] ; then
failedRetryDownload "${remote_url}" "" ""
fi
return 1
fi
fi
if ! grep -Eqi 'Content-Length' <<< "${file_header}" ; then
echo -e "${RED}| Failed to extract file size.${NC}"
if [ "${finalAttempt}" == "true" ] ; then
failedRetryDownload "${remote_url}" "" ""
fi
return 1
fi
else
echo -e "${RED}| No response. Try again later.${NC}"
if [ "${finalAttempt}" == "true" ] ; then
failedRetryDownload "${remote_url}" "" ""
fi
return 1
fi
touch ${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/}
if [ ! "$filename_override" == "" ] ; then
filename="$filename_override"
fi
filename=$(sanitize_file_or_folder_name "${filename}")
file_size_bytes=$(grep -oPi '(?<=content-length: ).*' <<< "$file_header")
file_size_bytes=${file_size_bytes//[$'\t\r\n']}
if [ -z $file_size_bytes ] ; then
if [ "${finalAttempt}" == "true" ] ; then
failedRetryDownload "${remote_url}" "Filesize not found!" ""
fi
echo -e "${YELLOW}| Filesize not found… retry${NC}"
return 1
else
file_size_readable="$(numfmt --to=iec --from=auto --format "%.2f" <<< "$file_size_bytes")"
fi
echo -e "${YELLOW}| File size:${NC}\t${file_size_readable}"
file_path="${download_inflight_path}${filename}"
echo -e "${YELLOW}| File name:${NC}\t\"${filename}\""
flockDownload="${WorkDir}/.flocks/${filename//[^a-zA-Z0-9\.\_\-]/}.flock"
if CheckFileSize "${remote_url}" "${file_size_bytes}" ; then
return 1
fi
if CheckDownloadExists "$remote_url" "$MoveToFolder" "$filecnt" "$filename" "$file_path" "$completed_location" ; then
return 1
fi
echo "${remote_url//[^a-zA-Z0-9]/}" > $flockDownload
}
#!
#! ----------- (3) Fetch File / Download File Function --------------- #
#!
kraken_GetFile() {
echo -e "${GREEN}# Downloading…"
echo -e "${YELLOW}| File path:${NC}\t./.inflight/${filename}\n"
fileCnt=$1
retryCnt=$2
finalAttempt=$3
flockDownload="${WorkDir}/.flocks/${filename//[^a-zA-Z0-9\.\_\-]/}.flock"
for ((j=1; j<=$MaxDownloadRetries; j++)); do
pd_presize=0
if [ -f "$file_path" ] ; then
pd_presize=$(stat --format="%s" "$file_path" | tr -d '[:space:]')
fi
GetRandomUA
CLEANSTRING=${remote_url//[^a-zA-Z0-9]/}
trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f $flockDownload; echo ""; tput cnorm; exit" 0 1 2 3 6 15
if [ "${RateMonitorEnabled}" == "true" ] && [ ! -f "$file_path" ]; then
tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval --referer "$kraken_action" "$download_url" --continue-at - --output "$file_path"
else
tor_curl_request --insecure --referer "$kraken_action" "$download_url" --continue-at - --output "$file_path"
fi
received_file_size=0
if [ -f "$file_path" ] ; then
received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]')
fi
if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then
containsHtml=false
else
containsHtml=true
fi
downDelta=$(( received_file_size - pd_presize ))
if [[ "${received_file_size}" -ne "${file_size_bytes}" ]] || [ "$containsHtml" == "true" ]; then
if [ "${AutoRepairBadPartials}" == "true" ] && (( downDelta > 0 && downDelta < 1024 )) ; then
if [ -f "${file_path}" ] ; then
if ((pd_presize > 0)); then
echo -e "${YELLOW}Bad node / HTML found:${NC} reverting to previous file..."
truncateDownload "$remote_url" "$filename" "$pd_presize" "$received_file_size"
truncate -s $pd_presize "${file_path}"
else
echo -e "${YELLOW}Bad node / HTML found:${NC} tainted partial removed..."
rm -f "${file_path}"
fi
fi
if ((j >= $MaxDownloadRetries)) ; then
rm -f "$flockDownload";
if [ "${finalAttempt}" == "true" ] ; then
droppedSizeBadDownload "${remote_url}" "${filename}" "${received_file_size}"
fi
return 1
else
continue
fi
elif [ "${AutoRepairBadPartials}" == "true" ] && [ "$containsHtml" == "true" ] ; then
if [ -f "${file_path}" ] ; then
if ((pd_presize > 0)); then
echo -e "${YELLOW}Bad node / HTML found:${NC} reverting to previous file..."
truncateDownload "$remote_url" "$filename" "$pd_presize" "$received_file_size"
truncate -s $pd_presize "${file_path}"
else
echo -e "${YELLOW}Bad node / HTML found:${NC} tainted partial removed..."
rm -f "${file_path}"
fi
fi
if ((j >= $MaxDownloadRetries)) ; then
rm -f "$flockDownload";
if [ "${finalAttempt}" == "true" ] ; then
droppedSizeBadDownload "${remote_url}" "${filename}" "${received_file_size}"
fi
return 1
else
continue
fi
elif (( downDelta > 0 && downDelta < 1024 )) || [ "$containsHtml" == "true" ] ; then
if [ -f "$file_path" ] ; then
rm -rf "$file_path"
fi
echo -e "\n${YELLOW}Bad node / HTML found:${NC} tainted partial removed..."
if ((j >= $MaxDownloadRetries)) ; then
rm -f "$flockDownload";
if [ "${finalAttempt}" == "true" ] ; then
droppedSizeBadDownload "${remote_url}" "${filename}" "${received_file_size}"
fi
return 1
else
continue
fi
fi
if [[ "${received_file_size}" -ne "${file_size_bytes}" ]]; then
echo -e "\n${RED}Download failed, file is incomplete.${NC}"
if ((j >= $MaxDownloadRetries)) ; then
rm -f "$flockDownload";
if [ "${finalAttempt}" == "true" ] ; then
droppedSizeBadDownload "${remote_url}" "${filename}" "${received_file_size}"
fi
return 1
else
continue
fi
fi
else
break
fi
done
rm -f "$flockDownload";
ProcessCompletedDownload "$remote_url" "$MoveToFolder" "$filecnt" "$filename" "$file_size_bytes" "$completed_location" "$file_path"
return 0
}
#!
#! --------------- Host Extra Functions ------------------- #
#!