From 808d64768bc3bd0c66afa95144b763ef6326e6bc Mon Sep 17 00:00:00 2001 From: kittykat Date: Fri, 8 Nov 2024 09:32:54 +0000 Subject: [PATCH] v2024.11.06 --- .audit/mad-audit-curl.log | 457 ++ .audit/mad-audit-http.log | 366 ++ .audit/mad-audit-tor_curl-details.log | 2608 ++++++++++ _audit.sh | 45 + documentation/!CMD arguments.txt | 54 + documentation/!Changelog (Historical).txt | 480 ++ ...ME-mad-v2024.09.24-migration-checklist.txt | 51 + documentation/!README.txt | 157 + .../ScriptDir+WorkDir.jpg | Bin 0 -> 49921 bytes .../ScriptDir.jpg | Bin 0 -> 24595 bytes .../WorkingDir.jpg | Bin 0 -> 34095 bytes documentation/README-upload_hosts.txt | 66 + hosts/1fichier.sh | 377 ++ hosts/9saves.sh | 427 ++ hosts/acid.sh | 31 + hosts/anarchaserver.sh | 31 + hosts/anonsharing.sh | 315 ++ hosts/archived/nekofile.sh | 32 + hosts/bedrive.sh | 406 ++ hosts/biteblob.sh | 364 ++ hosts/bowfile.sh | 435 ++ hosts/click.sh | 675 +++ hosts/dailyuploads.sh | 634 +++ hosts/dataupload.sh | 487 ++ hosts/dbree.sh | 32 + hosts/depotkaz.sh | 31 + hosts/discreetshare.sh | 31 + hosts/dosya.sh | 525 ++ hosts/downloadgg.sh | 403 ++ hosts/eternalhosting.sh | 31 + hosts/examples/ExampleNewHost.sh | 291 ++ hosts/examples/up_example.sh | 130 + hosts/filedoge.sh | 31 + hosts/filedot.sh | 592 +++ hosts/filehaus.sh | 289 ++ hosts/filesquid.sh | 31 + hosts/firestorage.sh | 427 ++ hosts/free4e.sh | 31 + hosts/gofile.sh | 476 ++ hosts/harrault.sh | 31 + hosts/hexload.sh | 413 ++ hosts/innocent.sh | 246 + hosts/kraken.sh | 378 ++ hosts/lainsafe.sh | 31 + hosts/lainsafe_onion.sh | 38 + hosts/linxx.sh | 31 + hosts/nantes.sh | 31 + hosts/netlib.sh | 31 + hosts/nippy.sh | 395 ++ hosts/nofile.sh | 32 + hosts/offshorecat.sh | 27 + hosts/oshi.sh | 287 ++ hosts/pixeldrain.sh | 439 ++ hosts/ranoz.sh | 383 ++ hosts/shareonline.sh | 32 + hosts/soyjak.sh | 31 + hosts/tempfileme.sh | 422 ++ hosts/tempsh.sh | 352 ++ hosts/turboonion.sh | 31 + hosts/up2share.sh | 453 ++ hosts/up_1fichier.sh | 218 + hosts/up_acid.sh | 127 + hosts/up_anarchaserver.sh | 135 + hosts/up_anonsharing.sh | 133 + hosts/up_axfc.sh | 218 + hosts/up_bedrive.sh | 134 + hosts/up_bowfile.sh | 140 + hosts/up_dailyuploads.sh | 147 + hosts/up_dataupload.sh | 140 + hosts/up_dbree.sh | 135 + hosts/up_depotkaz.sh | 135 + hosts/up_dosya.sh | 139 + hosts/up_filehaus.sh | 139 + hosts/up_filesquid.sh | 135 + hosts/up_firestorage.sh | 147 + hosts/up_free4e.sh | 127 + hosts/up_gofile.sh | 161 + hosts/up_harrault.sh | 127 + hosts/up_hexload.sh | 148 + hosts/up_innocent.sh | 133 + hosts/up_kouploader.sh | 171 + hosts/up_kraken.sh | 147 + hosts/up_linxx.sh | 135 + hosts/up_nantes.sh | 135 + hosts/up_netlib.sh | 135 + hosts/up_nippy.sh | 158 + hosts/up_nofile.sh | 135 + hosts/up_oshi.sh | 145 + hosts/up_ranoz.sh | 160 + hosts/up_shareonline.sh | 135 + hosts/up_soyjak.sh | 135 + hosts/up_tempfileme.sh | 133 + hosts/up_tempsh.sh | 134 + hosts/up_turboonion.sh | 139 + hosts/up_uploadev.sh | 140 + hosts/up_uploadflix.sh | 146 + hosts/up_uploadhive.sh | 142 + hosts/up_uploadraja.sh | 140 + hosts/up_yolobit.sh | 135 + hosts/uploadee.sh | 389 ++ hosts/uploadev.sh | 501 ++ hosts/uploadflix.sh | 378 ++ hosts/uploadhive.sh | 361 ++ hosts/yolobit.sh | 32 + hosts/youdbox.sh | 368 ++ mad.sh | 4394 +++++++++++++++++ optional/mad.config | 113 + plugins/!README-plugins.txt | 84 + plugins/AutoResetAndRetryDownloads.sh | 93 + plugins/CatnapCtrlC.sh | 57 + plugins/SkipUrlsInDownloadsCompletedTxt.sh | 90 + ...leAddNewFuncAndCallOnSuccessfulDownload.sh | 67 + plugins/examples/ExamplesMainHooks.sh | 163 + .../HowTo - tesseract traineddata.txt | 7 + plugins/ocr_captcha.sh | 127 + plugins/pjscloud.sh | 74 + uploads.txt | 35 + urls.txt | 44 + 118 files changed, 28958 insertions(+) create mode 100755 .audit/mad-audit-curl.log create mode 100755 .audit/mad-audit-http.log create mode 100755 .audit/mad-audit-tor_curl-details.log create mode 100755 _audit.sh create mode 100755 documentation/!CMD arguments.txt create mode 100755 documentation/!Changelog (Historical).txt create mode 100755 documentation/!README-mad-v2024.09.24-migration-checklist.txt create mode 100755 documentation/!README.txt create mode 100755 documentation/FolderStructure-Default (AIO)/ScriptDir+WorkDir.jpg create mode 100755 documentation/FolderStructure-WorkDirOverride/ScriptDir.jpg create mode 100755 documentation/FolderStructure-WorkDirOverride/WorkingDir.jpg create mode 100755 documentation/README-upload_hosts.txt create mode 100755 hosts/1fichier.sh create mode 100755 hosts/9saves.sh create mode 100755 hosts/acid.sh create mode 100755 hosts/anarchaserver.sh create mode 100755 hosts/anonsharing.sh create mode 100755 hosts/archived/nekofile.sh create mode 100755 hosts/bedrive.sh create mode 100755 hosts/biteblob.sh create mode 100755 hosts/bowfile.sh create mode 100755 hosts/click.sh create mode 100755 hosts/dailyuploads.sh create mode 100755 hosts/dataupload.sh create mode 100755 hosts/dbree.sh create mode 100755 hosts/depotkaz.sh create mode 100755 hosts/discreetshare.sh create mode 100755 hosts/dosya.sh create mode 100755 hosts/downloadgg.sh create mode 100755 hosts/eternalhosting.sh create mode 100755 hosts/examples/ExampleNewHost.sh create mode 100755 hosts/examples/up_example.sh create mode 100755 hosts/filedoge.sh create mode 100755 hosts/filedot.sh create mode 100755 hosts/filehaus.sh create mode 100755 hosts/filesquid.sh create mode 100755 hosts/firestorage.sh create mode 100755 hosts/free4e.sh create mode 100755 hosts/gofile.sh create mode 100755 hosts/harrault.sh create mode 100755 hosts/hexload.sh create mode 100755 hosts/innocent.sh create mode 100755 hosts/kraken.sh create mode 100755 hosts/lainsafe.sh create mode 100755 hosts/lainsafe_onion.sh create mode 100755 hosts/linxx.sh create mode 100755 hosts/nantes.sh create mode 100755 hosts/netlib.sh create mode 100755 hosts/nippy.sh create mode 100755 hosts/nofile.sh create mode 100755 hosts/offshorecat.sh create mode 100755 hosts/oshi.sh create mode 100755 hosts/pixeldrain.sh create mode 100755 hosts/ranoz.sh create mode 100755 hosts/shareonline.sh create mode 100755 hosts/soyjak.sh create mode 100755 hosts/tempfileme.sh create mode 100755 hosts/tempsh.sh create mode 100755 hosts/turboonion.sh create mode 100755 hosts/up2share.sh create mode 100755 hosts/up_1fichier.sh create mode 100755 hosts/up_acid.sh create mode 100755 hosts/up_anarchaserver.sh create mode 100755 hosts/up_anonsharing.sh create mode 100755 hosts/up_axfc.sh create mode 100755 hosts/up_bedrive.sh create mode 100755 hosts/up_bowfile.sh create mode 100755 hosts/up_dailyuploads.sh create mode 100755 hosts/up_dataupload.sh create mode 100755 hosts/up_dbree.sh create mode 100755 hosts/up_depotkaz.sh create mode 100755 hosts/up_dosya.sh create mode 100755 hosts/up_filehaus.sh create mode 100755 hosts/up_filesquid.sh create mode 100755 hosts/up_firestorage.sh create mode 100755 hosts/up_free4e.sh create mode 100755 hosts/up_gofile.sh create mode 100755 hosts/up_harrault.sh create mode 100755 hosts/up_hexload.sh create mode 100755 hosts/up_innocent.sh create mode 100755 hosts/up_kouploader.sh create mode 100755 hosts/up_kraken.sh create mode 100755 hosts/up_linxx.sh create mode 100755 hosts/up_nantes.sh create mode 100755 hosts/up_netlib.sh create mode 100755 hosts/up_nippy.sh create mode 100755 hosts/up_nofile.sh create mode 100755 hosts/up_oshi.sh create mode 100755 hosts/up_ranoz.sh create mode 100755 hosts/up_shareonline.sh create mode 100755 hosts/up_soyjak.sh create mode 100755 hosts/up_tempfileme.sh create mode 100755 hosts/up_tempsh.sh create mode 100755 hosts/up_turboonion.sh create mode 100755 hosts/up_uploadev.sh create mode 100755 hosts/up_uploadflix.sh create mode 100755 hosts/up_uploadhive.sh create mode 100755 hosts/up_uploadraja.sh create mode 100755 hosts/up_yolobit.sh create mode 100755 hosts/uploadee.sh create mode 100755 hosts/uploadev.sh create mode 100755 hosts/uploadflix.sh create mode 100755 hosts/uploadhive.sh create mode 100755 hosts/yolobit.sh create mode 100755 hosts/youdbox.sh create mode 100755 mad.sh create mode 100755 optional/mad.config create mode 100755 plugins/!README-plugins.txt create mode 100755 plugins/AutoResetAndRetryDownloads.sh create mode 100755 plugins/CatnapCtrlC.sh create mode 100755 plugins/SkipUrlsInDownloadsCompletedTxt.sh create mode 100755 plugins/examples/ExampleAddNewFuncAndCallOnSuccessfulDownload.sh create mode 100755 plugins/examples/ExamplesMainHooks.sh create mode 100755 plugins/ocr/tessdata/HowTo - tesseract traineddata.txt create mode 100755 plugins/ocr_captcha.sh create mode 100755 plugins/pjscloud.sh create mode 100755 uploads.txt create mode 100755 urls.txt diff --git a/.audit/mad-audit-curl.log b/.audit/mad-audit-curl.log new file mode 100755 index 0000000..ca86b40 --- /dev/null +++ b/.audit/mad-audit-curl.log @@ -0,0 +1,457 @@ +DateTime: 24.11.07 + +Files: +./hosts/1fichier.sh +./hosts/9saves.sh +./hosts/acid.sh +./hosts/anarchaserver.sh +./hosts/anonsharing.sh +./hosts/archived/nekofile.sh +./hosts/bedrive.sh +./hosts/biteblob.sh +./hosts/bowfile.sh +./hosts/click.sh +./hosts/dailyuploads.sh +./hosts/dataupload.sh +./hosts/dbree.sh +./hosts/depotkaz.sh +./hosts/discreetshare.sh +./hosts/dosya.sh +./hosts/downloadgg.sh +./hosts/eternalhosting.sh +./hosts/examples/ExampleNewHost.sh +./hosts/examples/up_example.sh +./hosts/filedoge.sh +./hosts/filedot.sh +./hosts/filehaus.sh +./hosts/filesquid.sh +./hosts/firestorage.sh +./hosts/free4e.sh +./hosts/gofile.sh +./hosts/harrault.sh +./hosts/hexload.sh +./hosts/innocent.sh +./hosts/kraken.sh +./hosts/lainsafe.sh +./hosts/lainsafe_onion.sh +./hosts/linxx.sh +./hosts/nantes.sh +./hosts/netlib.sh +./hosts/nippy.sh +./hosts/nofile.sh +./hosts/offshorecat.sh +./hosts/oshi.sh +./hosts/pixeldrain.sh +./hosts/ranoz.sh +./hosts/shareonline.sh +./hosts/soyjak.sh +./hosts/tempfileme.sh +./hosts/tempsh.sh +./hosts/turboonion.sh +./hosts/up2share.sh +./hosts/uploadee.sh +./hosts/uploadev.sh +./hosts/uploadflix.sh +./hosts/uploadhive.sh +./hosts/up_1fichier.sh +./hosts/up_acid.sh +./hosts/up_anarchaserver.sh +./hosts/up_anonsharing.sh +./hosts/up_axfc.sh +./hosts/up_bedrive.sh +./hosts/up_bowfile.sh +./hosts/up_dailyuploads.sh +./hosts/up_dataupload.sh +./hosts/up_dbree.sh +./hosts/up_depotkaz.sh +./hosts/up_dosya.sh +./hosts/up_filehaus.sh +./hosts/up_filesquid.sh +./hosts/up_firestorage.sh +./hosts/up_free4e.sh +./hosts/up_gofile.sh +./hosts/up_harrault.sh +./hosts/up_hexload.sh +./hosts/up_innocent.sh +./hosts/up_kouploader.sh +./hosts/up_kraken.sh +./hosts/up_linxx.sh +./hosts/up_nantes.sh +./hosts/up_netlib.sh +./hosts/up_nippy.sh +./hosts/up_nofile.sh +./hosts/up_oshi.sh +./hosts/up_ranoz.sh +./hosts/up_shareonline.sh +./hosts/up_soyjak.sh +./hosts/up_tempfileme.sh +./hosts/up_tempsh.sh +./hosts/up_turboonion.sh +./hosts/up_uploadev.sh +./hosts/up_uploadflix.sh +./hosts/up_uploadhive.sh +./hosts/up_uploadraja.sh +./hosts/up_yolobit.sh +./hosts/yolobit.sh +./hosts/youdbox.sh +./mad.sh +./plugins/AutoResetAndRetryDownloads.sh +./plugins/CatnapCtrlC.sh +./plugins/SkipUrlsInDownloadsCompletedTxt.sh +./plugins/examples/ExampleAddNewFuncAndCallOnSuccessfulDownload.sh +./plugins/examples/ExamplesMainHooks.sh +./plugins/ocr_captcha.sh +./plugins/pjscloud.sh + + +MAD Audit of curl: (grep "curl") +_________________________________________________________________________ +./hosts/1fichier.sh:48: PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -s "${remote_url}") +./hosts/1fichier.sh:155: cdn_request=$(tor_curl_request --insecure -s -L -b "${fich_cookie_jar}" -c "${fich_cookie_jar}" -F "submit=Download" -F "pass=${fich_user_provided_password}" -F "adz=${fich_adz_parameter}" "${remote_url}") +./hosts/1fichier.sh:189: file_header=$(tor_curl_request --insecure -sSIL -e "${remote_url}" "${target_file_link}") +./hosts/1fichier.sh:256: tor_curl_request --insecure -e "${remote_url}" "${target_file_link}" -C - -o "${file_path}" +./hosts/1fichier.sh:349: PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -c "${fich_cookie_jar}" -s "${remote_url}") +./hosts/9saves.sh:90: response=$(tor_curl_request --insecure -L -s -b "${ns_cookie_jar}" -c "${ns_cookie_jar}" "$remote_url") +./hosts/9saves.sh:139: response=$(tor_curl_request --insecure -L -s -X POST \ +./hosts/9saves.sh:188: file_header=$(tor_curl_request --insecure --head -L -s -b "${ns_cookie_jar}" -c "${ns_cookie_jar}" "$download_url") +./hosts/9saves.sh:290: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/9saves.sh:292: tor_curl_request --insecure \ +./hosts/9saves.sh:297: tor_curl_request --insecure \ +./hosts/9saves.sh:304: tor_curl_request --insecure \ +./hosts/9saves.sh:321: tor_curl_request --insecure \ +./hosts/anonsharing.sh:91: response=$(tor_curl_request --insecure -i -s \ +./hosts/anonsharing.sh:150: file_header=$(tor_curl_request --insecure --head -L -i -s \ +./hosts/anonsharing.sh:158: file_header=$(tor_curl_request --insecure --head -H "Connection: keep-alive" -s -i \ +./hosts/anonsharing.sh:273: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --output "$file_path" +./hosts/anonsharing.sh:275: tor_curl_request --insecure "$download_url" --output "$file_path" +./hosts/bedrive.sh:90: response=$(tor_curl_request --insecure -L -s \ +./hosts/bedrive.sh:149: file_header=$(tor_curl_request --insecure --head -L -i -s \ +./hosts/bedrive.sh:270: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/bedrive.sh:272: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/bedrive.sh:277: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/bedrive.sh:284: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/bedrive.sh:300: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/biteblob.sh:96: response=$(tor_curl_request --insecure -L -s "${fixed_url}") +./hosts/biteblob.sh:144: file_header=$(tor_curl_request --insecure --head -L -s "$download_url") +./hosts/biteblob.sh:227: tor_curl_request --insecure --referer "$file_url" "$download_url" --output "$file_path" +./hosts/biteblob.sh:271: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --continue-at - --output "$file_path" +./hosts/biteblob.sh:273: tor_curl_request --insecure --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/bowfile.sh:91: response=$(tor_curl_request --insecure -L -s -b "${bow_cookie_jar}" -c "${bow_cookie_jar}" \ +./hosts/bowfile.sh:143: response=$(tor_curl_request --insecure -s --head \ +./hosts/bowfile.sh:182: file_header=$(tor_curl_request --insecure -L -sS -i --head \ +./hosts/bowfile.sh:297: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/bowfile.sh:299: tor_curl_request --insecure -L \ +./hosts/bowfile.sh:305: tor_curl_request --insecure -L \ +./hosts/bowfile.sh:312: tor_curl_request --insecure -L \ +./hosts/bowfile.sh:329: tor_curl_request --insecure -L \ +./hosts/click.sh:143: response=$(tor_curl_request --insecure -L -s -b "${click_cookie_jar}" -c "${click_cookie_jar}" \ +./hosts/click.sh:226: response=$(tor_curl_request --insecure -L -s -X POST \ +./hosts/click.sh:345: response=$(tor_curl_request --insecure -L -s -X POST \ +./hosts/click.sh:434: file_header=$(tor_curl_request --insecure -L --head -s --referer "${fixed_url}" "$download_url") +./hosts/click.sh:533: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/click.sh:535: tor_curl_request --insecure \ +./hosts/click.sh:542: tor_curl_request --insecure \ +./hosts/click.sh:550: tor_curl_request --insecure \ +./hosts/click.sh:568: tor_curl_request --insecure \ +./hosts/dailyuploads.sh:97: response=$(tor_curl_request --insecure -L -s -b "${daily_cookie_jar}" -c "${daily_cookie_jar}" \ +./hosts/dailyuploads.sh:139: tor_curl_request --insecure -s "$captcha_img_url" --output "$tmp_captcha_img" +./hosts/dailyuploads.sh:286: response=$(tor_curl_request --insecure -L -s -X POST \ +./hosts/dailyuploads.sh:392: file_header=$(tor_curl_request -i -s --head \ +./hosts/dailyuploads.sh:496: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/dailyuploads.sh:498: tor_curl_request --insecure \ +./hosts/dailyuploads.sh:504: tor_curl_request --insecure \ +./hosts/dailyuploads.sh:511: tor_curl_request --insecure \ +./hosts/dailyuploads.sh:528: tor_curl_request --insecure \ +./hosts/dataupload.sh:90: response=$(tor_curl_request --insecure -L -s -b "${dup_cookie_jar}" -c "${dup_cookie_jar}" "$remote_url") +./hosts/dataupload.sh:166: response=$(tor_curl_request --insecure -svo. -X POST \ +./hosts/dataupload.sh:234: file_header=$(tor_curl_request --insecure -L --head -s "$download_url") +./hosts/dataupload.sh:349: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/dataupload.sh:351: tor_curl_request --insecure \ +./hosts/dataupload.sh:357: tor_curl_request --insecure \ +./hosts/dataupload.sh:364: tor_curl_request --insecure \ +./hosts/dataupload.sh:381: tor_curl_request --insecure \ +./hosts/dosya.sh:108: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/dosya.sh:109: PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -L -s \ +./hosts/dosya.sh:113: PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -L -s \ +./hosts/dosya.sh:172: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/dosya.sh:173: file_header=$(tor_curl_request_extended --insecure --head -L -s \ +./hosts/dosya.sh:179: file_header=$(tor_curl_request_extended --insecure --head -L -s \ +./hosts/dosya.sh:402: tor_curl_request -L -G --insecure \ +./hosts/dosya.sh:417: tor_curl_request -L -G --insecure \ +./hosts/downloadgg.sh:90: response=$(tor_curl_request --insecure -L -s -b "${dgg_cookie_jar}" -c "${dgg_cookie_jar}" "$remote_url") +./hosts/downloadgg.sh:169: response=$(tor_curl_request --insecure -svo. -X POST \ +./hosts/downloadgg.sh:255: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/downloadgg.sh:257: tor_curl_request --insecure -X POST \ +./hosts/downloadgg.sh:265: tor_curl_request --insecure -X POST \ +./hosts/downloadgg.sh:275: tor_curl_request --insecure -X POST \ +./hosts/downloadgg.sh:294: tor_curl_request --insecure -X POST \ +./hosts/examples/ExampleNewHost.sh:102: file_header=$(tor_curl_request --insecure -L --head -s --referer "${remote_url//\.org/\.cc}" "$download_url") +./hosts/examples/ExampleNewHost.sh:199: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval --referer "$download_url" "$download_url" --continue-at - --output "$file_path" +./hosts/examples/ExampleNewHost.sh:201: tor_curl_request --insecure --referer "$download_url" "$download_url" --continue-at - --output "$file_path" +./hosts/examples/up_example.sh:112: response=$(tor_curl_upload --insecure \ +./hosts/filedot.sh:112: PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -L -s \ +./hosts/filedot.sh:153: resp_login=$(tor_curl_request --insecure -L -s \ +./hosts/filedot.sh:240: response=$(tor_curl_request --insecure -L -s \ +./hosts/filedot.sh:320: response=$(tor_curl_request --insecure -L -s \ +./hosts/filedot.sh:406: file_header=$(tor_curl_request --insecure -L --head -s --referer "${fixed_url}" "$download_url") +./hosts/filedot.sh:499: tor_curl_request --insecure -L -G --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --continue-at - --output "$file_path" +./hosts/filedot.sh:501: tor_curl_request --insecure -L -G "$download_url" --continue-at - --output "$file_path" +./hosts/filehaus.sh:100: file_header=$(tor_curl_request --insecure -L --head -s --referer "${remote_url//\.org/\.cc}" "$download_url") +./hosts/filehaus.sh:197: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval --referer "$download_url" "$download_url" --continue-at - --output "$file_path" +./hosts/filehaus.sh:199: tor_curl_request --insecure --referer "$download_url" "$download_url" --continue-at - --output "$file_path" +./hosts/firestorage.sh:98: response=$(tor_curl_request --insecure -L -s "${fixed_url}") +./hosts/firestorage.sh:226: file_header=$(tor_curl_request --insecure -L --head -s --referer "${fixed_url}" "$download_url") +./hosts/firestorage.sh:335: tor_curl_request --insecure -L -G --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --continue-at - --output "$file_path" +./hosts/firestorage.sh:337: tor_curl_request --insecure -L -G "$download_url" --continue-at - --output "$file_path" +./hosts/gofile.sh:97: response=$(tor_curl_request --insecure -s -X POST \ +./hosts/gofile.sh:170: response=$(tor_curl_request --insecure -G -L -s \ +./hosts/gofile.sh:241: file_header=$(tor_curl_request --insecure -L --head -s \ +./hosts/gofile.sh:359: tor_curl_request --insecure -G --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/gofile.sh:373: tor_curl_request --insecure -G \ +./hosts/hexload.sh:108: response=$(tor_curl_request --insecure -s --data "$form_data" "https://hexload.com/download") +./hosts/hexload.sh:116: response=$(tor_curl_request --insecure -s --data "$form_data" "https://hexload.com/download") +./hosts/hexload.sh:122: response=$(tor_curl_request --insecure -s --data "$form_data" "https://hexload.com/download") +./hosts/hexload.sh:254: file_header=$(tor_curl_request --insecure --head -L -s --referer "$file_url" "$download_url") +./hosts/hexload.sh:321: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/hexload.sh:323: tor_curl_request --insecure --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/innocent.sh:98: file_header=$(tor_curl_request --insecure --head -H "Connection: keep-alive" -L -s -i "$download_url" | +./hosts/innocent.sh:110: file_header=$(tor_curl_request --insecure -m 16 -s -D - -o /dev/null \ +./hosts/innocent.sh:116: file_header=$(tor_curl_request --insecure --head -L -s "$download_url") +./hosts/innocent.sh:207: tor_curl_request --insecure "$download_url" --output "$file_path" +./hosts/kraken.sh:104: PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -s -L -c "${kraken_cookie_jar}" "${fixed_url}") +./hosts/kraken.sh:169: down_request=$(tor_curl_request --insecure -L -s -b "${kraken_cookie_jar}" -c "${kraken_cookie_jar}" -F "token=${kraken_token}" "${kraken_action}") +./hosts/kraken.sh:186: file_header=$(tor_curl_request --insecure --head -L -s -b "${kraken_cookie_jar}" -c "${kraken_cookie_jar}" --referer "$kraken_action" "$download_url") +./hosts/kraken.sh:286: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval --referer "$kraken_action" "$download_url" --continue-at - --output "$file_path" +./hosts/kraken.sh:288: tor_curl_request --insecure --referer "$kraken_action" "$download_url" --continue-at - --output "$file_path" +./hosts/nippy.sh:121: response=$(tor_curl_request --insecure -L -s -b "${nippy_cookie_jar}" -c "${nippy_cookie_jar}" "$fixed_url") +./hosts/nippy.sh:190: file_header=$(tor_curl_request --insecure -L --head -s \ +./hosts/nippy.sh:301: tor_curl_request --insecure -L --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/nippy.sh:304: tor_curl_request --insecure -L "$download_url" --continue-at - --output "$file_path" +./hosts/oshi.sh:101: file_header=$(tor_curl_request --insecure --head -L -s --referer "$remote_url" "$download_url") +./hosts/oshi.sh:195: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/oshi.sh:197: tor_curl_request --insecure --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/pixeldrain.sh:94: response=$(tor_curl_request --insecure -L -s "https://pixeldrain.com/u/$fileid") +./hosts/pixeldrain.sh:256: file_header=$(tor_curl_request --insecure --head -L -s --referer "$file_url" "$pdheadurl") +./hosts/pixeldrain.sh:322: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/pixeldrain.sh:324: tor_curl_request --insecure \ +./hosts/pixeldrain.sh:328: tor_curl_request --insecure \ +./hosts/pixeldrain.sh:333: tor_curl_request --insecure \ +./hosts/pixeldrain.sh:342: tor_curl_request --insecure \ +./hosts/ranoz.sh:90: response=$(tor_curl_request --insecure -L -s "$remote_url") +./hosts/ranoz.sh:144: file_header=$(tor_curl_request --insecure --head -L -i -s "$download_url") +./hosts/ranoz.sh:253: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/ranoz.sh:255: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/ranoz.sh:259: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/ranoz.sh:264: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/ranoz.sh:279: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/tempfileme.sh:89: response=$(tor_curl_request --insecure -L -s "$remote_url") +./hosts/tempfileme.sh:163: file_header=$(tor_curl_request --insecure -L --head -s --referer "${remote_url}" "$download_url") +./hosts/tempfileme.sh:291: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/tempfileme.sh:293: tor_curl_request --insecure -L \ +./hosts/tempfileme.sh:298: tor_curl_request --insecure -L \ +./hosts/tempfileme.sh:304: tor_curl_request --insecure -L \ +./hosts/tempfileme.sh:319: tor_curl_request --insecure -L \ +./hosts/tempsh.sh:88: file_header=$(tor_curl_request --insecure -s -D - -o /dev/null -X POST \ +./hosts/tempsh.sh:225: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/tempsh.sh:227: tor_curl_request --insecure -X POST \ +./hosts/tempsh.sh:231: tor_curl_request --insecure -X POST \ +./hosts/tempsh.sh:236: tor_curl_request --insecure -X POST \ +./hosts/tempsh.sh:250: tor_curl_request --insecure -X POST \ +./hosts/up2share.sh:91: response=$(tor_curl_request --insecure -L -s -b "${up2share_cookie_jar}" -c "${up2share_cookie_jar}" \ +./hosts/up2share.sh:144: response=$(tor_curl_request --insecure -L -s -b "${up2share_cookie_jar}" -c "${up2share_cookie_jar}" \ +./hosts/up2share.sh:195: file_header=$(tor_curl_request --insecure -L -s --head \ +./hosts/up2share.sh:311: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/up2share.sh:313: tor_curl_request --insecure -L \ +./hosts/up2share.sh:320: tor_curl_request --insecure -L \ +./hosts/up2share.sh:328: tor_curl_request --insecure -L \ +./hosts/up2share.sh:346: tor_curl_request --insecure -L \ +./hosts/uploadee.sh:90: response=$(tor_curl_request --insecure -L -s "$remote_url") +./hosts/uploadee.sh:143: file_header=$(tor_curl_request --insecure --head -L -s -b "${upee_cookie_jar}" -c "${upee_cookie_jar}" --referer "$remote_url" "$download_url") +./hosts/uploadee.sh:249: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/uploadee.sh:251: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/uploadee.sh:257: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/uploadee.sh:265: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/uploadee.sh:282: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/uploadev.sh:91: response=$(tor_curl_request --insecure -L -s -b "${upev_cookie_jar}" -c "${upev_cookie_jar}" \ +./hosts/uploadev.sh:181: response=$(tor_curl_request --insecure -L -s -X POST \ +./hosts/uploadev.sh:268: file_header=$(tor_curl_request --insecure -L --head -s "$download_url") +./hosts/uploadev.sh:367: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./hosts/uploadev.sh:369: tor_curl_request --insecure -L \ +./hosts/uploadev.sh:374: tor_curl_request --insecure -L \ +./hosts/uploadev.sh:380: tor_curl_request --insecure -L \ +./hosts/uploadev.sh:396: tor_curl_request --insecure -L \ +./hosts/uploadflix.sh:97: response=$(tor_curl_request --insecure -L -s "${fixed_url}") +./hosts/uploadflix.sh:150: response=$(tor_curl_request --insecure -L -s -X POST --data "$form_data" "${fixed_url}") +./hosts/uploadflix.sh:192: file_header=$(tor_curl_request --insecure -L --head -s --referer "${fixed_url}" "${download_url}") +./hosts/uploadflix.sh:286: tor_curl_request --insecure -L -G --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --continue-at - --output "$file_path" +./hosts/uploadflix.sh:288: tor_curl_request --insecure -L -G "$download_url" --continue-at - --output "$file_path" +./hosts/uploadhive.sh:88: response=$(tor_curl_request --insecure -L -s "$remote_url") +./hosts/uploadhive.sh:134: response=$(tor_curl_request --insecure -L -s -X POST --data "$form_data" "$remote_url") +./hosts/uploadhive.sh:175: file_header=$(tor_curl_request --insecure --head -s -L --referer "$remote_url" "$download_url") +./hosts/uploadhive.sh:269: tor_curl_request --insecure -L -G --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --continue-at - --output "$file_path" +./hosts/uploadhive.sh:271: tor_curl_request --insecure -L -G "$download_url" --continue-at - --output "$file_path" +./hosts/up_1fichier.sh:107: response=$(tor_curl_request --insecure -L -s "https://1fichier.com/") +./hosts/up_1fichier.sh:180: response=$(tor_curl_upload --insecure -L \ +./hosts/up_acid.sh:94: response=$(tor_curl_upload --insecure -i \ +./hosts/up_anarchaserver.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_anonsharing.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_axfc.sh:109: response=$(tor_curl_request --insecure -L -s -b "${axfc_cookie_jar}" -c "${axfc_cookie_jar}" "$fixed_url") +./hosts/up_axfc.sh:136: response=$(tor_curl_upload --insecure -L -s -X POST \ +./hosts/up_axfc.sh:184: response=$(tor_curl_upload --insecure -L -i -X POST \ +./hosts/up_bedrive.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_bowfile.sh:108: response=$(tor_curl_request --insecure -L -i \ +./hosts/up_dailyuploads.sh:109: response=$(tor_curl_upload --insecure -i \ +./hosts/up_dataupload.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_dbree.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_depotkaz.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_dosya.sh:107: response=$(tor_curl_upload --insecure -L -i \ +./hosts/up_filehaus.sh:106: response=$(tor_curl_upload --insecure -i \ +./hosts/up_filesquid.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_firestorage.sh:113: response=$(tor_curl_upload --insecure -i \ +./hosts/up_free4e.sh:94: response=$(tor_curl_upload --insecure -i \ +./hosts/up_gofile.sh:102: response=$(tor_curl_request --insecure -L -s "https://api.gofile.io/servers") +./hosts/up_gofile.sh:121: response=$(tor_curl_upload --insecure -i \ +./hosts/up_harrault.sh:94: response=$(tor_curl_upload --insecure -i \ +./hosts/up_hexload.sh:109: response=$(tor_curl_upload --insecure -i \ +./hosts/up_innocent.sh:99: response=$(tor_curl_upload --insecure -D - -o /dev/null \ +./hosts/up_kouploader.sh:108: response=$(tor_curl_request --insecure -L -s -b "${ko_cookie_jar}" -c "${ko_cookie_jar}" "$PostUrlHost") +./hosts/up_kouploader.sh:132: response=$(tor_curl_upload --insecure -L -i \ +./hosts/up_kraken.sh:115: response=$(tor_curl_upload --insecure -i \ +./hosts/up_linxx.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_nantes.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_netlib.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_nippy.sh:125: response=$(tor_curl_upload --insecure -i \ +./hosts/up_nofile.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_oshi.sh:110: response=$(tor_curl_upload --insecure \ +./hosts/up_ranoz.sh:102: response=$(tor_curl_upload --insecure -L -i -s \ +./hosts/up_ranoz.sh:131: response=$(tor_curl_upload --insecure -i -X PUT \ +./hosts/up_shareonline.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_soyjak.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_tempfileme.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_tempsh.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_turboonion.sh:99: response=$(tor_curl_upload --insecure \ +./hosts/up_uploadev.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_uploadflix.sh:106: response=$(tor_curl_upload --insecure -i \ +./hosts/up_uploadhive.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_uploadraja.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_yolobit.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/youdbox.sh:95: response=$(tor_curl_request --insecure -L -i -s "${fixed_url}") +./hosts/youdbox.sh:141: response=$(tor_curl_request --insecure -L -s -X POST --data "$form_data" "${fixed_url}") +./hosts/youdbox.sh:183: file_header=$(tor_curl_request --insecure -L --head -s --referer "${fixed_url}" "$download_url") +./hosts/youdbox.sh:276: tor_curl_request --insecure -L -G --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --continue-at - --output "$file_path" +./hosts/youdbox.sh:278: tor_curl_request --insecure -L -G "$download_url" --continue-at - --output "$file_path" +./mad.sh:106:UseTorCurlImpersonate=false +./mad.sh:371:tor_curl_request() { +./mad.sh:372: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./mad.sh:373: "${curl_impersonate[@]}" --proxy "socks5h://${tor_identity}@${TorIp}:${torPort}" --connect-timeout ${ConnectTimeout} --compressed --globoff "$@" +./mad.sh:375: curl --proxy "socks5h://${tor_identity}@${TorIp}:${torPort}" --connect-timeout ${ConnectTimeout} --compressed --globoff "$@" +./mad.sh:378:tor_curl_request_extended() { +./mad.sh:379: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./mad.sh:380: "${curl_impersonate[@]}" --proxy "socks5h://${tor_identity}@${TorIp}:${torPort}" --connect-timeout 60 --compressed --globoff "$@" +./mad.sh:382: curl --proxy "socks5h://${tor_identity}@${TorIp}:${torPort}" --connect-timeout 60 --compressed --globoff "$@" +./mad.sh:385:tor_curl_upload() { +./mad.sh:386: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./mad.sh:388: "${curl_impersonate[@]}" --proxy "socks5h://${tor_identity}@${TorIp}:${torPort}" --connect-timeout ${ConnectTimeout} --speed-limit $UploadSpeedMin --speed-time $UploadTimeoutInterval --compressed --globoff "$@" +./mad.sh:390: "${curl_impersonate[@]}" --proxy "socks5h://${tor_identity}@${TorIp}:${torPort}" --connect-timeout ${ConnectTimeout} --compressed --globoff "$@" +./mad.sh:394: curl --proxy "socks5h://${tor_identity}@${TorIp}:${torPort}" --connect-timeout ${ConnectTimeout} --speed-limit $UploadSpeedMin --speed-time $UploadTimeoutInterval -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:109.0) Gecko/20100101 Firefox/115.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate, br' -H 'Origin: null' -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' -H 'Sec-Fetch-Dest: document' -H 'Sec-Fetch-Mode: navigate' -H 'Sec-Fetch-Site: cross-site' -H 'Sec-Fetch-User: ?1' -H 'TE: trailers' --compressed --globoff "$@" +./mad.sh:396: curl --proxy "socks5h://${tor_identity}@${TorIp}:${torPort}" --connect-timeout ${ConnectTimeout} -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:109.0) Gecko/20100101 Firefox/115.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate, br' -H 'Origin: null' -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' -H 'Sec-Fetch-Dest: document' -H 'Sec-Fetch-Mode: navigate' -H 'Sec-Fetch-Site: cross-site' -H 'Sec-Fetch-User: ?1' -H 'TE: trailers' --compressed --globoff "$@" +./mad.sh:1283:install_curl_impersonate() { +./mad.sh:1285: echo -e "${BLUE}lwthiker curl_impersonate${NC} is the original dev, but it is relatively inactive." +./mad.sh:1286: echo -e "- Currently uses curl v8.1.1." +./mad.sh:1290: echo -e "${BLUE}lexiforest curl_impersonate${NC} is an active fork of curl_impersonate." +./mad.sh:1291: echo -e "+ Currently uses curl v8.7.1" +./mad.sh:1295: PS3='Please select which curl_impersonate to install: ' +./mad.sh:1303: install_curl_impersonate_lwthiker_orig +./mad.sh:1307: install_curl_impersonate_lexiforest_fork +./mad.sh:1317:install_curl_impersonate_lwthiker_orig() { +./mad.sh:1321: echo -e "${BLUE}lwthiker curl_impersonate${NC} is the original curl_impersonate." +./mad.sh:1322: echo -e "+ Currently uses curl v8.1.1, and has low activity for updates" +./mad.sh:1325: echo -e "${GREEN}| Fetching:${NC} latest ${BLUE}lwthiker curl_impersonate${NC} info from github...${NC}" +./mad.sh:1328: response=$(tor_curl_request --insecure -L -s https://github.com/lwthiker/curl-impersonate/releases/latest) +./mad.sh:1330: debugHtml "github" "lbf_inst_curlimp$j" "$response" +./mad.sh:1333: latestTag=$(grep -oPi -m 1 '(?<=/curl-impersonate/releases/tag/).*?(?=")' <<< "$response") +./mad.sh:1343: yes_or_no "Do you wish to download and extract curl_impersonate $latestTag (using tor+curl)?" && { +./mad.sh:1345: download_url='https://github.com/lwthiker/curl-impersonate/releases/download/'"$latestTag"'/curl-impersonate-'"$latestTag"'.x86_64-linux-gnu.tar.gz' +./mad.sh:1348: file_header=$(tor_curl_request --insecure --head -Ls "$download_url") +./mad.sh:1350: debugHtml "github" "head_inst_curlimp$j" "${file_header}" +./mad.sh:1398: tor_curl_request --insecure -L "$download_url" --continue-at - --output "$file_path" +./mad.sh:1427: echo -e "| Extracting curl_impersonate..." +./mad.sh:1429: rm -f "${ScriptDir}"/curl* +./mad.sh:1430: mv "$extract_location/curl-impersonate-ff" "${ScriptDir}/" +./mad.sh:1431: mv "$extract_location/curl_ff109" "${ScriptDir}/" +./mad.sh:1432: echo -e "${GREEN}| Done.${NC} Update ${BLUE}\"UseTorCurlImpersonate=true\"${NC} in script to use..." +./mad.sh:1440:install_curl_impersonate_lexiforest_fork() { +./mad.sh:1444: echo -e "${BLUE}lexiforest curl_impersonate${NC} is an active fork of curl_impersonate." +./mad.sh:1445: echo -e "+ Currently uses curl v8.7.1, and is patched for latest CVEs" +./mad.sh:1448: echo -e "${GREEN}| Fetching:${NC} latest ${BLUE}lexiforest curl_impersonate fork${NC} info from github...${NC}" +./mad.sh:1451: response=$(tor_curl_request --insecure -L -s https://github.com/lexiforest/curl-impersonate/releases/latest) +./mad.sh:1453: debugHtml "github" "lbf_inst_curlimp$j" "$response" +./mad.sh:1456: latestTag=$(grep -oPi -m 1 '(?<=/curl-impersonate/releases/tag/).*?(?=")' <<< "$response") +./mad.sh:1466: yes_or_no "Do you wish to download and extract curl_impersonate $latestTag (using tor+curl)?" && { +./mad.sh:1468: download_url='https://github.com/lexiforest/curl-impersonate/releases/download/'"$latestTag"'/curl-impersonate-'"$latestTag"'.x86_64-linux-gnu.tar.gz' +./mad.sh:1471: file_header=$(tor_curl_request --insecure --head -Ls "$download_url") +./mad.sh:1473: debugHtml "github" "head_inst_curlimp$j" "${file_header}" +./mad.sh:1521: tor_curl_request --insecure -L "$download_url" --continue-at - --output "$file_path" +./mad.sh:1550: echo -e "| Extracting curl_impersonate..." +./mad.sh:1552: rm -f "${ScriptDir}"/curl* +./mad.sh:1553: mv "$extract_location/curl-impersonate-chrome" "${ScriptDir}/" +./mad.sh:1554: mv "$extract_location/curl_chrome124" "${ScriptDir}/" +./mad.sh:1555: echo -e "${GREEN}| Done.${NC} Update ${BLUE}\"UseTorCurlImpersonate=true\"${NC} in script to use..." +./mad.sh:1717: echo -e ":${NC} ${GREEN}MAD${PINK} Audit${NC} : Reports usage of http & curl in scripts${PINK}${BLD} :" +./mad.sh:1725: maud_curl=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep --color='always' -Ei 'curl') +./mad.sh:1726: maud_torcurl=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep -A 12 --color='always' -Ei 'tor_curl') +./mad.sh:1735: echo -e "${PINK}MAD Audit of curl:${NC} (${GREEN}grep \"curl\"${NC})" +./mad.sh:1737: echo -e "$maud_curl" +./mad.sh:1739: echo -e "${PINK}MAD Audit of tor_curl (+12 lines after):${NC} (${GREEN}grep \"tor_curl\"${NC})" +./mad.sh:1741: echo -e "$maud_torcurl" +./mad.sh:1753: maud_curl=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep --color='always' -Ei 'curl') +./mad.sh:1754: maud_torcurl=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep -A 12 --color='always' -Ei 'tor_curl') +./mad.sh:1763: echo -e "${PINK}MAD Audit of curl:${NC} (${GREEN}grep \"curl \"${NC})" +./mad.sh:1765: echo -e "$maud_curl" +./mad.sh:1767: echo -e "${PINK}MAD Audit of tor_curl (+12 lines after):${NC} (${GREEN}grep \"tor_curl\"${NC})" +./mad.sh:1769: echo -e "$maud_torcurl" +./mad.sh:1775: maud_curl=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep --color='always' -Ei 'curl') +./mad.sh:1776: maud_torcurl=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep -A 12 --color='always' -Ei 'tor_curl') +./mad.sh:1785: echo -e "${PINK}MAD Audit of curl:${NC} (${GREEN}grep \"curl\"${NC})" +./mad.sh:1787: echo -e "$maud_curl" +./mad.sh:1789: echo -e "${PINK}MAD Audit of tor_curl (+12 lines after):${NC} (${GREEN}grep \"tor_curl\"${NC})" +./mad.sh:1791: echo -e "$maud_torcurl" +./mad.sh:2738: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./mad.sh:2739: printf "client: ${GREEN}Tor${NC} + ${BLUE}curl_impersonate${NC}\\n" +./mad.sh:2741: printf "client: ${GREEN}Tor${NC} + ${GREEN}curl${NC}\\n" +./mad.sh:2901: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./mad.sh:2902: printf "client: ${GREEN}Tor${NC} + ${BLUE}curl_impersonate${NC}\\n" +./mad.sh:2904: printf "client: ${GREEN}Tor${NC} + ${GREEN}curl${NC}\\n" +./mad.sh:3102: file_header=$(tor_curl_request --insecure -m 18 -s -D - -o /dev/null \ +./mad.sh:3109: file_header=$(tor_curl_request --insecure --head -H "Connection: keep-alive" -L -s -i "$download_url" | +./mad.sh:3237: tor_curl_request --insecure -L --referer "$file_url" "$download_url" --output "$file_path" +./mad.sh:3281: tor_curl_request --insecure -L --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --continue-at - --output "$file_path" +./mad.sh:3283: tor_curl_request --insecure -L --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./mad.sh:3456:if [ "${UseTorCurlImpersonate}" == "true" ]; then +./mad.sh:3457: curl_impersonate=() +./mad.sh:3458: readarray -d $'' arrFiles < <(find "$ScriptDir" -maxdepth 1 -name "curl_*" -printf '%p\n' | sort -Vk1) +./mad.sh:3459: bFoundCurlHeader=false +./mad.sh:3463: curl_impersonate=($fil) +./mad.sh:3464: bFoundCurlHeader=true +./mad.sh:3468: if [ "$bFoundCurlHeader" == "false" ]; then +./mad.sh:3469: echo -e "${RED}[ERROR] Missing dependency \"curl-impersonate\"!${NC}" +./mad.sh:3472: echo -e "You'll need to download ${GREEN}\"curl-impersonate\"${NC}." +./mad.sh:3475: echo -e "The latest binary can be obtained on GitHub, search for \"curl-impersonate\"" +./mad.sh:3477: echo -e " 1. Visit the page of curl-impersonate and add \"/releases/latest/\" at end of URL." +./mad.sh:3481: echo -e " 4. Download archive ${GREEN}\"curl-impersonate-vX.Y.Z.x86_64-linux-gnu.tar.gz\"${YELLOW}." +./mad.sh:3482: echo -e " 5. Extract files ${GREEN}\"curl-impersonate-ff\"${NC} and ${GREEN}\"curl_ff109\"${NC} next to this script." +./mad.sh:3485: echo -e "run $0 install_curl_impersonate\\n" +./mad.sh:3487: yes_or_no "Do you wish to download and extract latest curl_impersonate (using tor+curl)?" && { +./mad.sh:3488: UseTorCurlImpersonate=false +./mad.sh:3489: install_curl_impersonate +./mad.sh:3573: echo -e "[${YELLOW}Install curl_impersonate${NC}]: Downloads the latest binary for curl_impersonate from github repo (3 choices)" +./mad.sh:3574: printf " %s install_curl_impersonate\\n" "$0" +./mad.sh:3652:elif [[ "$arg1" == "install_curl_impersonate" ]]; then +./mad.sh:3653: install_curl_impersonate +./mad.sh:3684:if [ "${UseTorCurlImpersonate}" == "true" ]; then +./mad.sh:3685: printf "client: ${GREEN}Tor${NC} + ${BLUE}curl_impersonate${NC}\\n" +./mad.sh:3687: printf "client: ${GREEN}Tor${NC} + ${GREEN}curl${NC}\\n" +./plugins/pjscloud.sh:44: if [ "${UseTorCurlImpersonate}" == "true" ]; then +./plugins/pjscloud.sh:45: response=$("${curl_impersonate[@]}" --proxy "socks5h://${tor_identity}@${TorIp}:${torPort}" \ +./plugins/pjscloud.sh:53: response=$(curl --proxy "socks5h://${tor_identity}@${TorIp}:${torPort}" \ + diff --git a/.audit/mad-audit-http.log b/.audit/mad-audit-http.log new file mode 100755 index 0000000..de66ad6 --- /dev/null +++ b/.audit/mad-audit-http.log @@ -0,0 +1,366 @@ +DateTime: 24.11.07 + +Files: +./hosts/1fichier.sh +./hosts/9saves.sh +./hosts/acid.sh +./hosts/anarchaserver.sh +./hosts/anonsharing.sh +./hosts/archived/nekofile.sh +./hosts/bedrive.sh +./hosts/biteblob.sh +./hosts/bowfile.sh +./hosts/click.sh +./hosts/dailyuploads.sh +./hosts/dataupload.sh +./hosts/dbree.sh +./hosts/depotkaz.sh +./hosts/discreetshare.sh +./hosts/dosya.sh +./hosts/downloadgg.sh +./hosts/eternalhosting.sh +./hosts/examples/ExampleNewHost.sh +./hosts/examples/up_example.sh +./hosts/filedoge.sh +./hosts/filedot.sh +./hosts/filehaus.sh +./hosts/filesquid.sh +./hosts/firestorage.sh +./hosts/free4e.sh +./hosts/gofile.sh +./hosts/harrault.sh +./hosts/hexload.sh +./hosts/innocent.sh +./hosts/kraken.sh +./hosts/lainsafe.sh +./hosts/lainsafe_onion.sh +./hosts/linxx.sh +./hosts/nantes.sh +./hosts/netlib.sh +./hosts/nippy.sh +./hosts/nofile.sh +./hosts/offshorecat.sh +./hosts/oshi.sh +./hosts/pixeldrain.sh +./hosts/ranoz.sh +./hosts/shareonline.sh +./hosts/soyjak.sh +./hosts/tempfileme.sh +./hosts/tempsh.sh +./hosts/turboonion.sh +./hosts/up2share.sh +./hosts/uploadee.sh +./hosts/uploadev.sh +./hosts/uploadflix.sh +./hosts/uploadhive.sh +./hosts/up_1fichier.sh +./hosts/up_acid.sh +./hosts/up_anarchaserver.sh +./hosts/up_anonsharing.sh +./hosts/up_axfc.sh +./hosts/up_bedrive.sh +./hosts/up_bowfile.sh +./hosts/up_dailyuploads.sh +./hosts/up_dataupload.sh +./hosts/up_dbree.sh +./hosts/up_depotkaz.sh +./hosts/up_dosya.sh +./hosts/up_filehaus.sh +./hosts/up_filesquid.sh +./hosts/up_firestorage.sh +./hosts/up_free4e.sh +./hosts/up_gofile.sh +./hosts/up_harrault.sh +./hosts/up_hexload.sh +./hosts/up_innocent.sh +./hosts/up_kouploader.sh +./hosts/up_kraken.sh +./hosts/up_linxx.sh +./hosts/up_nantes.sh +./hosts/up_netlib.sh +./hosts/up_nippy.sh +./hosts/up_nofile.sh +./hosts/up_oshi.sh +./hosts/up_ranoz.sh +./hosts/up_shareonline.sh +./hosts/up_soyjak.sh +./hosts/up_tempfileme.sh +./hosts/up_tempsh.sh +./hosts/up_turboonion.sh +./hosts/up_uploadev.sh +./hosts/up_uploadflix.sh +./hosts/up_uploadhive.sh +./hosts/up_uploadraja.sh +./hosts/up_yolobit.sh +./hosts/yolobit.sh +./hosts/youdbox.sh +./mad.sh +./plugins/AutoResetAndRetryDownloads.sh +./plugins/CatnapCtrlC.sh +./plugins/SkipUrlsInDownloadsCompletedTxt.sh +./plugins/examples/ExampleAddNewFuncAndCallOnSuccessfulDownload.sh +./plugins/examples/ExamplesMainHooks.sh +./plugins/ocr_captcha.sh +./plugins/pjscloud.sh + + +MAD Audit of http lines: (grep "http:" or "https:") +_________________________________________________________________________ +./hosts/1fichier.sh:161: if ! grep -Eqi "https://" <<< "${target_file_link}" > /dev/null ; then +./hosts/9saves.sh:141: --data "$form_data" "https://9saves.com/") +./hosts/anonsharing.sh:95: "https://anonsharing.com/account/ajax/file_details") +./hosts/anonsharing.sh:121: if grep -Eqi 'openUrl\('"'"'https:\\/\\/anonsharing.com\\/' <<< "$response"; then +./hosts/anonsharing.sh:124: download_url='https://anonsharing.com/'$(grep -oPi '(?<=openUrl\('"'"'https:\\/\\/anonsharing.com\\/).*?(?='"'"'.*$)' <<< "$response" | head -1) +./hosts/anonsharing.sh:155: ansh_host="${download_url/https:\/\//}" +./hosts/biteblob.sh:123: if ! grep -Eqi 'https://biteblob.com/Download/' <<< $download_url ; then +./hosts/biteblob.sh:125: download_url="https://biteblob.com${download_loc}" +./hosts/bowfile.sh:119: if grep -Eqi 'let next = "https://bowfile.com/' <<< "$response" ; then +./hosts/bowfile.sh:120: download_url="https://bowfile.com/"$(grep -oPi '(?<=let next = "https://bowfile.com/).*?(?=")' <<< "$response") +./hosts/bowfile.sh:174: fshost=$(grep -oPi -m 1 '(?<=https://).*?(?=/token/download/dl)' <<< "$download_url") +./hosts/bowfile.sh:293: fshost=$(grep -oPi -m 1 '(?<=https://).*?(?=/token/download/dl)' <<< "$download_url") +./hosts/bowfile.sh:302: --referer "https://bowfile.com/" \ +./hosts/bowfile.sh:307: --referer "https://bowfile.com/" \ +./hosts/bowfile.sh:326: --referer "https://bowfile.com/" \ +./hosts/bowfile.sh:342: --referer "https://bowfile.com/" \ +./hosts/click.sh:530: click_host=$(grep -oPi '(?<=https://).*(?=/)' <<< "$fixed_url") +./hosts/dailyuploads.sh:125: if grep -Eqi 'img src="https://dailyuploads.net/captchas/' <<< "$response" ; then +./hosts/dailyuploads.sh:280: response=$(pjscloud_tor_request "https://hexload.com/download" "$form_data") +./hosts/dailyuploads.sh:493: daily_host=$(grep -oPi '(?<=https://).*(?=/)' <<< "$fixed_url") +./hosts/dataupload.sh:133: post_action="https://dataupload.net/" +./hosts/dataupload.sh:210: if ! grep -Eqi "location: https://dataupload.net/d/" <<< "$response"; then +./hosts/dosya.sh:168: if grep -Eqi 'https://dosyaupload.com' <<< "$dos_url" ; then +./hosts/downloadgg.sh:139: if grep -Eqi '
)' <<< "$response") +./hosts/gofile.sh:84: badUrlDownload "${remote_url}" "Expect format http://gofile.io/d/xxxxxxxxx" +./hosts/gofile.sh:108: "https://api.gofile.io/accounts") +./hosts/gofile.sh:183: "https://api.gofile.io/contents/$file_id") +./hosts/gofile.sh:185: debugHtml "${remote_url##*/}" "gofile_contents$i" "url: https://api.gofile.io/contents/${file_id}?${form_data}"$'\n'"${response}" +./hosts/gofile.sh:293: cdn_url="https:"$(grep -oPi '(?<=location: ).*' <<< "$file_header") +./hosts/hexload.sh:102: response=$(pjscloud_tor_request "https://hexload.com/download" "$form_data") +./hosts/hexload.sh:108: response=$(tor_curl_request --insecure -s --data "$form_data" "https://hexload.com/download") +./hosts/hexload.sh:116: response=$(tor_curl_request --insecure -s --data "$form_data" "https://hexload.com/download") +./hosts/hexload.sh:122: response=$(tor_curl_request --insecure -s --data "$form_data" "https://hexload.com/download") +./hosts/innocent.sh:48: download_url="${download_url/https:/http:}" +./hosts/kraken.sh:155: kraken_action="https://krakenfiles.com/download/${kraken_action##*/}" +./hosts/nippy.sh:162: download_url="https:"$(grep -oP '(?<=

click here)' <<< "$response") +./hosts/up2share.sh:197: --referer "https://up2sha.re/" "$download_url") +./hosts/up2share.sh:317: --referer "https://up2sha.re/" \ +./hosts/up2share.sh:323: --referer "https://up2sha.re/" \ +./hosts/up2share.sh:343: --referer "https://up2sha.re/" \ +./hosts/up2share.sh:360: --referer "https://up2sha.re/" \ +./hosts/up_1fichier.sh:107: response=$(tor_curl_request --insecure -L -s "https://1fichier.com/") +./hosts/up_1fichier.sh:109: debugHtml "${filepath##*/}" "${_hostCode}_up_getid_$i" "url: https://1fichier.com/"$'\n'"${response}" +./hosts/up_1fichier.sh:176: fichHost="${fichaction/https:\/\///}" +./hosts/up_1fichier.sh:195: hash=$(grep -oPi '(?<=
http://koldr.jp/' <<< "${response}" ; then +./hosts/up_kouploader.sh:147: subSearch=$(awk '/MESSAGE<\/font>/,/http:\/\/koldr.jp\//' <<< "$response") +./hosts/up_kouploader.sh:150: downloadLink="http://up8.kouploader.jp/?m=dp&dlkey=1234&n=$hash" +./hosts/up_kraken.sh:99: local ar_HUP[0]='https://uploads1.krakenfiles.com/_uploader/gallery/upload' +./hosts/up_kraken.sh:100: local ar_HUP[1]='https://uploads2.krakenfiles.com/_uploader/gallery/upload' +./hosts/up_kraken.sh:101: local ar_HUP[2]='https://uploads3.krakenfiles.com/_uploader/gallery/upload' +./hosts/up_kraken.sh:102: local ar_HUP[3]='https://uploads4.krakenfiles.com/_uploader/gallery/upload' +./hosts/up_kraken.sh:103: local ar_HUP[4]='https://uploads5.krakenfiles.com/_uploader/gallery/upload' +./hosts/up_kraken.sh:104: local ar_HUP[5]='https://uploads6.krakenfiles.com/_uploader/gallery/upload' +./hosts/up_kraken.sh:105: local ar_HUP[6]='https://uploads7.krakenfiles.com/_uploader/gallery/upload' +./hosts/up_kraken.sh:106: local ar_HUP[7]='https://uploads8.krakenfiles.com/_uploader/gallery/upload' +./hosts/up_kraken.sh:107: local ar_HUP[8]='https://uploads9.krakenfiles.com/_uploader/gallery/upload' +./hosts/up_kraken.sh:108: local ar_HUP[9]='https://uploads10.krakenfiles.com/_uploader/gallery/upload' +./hosts/up_kraken.sh:126: downloadLink="https://krakenfiles.com/view/${hash}/file.html" +./hosts/up_linxx.sh:99: PostUrlHost='https://linxx.net/upload/script.php' +./hosts/up_linxx.sh:114: downloadLink="https://linxx.net/upload/f.php?h=${hash}&p=1" +./hosts/up_nantes.sh:99: PostUrlHost='https://fichiers.nantes.cloud/script.php' +./hosts/up_nantes.sh:114: downloadLink="https://fichiers.nantes.cloud/f.php?h=${hash}&p=1" +./hosts/up_netlib.sh:99: PostUrlHost='https://mhep.netlib.re/jirafeau/script.php' +./hosts/up_netlib.sh:114: downloadLink="https://mhep.netlib.re/jirafeau/f.php?h=${hash}&p=1" +./hosts/up_nippy.sh:103: PostUrlHost='https://ns05.zipcluster.com/upload.php' +./hosts/up_nippy.sh:105: PostUrlHost='https://ns01.zipcluster.com/upload.php' +./hosts/up_nippy.sh:107: PostUrlHost='https://ns04.zipcluster.com/upload.php' +./hosts/up_nippy.sh:109: PostUrlHost='https://ns03.zipcluster.com/upload.php' +./hosts/up_nippy.sh:111: PostUrlHost='https://ns02.zipcluster.com/upload.php' +./hosts/up_nippy.sh:113: local ar_HUP[0]='https://ns05.zipcluster.com/upload.php' # nippydrive +./hosts/up_nippy.sh:114: local ar_HUP[1]='https://ns01.zipcluster.com/upload.php' # nippyshare +./hosts/up_nippy.sh:115: local ar_HUP[2]='https://ns04.zipcluster.com/upload.php' # nippybox +./hosts/up_nippy.sh:116: local ar_HUP[3]='https://ns03.zipcluster.com/upload.php' # nippyspace +./hosts/up_nippy.sh:117: local ar_HUP[4]='https://ns02.zipcluster.com/upload.php' # nippyfile +./hosts/up_nofile.sh:99: PostUrlHost='https://ns06.zipcluster.com/upload.php' +./hosts/up_oshi.sh:104: PostUrlHost='https://oshi.at/' +./hosts/up_oshi.sh:106: PostUrlHost='http://5ety7tpkim5me6eszuwcje7bmy25pbtrjtue7zkqqgziljwqy3rrikqd.onion/' +./hosts/up_ranoz.sh:99: PostUrlHost='https://ranoz.gg/api/v1/files/upload_url' +./hosts/up_ranoz.sh:111: if grep -Eqi '"upload_url":"https://' <<< "$response" ; then +./hosts/up_shareonline.sh:99: PostUrlHost='https://ns07.zipcluster.com/upload.php' +./hosts/up_soyjak.sh:99: PostUrlHost='https://soyjak.download/script.php' +./hosts/up_soyjak.sh:114: downloadLink="https://soyjak.download/f.php?h=${hash}&p=1" +./hosts/up_tempfileme.sh:99: PostUrlHost='https://tempfile.me/upload' +./hosts/up_tempsh.sh:99: PostUrlHost='https://temp.sh/upload' +./hosts/up_tempsh.sh:111: hash=$(grep -oPi '(?<=http://temp.sh/).*?(?=$)' <<< "$response") +./hosts/up_tempsh.sh:113: downloadLink="https://temp.sh/${hash}" +./hosts/up_turboonion.sh:96: PostUrlHost='http://3qeyzgtujhguzjletcz34qxsiqoymlni6s6rhc37kpobyttzngwlzjid.onion/api/upload' +./hosts/up_turboonion.sh:118: downloadLink='http://3qeyzgtujhguzjletcz34qxsiqoymlni6s6rhc37kpobyttzngwlzjid.onion/dl/file/'"$hash" +./hosts/up_uploadev.sh:99: PostUrlHost='https://fs8.uploadev.org/cgi-bin/upload.cgi?upload_type=file&utype=anon' +./hosts/up_uploadev.sh:119: downloadLink="https://uploadev.org/${hash}" +./hosts/up_uploadflix.sh:99: local ar_HUP[0]='https://fs50.uploadflix.cyou/cgi-bin/upload.cgi?upload_type=file&utype=anon' +./hosts/up_uploadflix.sh:125: downloadLink="https://uploadflix.cc/${hash}" +./hosts/up_uploadhive.sh:99: PostUrlHost='https://fs430.uploadhive.com/cgi-bin/upload.cgi' +./hosts/up_uploadhive.sh:120: downloadLink="https://uploadhive.com/${hash}" +./hosts/up_uploadraja.sh:99: PostUrlHost='https://awsaisiaposisition69.kalpstudio.xyz/cgi-bin/upload.cgi?upload_type=file&utype=anon' +./hosts/up_uploadraja.sh:119: downloadLink="https://uploadraja.com/$hash" +./hosts/up_yolobit.sh:99: PostUrlHost='https://ns08.zipcluster.com/upload.php' +./mad.sh:606: sed -i -e "s>^${url/https:/http:}.*>#& #OK# ${filename}>g" "${InputFile}" #http (if changed) +./mad.sh:608: sed -i -e "s>^direct=${url/https:/http:}.*>#& #OK# ${filename}>g" "${InputFile}" #direct url https +./mad.sh:611: sed -i -e "s>^${url/https:/http:}.*>#&>g" "${InputFile}" #http (if changed) +./mad.sh:613: sed -i -e "s>^direct=${url/https:/http:}.*>#&>g" "${InputFile}" #direct url https +./mad.sh:634: sed -i -e "s>^${url/https:/http:}.*>#& #OK# ${filename} (File exists)>g" "${InputFile}" #http (if changed) +./mad.sh:636: sed -i -e "s>^direct=${url/https:/http:}.*>#& #OK# ${filename} (File exists)>g" "${InputFile}" #direct url https +./mad.sh:639: sed -i -e "s>^${url/https:/http:}.*>#&>g" "${InputFile}" #http (if changed) +./mad.sh:641: sed -i -e "s>^direct=${url/https:/http:}.*>#&>g" "${InputFile}" #direct url https +./mad.sh:662: sed -i -e "s>^${url/https:/http:}.*>#& #RETRY# ${message}>g" "${InputFile}" #http (if changed) +./mad.sh:664: sed -i -e "s>^direct=${url/https:/http:}.*>#& #RETRY# ${message}>g" "${InputFile}" #direct url https +./mad.sh:667: sed -i -e "s>^${url/https:/http:}.*>#&>g" "${InputFile}" #http (if changed) +./mad.sh:669: sed -i -e "s>^direct=${url/https:/http:}.*>#&>g" "${InputFile}" #direct url https +./mad.sh:691: sed -i -e "s>^${url/https:/http:}.*>#& #FAIL# $message>g" "${InputFile}" #http (if changed) +./mad.sh:693: sed -i -e "s>^direct=${url/https:/http:}.*>#& #FAIL# $message>g" "${InputFile}" #direct url https +./mad.sh:696: sed -i -e "s>^${url/https:/http:}.*>#&>g" "${InputFile}" #http (if changed) +./mad.sh:698: sed -i -e "s>^direct=${url/https:/http:}.*>#&>g" "${InputFile}" #direct url https +./mad.sh:719: sed -i -e "s>^${url/https:/http:}.*>#& #REMOVED#>g" "${InputFile}" #http (if changed) +./mad.sh:721: sed -i -e "s>^direct=${url/https:/http:}.*>#& #REMOVED#>g" "${InputFile}" #direct url https +./mad.sh:724: sed -i -e "s>^${url/https:/http:}.*>#&>g" "${InputFile}" #http (if changed) +./mad.sh:726: sed -i -e "s>^direct=${url/https:/http:}.*>#&>g" "${InputFile}" #direct url https +./mad.sh:752: sed -i -e "s>^${url/https:/http:}.*>${url}|${newfilename}>g" "${InputFile}" #http (if changed) +./mad.sh:754: sed -i -e "s>^direct=${url/https:/http:}.*>direct=${url}|${newfilename}>g" "${InputFile}" #direct url https +./mad.sh:779: sed -i -e "s>^${url/https:/http:}.*>#& #RETRY# ${filename} (dropped or bad size)>g" "${InputFile}" #http (if changed) +./mad.sh:781: sed -i -e "s>^direct=${url/https:/http:}.*>#& #RETRY# ${filename} (dropped or bad size)>g" "${InputFile}" #direct url https +./mad.sh:784: sed -i -e "s>^${url/https:/http:}.*>#&>g" "${InputFile}" #http (if changed) +./mad.sh:786: sed -i -e "s>^direct=${url/https:/http:}.*>#&>g" "${InputFile}" #direct url https +./mad.sh:802: sed -i -e "s>^${url/https:/http:}.*>#& #RETRY# (No CDN found)>g" "${InputFile}" #http (if changed) +./mad.sh:804: sed -i -e "s>^direct=${url/https:/http:}.*>#& #RETRY# (No CDN found)>g" "${InputFile}" #direct url https +./mad.sh:807: sed -i -e "s>^${url/https:/http:}.*>#&>g" "${InputFile}" #http (if changed) +./mad.sh:809: sed -i -e "s>^direct=${url/https:/http:}.*>#&>g" "${InputFile}" #direct url https +./mad.sh:828: sed -i -e "s>^${url/https:/http:}.*>#& #PASSWORD#>g" "${InputFile}" #http (if changed) +./mad.sh:830: sed -i -e "s>^direct=${url/https:/http:}.*>#& #PASSWORD#>g" "${InputFile}" #direct url https +./mad.sh:833: sed -i -e "s>^${url/https:/http:}.*>#&>g" "${InputFile}" #http (if changed) +./mad.sh:835: sed -i -e "s>^direct=${url/https:/http:}.*>#&>g" "${InputFile}" #direct url https +./mad.sh:855: sed -i -e "s>^${url/https:/http:}.*>#& #BAD-URL#${message}>g" "${InputFile}" #http (if changed) +./mad.sh:857: sed -i -e "s>^direct=${url/https:/http:}.*>#& #BAD-URL#${message}>g" "${InputFile}" #direct url https +./mad.sh:860: sed -i -e "s>^${url/https:/http:}.*>#&>g" "${InputFile}" #http (if changed) +./mad.sh:862: sed -i -e "s>^direct=${url/https:/http:}.*>#&>g" "${InputFile}" #direct url https +./mad.sh:880: sed -i -e "s>^${url/https:/http:}.*>#& #RETRY# ${filename} (No filename or size. Try again later)>g" "${InputFile}" #http (if changed) +./mad.sh:882: sed -i -e "s>^direct=${url/https:/http:}.*>#& #RETRY# ${filename} (No filename or size. Try again later)>g" "${InputFile}" #direct url https +./mad.sh:885: sed -i -e "s>^${url/https:/http:}.*>#&>g" "${InputFile}" #http (if changed) +./mad.sh:887: sed -i -e "s>^direct=${url/https:/http:}.*>#&>g" "${InputFile}" #direct url https +./mad.sh:906: sed -i -e "s>^${url/https:/http:}.*>#& #RETRY# ${filename} (File exists and is too large--retry or delete from downloads)>g" "${InputFile}" #http (if changed) +./mad.sh:908: sed -i -e "s>^direct=${url/https:/http:}.*>#& #RETRY# ${filename} (File exists and is too large--retry or delete from downloads)>g" "${InputFile}" #direct url https +./mad.sh:911: sed -i -e "s>^${url/https:/http:}.*>#&>g" "${InputFile}" #http (if changed) +./mad.sh:913: sed -i -e "s>^direct=${url/https:/http:}.*>#&>g" "${InputFile}" #direct url https +./mad.sh:1328: response=$(tor_curl_request --insecure -L -s https://github.com/lwthiker/curl-impersonate/releases/latest) +./mad.sh:1345: download_url='https://github.com/lwthiker/curl-impersonate/releases/download/'"$latestTag"'/curl-impersonate-'"$latestTag"'.x86_64-linux-gnu.tar.gz' +./mad.sh:1451: response=$(tor_curl_request --insecure -L -s https://github.com/lexiforest/curl-impersonate/releases/latest) +./mad.sh:1468: download_url='https://github.com/lexiforest/curl-impersonate/releases/download/'"$latestTag"'/curl-impersonate-'"$latestTag"'.x86_64-linux-gnu.tar.gz' +./mad.sh:1731: echo -e "${PINK}MAD Audit of http lines:${NC} (${GREEN}grep \"http:\" or \"https:\"${NC})" +./mad.sh:1759: echo -e "${PINK}MAD Audit of http lines:${NC} (${GREEN}grep \"http:\" or \"https:\"${NC})" +./mad.sh:1781: echo -e "${PINK}MAD Audit of http lines:${NC} (${GREEN}grep \"http:\" or \"https:\"${NC})" +./mad.sh:3085: if grep -Eqi '.onion' <<< "$download_url" && grep -Eqi 'https://' <<< "$download_url" ; then +./mad.sh:3495:arg2="$2" # auto, filelist, +./mad.sh:3592: echo -e " - http://oshi.at/abcd/origAABB.rar|My specified file.part1.rar" +./mad.sh:3594: echo -e " - direct=http://pomf2.lain.la/f/abcd00zz.7z" +./mad.sh:3596: echo -e ' - ie. direct=http://somehost.onion/abcD|filename.part1.rar' +./mad.sh:3815: if [[ ${remote_url} =~ ^http: ]] ; then +./mad.sh:3816: remote_url=${remote_url/http:/https:} +./mad.sh:3837: if [[ ${remote_url} =~ ^http: ]] ; then +./mad.sh:3838: remote_url=${remote_url/http:/https:} +./mad.sh:4204: if [[ ${remote_url} =~ ^http: ]] ; then +./mad.sh:4205: remote_url=${remote_url/http:/https:} +./mad.sh:4263: if [[ ${remote_url} =~ ^http: ]] ; then +./mad.sh:4264: remote_url=${remote_url/http:/https:} +./mad.sh:4289: if [[ ${remote_url} =~ ^http: ]] ; then +./mad.sh:4290: remote_url=${remote_url/http:/https:} +./plugins/pjscloud.sh:51: "https://PhantomJScloud.com/api/browser/v2/$RandomPjsKey/" & sleep 8s; kill -HUP $! 2>/dev/null) +./plugins/pjscloud.sh:59: "https://PhantomJScloud.com/api/browser/v2/$RandomPjsKey/" & sleep 8s; kill -HUP $! 2>/dev/null) + diff --git a/.audit/mad-audit-tor_curl-details.log b/.audit/mad-audit-tor_curl-details.log new file mode 100755 index 0000000..fef0833 --- /dev/null +++ b/.audit/mad-audit-tor_curl-details.log @@ -0,0 +1,2608 @@ +DateTime: 24.11.07 + +Files: +./hosts/1fichier.sh +./hosts/9saves.sh +./hosts/acid.sh +./hosts/anarchaserver.sh +./hosts/anonsharing.sh +./hosts/archived/nekofile.sh +./hosts/bedrive.sh +./hosts/biteblob.sh +./hosts/bowfile.sh +./hosts/click.sh +./hosts/dailyuploads.sh +./hosts/dataupload.sh +./hosts/dbree.sh +./hosts/depotkaz.sh +./hosts/discreetshare.sh +./hosts/dosya.sh +./hosts/downloadgg.sh +./hosts/eternalhosting.sh +./hosts/examples/ExampleNewHost.sh +./hosts/examples/up_example.sh +./hosts/filedoge.sh +./hosts/filedot.sh +./hosts/filehaus.sh +./hosts/filesquid.sh +./hosts/firestorage.sh +./hosts/free4e.sh +./hosts/gofile.sh +./hosts/harrault.sh +./hosts/hexload.sh +./hosts/innocent.sh +./hosts/kraken.sh +./hosts/lainsafe.sh +./hosts/lainsafe_onion.sh +./hosts/linxx.sh +./hosts/nantes.sh +./hosts/netlib.sh +./hosts/nippy.sh +./hosts/nofile.sh +./hosts/offshorecat.sh +./hosts/oshi.sh +./hosts/pixeldrain.sh +./hosts/ranoz.sh +./hosts/shareonline.sh +./hosts/soyjak.sh +./hosts/tempfileme.sh +./hosts/tempsh.sh +./hosts/turboonion.sh +./hosts/up2share.sh +./hosts/uploadee.sh +./hosts/uploadev.sh +./hosts/uploadflix.sh +./hosts/uploadhive.sh +./hosts/up_1fichier.sh +./hosts/up_acid.sh +./hosts/up_anarchaserver.sh +./hosts/up_anonsharing.sh +./hosts/up_axfc.sh +./hosts/up_bedrive.sh +./hosts/up_bowfile.sh +./hosts/up_dailyuploads.sh +./hosts/up_dataupload.sh +./hosts/up_dbree.sh +./hosts/up_depotkaz.sh +./hosts/up_dosya.sh +./hosts/up_filehaus.sh +./hosts/up_filesquid.sh +./hosts/up_firestorage.sh +./hosts/up_free4e.sh +./hosts/up_gofile.sh +./hosts/up_harrault.sh +./hosts/up_hexload.sh +./hosts/up_innocent.sh +./hosts/up_kouploader.sh +./hosts/up_kraken.sh +./hosts/up_linxx.sh +./hosts/up_nantes.sh +./hosts/up_netlib.sh +./hosts/up_nippy.sh +./hosts/up_nofile.sh +./hosts/up_oshi.sh +./hosts/up_ranoz.sh +./hosts/up_shareonline.sh +./hosts/up_soyjak.sh +./hosts/up_tempfileme.sh +./hosts/up_tempsh.sh +./hosts/up_turboonion.sh +./hosts/up_uploadev.sh +./hosts/up_uploadflix.sh +./hosts/up_uploadhive.sh +./hosts/up_uploadraja.sh +./hosts/up_yolobit.sh +./hosts/yolobit.sh +./hosts/youdbox.sh +./mad.sh +./plugins/AutoResetAndRetryDownloads.sh +./plugins/CatnapCtrlC.sh +./plugins/SkipUrlsInDownloadsCompletedTxt.sh +./plugins/examples/ExampleAddNewFuncAndCallOnSuccessfulDownload.sh +./plugins/examples/ExamplesMainHooks.sh +./plugins/ocr_captcha.sh +./plugins/pjscloud.sh + + +MAD Audit of tor_curl (+10 lines after): (grep "tor_curl") +_________________________________________________________________________ +./hosts/1fichier.sh:48: PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -s "${remote_url}") +./hosts/1fichier.sh:49: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/1fichier.sh:50: debugHtml "${remote_url##*/?}" "prechk$y" "${PAGE}" +./hosts/1fichier.sh:51: fi +./hosts/1fichier.sh:52: file_information=$(grep -oP '(?<=)[^<]*?(?=)' <<< "${PAGE}") +./hosts/1fichier.sh:53: size=$(echo "${file_information}" | tail -n 1) +./hosts/1fichier.sh:54: filename=$(echo "${file_information}" | head -n 1) +./hosts/1fichier.sh:55: if [ ! "$filename_override" == "" ] ; then +./hosts/1fichier.sh:56: filename="$filename_override" +./hosts/1fichier.sh:57: fi +./hosts/1fichier.sh:58: filename=$(sanitize_file_or_folder_name "${filename}") +-- +./hosts/1fichier.sh:155: cdn_request=$(tor_curl_request --insecure -s -L -b "${fich_cookie_jar}" -c "${fich_cookie_jar}" -F "submit=Download" -F "pass=${fich_user_provided_password}" -F "adz=${fich_adz_parameter}" "${remote_url}") +./hosts/1fichier.sh:156: target_file_link=$(echo "$cdn_request" | grep -A 2 '
' | grep -oP ' /dev/null ; then +./hosts/1fichier.sh:162: if $is_password_protected; then +./hosts/1fichier.sh:163: echo -e "${RED}ERROR: Incorrect password${NC}\nSince this download required a password, you might have copied it incorrectly?" +./hosts/1fichier.sh:164: passwordProtectedDownload "${remote_url}" +./hosts/1fichier.sh:165: exitDownloadError=true +-- +./hosts/1fichier.sh:189: file_header=$(tor_curl_request --insecure -sSIL -e "${remote_url}" "${target_file_link}") +./hosts/1fichier.sh:190: file_size_bytes=$(grep -oPi '(?<=content-length: ).*' <<< "$file_header") +./hosts/1fichier.sh:191: file_size_bytes=${file_size_bytes//[$'\t\r\n']} +./hosts/1fichier.sh:192: download_inflight_path="${WorkDir}/.inflight/" +./hosts/1fichier.sh:193: completed_location="${WorkDir}/downloads/" +./hosts/1fichier.sh:194: file_path="${download_inflight_path}${filename}" +./hosts/1fichier.sh:195: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/1fichier.sh:196: debugHtml "${remote_url##*/?}" "fich_savehead${num_attempt}_${j}" "target_file_link: ${target_file_link}"$'\n'"${file_header}" +./hosts/1fichier.sh:197: fi +./hosts/1fichier.sh:198: if [[ -z "$file_header" ]] || [[ -z "$file_size_bytes" ]]; then +./hosts/1fichier.sh:199: continue +-- +./hosts/1fichier.sh:256: tor_curl_request --insecure -e "${remote_url}" "${target_file_link}" -C - -o "${file_path}" +./hosts/1fichier.sh:257: rm -f "$flockDownload"; +./hosts/1fichier.sh:258: received_file_size=0 +./hosts/1fichier.sh:259: if [ -f "$file_path" ] ; then +./hosts/1fichier.sh:260: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/1fichier.sh:261: fi +./hosts/1fichier.sh:262: if [[ "${received_file_size}" -ne "${file_size_bytes}" ]]; then +./hosts/1fichier.sh:263: echo -e "${RED}ERROR: Size mismatch after downloading${NC}\nPerhaps you or 1fichier lost connection for a while?" +./hosts/1fichier.sh:264: if [ "${finalAttempt}" == "true" ] ; then +./hosts/1fichier.sh:265: droppedSizeBadDownload "${remote_url}" "${filename}" "${received_file_size}" +./hosts/1fichier.sh:266: fi +-- +./hosts/1fichier.sh:349: PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -c "${fich_cookie_jar}" -s "${remote_url}") +./hosts/1fichier.sh:350: if [[ -z ${PAGE} ]]; then +./hosts/1fichier.sh:351: rm -f "${fich_cookie_jar}" +./hosts/1fichier.sh:352: continue +./hosts/1fichier.sh:353: fi +./hosts/1fichier.sh:354: if grep -Eqi 'Warning !|Attention !' <<< "${PAGE}"; then +./hosts/1fichier.sh:355: rm -f "${fich_cookie_jar}" +./hosts/1fichier.sh:356: continue +./hosts/1fichier.sh:357: else +./hosts/1fichier.sh:358: fich_adz_parameter=$(grep -oPi 'name="adz" value="\K[^"]+' <<< "${PAGE}") +./hosts/1fichier.sh:359: if [[ $fich_adz_parameter ]]; then +-- +./hosts/9saves.sh:90: response=$(tor_curl_request --insecure -L -s -b "${ns_cookie_jar}" -c "${ns_cookie_jar}" "$remote_url") +./hosts/9saves.sh:91: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/9saves.sh:92: debugHtml "${remote_url##*/}" "ns_dwnpage$i" "${response}" +./hosts/9saves.sh:93: fi +./hosts/9saves.sh:94: if [[ -z $response ]] ; then +./hosts/9saves.sh:95: if [ $i == $maxfetchretries ] ; then +./hosts/9saves.sh:96: rm -f "${ns_cookie_jar}"; +./hosts/9saves.sh:97: printf "\\n" +./hosts/9saves.sh:98: echo -e "${RED}| Failed to extract post link.${NC}" +./hosts/9saves.sh:99: warnAndRetryUnknownError=true +./hosts/9saves.sh:100: if [ "${finalAttempt}" == "true" ] ; then +-- +./hosts/9saves.sh:139: response=$(tor_curl_request --insecure -L -s -X POST \ +./hosts/9saves.sh:140: -b "${ns_cookie_jar}" -c "${ns_cookie_jar}" \ +./hosts/9saves.sh:141: --data "$form_data" "https://9saves.com/") +./hosts/9saves.sh:142: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/9saves.sh:143: debugHtml "${remote_url##*/}" "ns_post" "form_data: ${form_data}"$'\n'"${response}" +./hosts/9saves.sh:144: fi +./hosts/9saves.sh:145: if [[ -z $response ]] ; then +./hosts/9saves.sh:146: rm -f "${ns_cookie_jar}"; +./hosts/9saves.sh:147: echo -e "${RED}| Failed to extract download link.${NC}" +./hosts/9saves.sh:148: warnAndRetryUnknownError=true +./hosts/9saves.sh:149: if [ "${finalAttempt}" == "true" ] ; then +-- +./hosts/9saves.sh:188: file_header=$(tor_curl_request --insecure --head -L -s -b "${ns_cookie_jar}" -c "${ns_cookie_jar}" "$download_url") +./hosts/9saves.sh:189: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/9saves.sh:190: debugHtml "${remote_url##*/}" "ns_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/9saves.sh:191: fi +./hosts/9saves.sh:192: if [[ -z $file_header ]] ; then +./hosts/9saves.sh:193: if [ $j == $maxfetchretries ] ; then +./hosts/9saves.sh:194: rm -f "${ns_cookie_jar}"; +./hosts/9saves.sh:195: printf "\\n" +./hosts/9saves.sh:196: echo -e "${RED}| Failed to extract file info.${NC}" +./hosts/9saves.sh:197: warnAndRetryUnknownError=true +./hosts/9saves.sh:198: if [ "${finalAttempt}" == "true" ] ; then +-- +./hosts/9saves.sh:292: tor_curl_request --insecure \ +./hosts/9saves.sh:293: -b "${ns_cookie_jar}" --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/9saves.sh:294: "$download_url" \ +./hosts/9saves.sh:295: --continue-at - --output "$file_path" +./hosts/9saves.sh:296: else +./hosts/9saves.sh:297: tor_curl_request --insecure \ +./hosts/9saves.sh:298: -b "${ns_cookie_jar}" \ +./hosts/9saves.sh:299: "$download_url" \ +./hosts/9saves.sh:300: --continue-at - --output "$file_path" +./hosts/9saves.sh:301: fi +./hosts/9saves.sh:302: else +./hosts/9saves.sh:303: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/9saves.sh:304: tor_curl_request --insecure \ +./hosts/9saves.sh:305: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/9saves.sh:306: -b "${ns_cookie_jar}" \ +./hosts/9saves.sh:307: -H "User-Agent: $RandomUA" \ +./hosts/9saves.sh:308: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/9saves.sh:309: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/9saves.sh:310: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/9saves.sh:311: -H "Connection: keep-alive" \ +./hosts/9saves.sh:312: -H "Cookie: lng=eng" \ +./hosts/9saves.sh:313: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/9saves.sh:314: -H "Sec-Fetch-Dest: document" \ +-- +./hosts/9saves.sh:321: tor_curl_request --insecure \ +./hosts/9saves.sh:322: -b "${ns_cookie_jar}" \ +./hosts/9saves.sh:323: -H "User-Agent: $RandomUA" \ +./hosts/9saves.sh:324: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/9saves.sh:325: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/9saves.sh:326: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/9saves.sh:327: -H "Connection: keep-alive" \ +./hosts/9saves.sh:328: -H "Cookie: lng=eng" \ +./hosts/9saves.sh:329: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/9saves.sh:330: -H "Sec-Fetch-Dest: document" \ +./hosts/9saves.sh:331: -H "Sec-Fetch-Mode: navigate" \ +-- +./hosts/anonsharing.sh:91: response=$(tor_curl_request --insecure -i -s \ +./hosts/anonsharing.sh:92: -b "${ansh_cookie_jar}" -c "${ansh_cookie_jar}" \ +./hosts/anonsharing.sh:93: -F "u=$fileid" \ +./hosts/anonsharing.sh:94: -F "p=true" \ +./hosts/anonsharing.sh:95: "https://anonsharing.com/account/ajax/file_details") +./hosts/anonsharing.sh:96: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/anonsharing.sh:97: debugHtml "${remote_url##*/}" "ansh_postfileinfo$i" "${response}" +./hosts/anonsharing.sh:98: fi +./hosts/anonsharing.sh:99: if [[ -z $response ]] ; then +./hosts/anonsharing.sh:100: rm -f "${ansh_cookie_jar}"; +./hosts/anonsharing.sh:101: if [ $i == $maxfetchretries ] ; then +-- +./hosts/anonsharing.sh:150: file_header=$(tor_curl_request --insecure --head -L -i -s \ +./hosts/anonsharing.sh:151: -b "${ansh_cookie_jar}" -c "${ansh_cookie_jar}" \ +./hosts/anonsharing.sh:152: "$download_url") +./hosts/anonsharing.sh:153: else +./hosts/anonsharing.sh:154: echo -e "${GREEN}# Fetching file info…${NC}" +./hosts/anonsharing.sh:155: ansh_host="${download_url/https:\/\//}" +./hosts/anonsharing.sh:156: ansh_host="${ansh_host%%\/*}" +./hosts/anonsharing.sh:157: rm -f "${WorkDir}/.temp/directhead" +./hosts/anonsharing.sh:158: file_header=$(tor_curl_request --insecure --head -H "Connection: keep-alive" -s -i \ +./hosts/anonsharing.sh:159: -H "Host: $ansh_host" \ +./hosts/anonsharing.sh:160: "$download_url" | +./hosts/anonsharing.sh:161: tee "${WorkDir}/.temp/directhead" & +./hosts/anonsharing.sh:162: sleep 6 +./hosts/anonsharing.sh:163: [ -s "${WorkDir}/.temp/directhead" ] +./hosts/anonsharing.sh:164: kill $! 2>/dev/null +./hosts/anonsharing.sh:165: ) +./hosts/anonsharing.sh:166: if [ ! -f "${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/}" ]; then +./hosts/anonsharing.sh:167: touch "${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/}" +./hosts/anonsharing.sh:168: fi +-- +./hosts/anonsharing.sh:273: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --output "$file_path" +./hosts/anonsharing.sh:274: else +./hosts/anonsharing.sh:275: tor_curl_request --insecure "$download_url" --output "$file_path" +./hosts/anonsharing.sh:276: fi +./hosts/anonsharing.sh:277: received_file_size=0 +./hosts/anonsharing.sh:278: if [ -f "$file_path" ] ; then +./hosts/anonsharing.sh:279: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/anonsharing.sh:280: fi +./hosts/anonsharing.sh:281: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./hosts/anonsharing.sh:282: containsHtml=false +./hosts/anonsharing.sh:283: else +./hosts/anonsharing.sh:284: containsHtml=true +./hosts/anonsharing.sh:285: fi +-- +./hosts/bedrive.sh:90: response=$(tor_curl_request --insecure -L -s \ +./hosts/bedrive.sh:91: -b "${bd_cookie_jar}" -c "${bd_cookie_jar}" \ +./hosts/bedrive.sh:92: "$remote_url") +./hosts/bedrive.sh:93: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/bedrive.sh:94: debugHtml "${remote_url##*/}" "bd_fetch$i" "${response}" +./hosts/bedrive.sh:95: fi +./hosts/bedrive.sh:96: if [[ -z $response ]] ; then +./hosts/bedrive.sh:97: rm -f "${bd_cookie_jar}"; +./hosts/bedrive.sh:98: if [ $i == $maxfetchretries ] ; then +./hosts/bedrive.sh:99: printf "\\n" +./hosts/bedrive.sh:100: echo -e "${RED}| Failed to extract download link.${NC}" +-- +./hosts/bedrive.sh:149: file_header=$(tor_curl_request --insecure --head -L -i -s \ +./hosts/bedrive.sh:150: -b "${bd_cookie_jar}" -c "${bd_cookie_jar}" \ +./hosts/bedrive.sh:151: "$download_url") +./hosts/bedrive.sh:152: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/bedrive.sh:153: debugHtml "${remote_url##*/}" "bd_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/bedrive.sh:154: fi +./hosts/bedrive.sh:155: if [[ -z $file_header ]] ; then +./hosts/bedrive.sh:156: if [ $j == $maxfetchretries ] ; then +./hosts/bedrive.sh:157: rm -f "${bd_cookie_jar}"; +./hosts/bedrive.sh:158: printf "\\n" +./hosts/bedrive.sh:159: echo -e "${RED}| Failed to extract file info.${NC}" +-- +./hosts/bedrive.sh:272: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/bedrive.sh:273: -b "${bd_cookie_jar}" -c "${bd_cookie_jar}" --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/bedrive.sh:274: --referer "$remote_url" "$download_url" \ +./hosts/bedrive.sh:275: --continue-at - --output "$file_path" +./hosts/bedrive.sh:276: else +./hosts/bedrive.sh:277: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/bedrive.sh:278: -b "${bd_cookie_jar}" -c "${bd_cookie_jar}" \ +./hosts/bedrive.sh:279: --referer "$remote_url" "$download_url" \ +./hosts/bedrive.sh:280: --continue-at - --output "$file_path" +./hosts/bedrive.sh:281: fi +./hosts/bedrive.sh:282: else +./hosts/bedrive.sh:283: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/bedrive.sh:284: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/bedrive.sh:285: -b "${bd_cookie_jar}" -c "${bd_cookie_jar}" --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/bedrive.sh:286: -H "User-Agent: $RandomUA" \ +./hosts/bedrive.sh:287: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/bedrive.sh:288: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/bedrive.sh:289: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/bedrive.sh:290: -H "Connection: keep-alive" \ +./hosts/bedrive.sh:291: -H "Cookie: lng=eng" \ +./hosts/bedrive.sh:292: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/bedrive.sh:293: -H "Sec-Fetch-Dest: document" \ +./hosts/bedrive.sh:294: -H "Sec-Fetch-Mode: navigate" \ +-- +./hosts/bedrive.sh:300: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/bedrive.sh:301: -b "${bd_cookie_jar}" -c "${bd_cookie_jar}" \ +./hosts/bedrive.sh:302: -H "User-Agent: $RandomUA" \ +./hosts/bedrive.sh:303: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/bedrive.sh:304: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/bedrive.sh:305: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/bedrive.sh:306: -H "Connection: keep-alive" \ +./hosts/bedrive.sh:307: -H "Cookie: lng=eng" \ +./hosts/bedrive.sh:308: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/bedrive.sh:309: -H "Sec-Fetch-Dest: document" \ +./hosts/bedrive.sh:310: -H "Sec-Fetch-Mode: navigate" \ +-- +./hosts/biteblob.sh:96: response=$(tor_curl_request --insecure -L -s "${fixed_url}") +./hosts/biteblob.sh:97: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/biteblob.sh:98: debugHtml "${remote_url##*/}" "bite_dwnpage$j" "url: $fixed_url"$'\n'"${response}" +./hosts/biteblob.sh:99: fi +./hosts/biteblob.sh:100: if [[ -z $response ]] ; then +./hosts/biteblob.sh:101: if [ $j == $maxfetchretries ] ; then +./hosts/biteblob.sh:102: printf "\\n" +./hosts/biteblob.sh:103: echo -e "${RED}| Failed to extract download link${NC}" +./hosts/biteblob.sh:104: warnAndRetryUnknownError=true +./hosts/biteblob.sh:105: if [ "${finalAttempt}" == "true" ] ; then +./hosts/biteblob.sh:106: failedRetryDownload "${remote_url}" "" "" +-- +./hosts/biteblob.sh:144: file_header=$(tor_curl_request --insecure --head -L -s "$download_url") +./hosts/biteblob.sh:145: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/biteblob.sh:146: debugHtml "${remote_url##*/}" "bite_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/biteblob.sh:147: fi +./hosts/biteblob.sh:148: if [[ -z $file_header ]] ; then +./hosts/biteblob.sh:149: if [ $j == $maxfetchretries ] ; then +./hosts/biteblob.sh:150: printf "\\n" +./hosts/biteblob.sh:151: echo -e "${RED}| Failed to extract file info.${NC}" +./hosts/biteblob.sh:152: warnAndRetryUnknownError=true +./hosts/biteblob.sh:153: if [ "${finalAttempt}" == "true" ] ; then +./hosts/biteblob.sh:154: failedRetryDownload "${remote_url}" "" "" +-- +./hosts/biteblob.sh:227: tor_curl_request --insecure --referer "$file_url" "$download_url" --output "$file_path" +./hosts/biteblob.sh:228: rc=$? +./hosts/biteblob.sh:229: if [ $rc -ne 0 ] ; then +./hosts/biteblob.sh:230: printf "${RED}Download Failed (bad exit status).${NC}" +./hosts/biteblob.sh:231: if [ -f ${file_path} ]; then +./hosts/biteblob.sh:232: printf "${YELLOW} Partial removed...${NC}" +./hosts/biteblob.sh:233: printf "\n\n" +./hosts/biteblob.sh:234: rm -f "${file_path}" +./hosts/biteblob.sh:235: else +./hosts/biteblob.sh:236: printf "\n\n" +./hosts/biteblob.sh:237: fi +-- +./hosts/biteblob.sh:271: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --continue-at - --output "$file_path" +./hosts/biteblob.sh:272: else +./hosts/biteblob.sh:273: tor_curl_request --insecure --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/biteblob.sh:274: fi +./hosts/biteblob.sh:275: received_file_size=0 +./hosts/biteblob.sh:276: if [ -f "$file_path" ] ; then +./hosts/biteblob.sh:277: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/biteblob.sh:278: fi +./hosts/biteblob.sh:279: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./hosts/biteblob.sh:280: containsHtml=false +./hosts/biteblob.sh:281: else +./hosts/biteblob.sh:282: containsHtml=true +./hosts/biteblob.sh:283: fi +-- +./hosts/bowfile.sh:91: response=$(tor_curl_request --insecure -L -s -b "${bow_cookie_jar}" -c "${bow_cookie_jar}" \ +./hosts/bowfile.sh:92: -w "\n\nHTTP_CODE: %{http_code}\nEFFECTIVE_URL: %{url_effective}\n" \ +./hosts/bowfile.sh:93: "$fixed_url") +./hosts/bowfile.sh:94: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/bowfile.sh:95: debugHtml "${remote_url##*/}" "bow_fetch$i" "${response}" +./hosts/bowfile.sh:96: fi +./hosts/bowfile.sh:97: if [[ -z $response ]] ; then +./hosts/bowfile.sh:98: rm -f "${bow_cookie_jar}"; +./hosts/bowfile.sh:99: if [ $i == $maxfetchretries ] ; then +./hosts/bowfile.sh:100: printf "\\n" +./hosts/bowfile.sh:101: echo -e "${RED}| Failed to extract token link [1].${NC}" +-- +./hosts/bowfile.sh:143: response=$(tor_curl_request --insecure -s --head \ +./hosts/bowfile.sh:144: -b "${bow_cookie_jar}" -c "${bow_cookie_jar}" \ +./hosts/bowfile.sh:145: -H "Host: bowfile.com" \ +./hosts/bowfile.sh:146: -w "\n\nHTTP_CODE: %{http_code}\nEFFECTIVE_URL: %{url_effective}\n" \ +./hosts/bowfile.sh:147: "$download_url") +./hosts/bowfile.sh:148: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/bowfile.sh:149: debugHtml "${remote_url##*/}" "bow_downurl" "download_url: ${download_url}"$'\n'"${response}" +./hosts/bowfile.sh:150: fi +./hosts/bowfile.sh:151: if [[ -z $response ]] ; then +./hosts/bowfile.sh:152: rm -f "${bow_cookie_jar}"; +./hosts/bowfile.sh:153: printf "\\n" +-- +./hosts/bowfile.sh:182: file_header=$(tor_curl_request --insecure -L -sS -i --head \ +./hosts/bowfile.sh:183: -H "Host: $fshost" \ +./hosts/bowfile.sh:184: -w "\n\nHTTP_CODE: %{http_code}\nEFFECTIVE_URL: %{url_effective}\n" \ +./hosts/bowfile.sh:185: "$download_url") +./hosts/bowfile.sh:186: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/bowfile.sh:187: debugHtml "${remote_url##*/}" "bow_head$j" "download_url: ${download_url}"$'\n'"download_token: ${dltoken}"$'\n'"${file_header}" +./hosts/bowfile.sh:188: fi +./hosts/bowfile.sh:189: if [[ -z $file_header ]] ; then +./hosts/bowfile.sh:190: if [ $j == $maxfetchretries ] ; then +./hosts/bowfile.sh:191: printf "\\n" +./hosts/bowfile.sh:192: echo -e "${RED}| Failed to extract file info${NC}" +-- +./hosts/bowfile.sh:299: tor_curl_request --insecure -L \ +./hosts/bowfile.sh:300: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/bowfile.sh:301: -H "Host: $fshost" \ +./hosts/bowfile.sh:302: --referer "https://bowfile.com/" \ +./hosts/bowfile.sh:303: "$download_url" --continue-at - --output "$file_path" +./hosts/bowfile.sh:304: else +./hosts/bowfile.sh:305: tor_curl_request --insecure -L \ +./hosts/bowfile.sh:306: -H "Host: $fshost" \ +./hosts/bowfile.sh:307: --referer "https://bowfile.com/" \ +./hosts/bowfile.sh:308: "$download_url" --continue-at - --output "$file_path" +./hosts/bowfile.sh:309: fi +./hosts/bowfile.sh:310: else +./hosts/bowfile.sh:311: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/bowfile.sh:312: tor_curl_request --insecure -L \ +./hosts/bowfile.sh:313: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/bowfile.sh:314: -H "Host: $fshost" \ +./hosts/bowfile.sh:315: -H "User-Agent: $RandomUA" \ +./hosts/bowfile.sh:316: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/bowfile.sh:317: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/bowfile.sh:318: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/bowfile.sh:319: -H "Connection: keep-alive" \ +./hosts/bowfile.sh:320: -H "Cookie: lng=eng" \ +./hosts/bowfile.sh:321: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/bowfile.sh:322: -H "Sec-Fetch-Dest: document" \ +-- +./hosts/bowfile.sh:329: tor_curl_request --insecure -L \ +./hosts/bowfile.sh:330: -H "Host: $fshost" \ +./hosts/bowfile.sh:331: -H "User-Agent: $RandomUA" \ +./hosts/bowfile.sh:332: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/bowfile.sh:333: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/bowfile.sh:334: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/bowfile.sh:335: -H "Connection: keep-alive" \ +./hosts/bowfile.sh:336: -H "Cookie: lng=eng" \ +./hosts/bowfile.sh:337: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/bowfile.sh:338: -H "Sec-Fetch-Dest: document" \ +./hosts/bowfile.sh:339: -H "Sec-Fetch-Mode: navigate" \ +-- +./hosts/click.sh:143: response=$(tor_curl_request --insecure -L -s -b "${click_cookie_jar}" -c "${click_cookie_jar}" \ +./hosts/click.sh:144: -w "\n\nHTTP_CODE: %{http_code}\nEFFECTIVE_URL: %{url_effective}\n" \ +./hosts/click.sh:145: "$fixed_url") +./hosts/click.sh:146: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/click.sh:147: debugHtml "${remote_url##*/}" "click_fetch$i" "${response}" +./hosts/click.sh:148: fi +./hosts/click.sh:149: if [[ -z $response ]] ; then +./hosts/click.sh:150: rm -f "${click_cookie_jar}"; +./hosts/click.sh:151: if [ $i == $maxfetchretries ] ; then +./hosts/click.sh:152: printf "\\n" +./hosts/click.sh:153: echo -e "${RED}| Failed to extract download link [1].${NC}" +-- +./hosts/click.sh:226: response=$(tor_curl_request --insecure -L -s -X POST \ +./hosts/click.sh:227: -b "${click_cookie_jar}" -c "${click_cookie_jar}" \ +./hosts/click.sh:228: --data "$form_data" "$fixed_url") +./hosts/click.sh:229: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/click.sh:230: debugHtml "${remote_url##*/}" "click_post1_$i" "url: ${fixed_url}"$'\n'"form_data: ${form_data}"$'\n'"${response}" +./hosts/click.sh:231: fi +./hosts/click.sh:232: if [[ -z $response ]] ; then +./hosts/click.sh:233: if [ $i == $maxfetchretries ] ; then +./hosts/click.sh:234: rm -f "${click_cookie_jar}"; +./hosts/click.sh:235: printf "\\n" +./hosts/click.sh:236: echo -e "${RED}| Failed to extract download link [2].${NC}" +-- +./hosts/click.sh:345: response=$(tor_curl_request --insecure -L -s -X POST \ +./hosts/click.sh:346: -b "${click_cookie_jar}" -c "${click_cookie_jar}" \ +./hosts/click.sh:347: --data "$form_data" "$fixed_url") +./hosts/click.sh:348: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/click.sh:349: debugHtml "${remote_url##*/}" "click_post2_$i" "url: ${fixed_url}"$'\n'"form_data: ${form_data}"$'\n'"${response}" +./hosts/click.sh:350: fi +./hosts/click.sh:351: if [[ -z $response ]] ; then +./hosts/click.sh:352: if [ $i == $maxfetchretries ] ; then +./hosts/click.sh:353: rm -f "${click_cookie_jar}"; +./hosts/click.sh:354: printf "\\n" +./hosts/click.sh:355: echo -e "${RED}| Failed to extract download link [3].${NC}" +-- +./hosts/click.sh:434: file_header=$(tor_curl_request --insecure -L --head -s --referer "${fixed_url}" "$download_url") +./hosts/click.sh:435: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/click.sh:436: debugHtml "${remote_url##*/}" "click_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/click.sh:437: fi +./hosts/click.sh:438: if [[ -z $file_header ]] ; then +./hosts/click.sh:439: if [ $j == $maxfetchretries ] ; then +./hosts/click.sh:440: rm -f "${click_cookie_jar}"; +./hosts/click.sh:441: printf "\\n" +./hosts/click.sh:442: echo -e "${RED}| Failed to extract file info${NC}" +./hosts/click.sh:443: warnAndRetryUnknownError=true +./hosts/click.sh:444: if [ "${finalAttempt}" == "true" ] ; then +-- +./hosts/click.sh:535: tor_curl_request --insecure \ +./hosts/click.sh:536: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/click.sh:537: -b "${click_cookie_jar}" -c "${click_cookie_jar}" \ +./hosts/click.sh:538: -H "Host: $click_host" \ +./hosts/click.sh:539: --referer "$post_referer" \ +./hosts/click.sh:540: "$download_url" --continue-at - --output "$file_path" +./hosts/click.sh:541: else +./hosts/click.sh:542: tor_curl_request --insecure \ +./hosts/click.sh:543: -b "${click_cookie_jar}" -c "${click_cookie_jar}" \ +./hosts/click.sh:544: -H "Host: $click_host" \ +./hosts/click.sh:545: --referer "$post_referer" \ +./hosts/click.sh:546: "$download_url" --continue-at - --output "$file_path" +./hosts/click.sh:547: fi +./hosts/click.sh:548: else +./hosts/click.sh:549: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/click.sh:550: tor_curl_request --insecure \ +./hosts/click.sh:551: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/click.sh:552: -b "${click_cookie_jar}" -c "${click_cookie_jar}" \ +./hosts/click.sh:553: -H "Host: $click_host" \ +./hosts/click.sh:554: -H "User-Agent: $RandomUA" \ +./hosts/click.sh:555: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/click.sh:556: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/click.sh:557: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/click.sh:558: -H "Connection: keep-alive" \ +./hosts/click.sh:559: -H "Cookie: lng=eng" \ +./hosts/click.sh:560: -H "Upgrade-Insecure-Requests: 1" \ +-- +./hosts/click.sh:568: tor_curl_request --insecure \ +./hosts/click.sh:569: -b "${click_cookie_jar}" -c "${click_cookie_jar}" \ +./hosts/click.sh:570: -H "Host: $click_host" \ +./hosts/click.sh:571: -H "User-Agent: $RandomUA" \ +./hosts/click.sh:572: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/click.sh:573: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/click.sh:574: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/click.sh:575: -H "Connection: keep-alive" \ +./hosts/click.sh:576: -H "Cookie: lng=eng" \ +./hosts/click.sh:577: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/click.sh:578: -H "Sec-Fetch-Dest: document" \ +-- +./hosts/dailyuploads.sh:97: response=$(tor_curl_request --insecure -L -s -b "${daily_cookie_jar}" -c "${daily_cookie_jar}" \ +./hosts/dailyuploads.sh:98: -w "\n\nHTTP_CODE: %{http_code}\nEFFECTIVE_URL: %{url_effective}\n" \ +./hosts/dailyuploads.sh:99: "$fixed_url") +./hosts/dailyuploads.sh:100: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/dailyuploads.sh:101: debugHtml "${remote_url##*/}" "daily_fetch$i" "${response}" +./hosts/dailyuploads.sh:102: fi +./hosts/dailyuploads.sh:103: if [[ -z $response ]] ; then +./hosts/dailyuploads.sh:104: rm -f "${daily_cookie_jar}"; +./hosts/dailyuploads.sh:105: if [ $i == $maxfetchretries ] ; then +./hosts/dailyuploads.sh:106: printf "\\n" +./hosts/dailyuploads.sh:107: echo -e "${RED}| Failed to extract download link [1].${NC}" +-- +./hosts/dailyuploads.sh:139: tor_curl_request --insecure -s "$captcha_img_url" --output "$tmp_captcha_img" +./hosts/dailyuploads.sh:140: captcha_ocr_output=$(CaptchaOcrImage "$tmp_captcha_img" "NUMBERONLY" "ContrastStretch_5x90,Brightness_130") +./hosts/dailyuploads.sh:141: if [ "${DebugPluginsEnabled}" == "true" ]; then +./hosts/dailyuploads.sh:142: printf "\\n" +./hosts/dailyuploads.sh:143: echo -e "$captcha_ocr_output" +./hosts/dailyuploads.sh:144: fi +./hosts/dailyuploads.sh:145: captcha_code=$(grep -oP -m 1 "(?<=\[CAPTCHA_CODE\:).*?(?=\])" <<< "$captcha_ocr_output") +./hosts/dailyuploads.sh:146: rm -f "$tmp_captcha_img" +./hosts/dailyuploads.sh:147: rm -f "$captcha_ocr_output" +./hosts/dailyuploads.sh:148: local caplength=${#captcha_code} +./hosts/dailyuploads.sh:149: if [ -z "$captcha_code" ] || ((caplength != 4)) ; then +-- +./hosts/dailyuploads.sh:286: response=$(tor_curl_request --insecure -L -s -X POST \ +./hosts/dailyuploads.sh:287: -b "${daily_cookie_jar}" -c "${daily_cookie_jar}" \ +./hosts/dailyuploads.sh:288: --data "$form_data" "$fixed_url") +./hosts/dailyuploads.sh:289: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/dailyuploads.sh:290: debugHtml "${remote_url##*/}" "daily_post2_$i" "url: ${fixed_url}"$'\n'"form_data: ${form_data}"$'\n'"${response}" +./hosts/dailyuploads.sh:291: fi +./hosts/dailyuploads.sh:292: fi +./hosts/dailyuploads.sh:293: if [[ -z $response ]] ; then +./hosts/dailyuploads.sh:294: if [ $i == $maxfetchretries ] ; then +./hosts/dailyuploads.sh:295: rm -f "${daily_cookie_jar}"; +./hosts/dailyuploads.sh:296: printf "\\n" +-- +./hosts/dailyuploads.sh:392: file_header=$(tor_curl_request -i -s --head \ +./hosts/dailyuploads.sh:393: -b "${daily_cookie_jar}" -c "${daily_cookie_jar}" \ +./hosts/dailyuploads.sh:394: --referer "${fixed_url}" \ +./hosts/dailyuploads.sh:395: "$download_url") +./hosts/dailyuploads.sh:396: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/dailyuploads.sh:397: debugHtml "${remote_url##*/}" "daily_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/dailyuploads.sh:398: fi +./hosts/dailyuploads.sh:399: if [[ -z $file_header ]] ; then +./hosts/dailyuploads.sh:400: if [ $j == $maxfetchretries ] ; then +./hosts/dailyuploads.sh:401: rm -f "${daily_cookie_jar}"; +./hosts/dailyuploads.sh:402: printf "\\n" +-- +./hosts/dailyuploads.sh:498: tor_curl_request --insecure \ +./hosts/dailyuploads.sh:499: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/dailyuploads.sh:500: -b "${daily_cookie_jar}" -c "${daily_cookie_jar}" \ +./hosts/dailyuploads.sh:501: --referer "${fixed_url}" \ +./hosts/dailyuploads.sh:502: "$download_url" --continue-at - --output "$file_path" +./hosts/dailyuploads.sh:503: else +./hosts/dailyuploads.sh:504: tor_curl_request --insecure \ +./hosts/dailyuploads.sh:505: -b "${daily_cookie_jar}" -c "${daily_cookie_jar}" \ +./hosts/dailyuploads.sh:506: --referer "${fixed_url}" \ +./hosts/dailyuploads.sh:507: "$download_url" --continue-at - --output "$file_path" +./hosts/dailyuploads.sh:508: fi +./hosts/dailyuploads.sh:509: else +./hosts/dailyuploads.sh:510: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/dailyuploads.sh:511: tor_curl_request --insecure \ +./hosts/dailyuploads.sh:512: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/dailyuploads.sh:513: -H "User-Agent: $RandomUA" \ +./hosts/dailyuploads.sh:514: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/dailyuploads.sh:515: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/dailyuploads.sh:516: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/dailyuploads.sh:517: -H "Connection: keep-alive" \ +./hosts/dailyuploads.sh:518: -H "Cookie: lng=eng" \ +./hosts/dailyuploads.sh:519: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/dailyuploads.sh:520: -H "Sec-Fetch-Dest: document" \ +./hosts/dailyuploads.sh:521: -H "Sec-Fetch-Mode: navigate" \ +-- +./hosts/dailyuploads.sh:528: tor_curl_request --insecure \ +./hosts/dailyuploads.sh:529: -H "User-Agent: $RandomUA" \ +./hosts/dailyuploads.sh:530: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/dailyuploads.sh:531: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/dailyuploads.sh:532: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/dailyuploads.sh:533: -H "Connection: keep-alive" \ +./hosts/dailyuploads.sh:534: -H "Cookie: lng=eng" \ +./hosts/dailyuploads.sh:535: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/dailyuploads.sh:536: -H "Sec-Fetch-Dest: document" \ +./hosts/dailyuploads.sh:537: -H "Sec-Fetch-Mode: navigate" \ +./hosts/dailyuploads.sh:538: -H "Sec-Fetch-Site: same-origin" \ +-- +./hosts/dataupload.sh:90: response=$(tor_curl_request --insecure -L -s -b "${dup_cookie_jar}" -c "${dup_cookie_jar}" "$remote_url") +./hosts/dataupload.sh:91: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/dataupload.sh:92: debugHtml "${remote_url##*/}" "dup_dwnpage$i" "${response}" +./hosts/dataupload.sh:93: fi +./hosts/dataupload.sh:94: if [[ -z $response ]] ; then +./hosts/dataupload.sh:95: rm -f "${dup_cookie_jar}"; +./hosts/dataupload.sh:96: if [ $i == $maxfetchretries ] ; then +./hosts/dataupload.sh:97: printf "\\n" +./hosts/dataupload.sh:98: echo -e "${RED}| Failed to extract download link.${NC}" +./hosts/dataupload.sh:99: warnAndRetryUnknownError=true +./hosts/dataupload.sh:100: if [ "${finalAttempt}" == "true" ] ; then +-- +./hosts/dataupload.sh:166: response=$(tor_curl_request --insecure -svo. -X POST \ +./hosts/dataupload.sh:167: -b "${dup_cookie_jar}" -c "${dup_cookie_jar}" \ +./hosts/dataupload.sh:168: --data-raw "$form_data" "$post_action" 2>&1) +./hosts/dataupload.sh:169: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/dataupload.sh:170: debugHtml "${remote_url##*/}" "dup_post" "post_action: ${post_action}"$'\n'"form_data: ${form_data}"$'\n'"${response}" +./hosts/dataupload.sh:171: fi +./hosts/dataupload.sh:172: if [[ -z $response ]] ; then +./hosts/dataupload.sh:173: if [ $i == $maxfetchretries ] ; then +./hosts/dataupload.sh:174: rm -f "${dup_cookie_jar}"; +./hosts/dataupload.sh:175: printf "\\n" +./hosts/dataupload.sh:176: echo -e "${RED}| Failed to extract download link [3].${NC}" +-- +./hosts/dataupload.sh:234: file_header=$(tor_curl_request --insecure -L --head -s "$download_url") +./hosts/dataupload.sh:235: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/dataupload.sh:236: debugHtml "${remote_url##*/}" "dup_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/dataupload.sh:237: fi +./hosts/dataupload.sh:238: if [[ -z $file_header ]] ; then +./hosts/dataupload.sh:239: if [ $j == $maxfetchretries ] ; then +./hosts/dataupload.sh:240: rm -f "${dup_cookie_jar}"; +./hosts/dataupload.sh:241: printf "\\n" +./hosts/dataupload.sh:242: echo -e "${RED}| Failed to extract file info [1]${NC}" +./hosts/dataupload.sh:243: warnAndRetryUnknownError=true +./hosts/dataupload.sh:244: if [ "${finalAttempt}" == "true" ] ; then +-- +./hosts/dataupload.sh:351: tor_curl_request --insecure \ +./hosts/dataupload.sh:352: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/dataupload.sh:353: -b "${dup_cookie_jar}" -c "${dup_cookie_jar}" \ +./hosts/dataupload.sh:354: -H "Host: dataupload.net" \ +./hosts/dataupload.sh:355: "$download_url" --continue-at - --output "$file_path" +./hosts/dataupload.sh:356: else +./hosts/dataupload.sh:357: tor_curl_request --insecure \ +./hosts/dataupload.sh:358: -b "${dup_cookie_jar}" -c "${dup_cookie_jar}" \ +./hosts/dataupload.sh:359: -H "Host: dataupload.net" \ +./hosts/dataupload.sh:360: "$download_url" --continue-at - --output "$file_path" +./hosts/dataupload.sh:361: fi +./hosts/dataupload.sh:362: else +./hosts/dataupload.sh:363: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/dataupload.sh:364: tor_curl_request --insecure \ +./hosts/dataupload.sh:365: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/dataupload.sh:366: -b "${dup_cookie_jar}" -c "${dup_cookie_jar}" \ +./hosts/dataupload.sh:367: -H "Host: dataupload.net" \ +./hosts/dataupload.sh:368: -H "User-Agent: $RandomUA" \ +./hosts/dataupload.sh:369: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/dataupload.sh:370: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/dataupload.sh:371: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/dataupload.sh:372: -H "Connection: keep-alive" \ +./hosts/dataupload.sh:373: -H "Cookie: lng=eng" \ +./hosts/dataupload.sh:374: -H "Upgrade-Insecure-Requests: 1" \ +-- +./hosts/dataupload.sh:381: tor_curl_request --insecure \ +./hosts/dataupload.sh:382: -b "${dup_cookie_jar}" -c "${dup_cookie_jar}" \ +./hosts/dataupload.sh:383: -H "Host: dataupload.net" \ +./hosts/dataupload.sh:384: -H "User-Agent: $RandomUA" \ +./hosts/dataupload.sh:385: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/dataupload.sh:386: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/dataupload.sh:387: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/dataupload.sh:388: -H "Connection: keep-alive" \ +./hosts/dataupload.sh:389: -H "Cookie: lng=eng" \ +./hosts/dataupload.sh:390: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/dataupload.sh:391: -H "Sec-Fetch-Dest: document" \ +-- +./hosts/dosya.sh:109: PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -L -s \ +./hosts/dosya.sh:110: -c "${dosya_cookie_jar}" \ +./hosts/dosya.sh:111: "${remote_url}") +./hosts/dosya.sh:112: else +./hosts/dosya.sh:113: PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -L -s \ +./hosts/dosya.sh:114: -H "User-Agent: $RandomUA" \ +./hosts/dosya.sh:115: -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' \ +./hosts/dosya.sh:116: -H 'Accept-Language: en-US,en;q=0.5' \ +./hosts/dosya.sh:117: -H 'Accept-Encoding: gzip, deflate, br' -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' \ +./hosts/dosya.sh:118: -H 'Sec-Fetch-Dest: document' -H 'Sec-Fetch-Mode: navigate' -H 'Sec-Fetch-Site: none' -H 'Sec-Fetch-User: ?1' \ +./hosts/dosya.sh:119: -c "${dosya_cookie_jar}" \ +./hosts/dosya.sh:120: "${remote_url}") +./hosts/dosya.sh:121: fi +./hosts/dosya.sh:122: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/dosya.sh:123: debugHtml "${remote_url##*/}" "dos_fetch_$i" "remote_url: ${remote_url}"$'\n'"User-Agent: $RandomUA"$'\n'"${PAGE}" +-- +./hosts/dosya.sh:173: file_header=$(tor_curl_request_extended --insecure --head -L -s \ +./hosts/dosya.sh:174: -H "Cookie: filehosting=$cookie_filehosting" \ +./hosts/dosya.sh:175: -H "Host: www.dosyaupload.com" \ +./hosts/dosya.sh:176: -w "\n\nHTTP_CODE: %{http_code}\nEFFECTIVE_URL: %{url_effective}\n" \ +./hosts/dosya.sh:177: -b "${dosya_cookie_jar}" -c "${dosya_cookie_jar}" "$dos_url") +./hosts/dosya.sh:178: else +./hosts/dosya.sh:179: file_header=$(tor_curl_request_extended --insecure --head -L -s \ +./hosts/dosya.sh:180: -w "\n\nHTTP_CODE: %{http_code}\nEFFECTIVE_URL: %{url_effective}\n" \ +./hosts/dosya.sh:181: -H "User-Agent: $RandomUA" \ +./hosts/dosya.sh:182: -H "Cookie: filehosting=$cookie_filehosting" \ +./hosts/dosya.sh:183: -H "Host: www.dosyaupload.com" \ +./hosts/dosya.sh:184: -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' \ +./hosts/dosya.sh:185: -H 'Accept-Language: en-US,en;q=0.5' \ +./hosts/dosya.sh:186: -H 'Accept-Encoding: gzip, deflate, br' \ +./hosts/dosya.sh:187: -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' \ +./hosts/dosya.sh:188: -H 'Sec-Fetch-Dest: document' -H 'Sec-Fetch-Mode: navigate' -H 'Sec-Fetch-Site: none' -H 'Sec-Fetch-User: ?1' \ +./hosts/dosya.sh:189: -b "${dosya_cookie_jar}" -c "${dosya_cookie_jar}" "$dos_url") +-- +./hosts/dosya.sh:402: tor_curl_request -L -G --insecure \ +./hosts/dosya.sh:403: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/jxl,image/webp,*/*;q=0.8" \ +./hosts/dosya.sh:404: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/dosya.sh:405: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/dosya.sh:406: -H "Connection: keep-alive" \ +./hosts/dosya.sh:407: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/dosya.sh:408: -H "Sec-Fetch-Dest: document" \ +./hosts/dosya.sh:409: -H "Sec-Fetch-Mode: navigate" \ +./hosts/dosya.sh:410: -H "Sec-Fetch-Site: none" \ +./hosts/dosya.sh:411: -H "Sec-Fetch-User: ?1" \ +./hosts/dosya.sh:412: -H "DNT: 1" \ +-- +./hosts/dosya.sh:417: tor_curl_request -L -G --insecure \ +./hosts/dosya.sh:418: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/jxl,image/webp,*/*;q=0.8" \ +./hosts/dosya.sh:419: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/dosya.sh:420: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/dosya.sh:421: -H "Connection: keep-alive" \ +./hosts/dosya.sh:422: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/dosya.sh:423: -H "Sec-Fetch-Dest: document" \ +./hosts/dosya.sh:424: -H "Sec-Fetch-Mode: navigate" \ +./hosts/dosya.sh:425: -H "Sec-Fetch-Site: none" \ +./hosts/dosya.sh:426: -H "Sec-Fetch-User: ?1" \ +./hosts/dosya.sh:427: -H "DNT: 1" \ +-- +./hosts/downloadgg.sh:90: response=$(tor_curl_request --insecure -L -s -b "${dgg_cookie_jar}" -c "${dgg_cookie_jar}" "$remote_url") +./hosts/downloadgg.sh:91: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/downloadgg.sh:92: debugHtml "${remote_url##*/}" "dgg_dwnpage$i" "${response}" +./hosts/downloadgg.sh:93: fi +./hosts/downloadgg.sh:94: if [[ -z $response ]] ; then +./hosts/downloadgg.sh:95: rm -f "${dgg_cookie_jar}"; +./hosts/downloadgg.sh:96: if [ $i == $maxfetchretries ] ; then +./hosts/downloadgg.sh:97: printf "\\n" +./hosts/downloadgg.sh:98: echo -e "${RED}| Failed to extract download link.${NC}" +./hosts/downloadgg.sh:99: warnAndRetryUnknownError=true +./hosts/downloadgg.sh:100: if [ "${finalAttempt}" == "true" ] ; then +-- +./hosts/downloadgg.sh:169: response=$(tor_curl_request --insecure -svo. -X POST \ +./hosts/downloadgg.sh:170: -b "${dgg_cookie_jar}" -c "${dgg_cookie_jar}" \ +./hosts/downloadgg.sh:171: --data-raw "$form_data" "$post_action" 2>&1) +./hosts/downloadgg.sh:172: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/downloadgg.sh:173: debugHtml "${remote_url##*/}" "dgg_post" "post_action: ${post_action}"$'\n'"form_data: ${form_data}"$'\n'"${response}" +./hosts/downloadgg.sh:174: fi +./hosts/downloadgg.sh:175: if [[ -z $response ]] ; then +./hosts/downloadgg.sh:176: echo -e "${RED}| Failed to extract download link${NC}" +./hosts/downloadgg.sh:177: warnAndRetryUnknownError=true +./hosts/downloadgg.sh:178: if [ "${finalAttempt}" == "true" ] ; then +./hosts/downloadgg.sh:179: rm -f "${dgg_cookie_jar}"; +-- +./hosts/downloadgg.sh:257: tor_curl_request --insecure -X POST \ +./hosts/downloadgg.sh:258: -b "${dgg_cookie_jar}" -c "${dgg_cookie_jar}" --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/downloadgg.sh:259: -H "Host: download.gg" \ +./hosts/downloadgg.sh:260: -H "Origin: https://download.gg" \ +./hosts/downloadgg.sh:261: --referer "$remote_url" \ +./hosts/downloadgg.sh:262: --data "$form_data" "$post_action" \ +./hosts/downloadgg.sh:263: --output "$file_path" +./hosts/downloadgg.sh:264: else +./hosts/downloadgg.sh:265: tor_curl_request --insecure -X POST \ +./hosts/downloadgg.sh:266: -b "${dgg_cookie_jar}" -c "${dgg_cookie_jar}" \ +./hosts/downloadgg.sh:267: -H "Host: download.gg" \ +./hosts/downloadgg.sh:268: -H "Origin: https://download.gg" \ +./hosts/downloadgg.sh:269: --referer "$remote_url" \ +./hosts/downloadgg.sh:270: --data "$form_data" "$post_action" \ +./hosts/downloadgg.sh:271: --output "$file_path" +./hosts/downloadgg.sh:272: fi +./hosts/downloadgg.sh:273: else +./hosts/downloadgg.sh:274: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/downloadgg.sh:275: tor_curl_request --insecure -X POST \ +./hosts/downloadgg.sh:276: -b "${dgg_cookie_jar}" -c "${dgg_cookie_jar}" --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/downloadgg.sh:277: -H "Host: download.gg" \ +./hosts/downloadgg.sh:278: -H "Origin: https://download.gg" \ +./hosts/downloadgg.sh:279: -H "User-Agent: $RandomUA" \ +./hosts/downloadgg.sh:280: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/downloadgg.sh:281: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/downloadgg.sh:282: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/downloadgg.sh:283: -H "Connection: keep-alive" \ +./hosts/downloadgg.sh:284: -H "Cookie: lng=eng" \ +./hosts/downloadgg.sh:285: -H "Upgrade-Insecure-Requests: 1" \ +-- +./hosts/downloadgg.sh:294: tor_curl_request --insecure -X POST \ +./hosts/downloadgg.sh:295: -b "${dgg_cookie_jar}" -c "${dgg_cookie_jar}" \ +./hosts/downloadgg.sh:296: -H "Host: download.gg" \ +./hosts/downloadgg.sh:297: -H "Origin: https://download.gg" \ +./hosts/downloadgg.sh:298: -H "User-Agent: $RandomUA" \ +./hosts/downloadgg.sh:299: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/downloadgg.sh:300: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/downloadgg.sh:301: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/downloadgg.sh:302: -H "Connection: keep-alive" \ +./hosts/downloadgg.sh:303: -H "Cookie: lng=eng" \ +./hosts/downloadgg.sh:304: -H "Upgrade-Insecure-Requests: 1" \ +-- +./hosts/examples/ExampleNewHost.sh:102: file_header=$(tor_curl_request --insecure -L --head -s --referer "${remote_url//\.org/\.cc}" "$download_url") +./hosts/examples/ExampleNewHost.sh:103: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/examples/ExampleNewHost.sh:104: debugHtml "${remote_url##*/}" "fh_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/examples/ExampleNewHost.sh:105: fi +./hosts/examples/ExampleNewHost.sh:106: if [ ! -z "$file_header" ] ; then +./hosts/examples/ExampleNewHost.sh:107: if grep -Eqi '404 Not Found' <<< "${file_header}" ; then +./hosts/examples/ExampleNewHost.sh:108: if [ $j == $maxfetchretries ] ; then +./hosts/examples/ExampleNewHost.sh:109: printf "\\n" +./hosts/examples/ExampleNewHost.sh:110: echo -e "${RED}| The file has been removed (404).${NC}" +./hosts/examples/ExampleNewHost.sh:111: removedDownload "${remote_url}" +./hosts/examples/ExampleNewHost.sh:112: exitDownloadNotAvailable=true +-- +./hosts/examples/ExampleNewHost.sh:199: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval --referer "$download_url" "$download_url" --continue-at - --output "$file_path" +./hosts/examples/ExampleNewHost.sh:200: else +./hosts/examples/ExampleNewHost.sh:201: tor_curl_request --insecure --referer "$download_url" "$download_url" --continue-at - --output "$file_path" +./hosts/examples/ExampleNewHost.sh:202: fi +./hosts/examples/ExampleNewHost.sh:203: received_file_size=0 +./hosts/examples/ExampleNewHost.sh:204: if [ -f "$file_path" ] ; then +./hosts/examples/ExampleNewHost.sh:205: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/examples/ExampleNewHost.sh:206: fi +./hosts/examples/ExampleNewHost.sh:207: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./hosts/examples/ExampleNewHost.sh:208: containsHtml=false +./hosts/examples/ExampleNewHost.sh:209: else +./hosts/examples/ExampleNewHost.sh:210: containsHtml=true +./hosts/examples/ExampleNewHost.sh:211: fi +-- +./hosts/examples/up_example.sh:112: response=$(tor_curl_upload --insecure \ +./hosts/examples/up_example.sh:113: -F "files[]=@${arrFiles[@]}" \ +./hosts/examples/up_example.sh:114: -F "expire=129600" \ +./hosts/examples/up_example.sh:115: -F "autodestroy=0" \ +./hosts/examples/up_example.sh:116: -F "randomizefn=0" \ +./hosts/examples/up_example.sh:117: -F "shorturl=0" \ +./hosts/examples/up_example.sh:118: "${PostUrlHost}") +./hosts/examples/up_example.sh:119: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/examples/up_example.sh:120: debugHtml "${remote_url##*/}" "${_hostCode}_dwnpage$j" "post_url: ${PostUrlHost}"$'\n'"${response}" +./hosts/examples/up_example.sh:121: fi +./hosts/examples/up_example.sh:122: successUpload "$pline" "${filepath}" "${_hostCode}" "${filesize}" "${downloadLink}" "{$responseHtml}" +-- +./hosts/filedot.sh:112: PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -L -s \ +./hosts/filedot.sh:113: -H "User-Agent: $RandomUA" \ +./hosts/filedot.sh:114: -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' \ +./hosts/filedot.sh:115: -H 'Accept-Language: en-US,en;q=0.5' \ +./hosts/filedot.sh:116: -H 'Accept-Encoding: gzip, deflate, br' -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' \ +./hosts/filedot.sh:117: -H 'Sec-Fetch-Dest: document' -H 'Sec-Fetch-Mode: navigate' -H 'Sec-Fetch-Site: none' -H 'Sec-Fetch-User: ?1' \ +./hosts/filedot.sh:118: -c "${fdot_cookie_jar}" \ +./hosts/filedot.sh:119: "https://filedot.to/login.html") +./hosts/filedot.sh:120: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/filedot.sh:121: debugHtml "${remote_url##*/}" "fdot_login_$a" "${PAGE}" +./hosts/filedot.sh:122: fi +-- +./hosts/filedot.sh:153: resp_login=$(tor_curl_request --insecure -L -s \ +./hosts/filedot.sh:154: -H "Host: filedot.to" \ +./hosts/filedot.sh:155: -H "User-Agent: $RandomUA" \ +./hosts/filedot.sh:156: -H "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/filedot.sh:157: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/filedot.sh:158: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/filedot.sh:159: -H "Content-Type: application/x-www-form-urlencoded" \ +./hosts/filedot.sh:160: -H "Origin: https://filedot.to" \ +./hosts/filedot.sh:161: -H "Connection: keep-alive" \ +./hosts/filedot.sh:162: -H "Referer: https://filedot.to/login.html" \ +./hosts/filedot.sh:163: -H "DNT: 1" \ +-- +./hosts/filedot.sh:240: response=$(tor_curl_request --insecure -L -s \ +./hosts/filedot.sh:241: -H "Host: filedot.to" \ +./hosts/filedot.sh:242: -H "User-Agent: $RandomUA" \ +./hosts/filedot.sh:243: -H "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/filedot.sh:244: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/filedot.sh:245: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/filedot.sh:246: -H "Content-Type: application/x-www-form-urlencoded" \ +./hosts/filedot.sh:247: -H "Origin: https://filedot.to" \ +./hosts/filedot.sh:248: -H "Connection: keep-alive" \ +./hosts/filedot.sh:249: -H "Referer: https://filedot.to/login.html" \ +./hosts/filedot.sh:250: -H "DNT: 1" \ +-- +./hosts/filedot.sh:320: response=$(tor_curl_request --insecure -L -s \ +./hosts/filedot.sh:321: -H "Host: filedot.to" \ +./hosts/filedot.sh:322: -H "User-Agent: $RandomUA" \ +./hosts/filedot.sh:323: -H "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/filedot.sh:324: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/filedot.sh:325: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/filedot.sh:326: -H "Content-Type: application/x-www-form-urlencoded" \ +./hosts/filedot.sh:327: -H "Origin: https://filedot.to" \ +./hosts/filedot.sh:328: -H "Connection: keep-alive" \ +./hosts/filedot.sh:329: -H "Referer: $remote_url" \ +./hosts/filedot.sh:330: -H "DNT: 1" \ +-- +./hosts/filedot.sh:406: file_header=$(tor_curl_request --insecure -L --head -s --referer "${fixed_url}" "$download_url") +./hosts/filedot.sh:407: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/filedot.sh:408: debugHtml "${remote_url##*/}" "fdot_head_$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/filedot.sh:409: fi +./hosts/filedot.sh:410: if [[ -z $file_header ]] ; then +./hosts/filedot.sh:411: if [ $j == $maxfetchretries ] ; then +./hosts/filedot.sh:412: printf "\\n" +./hosts/filedot.sh:413: echo -e "${RED}| Failed to extract file info.${NC}" +./hosts/filedot.sh:414: warnAndRetryUnknownError=true +./hosts/filedot.sh:415: if [ "${finalAttempt}" == "true" ] ; then +./hosts/filedot.sh:416: failedRetryDownload "${remote_url}" "" "" +-- +./hosts/filedot.sh:499: tor_curl_request --insecure -L -G --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --continue-at - --output "$file_path" +./hosts/filedot.sh:500: else +./hosts/filedot.sh:501: tor_curl_request --insecure -L -G "$download_url" --continue-at - --output "$file_path" +./hosts/filedot.sh:502: fi +./hosts/filedot.sh:503: received_file_size=0 +./hosts/filedot.sh:504: if [ -f "$file_path" ] ; then +./hosts/filedot.sh:505: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/filedot.sh:506: fi +./hosts/filedot.sh:507: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./hosts/filedot.sh:508: containsHtml=false +./hosts/filedot.sh:509: else +./hosts/filedot.sh:510: containsHtml=true +./hosts/filedot.sh:511: fi +-- +./hosts/filehaus.sh:100: file_header=$(tor_curl_request --insecure -L --head -s --referer "${remote_url//\.org/\.cc}" "$download_url") +./hosts/filehaus.sh:101: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/filehaus.sh:102: debugHtml "${remote_url##*/}" "fh_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/filehaus.sh:103: fi +./hosts/filehaus.sh:104: if [ ! -z "$file_header" ] ; then +./hosts/filehaus.sh:105: if grep -Eqi '404 Not Found' <<< "${file_header}" ; then +./hosts/filehaus.sh:106: if [ $j == $maxfetchretries ] ; then +./hosts/filehaus.sh:107: printf "\\n" +./hosts/filehaus.sh:108: echo -e "${RED}| The file has been removed (404).${NC}" +./hosts/filehaus.sh:109: removedDownload "${remote_url}" +./hosts/filehaus.sh:110: exitDownloadNotAvailable=true +-- +./hosts/filehaus.sh:197: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval --referer "$download_url" "$download_url" --continue-at - --output "$file_path" +./hosts/filehaus.sh:198: else +./hosts/filehaus.sh:199: tor_curl_request --insecure --referer "$download_url" "$download_url" --continue-at - --output "$file_path" +./hosts/filehaus.sh:200: fi +./hosts/filehaus.sh:201: received_file_size=0 +./hosts/filehaus.sh:202: if [ -f "$file_path" ] ; then +./hosts/filehaus.sh:203: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/filehaus.sh:204: fi +./hosts/filehaus.sh:205: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./hosts/filehaus.sh:206: containsHtml=false +./hosts/filehaus.sh:207: else +./hosts/filehaus.sh:208: containsHtml=true +./hosts/filehaus.sh:209: fi +-- +./hosts/firestorage.sh:98: response=$(tor_curl_request --insecure -L -s "${fixed_url}") +./hosts/firestorage.sh:99: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/firestorage.sh:100: debugHtml "${remote_url##*/}" "fs_${fetchnum}fetch_$j" "fixed_url: ${fixed_url}"$'\n'"${response}" +./hosts/firestorage.sh:101: fi +./hosts/firestorage.sh:102: if [[ -z $response ]] ; then +./hosts/firestorage.sh:103: if [ $j == $maxfetchretries ] ; then +./hosts/firestorage.sh:104: printf "\\n" +./hosts/firestorage.sh:105: echo -e "${RED}| Failed to extract link.${NC}" +./hosts/firestorage.sh:106: warnAndRetryUnknownError=true +./hosts/firestorage.sh:107: if [ "${finalAttempt}" == "true" ] ; then +./hosts/firestorage.sh:108: failedRetryDownload "${remote_url}" "" "" +-- +./hosts/firestorage.sh:226: file_header=$(tor_curl_request --insecure -L --head -s --referer "${fixed_url}" "$download_url") +./hosts/firestorage.sh:227: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/firestorage.sh:228: debugHtml "${remote_url##*/}" "fs_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/firestorage.sh:229: fi +./hosts/firestorage.sh:230: if [[ -z $file_header ]] ; then +./hosts/firestorage.sh:231: if [ $j == $maxfetchretries ] ; then +./hosts/firestorage.sh:232: printf "\\n" +./hosts/firestorage.sh:233: echo -e "${RED}| Failed to extract file info${NC}" +./hosts/firestorage.sh:234: warnAndRetryUnknownError=true +./hosts/firestorage.sh:235: if [ "${finalAttempt}" == "true" ] ; then +./hosts/firestorage.sh:236: failedRetryDownload "${remote_url}" "" "" +-- +./hosts/firestorage.sh:335: tor_curl_request --insecure -L -G --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --continue-at - --output "$file_path" +./hosts/firestorage.sh:336: else +./hosts/firestorage.sh:337: tor_curl_request --insecure -L -G "$download_url" --continue-at - --output "$file_path" +./hosts/firestorage.sh:338: fi +./hosts/firestorage.sh:339: received_file_size=0 +./hosts/firestorage.sh:340: if [ -f "$file_path" ] ; then +./hosts/firestorage.sh:341: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/firestorage.sh:342: fi +./hosts/firestorage.sh:343: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./hosts/firestorage.sh:344: containsHtml=false +./hosts/firestorage.sh:345: else +./hosts/firestorage.sh:346: containsHtml=true +./hosts/firestorage.sh:347: fi +-- +./hosts/gofile.sh:97: response=$(tor_curl_request --insecure -s -X POST \ +./hosts/gofile.sh:98: -H "User-Agent: $RandomUA" \ +./hosts/gofile.sh:99: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/gofile.sh:100: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/gofile.sh:101: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/gofile.sh:102: -H "Connection: keep-alive" \ +./hosts/gofile.sh:103: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/gofile.sh:104: -H "Sec-Fetch-Dest: document" \ +./hosts/gofile.sh:105: -H "Sec-Fetch-Mode: navigate" \ +./hosts/gofile.sh:106: -H "Sec-Fetch-Site: none" \ +./hosts/gofile.sh:107: -H "Sec-Fetch-User: ?1" \ +-- +./hosts/gofile.sh:170: response=$(tor_curl_request --insecure -G -L -s \ +./hosts/gofile.sh:171: -b "${gofile_cookie_jar}" -c "${gofile_cookie_jar}" \ +./hosts/gofile.sh:172: -H "User-Agent: $RandomUA" \ +./hosts/gofile.sh:173: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/gofile.sh:174: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/gofile.sh:175: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/gofile.sh:176: -H "Connection: keep-alive" \ +./hosts/gofile.sh:177: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/gofile.sh:178: -H "Sec-Fetch-Dest: document" \ +./hosts/gofile.sh:179: -H "Sec-Fetch-Mode: navigate" \ +./hosts/gofile.sh:180: -H "Sec-Fetch-Site: none" \ +-- +./hosts/gofile.sh:241: file_header=$(tor_curl_request --insecure -L --head -s \ +./hosts/gofile.sh:242: -b "${gofile_cookie_jar}" -c "${gofile_cookie_jar}" \ +./hosts/gofile.sh:243: -H "User-Agent: $RandomUA" \ +./hosts/gofile.sh:244: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/gofile.sh:245: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/gofile.sh:246: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/gofile.sh:247: -H "Connection: keep-alive" \ +./hosts/gofile.sh:248: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/gofile.sh:249: -H "Sec-Fetch-Dest: document" \ +./hosts/gofile.sh:250: -H "Sec-Fetch-Mode: navigate" \ +./hosts/gofile.sh:251: -H "Sec-Fetch-Site: none" \ +-- +./hosts/gofile.sh:359: tor_curl_request --insecure -G --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/gofile.sh:360: -b "${gofile_cookie_jar}" -c "${gofile_cookie_jar}" \ +./hosts/gofile.sh:361: -H "User-Agent: $RandomUA" \ +./hosts/gofile.sh:362: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/gofile.sh:363: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/gofile.sh:364: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/gofile.sh:365: -H "Connection: keep-alive" \ +./hosts/gofile.sh:366: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/gofile.sh:367: -H "Sec-Fetch-Dest: document" \ +./hosts/gofile.sh:368: -H "Sec-Fetch-Mode: navigate" \ +./hosts/gofile.sh:369: -H "Sec-Fetch-Site: none" \ +-- +./hosts/gofile.sh:373: tor_curl_request --insecure -G \ +./hosts/gofile.sh:374: -b "${gofile_cookie_jar}" -c "${gofile_cookie_jar}" \ +./hosts/gofile.sh:375: -H "User-Agent: $RandomUA" \ +./hosts/gofile.sh:376: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/gofile.sh:377: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/gofile.sh:378: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/gofile.sh:379: -H "Connection: keep-alive" \ +./hosts/gofile.sh:380: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/gofile.sh:381: -H "Sec-Fetch-Dest: document" \ +./hosts/gofile.sh:382: -H "Sec-Fetch-Mode: navigate" \ +./hosts/gofile.sh:383: -H "Sec-Fetch-Site: none" \ +-- +./hosts/hexload.sh:108: response=$(tor_curl_request --insecure -s --data "$form_data" "https://hexload.com/download") +./hosts/hexload.sh:109: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/hexload.sh:110: debugHtml "${remote_url##*/}" "hex_dwnpage$j" "form_data: ${form_data}"$'\n'"${response}" +./hosts/hexload.sh:111: fi +./hosts/hexload.sh:112: fi +./hosts/hexload.sh:113: else +./hosts/hexload.sh:114: if [ "$hexUseDownload" == "download2" ]; then +./hosts/hexload.sh:115: form_data="op=download1&id=${file_id}&rand=&usr_login=&fname=&ajax=1&method_free=1&dataType=json" +./hosts/hexload.sh:116: response=$(tor_curl_request --insecure -s --data "$form_data" "https://hexload.com/download") +./hosts/hexload.sh:117: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/hexload.sh:118: debugHtml "${remote_url##*/}" "hex_dwnpage$j" "form_data: ${form_data}"$'\n'"${response}" +./hosts/hexload.sh:119: fi +./hosts/hexload.sh:120: else +./hosts/hexload.sh:121: form_data="op=download2&id=${file_id}&rand=&usr_login=&fname=&ajax=1&method_free=1&dataType=json" +./hosts/hexload.sh:122: response=$(tor_curl_request --insecure -s --data "$form_data" "https://hexload.com/download") +./hosts/hexload.sh:123: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/hexload.sh:124: debugHtml "${remote_url##*/}" "hex_dwnpage$j" "form_data: ${form_data}"$'\n'"${response}" +./hosts/hexload.sh:125: fi +./hosts/hexload.sh:126: fi +./hosts/hexload.sh:127: fi +./hosts/hexload.sh:128: filename=$(echo "$response" | grep -oPi '(?<="file_name":")[^"]+(?=")' | base64 --decode) +./hosts/hexload.sh:129: download_url=$(echo "$response" | grep -oPi '(?<="link":")[^"]+(?=")' | base64 --decode) +./hosts/hexload.sh:130: download_url=$(urlencode_spaces "$download_url") +./hosts/hexload.sh:131: if grep -Eqi "Sorry, you have been blocked" <<< "$response"; then +./hosts/hexload.sh:132: if [ $j == $hexmaxfetchfileretries ] ; then +-- +./hosts/hexload.sh:254: file_header=$(tor_curl_request --insecure --head -L -s --referer "$file_url" "$download_url") +./hosts/hexload.sh:255: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/hexload.sh:256: debugHtml "${remote_url##*/}" "hex_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/hexload.sh:257: fi +./hosts/hexload.sh:258: if ! grep -Eqi 'HTTP/2 200|HTTP/1.1 200|200 OK' <<< $file_header ; then +./hosts/hexload.sh:259: if ((j < hexmaxfetchfileretries)); then +./hosts/hexload.sh:260: continue +./hosts/hexload.sh:261: else +./hosts/hexload.sh:262: printf "\\n" +./hosts/hexload.sh:263: echo -e "${RED}| Bad header response…${NC}" +./hosts/hexload.sh:264: exitDownloadError=true +-- +./hosts/hexload.sh:321: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/hexload.sh:322: else +./hosts/hexload.sh:323: tor_curl_request --insecure --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/hexload.sh:324: fi +./hosts/hexload.sh:325: received_file_size=0 +./hosts/hexload.sh:326: if [ -f "$file_path" ] ; then +./hosts/hexload.sh:327: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/hexload.sh:328: fi +./hosts/hexload.sh:329: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./hosts/hexload.sh:330: containsHtml=false +./hosts/hexload.sh:331: else +./hosts/hexload.sh:332: containsHtml=true +./hosts/hexload.sh:333: fi +-- +./hosts/innocent.sh:98: file_header=$(tor_curl_request --insecure --head -H "Connection: keep-alive" -L -s -i "$download_url" | +./hosts/innocent.sh:99: tee "${WorkDir}/.temp/directhead" & +./hosts/innocent.sh:100: sleep 6 +./hosts/innocent.sh:101: [ -s "${WorkDir}/.temp/directhead" ] +./hosts/innocent.sh:102: kill $! 2>/dev/null +./hosts/innocent.sh:103: ) +./hosts/innocent.sh:104: if [ ! -f "${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/}" ]; then +./hosts/innocent.sh:105: touch "${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/}" +./hosts/innocent.sh:106: fi +./hosts/innocent.sh:107: rm -f "${WorkDir}/.temp/directhead" +./hosts/innocent.sh:108: elif ((j % 3 == 0)); then +-- +./hosts/innocent.sh:110: file_header=$(tor_curl_request --insecure -m 16 -s -D - -o /dev/null \ +./hosts/innocent.sh:111: -H "Connection: keep-alive" \ +./hosts/innocent.sh:112: -w 'EffectiveUrl=%{url_effective}' \ +./hosts/innocent.sh:113: "$download_url") +./hosts/innocent.sh:114: else +./hosts/innocent.sh:115: printf "| Retrieving Head: attempt #$j" +./hosts/innocent.sh:116: file_header=$(tor_curl_request --insecure --head -L -s "$download_url") +./hosts/innocent.sh:117: fi +./hosts/innocent.sh:118: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/innocent.sh:119: debugHtml "${remote_url##*/}" "inno_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/innocent.sh:120: fi +./hosts/innocent.sh:121: if [ ! -z "$file_header" ] ; then +./hosts/innocent.sh:122: if grep -Eqi '404 Not Found' <<< "${file_header}" ; then +./hosts/innocent.sh:123: printf "\\n" +./hosts/innocent.sh:124: echo -e "${RED}| Not Found (404). The file has been removed.${NC}" +./hosts/innocent.sh:125: removedDownload "${remote_url}" +./hosts/innocent.sh:126: exitDownloadNotAvailable=true +-- +./hosts/innocent.sh:207: tor_curl_request --insecure "$download_url" --output "$file_path" +./hosts/innocent.sh:208: received_file_size=0 +./hosts/innocent.sh:209: if [ -f "$file_path" ] ; then +./hosts/innocent.sh:210: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/innocent.sh:211: fi +./hosts/innocent.sh:212: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./hosts/innocent.sh:213: containsHtml=false +./hosts/innocent.sh:214: else +./hosts/innocent.sh:215: containsHtml=true +./hosts/innocent.sh:216: fi +./hosts/innocent.sh:217: if [ "${AutoRepairBadPartials}" == "true" ] && [ "$containsHtml" == "true" ] ; then +-- +./hosts/kraken.sh:104: PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -s -L -c "${kraken_cookie_jar}" "${fixed_url}") +./hosts/kraken.sh:105: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/kraken.sh:106: debugHtml "${krak_id}" "kraken_token${num_attempt}_$i" "url: ${fixed_url}"$'\n'"krakenid: ${krak_id}"$'\n'"${PAGE}" +./hosts/kraken.sh:107: fi +./hosts/kraken.sh:108: if grep -Eqi 'sendFormCaptcha()' <<< "${PAGE}"; then +./hosts/kraken.sh:109: rm -f "$kraken_cookie_jar"; +./hosts/kraken.sh:110: printf "\n" +./hosts/kraken.sh:111: echo -e "${RED}| Captcha required (Recaptcha)${NC}" +./hosts/kraken.sh:112: exitDownloadError=true +./hosts/kraken.sh:113: failedRetryDownload "${remote_url}" "Captcha required (Recaptcha)" "" +./hosts/kraken.sh:114: return 1 +-- +./hosts/kraken.sh:169: down_request=$(tor_curl_request --insecure -L -s -b "${kraken_cookie_jar}" -c "${kraken_cookie_jar}" -F "token=${kraken_token}" "${kraken_action}") +./hosts/kraken.sh:170: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/kraken.sh:171: debugHtml "${krak_id}" "kraken_url${num_attempt}_1" "action: ${kraken_action}, token: ${kraken_token}"$'\n'"${down_request}" +./hosts/kraken.sh:172: fi +./hosts/kraken.sh:173: if ! grep -Eqi '"status":"ok"' <<< "${down_request}"; then +./hosts/kraken.sh:174: echo -e "${RED}| Failed to get download url${NC}" +./hosts/kraken.sh:175: rm -f "$kraken_cookie_jar"; +./hosts/kraken.sh:176: return 1 +./hosts/kraken.sh:177: else +./hosts/kraken.sh:178: kraken_url=$(grep -oP '"url":"\K[^"]+' <<< "${down_request}") +./hosts/kraken.sh:179: download_url=${kraken_url//\\/} +-- +./hosts/kraken.sh:186: file_header=$(tor_curl_request --insecure --head -L -s -b "${kraken_cookie_jar}" -c "${kraken_cookie_jar}" --referer "$kraken_action" "$download_url") +./hosts/kraken.sh:187: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/kraken.sh:188: debugHtml "${krak_id}" "kraken_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/kraken.sh:189: fi +./hosts/kraken.sh:190: rm -f "$kraken_cookie_jar"; +./hosts/kraken.sh:191: if [ ! -z "$file_header" ] ; then +./hosts/kraken.sh:192: if grep -Eqi '404 Not Found' <<< "${file_header}" ; then +./hosts/kraken.sh:193: echo -e "${RED}| The file has been removed (404).${NC}" +./hosts/kraken.sh:194: removedDownload "${remote_url}" +./hosts/kraken.sh:195: exitDownloadNotAvailable=true +./hosts/kraken.sh:196: return 1 +-- +./hosts/kraken.sh:286: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval --referer "$kraken_action" "$download_url" --continue-at - --output "$file_path" +./hosts/kraken.sh:287: else +./hosts/kraken.sh:288: tor_curl_request --insecure --referer "$kraken_action" "$download_url" --continue-at - --output "$file_path" +./hosts/kraken.sh:289: fi +./hosts/kraken.sh:290: received_file_size=0 +./hosts/kraken.sh:291: if [ -f "$file_path" ] ; then +./hosts/kraken.sh:292: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/kraken.sh:293: fi +./hosts/kraken.sh:294: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./hosts/kraken.sh:295: containsHtml=false +./hosts/kraken.sh:296: else +./hosts/kraken.sh:297: containsHtml=true +./hosts/kraken.sh:298: fi +-- +./hosts/nippy.sh:121: response=$(tor_curl_request --insecure -L -s -b "${nippy_cookie_jar}" -c "${nippy_cookie_jar}" "$fixed_url") +./hosts/nippy.sh:122: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/nippy.sh:123: debugHtml "${remote_url##*/}" "nippy_dwnpage$i" "${response}" +./hosts/nippy.sh:124: fi +./hosts/nippy.sh:125: if [[ -z $response ]] ; then +./hosts/nippy.sh:126: rm -f "${nippy_cookie_jar}"; +./hosts/nippy.sh:127: if [ $i == $maxfetchretries ] ; then +./hosts/nippy.sh:128: printf "\\n" +./hosts/nippy.sh:129: echo -e "${RED}| Failed to extract download link.${NC}" +./hosts/nippy.sh:130: warnAndRetryUnknownError=true +./hosts/nippy.sh:131: if [ "${finalAttempt}" == "true" ] ; then +-- +./hosts/nippy.sh:190: file_header=$(tor_curl_request --insecure -L --head -s \ +./hosts/nippy.sh:191: -b "${nippy_cookie_jar}" -c "${nippy_cookie_jar}" \ +./hosts/nippy.sh:192: "$download_url") +./hosts/nippy.sh:193: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/nippy.sh:194: debugHtml "${remote_url##*/}" "nippy_head$j" "FileInfoUrl: ${download_url}"$'\n'"${file_header}" +./hosts/nippy.sh:195: fi +./hosts/nippy.sh:196: if [[ -z $file_header ]] ; then +./hosts/nippy.sh:197: if [ $j == $maxfetchretries ] ; then +./hosts/nippy.sh:198: rm -f "${nippy_cookie_jar}"; +./hosts/nippy.sh:199: printf "\\n" +./hosts/nippy.sh:200: echo -e "${RED}| Failed to extract file info${NC}" +-- +./hosts/nippy.sh:301: tor_curl_request --insecure -L --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/nippy.sh:302: "$download_url" --continue-at - --output "$file_path" +./hosts/nippy.sh:303: else +./hosts/nippy.sh:304: tor_curl_request --insecure -L "$download_url" --continue-at - --output "$file_path" +./hosts/nippy.sh:305: fi +./hosts/nippy.sh:306: received_file_size=0 +./hosts/nippy.sh:307: if [ -f "$file_path" ] ; then +./hosts/nippy.sh:308: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/nippy.sh:309: fi +./hosts/nippy.sh:310: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./hosts/nippy.sh:311: containsHtml=false +./hosts/nippy.sh:312: else +./hosts/nippy.sh:313: containsHtml=true +./hosts/nippy.sh:314: fi +-- +./hosts/oshi.sh:101: file_header=$(tor_curl_request --insecure --head -L -s --referer "$remote_url" "$download_url") +./hosts/oshi.sh:102: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/oshi.sh:103: debugHtml "${remote_url##*/}" "oshi_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/oshi.sh:104: fi +./hosts/oshi.sh:105: if [ ! -z "$file_header" ] ; then +./hosts/oshi.sh:106: if grep -Eqi '404 Not Found' <<< "${file_header}" ; then +./hosts/oshi.sh:107: echo -e "${RED}| O shi-, (404). The file has been removed.${NC}" +./hosts/oshi.sh:108: removedDownload "${remote_url}" +./hosts/oshi.sh:109: exitDownloadNotAvailable=true +./hosts/oshi.sh:110: return 1 +./hosts/oshi.sh:111: fi +-- +./hosts/oshi.sh:195: tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/oshi.sh:196: else +./hosts/oshi.sh:197: tor_curl_request --insecure --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/oshi.sh:198: fi +./hosts/oshi.sh:199: received_file_size=0 +./hosts/oshi.sh:200: if [ -f "$file_path" ] ; then +./hosts/oshi.sh:201: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/oshi.sh:202: fi +./hosts/oshi.sh:203: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./hosts/oshi.sh:204: containsHtml=false +./hosts/oshi.sh:205: else +./hosts/oshi.sh:206: containsHtml=true +./hosts/oshi.sh:207: fi +-- +./hosts/pixeldrain.sh:94: response=$(tor_curl_request --insecure -L -s "https://pixeldrain.com/u/$fileid") +./hosts/pixeldrain.sh:95: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/pixeldrain.sh:96: debugHtml "${remote_url##*/}" "pd_fetch$i" "$response" +./hosts/pixeldrain.sh:97: fi +./hosts/pixeldrain.sh:98: if [ ! -z "$response" ] ; then +./hosts/pixeldrain.sh:99: if grep -q -Eq '"views":' <<< "$response"; then +./hosts/pixeldrain.sh:100: pdpreviews=$(grep -o -P '(?<="views":).+?(?=,")' <<< "$response") +./hosts/pixeldrain.sh:101: fi +./hosts/pixeldrain.sh:102: if grep -i -Eq "You have reached the maximum number of open download connections" <<< "$response"; then +./hosts/pixeldrain.sh:103: if [ $i -ge 5 ] ; then +./hosts/pixeldrain.sh:104: printf "\\n" +-- +./hosts/pixeldrain.sh:256: file_header=$(tor_curl_request --insecure --head -L -s --referer "$file_url" "$pdheadurl") +./hosts/pixeldrain.sh:257: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/pixeldrain.sh:258: debugHtml "${remote_url##*/}" "pd_head$i" "url: ${pdheadurl}"$'\n'"${file_header}" +./hosts/pixeldrain.sh:259: fi +./hosts/pixeldrain.sh:260: if ! grep -Eqi 'HTTP/2 200|HTTP/1.1 200|200 OK' <<< $file_header ; then +./hosts/pixeldrain.sh:261: if ((i < 6)); then +./hosts/pixeldrain.sh:262: continue +./hosts/pixeldrain.sh:263: else +./hosts/pixeldrain.sh:264: echo -e "${YELLOW}| Filesize not found.${NC}" +./hosts/pixeldrain.sh:265: return 1 +./hosts/pixeldrain.sh:266: fi +-- +./hosts/pixeldrain.sh:324: tor_curl_request --insecure \ +./hosts/pixeldrain.sh:325: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/pixeldrain.sh:326: --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/pixeldrain.sh:327: else +./hosts/pixeldrain.sh:328: tor_curl_request --insecure \ +./hosts/pixeldrain.sh:329: --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/pixeldrain.sh:330: fi +./hosts/pixeldrain.sh:331: else +./hosts/pixeldrain.sh:332: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/pixeldrain.sh:333: tor_curl_request --insecure \ +./hosts/pixeldrain.sh:334: -H "User-Agent: $RandomUA" \ +./hosts/pixeldrain.sh:335: -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' \ +./hosts/pixeldrain.sh:336: -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate, br' \ +./hosts/pixeldrain.sh:337: -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' -H 'Sec-Fetch-Dest: document' \ +./hosts/pixeldrain.sh:338: -H 'Sec-Fetch-Mode: navigate' -H 'Sec-Fetch-Site: none' -H 'Sec-Fetch-User: ?1' \ +./hosts/pixeldrain.sh:339: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/pixeldrain.sh:340: --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/pixeldrain.sh:341: else +./hosts/pixeldrain.sh:342: tor_curl_request --insecure \ +./hosts/pixeldrain.sh:343: -H "User-Agent: $RandomUA" \ +./hosts/pixeldrain.sh:344: -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' \ +./hosts/pixeldrain.sh:345: -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate, br' \ +./hosts/pixeldrain.sh:346: -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' -H 'Sec-Fetch-Dest: document' \ +./hosts/pixeldrain.sh:347: -H 'Sec-Fetch-Mode: navigate' -H 'Sec-Fetch-Site: none' -H 'Sec-Fetch-User: ?1' \ +./hosts/pixeldrain.sh:348: --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./hosts/pixeldrain.sh:349: fi +./hosts/pixeldrain.sh:350: fi +./hosts/pixeldrain.sh:351: received_file_size=0 +./hosts/pixeldrain.sh:352: if [ -f "$file_path" ] ; then +-- +./hosts/ranoz.sh:90: response=$(tor_curl_request --insecure -L -s "$remote_url") +./hosts/ranoz.sh:91: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/ranoz.sh:92: debugHtml "${remote_url##*/}" "rz_fetch$i" "${response}" +./hosts/ranoz.sh:93: fi +./hosts/ranoz.sh:94: if [[ -z $response ]] ; then +./hosts/ranoz.sh:95: if [ $i == $maxfetchretries ] ; then +./hosts/ranoz.sh:96: printf "\\n" +./hosts/ranoz.sh:97: echo -e "${RED}| Failed to extract download url [1]${NC}" +./hosts/ranoz.sh:98: warnAndRetryUnknownError=true +./hosts/ranoz.sh:99: if [ "${finalAttempt}" == "true" ] ; then +./hosts/ranoz.sh:100: failedRetryDownload "${remote_url}" "Failed to extract download url [1]" "" +-- +./hosts/ranoz.sh:144: file_header=$(tor_curl_request --insecure --head -L -i -s "$download_url") +./hosts/ranoz.sh:145: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/ranoz.sh:146: debugHtml "${remote_url##*/}" "rz_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/ranoz.sh:147: fi +./hosts/ranoz.sh:148: if [[ -z $file_header ]] ; then +./hosts/ranoz.sh:149: if [ $j == $maxfetchretries ] ; then +./hosts/ranoz.sh:150: rm -f "${rz_cookie_jar}"; +./hosts/ranoz.sh:151: printf "\\n" +./hosts/ranoz.sh:152: echo -e "${RED}| Failed to extract file info${NC}" +./hosts/ranoz.sh:153: warnAndRetryUnknownError=true +./hosts/ranoz.sh:154: if [ "${finalAttempt}" == "true" ] ; then +-- +./hosts/ranoz.sh:255: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/ranoz.sh:256: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/ranoz.sh:257: "$download_url" --continue-at - --output "$file_path" +./hosts/ranoz.sh:258: else +./hosts/ranoz.sh:259: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/ranoz.sh:260: "$download_url" --continue-at - --output "$file_path" +./hosts/ranoz.sh:261: fi +./hosts/ranoz.sh:262: else +./hosts/ranoz.sh:263: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/ranoz.sh:264: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/ranoz.sh:265: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/ranoz.sh:266: -H "User-Agent: $RandomUA" \ +./hosts/ranoz.sh:267: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/ranoz.sh:268: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/ranoz.sh:269: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/ranoz.sh:270: -H "Connection: keep-alive" \ +./hosts/ranoz.sh:271: -H "Cookie: lng=eng" \ +./hosts/ranoz.sh:272: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/ranoz.sh:273: -H "Sec-Fetch-Dest: document" \ +./hosts/ranoz.sh:274: -H "Sec-Fetch-Mode: navigate" \ +-- +./hosts/ranoz.sh:279: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/ranoz.sh:280: -H "User-Agent: $RandomUA" \ +./hosts/ranoz.sh:281: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/ranoz.sh:282: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/ranoz.sh:283: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/ranoz.sh:284: -H "Connection: keep-alive" \ +./hosts/ranoz.sh:285: -H "Cookie: lng=eng" \ +./hosts/ranoz.sh:286: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/ranoz.sh:287: -H "Sec-Fetch-Dest: document" \ +./hosts/ranoz.sh:288: -H "Sec-Fetch-Mode: navigate" \ +./hosts/ranoz.sh:289: -H "Sec-Fetch-Site: same-origin" \ +-- +./hosts/tempfileme.sh:89: response=$(tor_curl_request --insecure -L -s "$remote_url") +./hosts/tempfileme.sh:90: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/tempfileme.sh:91: debugHtml "${remote_url##*/}" "tmpme_fetch$j" "${response}" +./hosts/tempfileme.sh:92: fi +./hosts/tempfileme.sh:93: if [[ -z $response ]] ; then +./hosts/tempfileme.sh:94: if [ $j == $maxfetchretries ] ; then +./hosts/tempfileme.sh:95: printf "\\n" +./hosts/tempfileme.sh:96: echo -e "${RED}| Failed to extract download link${NC}" +./hosts/tempfileme.sh:97: warnAndRetryUnknownError=true +./hosts/tempfileme.sh:98: if [ "${finalAttempt}" == "true" ] ; then +./hosts/tempfileme.sh:99: failedRetryDownload "${remote_url}" "Failed to extract download link" "" +-- +./hosts/tempfileme.sh:163: file_header=$(tor_curl_request --insecure -L --head -s --referer "${remote_url}" "$download_url") +./hosts/tempfileme.sh:164: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/tempfileme.sh:165: debugHtml "${remote_url##*/}" "tmpme_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/tempfileme.sh:166: fi +./hosts/tempfileme.sh:167: if [ ! -z "$file_header" ] ; then +./hosts/tempfileme.sh:168: if grep -Eqi 'HTTP.* 404|Not Found' <<< "${file_header}" ; then +./hosts/tempfileme.sh:169: if [ $j == $maxfetchretries ] ; then +./hosts/tempfileme.sh:170: printf "\\n" +./hosts/tempfileme.sh:171: echo -e "${RED}| The file has been removed (404).${NC}" +./hosts/tempfileme.sh:172: removedDownload "${remote_url}" +./hosts/tempfileme.sh:173: exitDownloadNotAvailable=true +-- +./hosts/tempfileme.sh:293: tor_curl_request --insecure -L \ +./hosts/tempfileme.sh:294: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/tempfileme.sh:295: --referer "${remote_url}" \ +./hosts/tempfileme.sh:296: "$download_url" --continue-at - --output "$file_path" +./hosts/tempfileme.sh:297: else +./hosts/tempfileme.sh:298: tor_curl_request --insecure -L \ +./hosts/tempfileme.sh:299: --referer "${remote_url}" \ +./hosts/tempfileme.sh:300: "$download_url" --continue-at - --output "$file_path" +./hosts/tempfileme.sh:301: fi +./hosts/tempfileme.sh:302: else +./hosts/tempfileme.sh:303: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/tempfileme.sh:304: tor_curl_request --insecure -L \ +./hosts/tempfileme.sh:305: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/tempfileme.sh:306: -H "User-Agent: $RandomUA" \ +./hosts/tempfileme.sh:307: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/tempfileme.sh:308: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/tempfileme.sh:309: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/tempfileme.sh:310: -H "Connection: keep-alive" \ +./hosts/tempfileme.sh:311: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/tempfileme.sh:312: -H "Sec-Fetch-Dest: document" \ +./hosts/tempfileme.sh:313: -H "Sec-Fetch-Mode: navigate" \ +./hosts/tempfileme.sh:314: -H "Sec-Fetch-Site: same-origin" \ +-- +./hosts/tempfileme.sh:319: tor_curl_request --insecure -L \ +./hosts/tempfileme.sh:320: -H "User-Agent: $RandomUA" \ +./hosts/tempfileme.sh:321: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/tempfileme.sh:322: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/tempfileme.sh:323: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/tempfileme.sh:324: -H "Connection: keep-alive" \ +./hosts/tempfileme.sh:325: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/tempfileme.sh:326: -H "Sec-Fetch-Dest: document" \ +./hosts/tempfileme.sh:327: -H "Sec-Fetch-Mode: navigate" \ +./hosts/tempfileme.sh:328: -H "Sec-Fetch-Site: same-origin" \ +./hosts/tempfileme.sh:329: -H "Sec-Fetch-User: ?1" \ +-- +./hosts/tempsh.sh:88: file_header=$(tor_curl_request --insecure -s -D - -o /dev/null -X POST \ +./hosts/tempsh.sh:89: -H "Connection: keep-alive" \ +./hosts/tempsh.sh:90: -w 'EffectiveUrl=%{url_effective}' \ +./hosts/tempsh.sh:91: "$download_url") +./hosts/tempsh.sh:92: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/tempsh.sh:93: debugHtml "${remote_url##*/}" "tmpsh_posthead" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/tempsh.sh:94: fi +./hosts/tempsh.sh:95: if [[ -z $file_header ]] ; then +./hosts/tempsh.sh:96: if [ $j == $maxfetchretries ] ; then +./hosts/tempsh.sh:97: printf "\\n" +./hosts/tempsh.sh:98: echo -e "${RED}| Failed to extract file info [1]${NC}" +-- +./hosts/tempsh.sh:227: tor_curl_request --insecure -X POST \ +./hosts/tempsh.sh:228: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/tempsh.sh:229: "$download_url" --continue-at - --output "$file_path" +./hosts/tempsh.sh:230: else +./hosts/tempsh.sh:231: tor_curl_request --insecure -X POST \ +./hosts/tempsh.sh:232: "$download_url" --continue-at - --output "$file_path" +./hosts/tempsh.sh:233: fi +./hosts/tempsh.sh:234: else +./hosts/tempsh.sh:235: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/tempsh.sh:236: tor_curl_request --insecure -X POST \ +./hosts/tempsh.sh:237: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/tempsh.sh:238: -H "User-Agent: $RandomUA" \ +./hosts/tempsh.sh:239: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/tempsh.sh:240: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/tempsh.sh:241: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/tempsh.sh:242: -H "Connection: keep-alive" \ +./hosts/tempsh.sh:243: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/tempsh.sh:244: -H "Sec-Fetch-Dest: document" \ +./hosts/tempsh.sh:245: -H "Sec-Fetch-Mode: navigate" \ +./hosts/tempsh.sh:246: -H "Sec-Fetch-Site: same-origin" \ +-- +./hosts/tempsh.sh:250: tor_curl_request --insecure -X POST \ +./hosts/tempsh.sh:251: -H "User-Agent: $RandomUA" \ +./hosts/tempsh.sh:252: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/tempsh.sh:253: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/tempsh.sh:254: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/tempsh.sh:255: -H "Connection: keep-alive" \ +./hosts/tempsh.sh:256: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/tempsh.sh:257: -H "Sec-Fetch-Dest: document" \ +./hosts/tempsh.sh:258: -H "Sec-Fetch-Mode: navigate" \ +./hosts/tempsh.sh:259: -H "Sec-Fetch-Site: same-origin" \ +./hosts/tempsh.sh:260: -H "Sec-Fetch-User: ?1" \ +-- +./hosts/up2share.sh:91: response=$(tor_curl_request --insecure -L -s -b "${up2share_cookie_jar}" -c "${up2share_cookie_jar}" \ +./hosts/up2share.sh:92: -w "\n\nHTTP_CODE: %{http_code}\nEFFECTIVE_URL: %{url_effective}\n" \ +./hosts/up2share.sh:93: "$fixed_url") +./hosts/up2share.sh:94: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/up2share.sh:95: debugHtml "${remote_url##*/}" "up2share_fetch$i" "${response}" +./hosts/up2share.sh:96: fi +./hosts/up2share.sh:97: if [[ -z $response ]] ; then +./hosts/up2share.sh:98: rm -f "${up2share_cookie_jar}"; +./hosts/up2share.sh:99: if [ $i == $maxfetchretries ] ; then +./hosts/up2share.sh:100: printf "\\n" +./hosts/up2share.sh:101: echo -e "${RED}| Failed to extract token link [1].${NC}" +-- +./hosts/up2share.sh:144: response=$(tor_curl_request --insecure -L -s -b "${up2share_cookie_jar}" -c "${up2share_cookie_jar}" \ +./hosts/up2share.sh:145: -w "\n\nHTTP_CODE: %{http_code}\nEFFECTIVE_URL: %{url_effective}\n" \ +./hosts/up2share.sh:146: "$download_url") +./hosts/up2share.sh:147: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/up2share.sh:148: debugHtml "${remote_url##*/}" "up2share_down$i" "${response}" +./hosts/up2share.sh:149: fi +./hosts/up2share.sh:150: if [[ -z $response ]] ; then +./hosts/up2share.sh:151: rm -f "${up2share_cookie_jar}"; +./hosts/up2share.sh:152: if [ $i == $maxfetchretries ] ; then +./hosts/up2share.sh:153: printf "\\n" +./hosts/up2share.sh:154: echo -e "${RED}| Failed to extract download link [1].${NC}" +-- +./hosts/up2share.sh:195: file_header=$(tor_curl_request --insecure -L -s --head \ +./hosts/up2share.sh:196: -b "${up2share_cookie_jar}" -c "${up2share_cookie_jar}" \ +./hosts/up2share.sh:197: --referer "https://up2sha.re/" "$download_url") +./hosts/up2share.sh:198: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/up2share.sh:199: debugHtml "${remote_url##*/}" "up2share_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/up2share.sh:200: fi +./hosts/up2share.sh:201: if [[ -z $file_header ]] ; then +./hosts/up2share.sh:202: if [ $j == $maxfetchretries ] ; then +./hosts/up2share.sh:203: rm -f "${up2share_cookie_jar}"; +./hosts/up2share.sh:204: printf "\\n" +./hosts/up2share.sh:205: echo -e "${RED}| Failed to extract file info${NC}" +-- +./hosts/up2share.sh:313: tor_curl_request --insecure -L \ +./hosts/up2share.sh:314: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/up2share.sh:315: -b "${up2share_cookie_jar}" -c "${up2share_cookie_jar}" \ +./hosts/up2share.sh:316: -H "Host: up2sha.re" \ +./hosts/up2share.sh:317: --referer "https://up2sha.re/" \ +./hosts/up2share.sh:318: "$download_url" --continue-at - --output "$file_path" +./hosts/up2share.sh:319: else +./hosts/up2share.sh:320: tor_curl_request --insecure -L \ +./hosts/up2share.sh:321: -b "${up2share_cookie_jar}" -c "${up2share_cookie_jar}" \ +./hosts/up2share.sh:322: -H "Host: up2sha.re" \ +./hosts/up2share.sh:323: --referer "https://up2sha.re/" \ +./hosts/up2share.sh:324: "$download_url" --continue-at - --output "$file_path" +./hosts/up2share.sh:325: fi +./hosts/up2share.sh:326: else +./hosts/up2share.sh:327: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/up2share.sh:328: tor_curl_request --insecure -L \ +./hosts/up2share.sh:329: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/up2share.sh:330: -b "${up2share_cookie_jar}" -c "${up2share_cookie_jar}" \ +./hosts/up2share.sh:331: -H "Host: up2sha.re" \ +./hosts/up2share.sh:332: -H "User-Agent: $RandomUA" \ +./hosts/up2share.sh:333: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/up2share.sh:334: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/up2share.sh:335: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/up2share.sh:336: -H "Connection: keep-alive" \ +./hosts/up2share.sh:337: -H "Cookie: lng=eng" \ +./hosts/up2share.sh:338: -H "Upgrade-Insecure-Requests: 1" \ +-- +./hosts/up2share.sh:346: tor_curl_request --insecure -L \ +./hosts/up2share.sh:347: -b "${up2share_cookie_jar}" -c "${up2share_cookie_jar}" \ +./hosts/up2share.sh:348: -H "Host: up2sha.re" \ +./hosts/up2share.sh:349: -H "User-Agent: $RandomUA" \ +./hosts/up2share.sh:350: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/up2share.sh:351: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/up2share.sh:352: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/up2share.sh:353: -H "Connection: keep-alive" \ +./hosts/up2share.sh:354: -H "Cookie: lng=eng" \ +./hosts/up2share.sh:355: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/up2share.sh:356: -H "Sec-Fetch-Dest: document" \ +-- +./hosts/uploadee.sh:90: response=$(tor_curl_request --insecure -L -s "$remote_url") +./hosts/uploadee.sh:91: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/uploadee.sh:92: debugHtml "${remote_url##*/}" "upee_dwnpage$i" "${response}" +./hosts/uploadee.sh:93: fi +./hosts/uploadee.sh:94: if [[ -z $response ]] ; then +./hosts/uploadee.sh:95: rm -f "${upee_cookie_jar}"; +./hosts/uploadee.sh:96: if [ $i == $maxfetchretries ] ; then +./hosts/uploadee.sh:97: printf "\\n" +./hosts/uploadee.sh:98: echo -e "${RED}| Failed to extract download link.${NC}" +./hosts/uploadee.sh:99: warnAndRetryUnknownError=true +./hosts/uploadee.sh:100: if [ "${finalAttempt}" == "true" ] ; then +-- +./hosts/uploadee.sh:143: file_header=$(tor_curl_request --insecure --head -L -s -b "${upee_cookie_jar}" -c "${upee_cookie_jar}" --referer "$remote_url" "$download_url") +./hosts/uploadee.sh:144: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/uploadee.sh:145: debugHtml "${remote_url##*/}" "upee_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/uploadee.sh:146: fi +./hosts/uploadee.sh:147: if [[ -z $file_header ]] ; then +./hosts/uploadee.sh:148: if [ $j == $maxfetchretries ] ; then +./hosts/uploadee.sh:149: rm -f "${upee_cookie_jar}"; +./hosts/uploadee.sh:150: printf "\\n" +./hosts/uploadee.sh:151: echo -e "${RED}| Failed to extract file info.${NC}" +./hosts/uploadee.sh:152: warnAndRetryUnknownError=true +./hosts/uploadee.sh:153: if [ "${finalAttempt}" == "true" ] ; then +-- +./hosts/uploadee.sh:251: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/uploadee.sh:252: -b "${upee_cookie_jar}" -c "${upee_cookie_jar}" --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/uploadee.sh:253: -H "Host: www.upload.ee" \ +./hosts/uploadee.sh:254: --referer "$remote_url" "$download_url" \ +./hosts/uploadee.sh:255: --continue-at - --output "$file_path" +./hosts/uploadee.sh:256: else +./hosts/uploadee.sh:257: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/uploadee.sh:258: -b "${upee_cookie_jar}" -c "${upee_cookie_jar}" \ +./hosts/uploadee.sh:259: -H "Host: www.upload.ee" \ +./hosts/uploadee.sh:260: --referer "$remote_url" "$download_url" \ +./hosts/uploadee.sh:261: --continue-at - --output "$file_path" +./hosts/uploadee.sh:262: fi +./hosts/uploadee.sh:263: else +./hosts/uploadee.sh:264: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/uploadee.sh:265: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/uploadee.sh:266: -b "${upee_cookie_jar}" -c "${upee_cookie_jar}" --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/uploadee.sh:267: -H "Host: www.upload.ee" \ +./hosts/uploadee.sh:268: -H "User-Agent: $RandomUA" \ +./hosts/uploadee.sh:269: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/uploadee.sh:270: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/uploadee.sh:271: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/uploadee.sh:272: -H "Connection: keep-alive" \ +./hosts/uploadee.sh:273: -H "Cookie: lng=eng" \ +./hosts/uploadee.sh:274: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/uploadee.sh:275: -H "Sec-Fetch-Dest: document" \ +-- +./hosts/uploadee.sh:282: tor_curl_request --insecure -L -G --no-alpn \ +./hosts/uploadee.sh:283: -b "${upee_cookie_jar}" -c "${upee_cookie_jar}" \ +./hosts/uploadee.sh:284: -H "Host: www.upload.ee" \ +./hosts/uploadee.sh:285: -H "User-Agent: $RandomUA" \ +./hosts/uploadee.sh:286: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/uploadee.sh:287: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/uploadee.sh:288: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/uploadee.sh:289: -H "Connection: keep-alive" \ +./hosts/uploadee.sh:290: -H "Cookie: lng=eng" \ +./hosts/uploadee.sh:291: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/uploadee.sh:292: -H "Sec-Fetch-Dest: document" \ +-- +./hosts/uploadev.sh:91: response=$(tor_curl_request --insecure -L -s -b "${upev_cookie_jar}" -c "${upev_cookie_jar}" \ +./hosts/uploadev.sh:92: -w "\n\nHTTP_CODE: %{http_code}\nEFFECTIVE_URL: %{url_effective}\n" \ +./hosts/uploadev.sh:93: "$fixed_url") +./hosts/uploadev.sh:94: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/uploadev.sh:95: debugHtml "${remote_url##*/}" "upev_fetch$i" "${response}" +./hosts/uploadev.sh:96: fi +./hosts/uploadev.sh:97: if [[ -z $response ]] ; then +./hosts/uploadev.sh:98: rm -f "${upev_cookie_jar}"; +./hosts/uploadev.sh:99: if [ $i == $maxfetchretries ] ; then +./hosts/uploadev.sh:100: printf "\\n" +./hosts/uploadev.sh:101: echo -e "${RED}| Failed to extract download link [1]${NC}" +-- +./hosts/uploadev.sh:181: response=$(tor_curl_request --insecure -L -s -X POST \ +./hosts/uploadev.sh:182: -b "${upev_cookie_jar}" -c "${upev_cookie_jar}" \ +./hosts/uploadev.sh:183: --data "$form_data" "$fixed_url") +./hosts/uploadev.sh:184: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/uploadev.sh:185: debugHtml "${remote_url##*/}" "upev_post2_$i" "url: ${fixed_url}"$'\n'"form_data: ${form_data}"$'\n'"${response}" +./hosts/uploadev.sh:186: fi +./hosts/uploadev.sh:187: if [[ -z $response ]] ; then +./hosts/uploadev.sh:188: if [ $i == $maxfetchretries ] ; then +./hosts/uploadev.sh:189: rm -f "${upev_cookie_jar}"; +./hosts/uploadev.sh:190: printf "\\n" +./hosts/uploadev.sh:191: echo -e "${RED}| Failed to extract download link [4]${NC}" +-- +./hosts/uploadev.sh:268: file_header=$(tor_curl_request --insecure -L --head -s "$download_url") +./hosts/uploadev.sh:269: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/uploadev.sh:270: debugHtml "${remote_url##*/}" "upev_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/uploadev.sh:271: fi +./hosts/uploadev.sh:272: if [[ -z $file_header ]] ; then +./hosts/uploadev.sh:273: if [ $j == $maxfetchretries ] ; then +./hosts/uploadev.sh:274: rm -f "${upev_cookie_jar}"; +./hosts/uploadev.sh:275: printf "\\n" +./hosts/uploadev.sh:276: echo -e "${RED}| Failed to extract file info [1]${NC}" +./hosts/uploadev.sh:277: warnAndRetryUnknownError=true +./hosts/uploadev.sh:278: if [ "${finalAttempt}" == "true" ] ; then +-- +./hosts/uploadev.sh:369: tor_curl_request --insecure -L \ +./hosts/uploadev.sh:370: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/uploadev.sh:371: -b "${upev_cookie_jar}" -c "${upev_cookie_jar}" \ +./hosts/uploadev.sh:372: "$download_url" --continue-at - --output "$file_path" +./hosts/uploadev.sh:373: else +./hosts/uploadev.sh:374: tor_curl_request --insecure -L \ +./hosts/uploadev.sh:375: -b "${upev_cookie_jar}" -c "${upev_cookie_jar}" \ +./hosts/uploadev.sh:376: "$download_url" --continue-at - --output "$file_path" +./hosts/uploadev.sh:377: fi +./hosts/uploadev.sh:378: else +./hosts/uploadev.sh:379: if [ "${RateMonitorEnabled}" == "true" ]; then +./hosts/uploadev.sh:380: tor_curl_request --insecure -L \ +./hosts/uploadev.sh:381: --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ +./hosts/uploadev.sh:382: -b "${upev_cookie_jar}" -c "${upev_cookie_jar}" \ +./hosts/uploadev.sh:383: -H "User-Agent: $RandomUA" \ +./hosts/uploadev.sh:384: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/uploadev.sh:385: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/uploadev.sh:386: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/uploadev.sh:387: -H "Connection: keep-alive" \ +./hosts/uploadev.sh:388: -H "Cookie: lng=eng" \ +./hosts/uploadev.sh:389: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/uploadev.sh:390: -H "Sec-Fetch-Dest: document" \ +-- +./hosts/uploadev.sh:396: tor_curl_request --insecure -L \ +./hosts/uploadev.sh:397: -b "${upev_cookie_jar}" -c "${upev_cookie_jar}" \ +./hosts/uploadev.sh:398: -H "User-Agent: $RandomUA" \ +./hosts/uploadev.sh:399: -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +./hosts/uploadev.sh:400: -H "Accept-Language: en-US,en;q=0.5" \ +./hosts/uploadev.sh:401: -H "Accept-Encoding: gzip, deflate, br" \ +./hosts/uploadev.sh:402: -H "Connection: keep-alive" \ +./hosts/uploadev.sh:403: -H "Cookie: lng=eng" \ +./hosts/uploadev.sh:404: -H "Upgrade-Insecure-Requests: 1" \ +./hosts/uploadev.sh:405: -H "Sec-Fetch-Dest: document" \ +./hosts/uploadev.sh:406: -H "Sec-Fetch-Mode: navigate" \ +-- +./hosts/uploadflix.sh:97: response=$(tor_curl_request --insecure -L -s "${fixed_url}") +./hosts/uploadflix.sh:98: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/uploadflix.sh:99: debugHtml "${remote_url##*/}" "uflix_dwnpage$j" "${response}" +./hosts/uploadflix.sh:100: fi +./hosts/uploadflix.sh:101: if [[ -z $response ]] ; then +./hosts/uploadflix.sh:102: if [ $j == $maxfetchretries ] ; then +./hosts/uploadflix.sh:103: printf "\\n" +./hosts/uploadflix.sh:104: echo -e "${RED}| Failed to extract post link.${NC}" +./hosts/uploadflix.sh:105: warnAndRetryUnknownError=true +./hosts/uploadflix.sh:106: if [ "${finalAttempt}" == "true" ] ; then +./hosts/uploadflix.sh:107: failedRetryDownload "${remote_url}" "" "" +-- +./hosts/uploadflix.sh:150: response=$(tor_curl_request --insecure -L -s -X POST --data "$form_data" "${fixed_url}") +./hosts/uploadflix.sh:151: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/uploadflix.sh:152: debugHtml "${remote_url##*/}" "uflix_post" "form_data: ${form_data}"$'\n'"${response}" +./hosts/uploadflix.sh:153: fi +./hosts/uploadflix.sh:154: if [[ -z $response ]] ; then +./hosts/uploadflix.sh:155: echo -e "${RED}| Failed to extract download link.${NC}" +./hosts/uploadflix.sh:156: warnAndRetryUnknownError=true +./hosts/uploadflix.sh:157: if [ "${finalAttempt}" == "true" ] ; then +./hosts/uploadflix.sh:158: failedRetryDownload "${remote_url}" "" "" +./hosts/uploadflix.sh:159: fi +./hosts/uploadflix.sh:160: return 1 +-- +./hosts/uploadflix.sh:192: file_header=$(tor_curl_request --insecure -L --head -s --referer "${fixed_url}" "${download_url}") +./hosts/uploadflix.sh:193: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/uploadflix.sh:194: debugHtml "${remote_url##*/}" "uflix_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/uploadflix.sh:195: fi +./hosts/uploadflix.sh:196: if [[ -z $file_header ]] ; then +./hosts/uploadflix.sh:197: if [ $j == $maxfetchretries ] ; then +./hosts/uploadflix.sh:198: printf "\\n" +./hosts/uploadflix.sh:199: echo -e "${RED}| Failed to extract file info.${NC}" +./hosts/uploadflix.sh:200: warnAndRetryUnknownError=true +./hosts/uploadflix.sh:201: if [ "${finalAttempt}" == "true" ] ; then +./hosts/uploadflix.sh:202: failedRetryDownload "${remote_url}" "" "" +-- +./hosts/uploadflix.sh:286: tor_curl_request --insecure -L -G --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --continue-at - --output "$file_path" +./hosts/uploadflix.sh:287: else +./hosts/uploadflix.sh:288: tor_curl_request --insecure -L -G "$download_url" --continue-at - --output "$file_path" +./hosts/uploadflix.sh:289: fi +./hosts/uploadflix.sh:290: received_file_size=0 +./hosts/uploadflix.sh:291: if [ -f "$file_path" ] ; then +./hosts/uploadflix.sh:292: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/uploadflix.sh:293: fi +./hosts/uploadflix.sh:294: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./hosts/uploadflix.sh:295: containsHtml=false +./hosts/uploadflix.sh:296: else +./hosts/uploadflix.sh:297: containsHtml=true +./hosts/uploadflix.sh:298: fi +-- +./hosts/uploadhive.sh:88: response=$(tor_curl_request --insecure -L -s "$remote_url") +./hosts/uploadhive.sh:89: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/uploadhive.sh:90: debugHtml "${remote_url##*/}" "uhive_dwnpage$j" "${response}" +./hosts/uploadhive.sh:91: fi +./hosts/uploadhive.sh:92: if [[ -z $response ]] ; then +./hosts/uploadhive.sh:93: if [ $j == $maxfetchretries ] ; then +./hosts/uploadhive.sh:94: printf "\\n" +./hosts/uploadhive.sh:95: echo -e "${RED}| Failed to extract post link.${NC}" +./hosts/uploadhive.sh:96: warnAndRetryUnknownError=true +./hosts/uploadhive.sh:97: if [ "${finalAttempt}" == "true" ] ; then +./hosts/uploadhive.sh:98: failedRetryDownload "${remote_url}" "" "" +-- +./hosts/uploadhive.sh:134: response=$(tor_curl_request --insecure -L -s -X POST --data "$form_data" "$remote_url") +./hosts/uploadhive.sh:135: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/uploadhive.sh:136: debugHtml "${remote_url##*/}" "uhive_post" "${response}" +./hosts/uploadhive.sh:137: fi +./hosts/uploadhive.sh:138: if [[ -z $response ]] ; then +./hosts/uploadhive.sh:139: echo -e "${RED}| Failed to extract download link.${NC}" +./hosts/uploadhive.sh:140: warnAndRetryUnknownError=true +./hosts/uploadhive.sh:141: if [ "${finalAttempt}" == "true" ] ; then +./hosts/uploadhive.sh:142: failedRetryDownload "${remote_url}" "" "" +./hosts/uploadhive.sh:143: fi +./hosts/uploadhive.sh:144: return 1 +-- +./hosts/uploadhive.sh:175: file_header=$(tor_curl_request --insecure --head -s -L --referer "$remote_url" "$download_url") +./hosts/uploadhive.sh:176: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/uploadhive.sh:177: debugHtml "${remote_url##*/}" "uhive_head$j" "download_url: ${download_url}"$'\n'"${file_header}" +./hosts/uploadhive.sh:178: fi +./hosts/uploadhive.sh:179: if [[ -z $file_header ]] ; then +./hosts/uploadhive.sh:180: if [ $j == $maxfetchretries ] ; then +./hosts/uploadhive.sh:181: printf "\\n" +./hosts/uploadhive.sh:182: echo -e "${RED}| Failed to extract file info.${NC}" +./hosts/uploadhive.sh:183: warnAndRetryUnknownError=true +./hosts/uploadhive.sh:184: if [ "${finalAttempt}" == "true" ] ; then +./hosts/uploadhive.sh:185: failedRetryDownload "${remote_url}" "" "" +-- +./hosts/uploadhive.sh:269: tor_curl_request --insecure -L -G --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --continue-at - --output "$file_path" +./hosts/uploadhive.sh:270: else +./hosts/uploadhive.sh:271: tor_curl_request --insecure -L -G "$download_url" --continue-at - --output "$file_path" +./hosts/uploadhive.sh:272: fi +./hosts/uploadhive.sh:273: received_file_size=0 +./hosts/uploadhive.sh:274: if [ -f "$file_path" ] ; then +./hosts/uploadhive.sh:275: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./hosts/uploadhive.sh:276: fi +./hosts/uploadhive.sh:277: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./hosts/uploadhive.sh:278: containsHtml=false +./hosts/uploadhive.sh:279: else +./hosts/uploadhive.sh:280: containsHtml=true +./hosts/uploadhive.sh:281: fi +-- +./hosts/up_1fichier.sh:107: response=$(tor_curl_request --insecure -L -s "https://1fichier.com/") +./hosts/up_1fichier.sh:108: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/up_1fichier.sh:109: debugHtml "${filepath##*/}" "${_hostCode}_up_getid_$i" "url: https://1fichier.com/"$'\n'"${response}" +./hosts/up_1fichier.sh:110: fi +./hosts/up_1fichier.sh:111: if [[ -z $response ]] ; then +./hosts/up_1fichier.sh:112: if [ $i == $maxfetchretries ] ; then +./hosts/up_1fichier.sh:113: if [ "${finalAttempt}" == "true" ] ; then +./hosts/up_1fichier.sh:114: printf "\\n" +./hosts/up_1fichier.sh:115: echo -e "${RED}| Upload failed. (GetId [1])${NC}" +./hosts/up_1fichier.sh:116: failedUpload "$pline" "${filepath}" "${_hostCode}" "Failed to upload file" "No Response (GetId [1])" +./hosts/up_1fichier.sh:117: exitUploadError=true +-- +./hosts/up_1fichier.sh:180: response=$(tor_curl_upload --insecure -L \ +./hosts/up_1fichier.sh:181: -F "file[]=@${arrFiles[@]}" \ +./hosts/up_1fichier.sh:182: -F "send_ssl=on" \ +./hosts/up_1fichier.sh:183: -F "domain=0" \ +./hosts/up_1fichier.sh:184: -F "mail=" \ +./hosts/up_1fichier.sh:185: -F "dpass=" \ +./hosts/up_1fichier.sh:186: -F "user=" \ +./hosts/up_1fichier.sh:187: -F "mails=" \ +./hosts/up_1fichier.sh:188: -F "message=" \ +./hosts/up_1fichier.sh:189: "${PostUrlHost}") +./hosts/up_1fichier.sh:190: if [ "${DebugAllEnabled}" == "true" ] ; then +-- +./hosts/up_acid.sh:94: response=$(tor_curl_upload --insecure -i \ +./hosts/up_acid.sh:95: -H "Content-Type: multipart/form-data" \ +./hosts/up_acid.sh:96: -F "time=month" \ +./hosts/up_acid.sh:97: -F "file=@${filepath}" \ +./hosts/up_acid.sh:98: "${PostUrlHost}") +./hosts/up_acid.sh:99: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/up_acid.sh:100: debugHtml "${filepath##*/}" "${_hostCode}_upload" "post_url: ${PostUrlHost}"$'\n'"${response}" +./hosts/up_acid.sh:101: fi +./hosts/up_acid.sh:102: if grep -Eqi ' 200 ' <<< "${response}" ; then +./hosts/up_acid.sh:103: hash=$(echo "$response" | tail -2 | head -1) +./hosts/up_acid.sh:104: hash=${hash//[$'\t\r\n']} +-- +./hosts/up_anarchaserver.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_anarchaserver.sh:103: -H "Content-Type: multipart/form-data" \ +./hosts/up_anarchaserver.sh:104: -F "time=month" \ +./hosts/up_anarchaserver.sh:105: -F "file=@${filepath}" \ +./hosts/up_anarchaserver.sh:106: "${PostUrlHost}") +./hosts/up_anarchaserver.sh:107: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/up_anarchaserver.sh:108: debugHtml "${filepath##*/}" "${_hostCode}_upload" "post_url: ${PostUrlHost}"$'\n'"${response}" +./hosts/up_anarchaserver.sh:109: fi +./hosts/up_anarchaserver.sh:110: if grep -Eqi ' 200 ' <<< "${response}" ; then +./hosts/up_anarchaserver.sh:111: hash=$(echo "$response" | tail -2 | head -1) +./hosts/up_anarchaserver.sh:112: hash=${hash//[$'\t\r\n']} +-- +./hosts/up_anonsharing.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_anonsharing.sh:103: -H "Content-Type: multipart/form-data" \ +./hosts/up_anonsharing.sh:104: -F "files[]=@${arrFiles[@]}" \ +./hosts/up_anonsharing.sh:105: "${PostUrlHost}") +./hosts/up_anonsharing.sh:106: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/up_anonsharing.sh:107: debugHtml "${filepath##*/}" "${_hostCode}_upload" "post_url: ${PostUrlHost}"$'\n'"${response}" +./hosts/up_anonsharing.sh:108: fi +./hosts/up_anonsharing.sh:109: if grep -Eqi '"error":null,"url":"https:\\/\\/anonsharing.com\\/' <<< "${response}" ; then +./hosts/up_anonsharing.sh:110: fileid=$(grep -oPi '(?<=","file_id":").*?(?=".*$)' <<< "$response") +./hosts/up_anonsharing.sh:111: filesize=$(GetFileSize "$filepath" "false") +./hosts/up_anonsharing.sh:112: downloadLink="https://anonsharing.com/fileid=${fileid}" +-- +./hosts/up_axfc.sh:109: response=$(tor_curl_request --insecure -L -s -b "${axfc_cookie_jar}" -c "${axfc_cookie_jar}" "$fixed_url") +./hosts/up_axfc.sh:110: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/up_axfc.sh:111: debugHtml "${remote_url##*/}" "axfc_fetch$i" "${response}" +./hosts/up_axfc.sh:112: fi +./hosts/up_axfc.sh:113: if [[ -z $response ]] ; then +./hosts/up_axfc.sh:114: rm -f "${axfc_cookie_jar}"; +./hosts/up_axfc.sh:115: if [ $i == $maxfetchretries ] ; then +./hosts/up_axfc.sh:116: printf "\\n" +./hosts/up_axfc.sh:117: echo -e "${RED}| Failed to start an upload [1]${NC}" +./hosts/up_axfc.sh:118: warnAndRetryUnknownError=true +./hosts/up_axfc.sh:119: if [ "${finalAttempt}" == "true" ] ; then +-- +./hosts/up_axfc.sh:136: response=$(tor_curl_upload --insecure -L -s -X POST \ +./hosts/up_axfc.sh:137: -H 'Referer: https://www.axfc.net/u/post_m.pl' \ +./hosts/up_axfc.sh:138: -H 'Content-Type: application/x-www-form-urlencoded' \ +./hosts/up_axfc.sh:139: -H 'Origin: https://www.axfc.net' \ +./hosts/up_axfc.sh:140: -H 'Connection: keep-alive' \ +./hosts/up_axfc.sh:141: -b "${axfc_cookie_jar}" -c "${axfc_cookie_jar}" \ +./hosts/up_axfc.sh:142: --data-raw "method=upload&ext=ext&filename=1&comment=&address=&delpass=$randelkey&keyword=1234&count=&term=0&term_y=2024&term_mon=10&term_d=1&term_h=15&term_min=0&term_s=0&term_ps=&term_mp=3600" \ +./hosts/up_axfc.sh:143: -w "\n\nHTTP_CODE: %{http_code}\nEFFECTIVE_URL: %{url_effective}\n" \ +./hosts/up_axfc.sh:144: "$fixed_url") +./hosts/up_axfc.sh:145: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/up_axfc.sh:146: debugHtml "${remote_url##*/}" "axfc_ticket$i" "${response}" +-- +./hosts/up_axfc.sh:184: response=$(tor_curl_upload --insecure -L -i -X POST \ +./hosts/up_axfc.sh:185: -H "Content-Type: multipart/form-data" \ +./hosts/up_axfc.sh:186: -H 'Connection: keep-alive' \ +./hosts/up_axfc.sh:187: -F "filedata=@$filepath" \ +./hosts/up_axfc.sh:188: -b "${axfc_cookie_jar}" -c "${axfc_cookie_jar}" \ +./hosts/up_axfc.sh:189: "$PostUrlHost") +./hosts/up_axfc.sh:190: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/up_axfc.sh:191: debugHtml "${filepath##*/}" "${_hostCode}_upload" "post_url: ${PostUrlHost}"$'\n'"${response}" +./hosts/up_axfc.sh:192: fi +./hosts/up_axfc.sh:193: if grep -Eqi 'Axfc Uploader -投稿完了.*キーワード付きURL:.*a href="https://www.axfc.net.*(QueryString無しVer)' <<< "${response}" ; then +./hosts/up_axfc.sh:194: subSearch=$(awk '/Axfc Uploader -投稿完了/,/(QueryString無しVer)/' <<< "$response") +-- +./hosts/up_bedrive.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_bedrive.sh:103: -H "Content-Type: multipart/form-data" \ +./hosts/up_bedrive.sh:104: -F "time=month" \ +./hosts/up_bedrive.sh:105: -F "files[]=@${arrFiles[@]}" \ +./hosts/up_bedrive.sh:106: "${PostUrlHost}") +./hosts/up_bedrive.sh:107: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/up_bedrive.sh:108: debugHtml "${filepath##*/}" "${_hostCode}_upload" "post_url: ${PostUrlHost}"$'\n'"${response}" +./hosts/up_bedrive.sh:109: fi +./hosts/up_bedrive.sh:110: if grep -Eqi '"error":null,"url":"https:\\/\\/bedrive.ru\\/' <<< "${response}" ; then +./hosts/up_bedrive.sh:111: hash=$(grep -oPi '(?<="url":"https:\\/\\/bedrive.ru\\/).*?(?=".*$)' <<< "$response") +./hosts/up_bedrive.sh:112: filesize=$(GetFileSize "$filepath" "false") +-- +./hosts/up_bowfile.sh:108: response=$(tor_curl_request --insecure -L -i \ +./hosts/up_bowfile.sh:109: -H "Content-Type: multipart/form-data" \ +./hosts/up_bowfile.sh:110: -F "files[]=@$filepath" \ +./hosts/up_bowfile.sh:111: "${PostUrlHost}") +./hosts/up_bowfile.sh:112: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/up_bowfile.sh:113: debugHtml "${filepath##*/}" "${_hostCode}_upload" "post_url: ${PostUrlHost}"$'\n'"${response}" +./hosts/up_bowfile.sh:114: fi +./hosts/up_bowfile.sh:115: if grep -Eqi '"error":null,"url":"https:\\/\\/bowfile.com\\/' <<< "${response}" ; then +./hosts/up_bowfile.sh:116: url=$(grep -oPi '(?<="url":"https:\\/\\/bowfile.com\\/).*?(?=")' <<< "$response") +./hosts/up_bowfile.sh:117: hash=$(grep -oPi '(?<="short_url":").*?(?=")' <<< "$response") +./hosts/up_bowfile.sh:118: filesize=$(GetFileSize "$filepath" "false") +-- +./hosts/up_dailyuploads.sh:109: response=$(tor_curl_upload --insecure -i \ +./hosts/up_dailyuploads.sh:110: -H "Content-Type: multipart/form-data" \ +./hosts/up_dailyuploads.sh:111: -F "sess_id=" \ +./hosts/up_dailyuploads.sh:112: -F "utype=anon" \ +./hosts/up_dailyuploads.sh:113: -F "link_rcpt=" \ +./hosts/up_dailyuploads.sh:114: -F "link_pass=" \ +./hosts/up_dailyuploads.sh:115: -F "to_folder=" \ +./hosts/up_dailyuploads.sh:116: -F "file_descr=" \ +./hosts/up_dailyuploads.sh:117: -F "file_public=1" \ +./hosts/up_dailyuploads.sh:118: -F "file_0=@$filepath" \ +./hosts/up_dailyuploads.sh:119: "${PostUrlHost}") +-- +./hosts/up_dataupload.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_dataupload.sh:103: -H "Content-Type: multipart/form-data" \ +./hosts/up_dataupload.sh:104: -F "sess_id=" \ +./hosts/up_dataupload.sh:105: -F "file_descr=" \ +./hosts/up_dataupload.sh:106: -F "file_public=" \ +./hosts/up_dataupload.sh:107: -F "link_rcpt=" \ +./hosts/up_dataupload.sh:108: -F "link_pass=" \ +./hosts/up_dataupload.sh:109: -F "to_folder=" \ +./hosts/up_dataupload.sh:110: -F "keepalive=1" \ +./hosts/up_dataupload.sh:111: -F "file_0=@${filepath}" \ +./hosts/up_dataupload.sh:112: "${PostUrlHost}") +-- +./hosts/up_dbree.sh:102: response=$(tor_curl_upload --insecure -i \ +./hosts/up_dbree.sh:103: -H "Content-Type: multipart/form-data" \ +./hosts/up_dbree.sh:104: -F "file[]=@${arrFiles[@]}" \ +./hosts/up_dbree.sh:105: -F "upload=Upload" \ +./hosts/up_dbree.sh:106: "${PostUrlHost}") +./hosts/up_dbree.sh:107: if [ "${DebugAllEnabled}" == "true" ] ; then +./hosts/up_dbree.sh:108: debugHtml "${filepath##*/}" "${_hostCode}_upload" "post_url: ${PostUrlHost}"$'\n'"${response}" +./hosts/up_dbree.sh:109: fi +./hosts/up_dbree.sh:110: if grep -Eqi 'URL: = MaxDownloadRetries)) ; then +./mad.sh:1407: echo -e "${RED}| FAILED: Size mismatch after downloading${NC}" +./mad.sh:1408: exit 1 +-- +./mad.sh:1451: response=$(tor_curl_request --insecure -L -s https://github.com/lexiforest/curl-impersonate/releases/latest) +./mad.sh:1452: if [ "${DebugAllEnabled}" == "true" ] ; then +./mad.sh:1453: debugHtml "github" "lbf_inst_curlimp$j" "$response" +./mad.sh:1454: fi +./mad.sh:1455: if [ ! -z "$response" ]; then +./mad.sh:1456: latestTag=$(grep -oPi -m 1 '(?<=/curl-impersonate/releases/tag/).*?(?=")' <<< "$response") +./mad.sh:1457: latestBinaryDate=$(grep -oPi -m 1 '(?<== MaxDownloadRetries)) ; then +./mad.sh:1530: echo -e "${RED}| FAILED: Size mismatch after downloading${NC}" +./mad.sh:1531: exit 1 +-- +./mad.sh:1726: maud_torcurl=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep -A 12 --color='always' -Ei 'tor_curl') +./mad.sh:1727: echo -e "Files:" +./mad.sh:1728: echo -e "${BLUE}${fil}${NC}" +./mad.sh:1729: echo -e "" +./mad.sh:1730: echo -e "" +./mad.sh:1731: echo -e "${PINK}MAD Audit of http lines:${NC} (${GREEN}grep \"http:\" or \"https:\"${NC})" +./mad.sh:1732: echo -e "_________________________________________________________________________" +./mad.sh:1733: echo -e "$maud_http" +./mad.sh:1734: echo -e "" +./mad.sh:1735: echo -e "${PINK}MAD Audit of curl:${NC} (${GREEN}grep \"curl\"${NC})" +./mad.sh:1736: echo -e "_________________________________________________________________________" +-- +./mad.sh:1739: echo -e "${PINK}MAD Audit of tor_curl (+12 lines after):${NC} (${GREEN}grep \"tor_curl\"${NC})" +./mad.sh:1740: echo -e "_________________________________________________________________________" +./mad.sh:1741: echo -e "$maud_torcurl" +./mad.sh:1742: echo -e "" +./mad.sh:1743: echo -e "" +./mad.sh:1744: done +./mad.sh:1745: else +./mad.sh:1746: cd "$ScriptDir" +./mad.sh:1747: readarray -d $'' arrFiles < <(find . -name "*.sh" -printf '%p\n' | sort -Vk1) +./mad.sh:1748: cd "$WorkDir" +./mad.sh:1749: readarray -d $'' arrFiles2 < <(find . -name "*.sh" -printf '%p\n' | sort -Vk1) +-- +./mad.sh:1754: maud_torcurl=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep -A 12 --color='always' -Ei 'tor_curl') +./mad.sh:1755: echo -e "Files:" +./mad.sh:1756: echo -e "${BLUE}${fil}${NC}" +./mad.sh:1757: echo -e "" +./mad.sh:1758: echo -e "" +./mad.sh:1759: echo -e "${PINK}MAD Audit of http lines:${NC} (${GREEN}grep \"http:\" or \"https:\"${NC})" +./mad.sh:1760: echo -e "_________________________________________________________________________" +./mad.sh:1761: echo -e "$maud_http" +./mad.sh:1762: echo -e "" +./mad.sh:1763: echo -e "${PINK}MAD Audit of curl:${NC} (${GREEN}grep \"curl \"${NC})" +./mad.sh:1764: echo -e "_________________________________________________________________________" +-- +./mad.sh:1767: echo -e "${PINK}MAD Audit of tor_curl (+12 lines after):${NC} (${GREEN}grep \"tor_curl\"${NC})" +./mad.sh:1768: echo -e "_________________________________________________________________________" +./mad.sh:1769: echo -e "$maud_torcurl" +./mad.sh:1770: echo -e "" +./mad.sh:1771: done +./mad.sh:1772: for fil in "${arrFiles2[@]}"; +./mad.sh:1773: do +./mad.sh:1774: maud_http=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep --color='always' -Ei '(http|https):') +./mad.sh:1775: maud_curl=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep --color='always' -Ei 'curl') +./mad.sh:1776: maud_torcurl=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep -A 12 --color='always' -Ei 'tor_curl') +./mad.sh:1777: echo -e "Files:" +./mad.sh:1778: echo -e "${BLUE}${fil}${NC}" +./mad.sh:1779: echo -e "" +./mad.sh:1780: echo -e "" +./mad.sh:1781: echo -e "${PINK}MAD Audit of http lines:${NC} (${GREEN}grep \"http:\" or \"https:\"${NC})" +./mad.sh:1782: echo -e "_________________________________________________________________________" +./mad.sh:1783: echo -e "$maud_http" +./mad.sh:1784: echo -e "" +./mad.sh:1785: echo -e "${PINK}MAD Audit of curl:${NC} (${GREEN}grep \"curl\"${NC})" +./mad.sh:1786: echo -e "_________________________________________________________________________" +-- +./mad.sh:1789: echo -e "${PINK}MAD Audit of tor_curl (+12 lines after):${NC} (${GREEN}grep \"tor_curl\"${NC})" +./mad.sh:1790: echo -e "_________________________________________________________________________" +./mad.sh:1791: echo -e "$maud_torcurl" +./mad.sh:1792: echo -e "" +./mad.sh:1793: done +./mad.sh:1794: fi +./mad.sh:1795:} +./mad.sh:1796:madStatus() { +./mad.sh:1797: local InputFile="$1" +./mad.sh:1798: if [ "$arg1" == "status" ] ; then +./mad.sh:1799: clear +-- +./mad.sh:3102: file_header=$(tor_curl_request --insecure -m 18 -s -D - -o /dev/null \ +./mad.sh:3103: -H "Connection: keep-alive" \ +./mad.sh:3104: -w 'EffectiveUrl=%{url_effective}' \ +./mad.sh:3105: "$download_url") +./mad.sh:3106: else +./mad.sh:3107: printf "| Retrieving Head: attempt #$j" +./mad.sh:3108: rm -f "${WorkDir}/.temp/directhead" +./mad.sh:3109: file_header=$(tor_curl_request --insecure --head -H "Connection: keep-alive" -L -s -i "$download_url" | +./mad.sh:3110: tee "${WorkDir}/.temp/directhead" & +./mad.sh:3111: sleep 6 +./mad.sh:3112: [ -s "${WorkDir}/.temp/directhead" ] +./mad.sh:3113: kill $! 2>/dev/null +./mad.sh:3114: ) +./mad.sh:3115: if [ ! -f "${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/}" ]; then +./mad.sh:3116: touch "${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/}" +./mad.sh:3117: fi +./mad.sh:3118: rm -f "${WorkDir}/.temp/directhead" +./mad.sh:3119: fi +-- +./mad.sh:3237: tor_curl_request --insecure -L --referer "$file_url" "$download_url" --output "$file_path" +./mad.sh:3238: rc=$? +./mad.sh:3239: if [ $rc -ne 0 ] ; then +./mad.sh:3240: printf "${RED}Download Failed (bad exit status).${NC}" +./mad.sh:3241: if [ -f ${file_path} ]; then +./mad.sh:3242: printf "${YELLOW} Partial removed...${NC}" +./mad.sh:3243: printf "\n\n" +./mad.sh:3244: rm -f "${file_path}" +./mad.sh:3245: else +./mad.sh:3246: printf "\n\n" +./mad.sh:3247: fi +-- +./mad.sh:3281: tor_curl_request --insecure -L --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --continue-at - --output "$file_path" +./mad.sh:3282: else +./mad.sh:3283: tor_curl_request --insecure -L --referer "$file_url" "$download_url" --continue-at - --output "$file_path" +./mad.sh:3284: fi +./mad.sh:3285: received_file_size=0 +./mad.sh:3286: if [ -f "$file_path" ] ; then +./mad.sh:3287: received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') +./mad.sh:3288: fi +./mad.sh:3289: if CheckNoHtml "$remote_url" "$filename" "$file_path" ; then +./mad.sh:3290: containsHtml=false +./mad.sh:3291: else +./mad.sh:3292: containsHtml=true +./mad.sh:3293: fi + diff --git a/_audit.sh b/_audit.sh new file mode 100755 index 0000000..b5f3bd7 --- /dev/null +++ b/_audit.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +backupIFS=$IFS +IFS=$(echo -en "\n\b") +ScriptDir="$( cd "$( dirname "$(realpath "$0")" )" && pwd )" +mkdir -p "$ScriptDir/.audit" +madAuditHttpLog="$ScriptDir/.audit/mad-audit-http.log" +madAuditCurlLog="$ScriptDir/.audit/mad-audit-curl.log" +madAuditTorCurlLog="$ScriptDir/.audit/mad-audit-tor_curl-details.log" +echo "DateTime: `date +%y.%m.%d`" | tee "$madAuditHttpLog" "$madAuditCurlLog" "$madAuditTorCurlLog" > /dev/null +echo "" | tee -a "$madAuditHttpLog" "$madAuditCurlLog" "$madAuditTorCurlLog" > /dev/null + +# Get array of all .sh files +cd "$ScriptDir" +readarray -d $'' arrFiles < <(find . -name "*.sh" ! -name "_audit.sh" -printf '%p\n' | sort -Vk1) + +# Process each file +for fil in "${arrFiles[@]}"; +do + # Find all "http", "curl ", and "tor_curl" refs + maud_http=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep -Ei '(http|https):') + maud_curl=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep -Ei 'curl') + maud_torcurl=$(grep -n -vxE '[[:blank:]]*([#].*)?' $fil | grep -A 10 -Ei 'tor_curl') + + echo "Files:" | tee -a "$madAuditHttpLog" "$madAuditCurlLog" "$madAuditTorCurlLog" > /dev/null + echo "${fil}" | tee -a "$madAuditHttpLog" "$madAuditCurlLog" "$madAuditTorCurlLog" > /dev/null + echo "" | tee -a "$madAuditHttpLog" "$madAuditCurlLog" "$madAuditTorCurlLog" > /dev/null + + echo "MAD Audit of http lines: (grep \"http:\" or \"https:\")" >> "$madAuditHttpLog" + echo "_________________________________________________________________________" >> "$madAuditHttpLog" + echo "$maud_http" >> "$madAuditHttpLog" + echo "" >> "$madAuditHttpLog" + + echo "MAD Audit of curl: (grep \"curl\")" >> "$madAuditCurlLog" + echo "_________________________________________________________________________" >> "$madAuditCurlLog" + echo "$maud_curl" >> "$madAuditCurlLog" + echo "" >> "$madAuditCurlLog" + + echo "MAD Audit of tor_curl (+10 lines after): (grep \"tor_curl\")" >> "$madAuditTorCurlLog" + echo "_________________________________________________________________________" >> "$madAuditTorCurlLog" + echo "$maud_torcurl" >> "$madAuditTorCurlLog" + echo "" >> "$madAuditTorCurlLog" +done + +IFS=$backupIFS \ No newline at end of file diff --git a/documentation/!CMD arguments.txt b/documentation/!CMD arguments.txt new file mode 100755 index 0000000..bc61e44 --- /dev/null +++ b/documentation/!CMD arguments.txt @@ -0,0 +1,54 @@ +------ Basic Usage (Downloads) ----------------------- + +# Process urls and download files from urls.txt +./mad.sh urls.txt + +# Process specific host urls in urls.txt +./mad.sh urls.txt + (ie ./mad.sh kraken urls.txt, ./mad.sh hex urls.txt) + +# Launch 4 terminals to process specific host urls in urls.txt (fallback to allhosts) +./mad.sh multi auto 4 urls.txt + +# Launch terminals to process specific host urls in urls.txt (fallback to allhosts) +./mad.sh multi auto urls.txt + +# Show the status of urls in urls.txt +./mad.sh status urls.txt + +# Reset any #RETRY# lines in urls.txt +./mad.sh reset urls.txt + + +------ Basic Usage (Uploads) ------------------------- + +# Display MAD UI Uploader (process files in ./uploads/ folder to selected hosts) +./mad.sh upload + +# Use MAD file processing (batch like the downloader) +./mad.sh upload uploads.txt + +# Show the status of urls in urls.txt +./mad.sh upload status uploads.txt + +# Reset any #RETRY# lines in uploads.txt +./mad.sh upload reset uploads.txt + + +------ Informational Display ----------------------- + +# Display Host Modules and their internal description +./mad.sh hosts + +# Diplay Plugins and their internal description +./mad.sh plugins + + +------ Other Arguments ------------------------------ + +Install curl_impersonate: Downloads the latest binary for curl_impersonate from github repo +.mad.sh install_curl_impersonate + +MAD Clipboard Monitor: Monitor clipboard for supported urls and add them to file (requires xclip -- apt install xclip) +./mad.sh clipmon urls.txt + diff --git a/documentation/!Changelog (Historical).txt b/documentation/!Changelog (Historical).txt new file mode 100755 index 0000000..9b0253c --- /dev/null +++ b/documentation/!Changelog (Historical).txt @@ -0,0 +1,480 @@ +# Additions by kittykat +# Tail format (newest to oldest) + +# +# ---------- Initial release with MAD Uploader functionality ---------- +# 2024.09.30 - [up_firestorage] Add firestorage.jp as upload host +# 2024.09.29 - [free4e/up_free4e] Add free4e.com as download and upload host +# 2024.09.29 - [harrault/up_harrault] Add harrault.fr as download and upload host +# 2024.09.29 - [acid/up_acid] Add acid.fr as download and upload host +# 2024.09.29 - [mad] Fix duplicate rename with literal chars in url +# 2024.09.28 - [dataupload/up_dataupload] Add dataupload.net as download and upload host +# 2024.09.27 - [netlib/up_netlib] Add mhep.netlib.re as download and upload host +# 2024.09.27 - [filesquid/up_filesquid] Add filesquid.net as download and upload host +# 2024.09.27 - [soyjak/up_soyjak] Add soyjak.download as download and upload host +# 2024.09.27 - [linxx/up_linxx] Add linxx.net as download and upload host +# 2024.09.27 - [nantes/up_nantes] Add nantes.cloud as download and upload host +# 2024.09.27 - [depotkaz/up_depotkaz] Add depot.kaz.bzh as download and upload host +# 2024.09.27 - [anarchaserver/up_anarchaserver] Add transitional.anarchaserver.org as download and upload host +# 2024.09.26 - [AutoResetAndRetryDownloads] Add autoloop handling to Doze&Retry / Ticket Expiry +# 2024.09.26 - [bowfile] Add handling of 'File has been removed due to inactivity' +# 2024.09.26 - [dailyuploads] Fix parsing blank referer +# 2024.09.26 - [dosya] Improve cookie cleanup +# 2024.09.26 - [1fichier] Improve cookie cleanup for exit node process +# 2024.09.26 - [mad] Fix direct= onion addresses (revert back to http) +# 2024.09.26 - [mad] Add additional direct= filename cleaning +# 2024.09.26 - [SkipUrlsInDownloadsCompletedTxt] Fix detection of already completed "direct=" urls +# 2024.09.25 - [bowfile] Add bowfile as download host (finally) +# 2024.09.25 - [mad + hosts] Do not remove file lock on Skip if another term is actively downloading the file +# 2024.09.25 - [click] Add clickndownload.name and clicknupload.name domains +# 2024.09.25 - [mad] Add global $UrlsVars that can be accessed from any function / plugin (code beautfar) +# - Any #key=value line added to urls.txt is parsed into this variable and their current value +# is accessible as ${UrlsVars["$key"]} -- ie. ${UrlsVars[pw]} +# 2024.09.25 - [mad] Fix ScriptDir ref when mad.sh is ran as a soft link (code beautfar) +# 2024.09.25 - [mad] Fix passing return code from hooked functions (thanks beautfar) +# 2024.09.25 - [uflix] Add server general error response handling +# 2024.09.25 - [ocr_captcha] Fix temp filename issue from decluttering / renaming +# 2024.09.24 - Update help, and documentation +# 2024.09.24 - Decluttered MAD folder structure and naming: +# (* READ the document on migration in the ./documentation folder *) +# (* REVIEW FolderStructure Pictures in documentation as well *) +# 2024.09.24 - [*all plugins / all hosts*] Updates to use the new decluttered folder structure and names +# 2024.09.24 - [SkipUrlsInDownloadsCompletedTxt] Add #REMOVED# to the Skip Url check +# 2024.09.24 - [up_gofile] Attempt to retrieve best upload server prior to file send +# 2024.09.23 - [mad] Add MAD Upload Reset (to reset #RETRY# lines in uploads.txt) +# * ./mad.sh upload reset uploads.txt +# 2024.09.23 - [kraken] Add cleanup of extra chars added to token +# 2024.09.23 - [filedot] Url encode user / pass in request +# 2024.09.23 - [mad] Complete MAD Upload Status (for uploads.txt) +# * ./mad.sh upload status uploads.txt +# 2024.09.23 - [mad] Fix trimming #pw= lines with special characters (beautfar) +# 2024.09.22 - [mad] Add extended upload argument (filepath) to process uploads in uploads.txt +# * ./mad.sh upload uploads.txt +# * This will process any line not starting with '#' and containing a '|' +# # Required format: +# * filename|HostCode (defaults in the ./uploads folder) +# * filepath|HostCode (uses file path passed in) +# * ie. +# MyArchive01.7z|oshi +# MyArchive01.7z|1f +# MyArchive01.7z|bow +# ! This functionality is quite new and likely I will find something I need to fix. Please +# report anything you encounter. +# 2024.09.22 - [*all upload hosts*] Updates to handle uploads.txt file processing +# 2024.09.22 - [mad] Add one more hookable function: PostFailRetryUpload() +# This is unused currrently, but will be implemented in file processing in a future update +# 2024.09.22 - [mad] Modify plugin loading system: allow multiple plugins to hook the same "hookable" functions +# * Same hookable functions: +# OnLoad(), BeginProcessing(), PreProcessUrl(), PostSuccessfulDownload(), PostFailedDownload(), +# PostFailRetryDownload(), DoneProcessingAllUrls(), PostSuccessfulUpload(), PostFailedUpload() +# Summary of changes: +# * To hook a function, it must be named "HookName_" and be unique. Best practice is to use filename +# ie. OnLoad_MyFilename() +# * NOTE: To upgrade any current plugins you wrote to function this way, just add "_" +# to the hooked function name in your plugin. +# * (Review ExampleMainHooks for more details) +# 2024.09.22 - [*all plugins*] Modified function names to use the new v2 hook mechanism, allowing for multiple +# hooks of the same function. +# 2024.09.21 - [mad] Sanitize printf in success/fail/retry/etc messaging [code: beautfar] +# 2024.09.21 - [mad] Add '#ref=' keyword to store links (like folder=) to "$CurrentRef" [code: beautfar] +# 2024.09.21 - [dbree] - Add dbree.me download host (zipcluster) +# 2024.09.21 - [up_dbree] - Add dbree.me upload host (zipcluster) +# 2024.09.21 - [nofile] - Add nofile.org download host (zipcluster) +# 2024.09.21 - [up_nofile] - Add nofile.org upload host (zipcluster) +# 2024.09.21 - [shareonline] - Add shareonline download host (zipcluster) +# 2024.09.21 - [up_shareonline] - Add shareonline upload host (zipcluster) +# 2024.09.21 - [up_yolobit] - Add yolobit upload host (zipcluster) +# 2024.09.20 - [yolobit] Add new host domain -- download files from yolobit.com (zipcluster) +# 2024.09.20 - [mad] Changed default UploadSpeedMin to 100 for uploads with RateMonitor (still catch stale uploads) +# 2024.09.20 - [lainsafe_onion] - Add lainsafe.kallist4mcluuxbjnr5p2asdlmdhaos3pcrvhk3fbzmiiiftwg6zncid.onion +# 2024.09.20 - [SkipOkUrlsInResultsTxt, SkipUrlsInCompletedTxt] - Add line verification prior to check +# 2024.09.20 - [nippy] Handle 302 response on download from some servers +# 2024.09.19 - [ocr_captcha] Create new plugin to perform OCR on images (primarily for dailyuploads) +# new image captcha system -- (WIP, accuracy maybe 25-35%, but it is all local) +# * Add "LoadPlugins=ocr_captcha.sh" to use +# * Dependencies: tesseract-ocr & imagemagick +# * (sudo apt-get install tesseract-ocr, sudo apt-get install imagemagick) +# 2024.09.19 - [dailyuploads] Fix dailyuploads captcha process -- was changed to an image captcha. +# (image captcha requires ocr_captcha plugin. not perfect -- maybe 25%-35% accuracy) +# 2024.09.18 - [mad] Add '[', ']' to literalize_string func +# 2024.09.18 - [up_uploadflix] Updated the response parsing.. working now +# 2024.09.17 - [dosya] Fix potential issue getting dosya filename +# 2024.09.17 - [mad] Fix LoopThroughFileUntilComplete=false not processing initially +# 2024.09.16 - Lots of pre-release updates & cleanup +# 2024.09.16 - Add bowfile as upload host +# 2024.09.16 - Add 3 new upload hosts -- dailyuploads, filehaus (down atm), uploadflix (down atm) +# 2024.09.16 - Add nippy upload (zipcluster: random, nippydrive, nippyshare, nippybox, nippyspace, nippyfile) +# 2024.09.16 - Add 3 new upload hosts -- hexload, gofile, dosya upload host +# 2024.09.16 - Add debug message to plugins to help locate issues if plugin has any errors +# 2024.09.16 - Add detection of failed uploads to hosts so other terminals will not attempt to upload +# 2024.09.16 - Add flock upload ticket detection and notification +# 2024.09.16 - Create 3 initial working upload hosts (1F, oshi, kraken). Also an example upload host. +# 2024.09.16 - Categorized the Options in the script and config into sections (minimized the config) +# 2024.09.16 - Added and Uploads section with 2 options in script and config +# - MaxUploadRetries (default=3) max tries to upload a file to each host +# - DefaultUploadHosts (default=1f,kraken,oshi) +# * This allows fast selection / entry of hosts at the prompt by typing 'd' +# 2024.09.15 - Add 3 new arguments / functionality to mad +# 1. ./mad.sh hosts -- displays all host modules and some internal details: +# hostcode, nick, prefix, functions, and upload specific info, etc.) +# 2. ./mad.sh plugins -- displays all plugins and internal details: +# (hostcode, nick, prefix, functions, entrypoint) +# 3. ./mad.sh upload -- This begins the batch upload processing: +# * Batch uploads will pickup any supported filetypes in the ./uploads folder +# (.7z, .rar, .001 - .009) +# * Once an upload is successfully uploaded, the download link and info is displayed, +# and a ticket is created in the ./uploads folder with all the details as well. +# * On completion, or already uploaded, or fail/retry, or failure, all information is +# logged to the ./results_upload.txt file in shortform, and detailed information is +# written to the ./uploads/uploads_processed.txt file. +# * The ./uploads/uploads_processed.txt file is used to ensure files are not uploaded +# more than once to each selected host. To re-up, the file can be edited to remove lines, +# or simply deleted. It's main purpose is to function until all files are uploaded in +# that batch, and then the folder cleaned for the next round. +# --- @ Uploading has several safety measures in place: +# 1. Supported file extension checking +# 2. A 2-step batch begin process: (require user to type 'y' to proceed selecting hosts, +# and then also require the user to type in the hostcodes to upload to). +# 3. Prior to the prompts, all files to be uploaded are displayed on the screen with details +# 4. Prior to hostcode input, all availabe upload hostcodes and hostnicks are displayed. +# 5. All the other MAD features inherent in initialization +# ** That said, be certain you take your own safety measures uploading: +# - Remove metadata from images, password protect your archives, etc. +# 2024.09.15 - Updates to the SkipUrlsInCompletedTxt.sh plugin to be more robust +# 2024.09.15 - Build out upload hosts templates "./hosts/up_.sh" +# ('up_' prefix is reserved for upload host modules) +# 2024.09.15 - Add MAD Upload functionality +# 2024.09.15 - Add MAD Host Details (run ./mad.sh hostdetails) +# Displays host information queried from all available host modules (./hosts/) +# 2024.09.15 - Add MAD Plugin Details (run ./mad.sh plugindetails) +# Displays available plugins (./plugins/ and their hooked functions +# +# ---------- Initial release with MAD Hosts functionality ---------- +# 2024.09.14 - Few small plugin updates (only functionality change is in SkipUrlsInCompletedTxt: +# include matching line number in output +# 2024.09.14 - Port clipmon functionality to use dynamic hosts +# 2024.09.13 - Change running in UrlOnly mode (passing in a url to process), to allow a second argument +# for the filename override (ie. ./mad.sh http://oshi.at/abcd "my filename.7z") +# 2024.09.13 - Port arguments to process a specific host urls to use dynamic hosts +# 2024.09.13 - Port .mad.sh help to use dynamic host data +# 2024.09.13 - Lots of testing.. lots of changes.. (all is passing so far.. though expect updates) +# 2024.09.13 - Add VerboseLoading option (display all hosts / plugin loads, or only FAIL statuses) +# 2024.09.13 - Added verification to hosts.sh file loading (check format, ensure unique HostFuncPrefix) +# 2024.09.13 - Created an example host with some descriptive help +# 2024.09.13 - Moved hosts functions into individual loadable host files (additional hosts can be added +# (additional supported hosts can be added with the example template "./hosts/Examples/ExampleNewHost.host" +# 2024.09.13 - Created a host folder and LoadHosts() function to load *.host files into mad.sh +# 2024.09.13 - Initial port of all host data (HostCode, HostNick, HostDomainRegex) into a modular string +# 2024.09.13 - [Major Update]: Host processing and code (modularized, moved into loadable hosts) +# - Created ListHostAndDomainRegexes object to allow modularization: +# - Allow loading hosts (and creating additional hosts) similarly to plugins +# - Merge ~4000 lines of host url checks and processing to make script more maintainable +# 2024.09.13 - Add detection of duplicate hook usage (functions) during plugin load and disallow +# 2024.09.12 - Created a few working plugins and one example plugin with helpful information for builders +# ** Plugins have passed args available, as well as all mad.sh vars and functions available ** +# - AutoResetAndRetryDownloads: Runs mad.sh reset after processing all urls and then relaunches MAD +# - CatnapCtrlC: Keeps mad.sh running until Ctrl-C, waiting for urls.txt updates +# - ExamplesMainHooks: Examples of the 7 main hooks +# - SkipOkUrlsInResultsTxt: Skips urls that already exist in results.txt with an #OK# flag +# - SkipUrlsInCompletedTxt: Better version of SkipOkUrlsInResultsTxt (uses new completed.txt) +# - UnzipAfterCompleted: (WIP) Unzips archives marked #OK# in urls.txt immediately after they are successfully +# downloaded and marked #OK# [this is not working yet] +# 2024.09.11 - Added completed.txt logging with more detailed info. +# (helpful for plugins such as unzipping and skip already downloaded urls as it contains filepath / date) +# 2024.09.11 - Worked with beautfar to build out ability to skip downloads already successfully downloaded +# in the results.txt (via SkipOkUrlsInResultsTxt.sh plugin). +# 2024.09.11 - Designed plugins framework in code: plugins folder, loading plugins, 5 main hooks (see readme) +# * The plugin system was designed to allow intermediate coders to implement workflows to fit their needs +# +# 2024.09.10 - Updates to nippy host processing (multi-domain, retries on unavailable response) +# 2024.09.10 - Add additional nippy hosts (nippybox.com, nippyfile.com, nippyspace.com) +# 2024.09.09 - Add retries to hexload head (ran into issue were cdn was not resolvable--likely gone) +# 2024.09.08 - Sanitize all vars written to urls.txt (prevent failures leaving a flock) +# 2024.09.07 - Add additional uflix responses +# 2024.09.06 - Add wait time response to hex and handling +# 2024.09.06 - Sanitize logging for unknown (html) errors with hexload +# 2024.09.05 - Update MinimumAllowedFilesize check for all hosts (1KB default) +# 2024.09.03 - Add new host up2sha.re +# 2024.09.03 - Replace strings dependency for bad html detection (code by beautfar) +# 2024.09.02 - Add nippyshare.me +# 2024.09.02 - Add handling of "download is temporarily unavailable" response from nippy +# 2024.09.01 - Fix MadStatus line # +# 2024.08.30 - Speed up MadStatus check / report +# 2024.08.30 - Add WorkDirOverride option to allow the working directory to be somewhere other than ScriptDir +# 2024.08.30 - Complete overhaul of ScriptDir / WorkDir to allow specifying locations +# 2024.08.30 - Converted hundreds unary operations to be more robust +# 2024.08.30 - Merge redundant shared code for maintainability and to reduce script size (~3000 lines) +# 2024.08.30 - Moved random functions out from the script configurables +# ** If you are using mad.config, it will need to be updated (grab the new one and update or merge) +# 2024.08.29 - Add handling 522 response for kraken +# 2024.08.29 - Add fdot download-limit reached response detection and removing user for further sessions +# 2024.08.29 - Add additional status [FAIL] to allow for unavailable / no retry links +# 2024.08.29 - Add fdot response handling for premium users only files +# 2024.08.28 - Add the ability to pass in a URL to simply process it instead of urls.txt +# * ./mad.sh http://oshi.at/ZZZZ +# * ./mad.sh http://oshi.at/ZZZZ\|MyFileName.7z (override filename -- don't forget the cli escape '\|' ) +# 2024.08.28 - Stringify all the rm commands for best practice (flocks, etc.) +# 2024.08.27 - Update which for curl_impersonate to look in ScriptDir +# 2024.08.26 - Updates to dailyuploads.net response parsing +# 2024.08.25 - Add option to specify terms to auto start in "multi auto" +# ./mad.sh multi auto # urls.txt +# 2024.08.24 - Add new host -- dailyuploads.net +# 2024.08.23 - Fix specific host processing completion (switch back to processing allhosts) +# 2024.08.23 - Update LaunchTerminal / ReloadScript args processing +# 2024.08.23 - clipmon: If specified urls.txt file does not exist, create it +# 2024.08.22 - Update curl_impersonate forks (cleanup / testing) +# 2024.08.22 - Add handling for multi-link download.gg urls (2 or more download files available on page) +# 2024.08.22 - Limit filehaus "no response" retries--server is likely down--mark Retry later +# 2024.08.21 - Modify catnapping message to not keep scrolling while waiting for downloads to finish +# 2024.08.21 - Make direct= download header retrieval and response check more robust +# 2024.08.21 - Revert the multi # urls.txt argument order (it was that, or change the documentation) +# * ./mad.sh multi # urls.txt +# * ./mad.sh multi host # urls.txt +# 2024.08.20 - Add several more 1F family domains +# * alterupload.com, cjoint.net, desfichiers.com, dfichiers.com, megadl.fr, mesfichiers.org, +# piecejointe.net, pjointe.com, dl4free.com +# 2024.08.20 - Fix script reload with multiple args +# 2024.08.20 - Fix Launch Terminal with multi # args +# 2024.08.20 - Dosya working again.. (up to 60 second delay on cdn server sending file) +# 2024.08.20 - Fix input file quick url count after initial argument parsing +# 2024.08.20 - Fix host parsing of args -- multi # host +# 2024.08.19 - Clean gofile filename +# 2024.08.19 - Fix download.gg post url for files with meta characters (ie. spaces) +# 2024.08.18 - Fix first line bash +# 2024.08.18 - Fix possible gofile cdn parsing issue +# 2024.08.18 - Updates to click file not found responses +# 2024.08.18 - Add clicknupload.site / clickndownload.site domain +# 2024.08.18 - Clean download.gg filename +# 2024.08.18 - Add download.gg Removed and Error responses +# 2024.08.17 - Fix flocks for active downloads with AutoRenameDuplicateFilenames=true +# (Only allow one download pure unique url -- including dupes) +# 2024.08.16 - Add AutoRenameDuplicateFilenames option (default=false) +# For any download filename that is a duplicate, this will prepend the filename with a random string +# ie. MyFile.rar --> 20240801124552305_renamed_MyFile.rar +# ** NOTE: Enabling AutoRenameDuplicateFilenames will result in downloading every url regardless +# of whether it is a duplicate or not. +# Enabled: +# (+) No need to skip simultaneous downloads of same named files +# (+) Less concern for unique filename overrides or collisions +# (-) Cannot use the |fname.ext override to try multiple download urls in order. +# ie. +# http://hosturl1.com/abcd|myfile.rar +# http://hosturl2.com/abcd|myfile.rar +# http://hosturl3.com/abcd|myfile.rar +# -- instead, use comments and uncomment if necessary -- +# http://hosturl1.com/abcd|myfile.rar +# # alt http://hosturl2.com/abcd|myfile.rar +# # alt http://hosturl3.com/abcd|myfile.rar +# Disabled: (normal / previous functionality) +# (+) Can use the |fname.ext override to try multiple download urls in order. +# (+) More control over downloads and the expected end result +# (-) More concern for unique filename overrides or collisions +# (-) Have to wait for duplicate filenames to finish downloading before starting the next. +# 2024.08.15 - Add tenvoi urls as download host (1F) +# 2024.08.14 - Add OshiBaseUrlOverride option to allow using the input url or forcing to oshi.at or oshi.onion +# 2024.08.12 - Fix file.flock check (needs to happen prior to downloads exist check) +# This fixes issues with two downloads with the same filename occurring where the second is marked failed/retry) +# 2024.08.11 - Fix gofile possible head filename parsing (new filename*=) +# 2024.08.10 - Add new host -- offshore.cat +# 2024.08.06 - Fix mad.config override for UseTorCurlImpersonate +# 2024.08.05 - Set curl_ff109 priority in which check +# 2024.08.03 - Let click resolve url domain for first 3 attempts, then fallback to .org +# 2024.08.02 - Add curl_impersonate menu choices lwthiker (orig), lexiforest (fork) +# 2024.07.30 - Add curl_impersonate lexiforest fork (more active, upgraded curl 8.7.1) +# 2024.07.28 - Fix possible 9saves fetch error +# 2024.07.26 - Fix upload.ee fileinfo request +# 2024.07.20 - Oshi file removed / no filename in header +# 2024.07.18 - Fix click dns resolution for alternate orgs that often fail +# 2024.07.16 - Fix for oshi and https cert error +# 2024.07.13 - Allow nippydrive downloads as well (ala nippyshare) +# 2024.07.12 - Fix click post for filenames with url metacharacters +# 2024.07.12 - Fix to not add blank lines at the end of processing list (from reloads) +# 2024.07.12 - Ensure url flock exists prior to download start +# 2024.07.06 - Sanitize clicknupload cdn url (fix for filenames with spaces and metacharacters) +# 2024.07.05 - Rework the reload function and terminal launcher +# 2024.07.05 - Fix bad partial detection logic / add "Too many connections" +# 2024.07.05 - Fix handling of an unexpected head query response for click and most other hosts +# 2024.07.04 - Add new host -- clicknupload / clickndownload +# 2024.07.03 - Remove nekofiles (host is gone) +# 2024.07.02 - Add new host -- gofile.io +# 2024.07.02 - Make reload script more dynamic +# 2024.07.01 - Add new host -- nippyshare.com +# 2024.06.30 - Add several direct hosts so urls can just be added +# -- Neko, lainsafe, FileDoge, Eternal, DiscreetShare +# 2024.06.28 - Add new host -- download.gg (works for good links, still needs file removed response detection) +# 2024.06.28 - Add new host -- firestorage (works for good links, still needs file removed response detection) +# 2024.06.27 - Fixes for ninesaves, biteblob, and other additions that were not tested long enough +# 2024.06.25 - Updates to filename handling with url-enconding +# 2024.06.25 - Updates to biteblob.com url handling and responses +# 2024.06.24 - Add new host -- biteblob.com +# 2024.06.24 - Add new host -- 9saves.com +# 2024.06.23 - Add clipboard monitoring option (rudimentary for now). Run in a separate terminal. +# * Dependencies: xclip (sudo apt install xclip) +# ie. ./mad.sh clipmon urls.txt +# 2024.06.22 - Add addtl pixeldrain and uploadhive file removal responses +# 2024.06.18 - Add a check to fix url flock for direct downloads with no head (fix for last update) +# 2024.06.18 - Update downloads folder to use script dir instead of pwd +# 2024.06.17 - Update to download curl_impersonate (retrieve version/date) +# 2024.06.16 - Add addtl uploadflix removed response +# 2024.06.16 - Update uploadhive removed file detection and head 500 server response +# 2024.06.16 - Fix detection of already completed if in downloads and size is equal +# 2024.06.15 - Updates to direct to handle no head response (api.discreetshare.com, and others) +# 2024.06.14 - Modify bad partial detection +# 2024.06.14 - Add debug logging to bad html check to show bad lines found +# 2024.06.14 - Updates to file downloads (generic and specific -- pd, direct) +# 2024.06.14 - Only use agent-specific header overrides if not using curl_impersonate (they are already handled) +# 2024.06.12 - Handle incorrect head response from pixeldrain +# 2024.06.12 - Make pixeldrain bypass an option (default false) +# 2024.06.11 - Make direct downloads more robust (perform no-resume downloads where no content-length is sent. +# ie. filedoge.com (this fixes filedoge.com downloads using direct=http://api.filedoge.com/) +# 2024.06.08 - Add notification option to install curl_impersonate if option is set to true and it is not found +# 2024.06.08 - Add a option to download / extract curl_impersonate (using tor+curl) to the script +# 2024.06.08 - Fix youdbox removal detection when no response +# 2024.06.04 - Fix detect direct urls if no other url types exist in inputfile +# 2024.06.04 - Remove unecessary filename parsing when a filename override is used +# 2024.06.03 - Better handling of hexload download2 cdns +# 2024.06.01 - Add additional file removal response checks for youdbox +# 2024.05.30 - Attempt to fix incorrect kraken urls, make fileid more robust +# 2024.05.28 - Add filedot.top (filedot.to) +# 2024.05.26 - Add "file was deleted because of being against Upload.ee rules" catch +# 2024.05.26 - Re-incorporate new pixeldrain viewpump functionality (use PhantomJSCloud) +# 2024.05.26 - Add retry/fail if filesize parsing fails +# 2024.05.25 - Add check for "Too many connections from your IP" to partial repairing +# 2024.05.20 - Small fix for html detecting in partials and repairing (trunc) +# 2024.05.19 - Fix filehaus head response check +# 2024.05.19 - Make filesize parser more robust for all hosts +# 2024.05.18 - Updated random user-agents (remove mobile/linux and use the top 10 -- 2024/05) +# 2024.05.18 - Changed head query of dosya to better handle response (location with no filesize updates head query +# with new location. +# 2024.05.16 - Fix null error when running without curl_impersonate +# 2024.05.16 - Add optional loading of saved mad.config variables from mad.config file if it exists to allow +# upgrading without having to reconfigure all the settings. +# 2024.05.15 - Allow RateMonitor on kraken if not resuming (issues only occur if a partial exists and the cdn +# server connected to does not support byte resume correctly.. which tends to be about half the time). +# 2024.05.11 - Addition of "direct=" keyword in urls.txt to download from a direct link or cdn +# - If the direct url doesn't end in the filename, it is highly recommended to override it with |filename.ext +# - ie. direct=http://somehost.onion/abcD|filename.part1.rar +# 2024.05.11 - Disable RateMonitor for kraken (as not all servers support byte resume correctly) +# 2024.05.09 - Sanitize urls to handle potential non-acceptable chars +# 2024.05.09 - Fix possible dosya cdn issue +# 2024.05.08 - Fix to allow inputfile not being in the script directory +# 2024.05.08 - Fix detecting corrupt partial with html (and trunc logging) +# 2024.05.07 - Add OsType (used for launching terminals with "multi" argument +# 2024.05.06 - Fdot settings check, format updates, etc. +# 2024.05.05 - Add pixeldrain ip / rate limited failure (captcha locked). View pump broke. Bypass still in testing +# 2024.05.03 - Fix possible 1F filesize check failure +# 2024.05.02 - Add kraken detection of cloudflare server issues (521: Web server down) +# 2024.05.01 - Add detection and repair of html corruption in bad partial downloads +# 2024.04.28 - Update pixeldrain (viewpump broke, use bypass) +# 2024.04.26 - Host fixes (upload.ee, hex, 1F, uhive) +# 2024.04.20 - Add youdbox.site as host +# 2024.04 - Add filedot.to as host (integration with user/pass login) +# 2024.04 - Add AutoRepairBadPartials (deprecated backup/restore) +# 2024.04 - Add download file retries (quick retries) +# 2024.04 - Add auto-switching to .top/.su domains for filehaus on excessive retries +# 2024.04 - Additional url hardening +# 2024.04 - Add uploadflix.cc / uploadflix.org +# 2024.04 - Add uploadhive.com +# 2024.04 - Add upload.ee +# 2024.04 - Add random user agent for usage +# 2024.04 - Add dosyaupload.com +# Detection of html pollution in downloads +# Updates to pixeldrain bypass +# Catch kraken "Oops" server alert +# Update pixeldrain (viewpump broke, use bypass) +# Host fixes (upload.ee, hex, 1F, uhive) +# Add youdbox.site as host +# Add filedot.to as host (integration with user/pass login) +# Add AutoRepairBadPartials (deprecated backup/restore) +# Add download file retries (quick retries) +# Add auto-switching to .top/.su domains for filehaus on excessive retries +# Additional url hardening +# Add uploadflix.cc / uploadflix.org +# Add uploadhive.com +# Add upload.ee +# Add random user agent for usage +# Add dosyaupload.com +# (retry skipped collisions / allow multiple host for a file) +# Add "LoopThroughFileUntilComplete" option to continue processing urls.txt until it has no urls to process +# * When it comes back around, if it is completed, it will be marked #OK# My file!.rar (File exists) +# * First will lock and begin downloading, the second will skip it and move on, eventually coming back around to it. +# http://krakenfiles.com/view/abcd123456/file.html|My file!.rar +# http://oshi.at/eeaa/12345.rar|My file!.rar +# ie. +# Add download / inprogress file downloading to handle collisions and to allow multi-host options for a file. +# Add hexupload.net +# Make hosts unique, cleanup cookies and temp +# Add kraken downloading (kraken) +# ie. http:/oshi.at/abcd/1abc.7z|NewFilename.001 +# Add ability to specify download filename by adding "|filename.ext" to the end of the url in file. +# Add filehaus downloading (fh) +# - Removes the _flocks folder to clear any stale tickets/locks. +# - Reverts all "#RETRY#" commented lines back so it can be downloaded again. +# Add mad.sh reset urls.txt +# leaking into the file. It also allows for resuming from a bad node, where if it is off, the download must restart. +# *deprecated* Add PdAutoBackupRestorePartials option that will backup / restore partial pixeldrain downloads to prevent bad api data +# ./mad multi auto urls.txt +# (OS dependent, 1 terminal per host -- whonix tested) +# ./mad multi fh 2 urls.txt +# ./mad multi oshi 2 urls.txt +# ./mad multi pd 2 urls.txt +# ./mad multi hex 2 urls.txt +# ./mad multi 1f 2 urls.txt +# (OS dependent, X terminals for a specific host -- whonix tested) +# ./mad multi [2-8] urls.txt +# (OS dependent, X terminals for all hosts -- whonix tested) +# ./mad urls.txt +# ./mad urls.txt +# ./mad urls.txt +# ./mad urls.txt +# (OS agnostic, run in X or more separate terminals) +# ./mad fh urls.txt +# ./mad oshi urls.txt +# ./mad pd urls.txt +# ./mad hex urls.txt +# ./mad 1f urls.txt +# (OS agnostic, run in X separate terminals) +# Add mutli-terminal / single-host (1 per host) downloading +# Add oshi downloading (oshi) +# Add pixeldrain downloading (pd) +# Add 1F french bytes conversion and potential incorrect download filesize detection (1Flove) +# Add hexload downloading functionality and integrated logging, moving, etc. +# Add multi-host downloading (1F, Hexload) +# More verbose logging on Retry/Fail reason +# Additional cdn debugging +# Add auto-commenting in urls.txt on completed / failed downloads +# Add check for completed download in the MoveToFolder (log and continue) +# Cleanup and debug additions +# Add verbose results logging +# Add optional minimum download size check +# Add retry attempts to acquire filename, filesize, and header +# Add retry on initial status attempts +# Add resume downloads (auto-resume by default) +# Incorporate multi-process download to find an empty slot faster (thanks 1flove devs) +# Add 1F Url validation +# Add STOP! keyword to allow ending after a specified download (perhaps drive limitations or another reason) +# Cleanup +# *deprecated* Update connection headers 2023.11 +# folder="" --> Keeps downloads in initial downloads directory +# - ex. folder=Folder1 Name (desc) --> Creates a folder "Folder1 Name (desc)" and moves downloads there +# Add folder= option to allow moving downloads into specified folders upon completion (blank to reset to downloads) +# *deprecated* Add option to keep partial downloads (move to *.partial folder) -- may use up space for large downloads +# *deprecated* Add multiple text recode options (some require apt install recode, or apt install html2text) +# *deprecated* Fixes for latin charset (UseRecode=html2iso8859) +# Add option to clear screen on filelist reload +# Add ability to auto-reload urls.txt if modifications are detected +# Allow reloading/restarting script (updated urls.txt) after finished processing current url "reload" or "restart" file exists +# Allow clearing the screen if "clear" file exists +# Allow aborting/stopping processing remaining urls if "stop" file exists +# Add allow comment lines (#), blank lines, and garbage lines (non-http starting) +# Add skipping file has been deleted +# Add skipping file removed by owner or does not exist +# Add skipping of removed files from host +# Output download status into results.txt in script directory +# Display try # on which successfully retrieved a valid circuit +# Add fixing (autoconverting) http:// --> https:// +# Added debug option (save html response in _debug folder) +# Added more output verbosity +# Added configurable failed download retries +# Increased connection retries / configurable connection timeout +# Fixes to output and code diff --git a/documentation/!README-mad-v2024.09.24-migration-checklist.txt b/documentation/!README-mad-v2024.09.24-migration-checklist.txt new file mode 100755 index 0000000..8e59e14 --- /dev/null +++ b/documentation/!README-mad-v2024.09.24-migration-checklist.txt @@ -0,0 +1,51 @@ +1.) Read and understand the changes -- see ./documentation/FolderStructure-Default (AIO) or + ./documentation/FolderStructure-WorkDirOverride to visualize the changes. + +Summary: +-------- + * Renamed _debug, _temp, _flocks to .debug, .temp, .flocks (so you can hide them if desired) + * Renamed 'downloads' folder (transferring files) to .inflight + * Renamed 'completed' folder to downloads (makes more sense as there are uploads / downloads (& .inflight) + * Moved "plugins" and "hosts" folders to ScriptDir in code (so they must reside in the same folder as + mad.sh (and curl_impersonate, mad.config if you choose to use them) + * Added ./data folder in WorkDir (the downloads_completed, uploads_completed reside here). It is intended + to be a more long-term data storage (things that plugins will / do use. + * Moved results.txt to ./downloads for downloads and ./uploads for uploads. This file is the verbose + processing of lines (OK, SKIP, FAIL, RETRY, NOCDN, PASSWORD, RENAME, etc). It is helpful to see an outline + of all the terminal processing. + * A summary of all the uploaded download links is created in ./uploads/results-links.txt (only successes) + * Upload completed tickets are put in the ./uploads/_tickets folder to keep it less cluttered. + * If uploads are done manual mode (through the UI ./mad.sh upload), then a file named + ./uploads/temp_upload_handler.txt is created and used to ensure multiple terminals do not reprocess + completed / failed upload files. If using uploads.txt, this is not created and not necessary as it is + handled directly in the uploads.txt + +2.) End any mad.sh processes +3.) Delete your old hosts & plugins folders (save off any plugins you are working on or wish to save). If you + have plugins that reference any of the old completed.txt, results.txt, or results_uploads.txt, then will need + to be referenced in their new locations: $WorkDir/data/downloads_completed.txt, + $WorkDir/downloads/results.txt, $WorkDir/uploads/results.txt +4.) Delete _debug, _temp, _flocks in your old folder +5.) Rename 'downloads' folder to '.inflight' (or delete if empty) +6.) Rename 'completed' folder to 'downloads' +5.) Copy all the files in this bundle and move to your MAD locations (overwrite anything there) +6.) Rename completed.txt to downloads_completed.txt and move to ./data +7.) If you have LoadPlugins="SkipUrlsInCompletedTxt.sh" in your mad.sh or mad.config, the name has changed to + SkipUrlsInDownloadsCompletedTxt.sh, so update it in the LoadPlugins="" line. + +Why? + * Less clutter everywhere (especially for those who use the WorkDirOverride) + - Scripts are in ScriptDir (mad.sh, mad.config, curl_impersonate, plugins, hosts) + - Downloads (complete) and all their result data is in downloads folder (except urls.txt, can be anywhere) + - Downloads can work in batches.. once done and extracted moved.. the contents can be purged + - Downloads that are being transferred / resuming, are in the .inflight folder. + - Once batch of downloads is complete.. this can be purged. There shouldn't be anything in it unless + something is processing or failed while processing and is waiting for resume. + - Uploads (files and all the results data / result-links.txt are in uploads (except uploads.txt); + - Uploads can work in batches.. once done and Download Links handled, this can be purged for next batch + - Upload tickets are saved in ./uploads/_tickets + - All .folders can be hidden, they are also generally short-term (really for processing a batch) + - Once processing is complete (no uploads or downloads active, these can be purged) + - New data folder is for longer term storage of statdata such as completed uploads / downloads for plugins + +* That's it for now.. \ No newline at end of file diff --git a/documentation/!README.txt b/documentation/!README.txt new file mode 100755 index 0000000..dbeaa03 --- /dev/null +++ b/documentation/!README.txt @@ -0,0 +1,157 @@ +:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-: +: Multi-host Auto Downloader [aka MAD] (by kittykat) : +:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-: + +Setup: +------ +1. Extract to folder to a location. +2. Ensure the script is executable + # Open terminal in script folder (or open terminal and cd into script folder). + # Run "chmod +e mad.sh" to give the script execute permission. +3. Configure settings in mad.sh script that you desire. +* Optional config: + - Copy mad.config to script directory from the Documentation folder and configure settings there instead. This + file will load and override any settings configured in the script -- this allows upgrading mad.sh without + having to reconfigure the settings across versions. +* Optional curl_impersonate: + - See Optional Depenencies section below. +4. Add urls to urls.txt or any file you wish to use. +5. Run "./mad.sh urls.txt" (see usage section below for additional commands or run "./mad.sh ?" for help) + + +Optional Dependecies: +--------------------- +Some hosts use CloudFlare to detect and block scripts (such as hexload). +To get around it, this script needs to impersonate a browser. +You'll need to download "curl-impersonate". + +It can be obtained on GitHub, search online for "curl-impersonate" + +To access the releases on GitHub without javascript, do this: +1. Visit the GitHub page of curl-impersonate and add "/releases/latest/" at end of URL. +2. You'll be redirected to the latest version, e.g: "/releases/tag/vx.x.x" +3. In the URL replace "tag" with "expanded_assets", e.g. "/releases/expanded_assets/v0.5.4" + +- Download archive "curl-impersonate-vX.Y.Z.x86_64-linux-gnu.tar.gz". +- Extract files "curl-impersonate-ff" and "curl_ff109" next to this script or into your PATH." + + +Usage (urls.txt): +----------------- +- ENTER 1f, hexload, pixeldrain, kraken, dosya, filehaus, oshi, upload.ee, uploadhive, or uploadflix urls + in urls.txt (one url per line). +- ! No trailing spaces BUT requires at least one empty newline at the end of file + +! Accepts/ignores comment lines and garbage lines (lines beginning with '#' or non http) + +Keywords (urls.txt): +-------------------- +folder= + - Changes save to folder (Lines beginning with keyword "folder=") + ie. folder=This is my folder! (vids) [2024] +|filename.ext + - Overrides filename to save download as (add the suffix "|Filename.ext" to a url) + ie. http://oshi.at/abcd|My new filename.rar +direct= + - Will download directly from url (special processing for Lainsafe, FileDoge, NekoFile, DiscreetShare, and others. + ie. direct=https://oshi.at/abcd/ABCD +#pw= + - Will update the $CurrentZipPassword variable in mad.sh (can be accessed in plugins) +STOP! + - Stops processing at this line +RELOAD! + - Forces a reload of the script and urls.txt file with the same commandline it started with + + +Example: +----------- +folder=New folder 01 +# pw: **1234567890$$ +# ref: http//reference.source.url/here.html +https://1fichier.com/?123456789abcdefghijk +http://hexload.com/123456789abc + +folder=New folder 02 +# pw: 4444555551-1 +http://5ety7tpkim5me6eszuwcje7bmy25pbtrjtue7zkqqgziljwqy3rrikqd.onion/ZaZa/12az.rar +http://oshi.at/AAzz/11ZZ.rar|File - Set 001 (2001).7z +http://oshi.at/AAyy/11YY.rar|File - Set 002 (2001).7z +http://pixeldrain.com/u/ZZaa0011 + +folder=Direct link fun +# pw= 2022234092 +direct=http://pomf2.lain.la/f/abcd123456789.7z +direct=http://pomf2.lain.la/f/ABCD998877000.rar|This is it [2022].rar + + +------ Informational Display ------------------------- + +[Status] of urls in urls.txt +./mad.sh status urls.txt + +[Reset] failed / retry urls in urls.txt +./mad.sh reset urls.txt + +[Host] Modules and their internal description +./mad.sh hosts + +[Plugins] and their internal description +./mad.sh plugins + + +------ Basic Usage (Uploads) ------------------------- + +[Upload] launch MAD Uploader (process files in ./uploads/ folder to selected hosts) +./mad.sh upload + + +------ Basic Usage (Downloads) ----------------------- + +[Run] +./mad.sh urls.txt + +## Multi Runs: (mutli-terminals / all-hosts / specific-host) ## +--------------------------------------------------------------- +[Normal Mode] Process urls.txt in order with multiple terminals downloading + (OS agnostic, run in X or more separate terminals) + ./mad urls.txt + ./mad urls.txt + (OS dependent, X terminals for all hosts -- whonix tested) + ./mad multi [2-8] urls.txt + +[Specific Host] Process only X host in terminal + (OS agnostic, run in X separate terminals) + ./mad 1f urls.txt + ./mad hex urls.txt + ./mad pd urls.txt + ./mad kraken urls.txt + ./mad dosya urls.txt + ./mad fh urls.txt + ./mad oshi urls.txt + ./mad upee urls.txt + ./mad uphive urls.txt + ./mad upflix urls.txt + +[**Multi Specific Host] Create X terminals for a specific host and process downloads in order + (**OS dependent, X terminals for a specific host -- whonix tested) + ./mad multi 1f 2 urls.txt + ./mad multi hex 2 urls.txt + ./mad multi pd 2 urls.txt + ./mad multi kraken 2 urls.txt + ./mad multi dosya 2 urls.txt + ./mad multi fh 2 urls.txt + ./mad multi oshi 2 urls.txt + ./mad multi upee 2 urls.txt + ./mad multi uphive 2 urls.txt + ./mad multi upflix 2 urls.txt + +[**Multi Auto] Create 1 terminal for each host and process downloads in order + (**OS dependent, 1 terminal per host -- whonix tested) + ./mad multi auto urls.txt + +[**Multi Auto] Create 4 terminals (1 terminal for each host) and process downloads in order + (**OS dependent, 1 terminal per host -- whonix tested) + ./mad multi auto 4 urls.txt + + + \ No newline at end of file diff --git a/documentation/FolderStructure-Default (AIO)/ScriptDir+WorkDir.jpg b/documentation/FolderStructure-Default (AIO)/ScriptDir+WorkDir.jpg new file mode 100755 index 0000000000000000000000000000000000000000..718662664db0790e03937b1fb30d69faa763f030 GIT binary patch literal 49921 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 GCjJJYitFzH literal 0 HcmV?d00001 diff --git a/documentation/FolderStructure-WorkDirOverride/ScriptDir.jpg b/documentation/FolderStructure-WorkDirOverride/ScriptDir.jpg new file mode 100755 index 0000000000000000000000000000000000000000..d709f9cc82efc7b9d28122f08efd15db5964cc17 GIT binary patch literal 24595 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

&)vRtLem`J38g4Jf2Pi9^2(jfj^bn+r!>8Y|1 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 m|G*Bx`D`>L (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: (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='1f' +HostNick='1fichier' +HostFuncPrefix='fich' +HostUrls='1fichier.com, tenvoi.com, alterupload.com, cjoint.net, desfichiers.com, dfichiers.com, megadl.fr, mesfichiers.org, piecejointe.net, pjointe.com, dl4free.com' +HostDomainRegex='^(http|https)://(.*\.)?(1fichier\.com|tenvoi\.com|alterupload\.com|cjoint\.net|desfichiers\.com|dfichiers\.com|megadl\.fr|mesfichiers\.org|piecejointe\.net|pjointe\.com|dl4free\.com)/\?[a-z0-9]{20}$' +#! +#! !! 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: +#! _DownloadFile() +fich_DownloadFile() { + warnAndRetryUnknownError=false + exitDownloadError=false + exitDownloadNotAvailable=false + fileAlreadyDone=false + local remote_url=${1} + local filecnt=${2} + fich_cookie_jar="" + fich_adz_parameter="" + target_file_link="" + fich_user_provided_password="" + is_password_protected=false + for ((y=1; y<=15; y++)); do + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f $lockfile; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + tor_identity="${RANDOM}" + PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -s "${remote_url}") + if [ "${DebugAllEnabled}" == "true" ] ; then + debugHtml "${remote_url##*/?}" "prechk$y" "${PAGE}" + fi + file_information=$(grep -oP '(?<=)[^<]*?(?=)' <<< "${PAGE}") + size=$(echo "${file_information}" | tail -n 1) + filename=$(echo "${file_information}" | head -n 1) + if [ ! "$filename_override" == "" ] ; then + filename="$filename_override" + fi + filename=$(sanitize_file_or_folder_name "${filename}") + download_inflight_path="${WorkDir}/.inflight/" + completed_location="${WorkDir}/downloads/" + if grep -Eqi "The requested file has been deleted for inactivity|Le fichier demandé a été supprimé automatiquement pour inactivité" <<< "${PAGE}"; then + echo -e "\n${RED}The file in URL (${remote_url}) was removed due to inactivity${NC}" + removedDownload "${remote_url}" + return 1 + elif + grep -Eqi "The requested file does not exist|It could be deleted by its owner" <<< "${PAGE}"; then + echo -e "\n${RED}The file in URL (${remote_url}) does not exist. Is the URL correct?${NC}" + removedDownload "${remote_url}" + return 1 + elif + grep -Eqi "The requested file has been deleted|Le fichier demandé a été supprimé" <<< "${PAGE}"; then + echo -e "\n${RED}The file in URL (${remote_url}) has been deleted by owner${NC}" + removedDownload "${remote_url}" + return 1 + elif + grep -Eqi "Le fichier demandé a été supprimé suite à un rapport d'abus|The requested file has been deleted following an abuse request" <<< "${PAGE}"; then + echo -e "\n${RED}The file in URL (${remote_url}) was reported and removed by 1fichier${NC}" + removedDownload "${remote_url}" + return 1 + elif + grep -Eqi "Le fichier demandé a été supprimé suite à une notification|The requested file has been deleted following a notification" <<< "${PAGE}"; then + echo -e "\n${RED}The file in URL (${remote_url}) was reported and removed by 1fichier${NC}" + removedDownload "${remote_url}" + return 1 + fi + if [[ -z "$filename" || -z "$size" || ${size//[!0-9]/} =~ '^[0-9]+([.][0-9]+?$' ]]; then + if [ $y -eq $MaxUrlRetries ] ; then + echo -e "\n${RED}ERROR: Filename or size not found${NC}" + echo -e "url: ${remote_url}" + echo -e "filename: $filename" + echo -e "size: $size" + filenameOrSizeNotExistDownload "${remote_url}" "${filename}" "${size}" + return 1 + fi + printf " ." + sleep 1 + continue # Try again if not MaxUrlRetries + fi + if grep -q "id=\"pass\"" <<< "${PAGE}"; then + echo -e "${YELLOW}This download requires a password${NC}" + passwordProtectedDownload "${remote_url}" + return 1 + fi + if [ $y -gt 1 ] ; then + printf "\\n" + fi + echo -e "${GREEN}${filename} (${size}) is available.${NC}" + break + done + 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 fich_FindEmptySlot && fich_FetchFileInfo "" $((z+1)) $finalAttempt && fich_GetFile "${filecnt}" $((z+1)) $finalAttempt $filename ; 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 ----------------- # +#! +fich_FetchFileInfo() { + local fileCnt=$1 + local num_attempt=$2 + local finalAttempt=$3 + echo -e "\nTrying to get CDN URL" + fich_adz_parameter=$(cat "${WorkDir}/.temp/fich_adz_parameter") + fich_cookie_jar=$(cat "${WorkDir}/.temp/fich_cookie_jar") + tor_identity=$(cat "${WorkDir}/.temp/fich_tor_identity") + rm -f "${WorkDir}/.temp/fich_cookie_jar"; rm -f "${WorkDir}/.temp/fich_adz_parameter"; rm -f "${WorkDir}/.temp/fich_tor_identity"; + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f "${fich_cookie_jar}"; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + cdn_request=$(tor_curl_request --insecure -s -L -b "${fich_cookie_jar}" -c "${fich_cookie_jar}" -F "submit=Download" -F "pass=${fich_user_provided_password}" -F "adz=${fich_adz_parameter}" "${remote_url}") + target_file_link=$(echo "$cdn_request" | grep -A 2 '

' | grep -oP ' /dev/null ; then + if $is_password_protected; then + echo -e "${RED}ERROR: Incorrect password${NC}\nSince this download required a password, you might have copied it incorrectly?" + passwordProtectedDownload "${remote_url}" + exitDownloadError=true + return 2 + else + echo -e "${RED}ERROR: Could not find CDN URL${NC}" + if [ "${finalAttempt}" == "true" ] ; then + noCdnDownload "${remote_url}" + fi + return 1 + fi + fi + echo -e "${GREEN}CDN URL has been found!${NC}" +} +#! +#! ----------- (3) Fetch File / Download File Function --------------- # +#! +fich_GetFile() { + local filecnt=$1 + local num_attempt=$2 + local finalAttempt=$3 + local filename=$4 + echo -e "\n${RED}❤${NC} Saving ${GREEN}${remote_url##*/?}${NC} to ${GREEN}${filename}${NC}" + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + for ((j=1; j<=4; j++)); do + trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + file_header=$(tor_curl_request --insecure -sSIL -e "${remote_url}" "${target_file_link}") + file_size_bytes=$(grep -oPi '(?<=content-length: ).*' <<< "$file_header") + file_size_bytes=${file_size_bytes//[$'\t\r\n']} + download_inflight_path="${WorkDir}/.inflight/" + completed_location="${WorkDir}/downloads/" + file_path="${download_inflight_path}${filename}" + if [ "${DebugAllEnabled}" == "true" ] ; then + debugHtml "${remote_url##*/?}" "fich_savehead${num_attempt}_${j}" "target_file_link: ${target_file_link}"$'\n'"${file_header}" + fi + if [[ -z "$file_header" ]] || [[ -z "$file_size_bytes" ]]; then + continue + else + break + fi + done + if grep -Eqi "200 OK" <<< "${file_header}" > /dev/null ; then + echo "We good" > /dev/null + elif grep -Eqi "410 Gone" <<< "${file_header}" > /dev/null ; then + echo -e "${RED}ERROR: Failed to retrieve file header (410 Gone).${NC}\nThis could be due to 1fichier experiencing a temporary issue." + if [ "${finalAttempt}" == "true" ] ; then + failedDownload "${remote_url}" "${filename}" "410 Gone" + fi + return 1 + elif grep -Eqi "403 Forbidden" <<< "${file_header}" > /dev/null ; then + echo -e "${RED}ERROR: Failed to retrieve file header (403 Forbidden).${NC}\nThis could be due to 1fichier experiencing a temporary issue." + if [ "${finalAttempt}" == "true" ] ; then + failedDownload "${remote_url}" "${filename}" "403 Forbidden" + fi + return 1 + else + echo -e "${RED}ERROR: Failed to retrieve file header (Unknown Head Response).${NC}\nThis could be due to 1fichier experiencing a temporary issue." + if [ "${finalAttempt}" == "true" ] ; then + failedDownload "${remote_url}" "${filename}" "Unknown Head Response" + fi + return 1 + fi + size_value=$(echo $size | cut -f1 -d' ') + size_unit=$(echo $size | cut -f2 -d' ') + case $size_unit in + KB|Ko) size_bytes=$(echo "$size_value * 1000" | bc);; + MB|Mo) size_bytes=$(echo "$size_value * 1000 * 1000" | bc);; + GB|Go) size_bytes=$(echo "$size_value * 1000 * 1000 * 1000" | bc);; + TB|To) size_bytes=$(echo "$size_value * 1000 * 1000 * 1000 * 1000" | bc);; + *) size_bytes=$size_value;; + esac + percent_threshold=0.01 # 1% error threshold, should be fine + percent_numerator=$(echo "$file_size_bytes - $size_bytes" | bc) + percent_diff=$(echo "${percent_numerator/-/} / (($file_size_bytes + $size_bytes) / 2)" | bc -l) + if (( $(echo "$percent_diff > $percent_threshold" |bc -l) )); then + echo -e "${RED}ERROR: The difference between the advertised and retrieved file size is too big${NC}\nThis is most likely due to someone else taking the slot or some other error along the way." + echo -e "AdvertisedSize: $size ($size_bytes), Size: $file_size_bytes, Diff: $percent_diff" + if [ "${finalAttempt}" == "true" ] ; then + droppedSizeBadDownload "${remote_url}" "${filename}" "${file_size_bytes}" "${size}" + fi + return 1 + fi + 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 + touch ${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/} + 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 + tor_curl_request --insecure -e "${remote_url}" "${target_file_link}" -C - -o "${file_path}" + rm -f "$flockDownload"; + received_file_size=0 + if [ -f "$file_path" ] ; then + received_file_size=$(stat --format="%s" "$file_path" | tr -d '[:space:]') + fi + if [[ "${received_file_size}" -ne "${file_size_bytes}" ]]; then + echo -e "${RED}ERROR: Size mismatch after downloading${NC}\nPerhaps you or 1fichier lost connection for a while?" + if [ "${finalAttempt}" == "true" ] ; then + droppedSizeBadDownload "${remote_url}" "${filename}" "${received_file_size}" + fi + return 1 + fi + ProcessCompletedDownload "$remote_url" "$MoveToFolder" "$filecnt" "$filename" "$file_size_bytes" "$completed_location" "$file_path" +} +#! +#! --------------- Host Extra Functions ------------------- # +#! +fich_FindEmptySlot() { + mkdir -p "${WorkDir}/.temp" + local lockfile="${WorkDir}/.temp/lockfile.lock" + timer_start=$(date +%s) + while [[ -e $lockfile ]]; do + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f $lockfile; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + timer_duration=$(($(date +%s) - timer_start)) + echo -e "Lock file in place, time elapsed: $timer_duration seconds" + sleep 1 + printf "\033[F" + tput el + done + touch $lockfile + echo -e "\nSearching for a usable exit node" + mkdir -p "${WorkDir}/.temp" + rm -f "${WorkDir}/.temp/fich_adz_parameter" + sleep 0.2 + instances="10" + timer_start=$(date +%s) + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + trap 'rm -f "${WorkDir}/.flocks/${CLEANSTRING}"; rm -f $lockfile; tput el; echo -e "${RED}Aborted by user!${NC}"; for i in $(seq 1 $instances); do tput el; echo ""; done; rm -f "${WorkDir}/.temp/fich_cookie_jar"; rm -f "${WorkDir}/.temp/fich_adz_parameter"; rm -f "${WorkDir}/.temp/tor_identity"; echo -e "${RED}Aborted by user!${NC}"; tput cnorm; exit' 0 1 2 3 6 15 + for instance_no in $(seq 1 $instances); do + fich_FetchTorExitNode "${instance_no}" ${instances} & + sleep 0.1 + done + wait + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f $lockfile; rm -f "${WorkDir}/.temp/fich_cookie_jar"; rm -f "${WorkDir}/.temp/fich_adz_parameter"; rm -f "${WorkDir}/.temp/tor_identity"; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + if [[ $(stat -c '%s' "${WorkDir}/.temp/fich_adz_parameter") -lt 1 ]]; then + echo -e "${RED}One of the instances ran out of attempts, try again later${NC}" + return 1 + fi + timer_end=$(date +%s) + timer_duration=$((timer_end - timer_start)) + tput el + echo -e "${GREEN}Search took ${timer_duration} seconds${NC}" + rm -f $lockfile +} +fich_FetchTorExitNode() { + local max_attempts=${CircuitRetries} + local iter=0 instance_no="$1" time_out=5 instances="$2" fich_cookie_jar="" tor_identity="" fich_adz_parameter="" PAGE="" + mkdir -p "${WorkDir}/.temp" + while :; do + if [[ "${iter}" -ge "${max_attempts}" ]]; then + rm -f "$fich_cookie_jar" + if [[ -s "${WorkDir}/.temp/fich_adz_parameter" ]]; then + rm -f "$fich_cookie_jar" + exit 1 + fi + echo "" > "${WorkDir}/.temp/fich_adz_parameter" + for i in $(seq 1 "$instances"); do echo ""; done + echo -e "\n${RED}Instance ${instance_no} ran out of attempts${NC}" + exit 1 + fi + ((iter++)) + if [[ -s "${WorkDir}/.temp/fich_adz_parameter" ]]; then + tput el + printf "Closing instance %s\r" "${instance_no}" + rm -f "${fich_cookie_jar}" # new + exit 1 + fi + for ((i=1; i<=instance_no; i++)) ; do + printf "\\n" + done + printf "Instance %s \t| Attempt %s \r" "${instance_no}" "${iter}/${max_attempts}" + for ((i=1; i<=instance_no; i++)) ; do + printf "\033[F" + done + if [[ ! $fich_adz_parameter ]]; then + rm -f "$fich_cookie_jar" + fich_cookie_jar=$(mktemp "${WorkDir}/.temp/fich_cookies""${instance_no}"".XXXXXX") + fi + tor_identity="${RANDOM}" + trap "rm -f ${fich_cookie_jar}; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + PAGE=$(tor_curl_request --insecure --max-time "$ConnectTimeout" -c "${fich_cookie_jar}" -s "${remote_url}") + if [[ -z ${PAGE} ]]; then + rm -f "${fich_cookie_jar}" + continue + fi + if grep -Eqi 'Warning !|Attention !' <<< "${PAGE}"; then + rm -f "${fich_cookie_jar}" + continue + else + fich_adz_parameter=$(grep -oPi 'name="adz" value="\K[^"]+' <<< "${PAGE}") + if [[ $fich_adz_parameter ]]; then + if [[ -s "${WorkDir}/.temp/fich_adz_parameter" ]]; then + rm -f "$fich_cookie_jar" + exit 1 + fi + echo "$fich_adz_parameter" > "${WorkDir}/.temp/fich_adz_parameter" + echo "$fich_cookie_jar" > "${WorkDir}/.temp/fich_cookie_jar" + echo "$tor_identity" > "${WorkDir}/.temp/fich_tor_identity" + rm -f "$fich_cookie_jar" + for i in $(seq 1 "$instances"); do echo ""; done + echo "" + tput el + echo -e "${GREEN}Slot found by instance ${instance_no}${NC}" + break + fi + fi + done + tput cnorm +} diff --git a/hosts/9saves.sh b/hosts/9saves.sh new file mode 100755 index 0000000..a152195 --- /dev/null +++ b/hosts/9saves.sh @@ -0,0 +1,427 @@ +#! Name: 9saves.sh +#! Author: kittykat +#! Version: 2024.09.13 +#! 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: (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: (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='ns' +HostNick='9saves' +HostFuncPrefix='ns' +HostUrls='9saves.com' +HostDomainRegex='^(http|https)://(.*\.)?9saves\.(com|org)' +#! +#! !! 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: +#! _DownloadFile() +ns_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 ns_FetchFileInfo $finalAttempt && ns_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 ----------------- # +#! +ns_FetchFileInfo() { + finalAttempt=$1 + maxfetchretries=6 + ns_cookie_jar="" + echo -e "${GREEN}# Fetching download link…${NC}" + for ((i=1; i<=$maxfetchretries; i++)); do + mkdir -p "${WorkDir}/.temp" + ns_cookie_jar=$(mktemp "${WorkDir}/.temp/ns_cookies""${instance_no}"".XXXXXX") + printf " ." + tor_identity="${RANDOM}" + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f ${ns_cookie_jar}; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + response=$(tor_curl_request --insecure -L -s -b "${ns_cookie_jar}" -c "${ns_cookie_jar}" "$remote_url") + if [ "${DebugAllEnabled}" == "true" ] ; then + debugHtml "${remote_url##*/}" "ns_dwnpage$i" "${response}" + fi + if [[ -z $response ]] ; then + if [ $i == $maxfetchretries ] ; then + rm -f "${ns_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to extract post link.${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + else + continue + fi + fi + if grep -Eqi 'No such file|404 NOT FOUND' <<< "$response"; then + rm -f "${ns_cookie_jar}"; + printf "\\n" + echo -e "${RED}| The file was not found. It could be deleted or expired.${NC}" + exitDownloadError=true + removedDownload "${remote_url}" + return 1 + fi + if grep -Eqi 'input type="hidden" name="id" value="' <<< "$response"; then + printf "\\n" + echo -e "${GREEN}| Post link found.${NC}" + post_op=$(grep -oP '(?<=input type="hidden" name="op" value=").*(?=">)' <<< "$response") + post_id=$(grep -oP '(?<=input type="hidden" name="id" value=").*(?=">)' <<< "$response") + post_rand=$(grep -oP '(?<=input type="hidden" name="rand" value=").*(?=">)' <<< "$response") + post_referer=$(grep -oP '(?<=input type="hidden" name="referer" value=").*(?=">)' <<< "$response") + break + fi + if ((i == maxfetchretries)) ; then + rm -f "${ns_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to extract post link (unknown).${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + fi + done + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f ${ns_cookie_jar}; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + form_data="op=${post_op}&id=${post_id}&rand=${post_rand}&referer=${post_referer}&method_free=&method_premium=" + response=$(tor_curl_request --insecure -L -s -X POST \ + -b "${ns_cookie_jar}" -c "${ns_cookie_jar}" \ + --data "$form_data" "https://9saves.com/") + if [ "${DebugAllEnabled}" == "true" ] ; then + debugHtml "${remote_url##*/}" "ns_post" "form_data: ${form_data}"$'\n'"${response}" + fi + if [[ -z $response ]] ; then + rm -f "${ns_cookie_jar}"; + echo -e "${RED}| Failed to extract download link.${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + fi + if grep -Eqi "File Not Found" <<< "$response"; then + rm -f "${ns_cookie_jar}"; + echo -e "${RED}| The file was not found. It could be deleted or expired.${NC}" + exitDownloadError=true + removedDownload "${remote_url}" + return 1 + fi + if grep -Eqi 'This direct link will be available for' <<< "$response"; then + echo -e "${GREEN}| Download link found.${NC}" + download_url=$(grep -oP '(?<=class="btn" href=").*(?=.*9saves\.com).*(?=">Download)' <<< "$response") + filename=$(grep -oP '(?<=Filename: ).*(?=
)' <<< "$response") + else + rm -f "${ns_cookie_jar}"; + echo -e "${RED}| The file was not found. It could be deleted or expired.${NC}" + exitDownloadError=true + removedDownload "${remote_url}" + return 1 + fi + if [[ -z $download_url ]] ; then + rm -f "${ns_cookie_jar}"; + echo -e "${RED}| Failed to extract download link.${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + fi + download_url=$(urlencode_literal_grouped_case_urlendingonly "$download_url") + maxfetchretries=6 + echo -e "${GREEN}# Fetching file info…${NC}" + for ((j=1; j<=$maxfetchretries; j++)); do + printf " ." + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f ${ns_cookie_jar}; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + file_header=$(tor_curl_request --insecure --head -L -s -b "${ns_cookie_jar}" -c "${ns_cookie_jar}" "$download_url") + if [ "${DebugAllEnabled}" == "true" ] ; then + debugHtml "${remote_url##*/}" "ns_head$j" "download_url: ${download_url}"$'\n'"${file_header}" + fi + if [[ -z $file_header ]] ; then + if [ $j == $maxfetchretries ] ; then + rm -f "${ns_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to extract file info.${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + else + continue + fi + fi + if grep -Eqi '404 Not Found' <<< "$file_header"; then + rm -f "${ns_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to extract file info.${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + fi + if ! grep -Eqi 'HTTP/2 200|HTTP/1.1 200|200 OK' <<< $file_header ; then + if [ $j == $maxfetchretries ] ; then + rm -f "${ns_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to extract file info (no 200 response).${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + else + continue + fi + fi + if grep -Eqi 'location:' <<< "$file_header"; then + download_url=$(grep -oPi '(?<=location: ).*' <<< "$file_header") + download_url=${download_url//[$'\t\r\n']} + fi + 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 [ $j == $maxfetchretries ] ; then + rm -f "${ns_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Filesize not found…${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "Filesize not found!" "" + fi + return 1 + else + continue + fi + else + file_size_readable="$(numfmt --to=iec --from=auto --format "%.2f" <<< "$file_size_bytes")" + fi + break #Good to go here + done + touch ${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/} + if [ ! "$filename_override" == "" ] ; then + filename="$filename_override" + fi + filename=$(sanitize_file_or_folder_name "${filename}") + printf "\\n" + echo -e "${YELLOW}| File name:${NC}\t\"${filename}\"" + echo -e "${YELLOW}| File size:${NC}\t${file_size_readable}" + file_path="${download_inflight_path}${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 --------------- # +#! +ns_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 ${ns_cookie_jar}; rm -f $flockDownload; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + if [ "${UseTorCurlImpersonate}" == "true" ]; then + if [ "${RateMonitorEnabled}" == "true" ]; then + tor_curl_request --insecure \ + -b "${ns_cookie_jar}" --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ + "$download_url" \ + --continue-at - --output "$file_path" + else + tor_curl_request --insecure \ + -b "${ns_cookie_jar}" \ + "$download_url" \ + --continue-at - --output "$file_path" + fi + else + if [ "${RateMonitorEnabled}" == "true" ]; then + tor_curl_request --insecure \ + --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ + -b "${ns_cookie_jar}" \ + -H "User-Agent: $RandomUA" \ + -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ + -H "Accept-Language: en-US,en;q=0.5" \ + -H "Accept-Encoding: gzip, deflate, br" \ + -H "Connection: keep-alive" \ + -H "Cookie: lng=eng" \ + -H "Upgrade-Insecure-Requests: 1" \ + -H "Sec-Fetch-Dest: document" \ + -H "Sec-Fetch-Mode: navigate" \ + -H "Sec-Fetch-Site: same-origin" \ + -H "Sec-Fetch-User: ?1" \ + "$download_url" \ + --continue-at - --output "$file_path" + else + tor_curl_request --insecure \ + -b "${ns_cookie_jar}" \ + -H "User-Agent: $RandomUA" \ + -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ + -H "Accept-Language: en-US,en;q=0.5" \ + -H "Accept-Encoding: gzip, deflate, br" \ + -H "Connection: keep-alive" \ + -H "Cookie: lng=eng" \ + -H "Upgrade-Insecure-Requests: 1" \ + -H "Sec-Fetch-Dest: document" \ + -H "Sec-Fetch-Mode: navigate" \ + -H "Sec-Fetch-Site: same-origin" \ + -H "Sec-Fetch-User: ?1" \ + "$download_url" \ + --continue-at - --output "$file_path" + fi + 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 < 10240 )) ; 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"; + rm -f "${ns_cookie_jar}"; + ProcessCompletedDownload "$remote_url" "$MoveToFolder" "$filecnt" "$filename" "$file_size_bytes" "$completed_location" "$file_path" + return 0 +} +#! +#! --------------- Host Extra Functions ------------------- # +#! diff --git a/hosts/acid.sh b/hosts/acid.sh new file mode 100755 index 0000000..a23941e --- /dev/null +++ b/hosts/acid.sh @@ -0,0 +1,31 @@ +#! Name: acid.sh +#! Author: kittykat +#! Version: 2024.09.29 +#! 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: (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: (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='acid' +HostNick='acid.fr' +HostFuncPrefix='direct' +HostUrls='dl.acid.fr' +HostDomainRegex='^(http|https)://(.*\.)?dl\.acid\.fr/' +#! +#! !! 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 --------------- # +#! +#! This is a direct= download host, so all the functions are already in mad.sh +#! Since the HostFuncPrefix is defined above as "direct", nothing further needs to be done as it will +#! call the direct_DownloadFile() function already in mad.sh diff --git a/hosts/anarchaserver.sh b/hosts/anarchaserver.sh new file mode 100755 index 0000000..7451284 --- /dev/null +++ b/hosts/anarchaserver.sh @@ -0,0 +1,31 @@ +#! Name: anarchaserver.sh +#! Author: kittykat +#! Version: 2024.09.27 +#! 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: (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: (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='anarc' +HostNick='anarchaserver' +HostFuncPrefix='direct' +HostUrls='transitional.anarchaserver.org' +HostDomainRegex='^(http|https)://(.*\.)?transitional\.anarchaserver\.org/jirafeau/' +#! +#! !! 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 --------------- # +#! +#! This is a direct= download host, so all the functions are already in mad.sh +#! Since the HostFuncPrefix is defined above as "direct", nothing further needs to be done as it will +#! call the direct_DownloadFile() function already in mad.sh diff --git a/hosts/anonsharing.sh b/hosts/anonsharing.sh new file mode 100755 index 0000000..6f3fadc --- /dev/null +++ b/hosts/anonsharing.sh @@ -0,0 +1,315 @@ +#! Name: anonsharing.sh +#! Author: kittykat +#! Version: 2024.10.30 +#! 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: (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: (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='ansh' +HostNick='anonsharing' +HostFuncPrefix='ansh' +HostUrls='anonsharing.com' +HostDomainRegex='^(http|https)://(.*\.)?anonsharing\.com/fileid\=' +#! +#! !! 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: +#! _DownloadFile() +ansh_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 ansh_FetchFileInfo $finalAttempt && ansh_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 ----------------- # +#! +ansh_FetchFileInfo() { + finalAttempt=$1 + maxfetchretries=5 + ansh_cookie_jar="" + local fileid="${remote_url##*fileid\=}" + echo -e "${GREEN}# Fetching download link…${NC}" + for ((i=1; i<=$maxfetchretries; i++)); do + mkdir -p "${WorkDir}/.temp" + ansh_cookie_jar=$(mktemp "${WorkDir}/.temp/ansh_cookies""${instance_no}"".XXXXXX") + printf " ." + tor_identity="${RANDOM}" + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f ${ansh_cookie_jar}; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + response=$(tor_curl_request --insecure -i -s \ + -b "${ansh_cookie_jar}" -c "${ansh_cookie_jar}" \ + -F "u=$fileid" \ + -F "p=true" \ + "https://anonsharing.com/account/ajax/file_details") + if [ "${DebugAllEnabled}" == "true" ] ; then + debugHtml "${remote_url##*/}" "ansh_postfileinfo$i" "${response}" + fi + if [[ -z $response ]] ; then + rm -f "${ansh_cookie_jar}"; + if [ $i == $maxfetchretries ] ; then + printf "\\n" + echo -e "${RED}| Failed to extract download link [1]${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "Failed to extract download link [1]" "" + fi + return 1 + else + continue + fi + fi + if grep -Eqi "There is no such file|File was deleted because" <<< "$response"; then + rm -f "${ansh_cookie_jar}"; + printf "\\n" + echo -e "${RED}| The file was not found. It could be deleted or expired.${NC}" + exitDownloadError=true + removedDownload "${remote_url}" + return 1 + fi + if grep -Eqi 'openUrl\('"'"'https:\\/\\/anonsharing.com\\/' <<< "$response"; then + printf "\\n" + echo -e "${GREEN}| Link found.${NC}" + download_url='https://anonsharing.com/'$(grep -oPi '(?<=openUrl\('"'"'https:\\/\\/anonsharing.com\\/).*?(?='"'"'.*$)' <<< "$response" | head -1) + download_url="${download_url//\\\//\/}" + download_url="${download_url//[$'\t\r\n\0']}" + break + else + rm -f "${ansh_cookie_jar}"; + if [ $i == $maxfetchretries ] ; then + printf "\\n" + echo -e "${RED}| Failed to extract download link [2]${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "Failed to extract download link [2]" "" + fi + return 1 + else + continue + fi + fi + break #Good to go here + done + bLocationFound=false + for ((j=1; j<=$maxfetchretries; j++)); do + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f ${ansh_cookie_jar}; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + if [ "$bLocationFound" == "false" ]; then + echo -e "${GREEN}# Fetching cdn and file info…${NC}" + file_header=$(tor_curl_request --insecure --head -L -i -s \ + -b "${ansh_cookie_jar}" -c "${ansh_cookie_jar}" \ + "$download_url") + else + echo -e "${GREEN}# Fetching file info…${NC}" + ansh_host="${download_url/https:\/\//}" + ansh_host="${ansh_host%%\/*}" + rm -f "${WorkDir}/.temp/directhead" + file_header=$(tor_curl_request --insecure --head -H "Connection: keep-alive" -s -i \ + -H "Host: $ansh_host" \ + "$download_url" | + tee "${WorkDir}/.temp/directhead" & + sleep 6 + [ -s "${WorkDir}/.temp/directhead" ] + kill $! 2>/dev/null + ) + if [ ! -f "${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/}" ]; then + touch "${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/}" + fi + rm -f "${WorkDir}/.temp/directhead" + fi + if [ "${DebugAllEnabled}" == "true" ] ; then + debugHtml "${remote_url##*/}" "ansh_head$j" "download_url: ${download_url}"$'\n'"${file_header}" + fi + if [[ -z $file_header ]] ; then + if [ $j == $maxfetchretries ] ; then + rm -f "${ansh_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to extract file info.${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + else + continue + fi + fi + if grep -Eqi '404 Not Found' <<< "$file_header"; then + rm -f "${ansh_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to extract file info.${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + fi + if grep -Eqi '302|location: ' <<< $file_header ; then + bLocationFound=true + download_url=$(grep -oPi -m 1 '(?<=location: ).*?(?=$)' <<< "$file_header") + download_url=${download_url//[$'\t\r\n']} + else + rm -f "${ansh_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to get download url (no location)${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "Failed to get download url (no location)" "" + fi + return 1 + fi + filename=$(grep -oP '(?<=filename=").*?(?=".*$)' <<< "$file_header") + if [ "$filename_override" == "" ] && [ -z "$filename" ] ; then + if [ $j == $maxfetchretries ] ; then + rm -f "${ansh_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to extract file name${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "Failed to extract file name" "" + fi + return 1 + else + continue + fi + fi + break #Good to go here + done + rm -f "${ansh_cookie_jar}"; + touch ${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/} + if [ ! "$filename_override" == "" ] ; then + filename="$filename_override" + fi + filename=$(sanitize_file_or_folder_name "${filename}") + printf "\\n" + echo -e "${YELLOW}| File name:${NC}\t\"${filename}\"" + if [ -z $file_size_bytes ] ; then + file_size_readable="${RED}Unknown filesize…${NC}" + 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}" + 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 --------------- # +#! +ansh_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 ${ansh_cookie_jar}; rm -f $flockDownload; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + echo -e "${BLUE}| No Resume Fetch${NC} (unknown filesize)" + if [ "${RateMonitorEnabled}" == "true" ]; then + tor_curl_request --insecure --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval "$download_url" --output "$file_path" + else + tor_curl_request --insecure "$download_url" --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 + if [ "${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 + fi + break + done + rm -f "$flockDownload"; + ProcessCompletedDownload "$remote_url" "$MoveToFolder" "$filecnt" "$filename" "$file_size_bytes" "$completed_location" "$file_path" + return 0 +} +#! +#! --------------- Host Extra Functions ------------------- # +#! diff --git a/hosts/archived/nekofile.sh b/hosts/archived/nekofile.sh new file mode 100755 index 0000000..5432654 --- /dev/null +++ b/hosts/archived/nekofile.sh @@ -0,0 +1,32 @@ +#! Name: nekofile.sh +#! Author: kittykat +#! Version: 2024.09.13 +#! Desc: Add support for downloading and processing of urls for a new host +#! Usage: Copy this file into the ./${ScriptDir}/hosts/ folder +#! +#! NOTES: nekofile has been shutdown by the hoster due to reported violations !!! +#! +#! ------------ 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: (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: (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='neko' +HostNick='nekofile' +HostFuncPrefix='direct' +HostUrls='nekofile.eu.org' +HostDomainRegex='^(http|https)://(.*\.)?nekofile.eu.org/' +#! +#! !! 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 --------------- # +#! +#! This is a direct= download host, so all the functions are already in mad.sh +#! Since the HostFuncPrefix is defined above as "direct", nothing further needs to be done as it will +#! call the direct_DownloadFile() function already in mad.sh \ No newline at end of file diff --git a/hosts/bedrive.sh b/hosts/bedrive.sh new file mode 100755 index 0000000..f38418c --- /dev/null +++ b/hosts/bedrive.sh @@ -0,0 +1,406 @@ +#! Name: bedrive.sh +#! Author: kittykat +#! Version: 2024.10.24 +#! 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: (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: (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='bd' +HostNick='bedrive' +HostFuncPrefix='bd' +HostUrls='bedrive.ru' +HostDomainRegex='^(http|https)://(.*\.)?bedrive\.ru' +#! +#! !! 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: +#! _DownloadFile() +bd_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 bd_FetchFileInfo $finalAttempt && bd_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 ----------------- # +#! +bd_FetchFileInfo() { + finalAttempt=$1 + maxfetchretries=5 + bd_cookie_jar="" + echo -e "${GREEN}# Fetching ticket link…${NC}" + for ((i=1; i<=$maxfetchretries; i++)); do + mkdir -p "${WorkDir}/.temp" + bd_cookie_jar=$(mktemp "${WorkDir}/.temp/bd_cookies""${instance_no}"".XXXXXX") + printf " ." + tor_identity="${RANDOM}" + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f ${bd_cookie_jar}; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + response=$(tor_curl_request --insecure -L -s \ + -b "${bd_cookie_jar}" -c "${bd_cookie_jar}" \ + "$remote_url") + if [ "${DebugAllEnabled}" == "true" ] ; then + debugHtml "${remote_url##*/}" "bd_fetch$i" "${response}" + fi + if [[ -z $response ]] ; then + rm -f "${bd_cookie_jar}"; + if [ $i == $maxfetchretries ] ; then + printf "\\n" + echo -e "${RED}| Failed to extract download link.${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + else + continue + fi + fi + if grep -Eqi "There is no such file|File was deleted because" <<< "$response"; then + rm -f "${bd_cookie_jar}"; + printf "\\n" + echo -e "${RED}| The file was not found. It could be deleted or expired.${NC}" + exitDownloadError=true + removedDownload "${remote_url}" + return 1 + fi + if grep -Eqi ",e='.*'" <<< "$response"; then + printf "\\n" + echo -e "${GREEN}| Link found.${NC}" + bd_encodedurl=$(grep -oPi '(?<=,e='"'"').*?(?='"'"',.*$)' <<< "$response") + bd_encodedurl="${bd_encodedurl//[$'\t\r\n\0']}" + download_url=$(echo "$bd_encodedurl" | base64 --decode) + download_url="${download_url//[$'\t\r\n\0']}" + break + else + rm -f "${bd_cookie_jar}"; + if [ $i == $maxfetchretries ] ; then + printf "\\n" + echo -e "${RED}| Failed to extract download link.${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + else + continue + fi + fi + break #Good to go here + done + echo -e "${GREEN}# Waiting 20 sec…${NC}" + sleep 20s + echo -e "${GREEN}# Fetching file info…${NC}" + for ((j=1; j<=$maxfetchretries; j++)); do + printf " ." + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; rm -f ${bd_cookie_jar}; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + file_header=$(tor_curl_request --insecure --head -L -i -s \ + -b "${bd_cookie_jar}" -c "${bd_cookie_jar}" \ + "$download_url") + if [ "${DebugAllEnabled}" == "true" ] ; then + debugHtml "${remote_url##*/}" "bd_head$j" "download_url: ${download_url}"$'\n'"${file_header}" + fi + if [[ -z $file_header ]] ; then + if [ $j == $maxfetchretries ] ; then + rm -f "${bd_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to extract file info.${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + else + continue + fi + fi + if grep -Eqi '404 Not Found' <<< "$file_header"; then + rm -f "${bd_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to extract file info.${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + fi + if grep -Eqi '302|location: ' <<< $file_header ; then + download_url=$(grep -oPi -m 1 '(?<=location: ).*?(?=$)' <<< "$file_header") + download_url=${download_url//[$'\t\r\n']} + else + rm -f "${bd_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to get download url (no location)${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "Failed to get download url (no location)" "" + fi + return 1 + fi + if ! grep -Eqi 'HTTP.* 200' <<< $file_header ; then + if [ $j == $maxfetchretries ] ; then + rm -f "${bd_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to extract file info${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "Failed to extract file info" "" + fi + return 1 + else + continue + fi + fi + filename=$(grep -oP '(?<=filename=").*?(?=".*$)' <<< "$file_header") + if [ "$filename_override" == "" ] && [ -z "$filename" ] ; then + if [ $j == $maxfetchretries ] ; then + rm -f "${bd_cookie_jar}"; + printf "\\n" + echo -e "${RED}| Failed to extract file name${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "Failed to extract file name" "" + fi + return 1 + else + continue + fi + fi + break #Good to go here + done + touch ${WorkDir}/.flocks/${remote_url//[^a-zA-Z0-9]/} + if [ ! "$filename_override" == "" ] ; then + filename="$filename_override" + fi + filename=$(sanitize_file_or_folder_name "${filename}") + printf "\\n" + echo -e "${YELLOW}| File name:${NC}\t\"${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}" + 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 --------------- # +#! +bd_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 ${bd_cookie_jar}; rm -f $flockDownload; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + if [ "${UseTorCurlImpersonate}" == "true" ]; then + if [ "${RateMonitorEnabled}" == "true" ]; then + tor_curl_request --insecure -L -G --no-alpn \ + -b "${bd_cookie_jar}" -c "${bd_cookie_jar}" --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ + --referer "$remote_url" "$download_url" \ + --continue-at - --output "$file_path" + else + tor_curl_request --insecure -L -G --no-alpn \ + -b "${bd_cookie_jar}" -c "${bd_cookie_jar}" \ + --referer "$remote_url" "$download_url" \ + --continue-at - --output "$file_path" + fi + else + if [ "${RateMonitorEnabled}" == "true" ]; then + tor_curl_request --insecure -L -G --no-alpn \ + -b "${bd_cookie_jar}" -c "${bd_cookie_jar}" --speed-limit $DownloadSpeedMin --speed-time $DownloadTimeoutInterval \ + -H "User-Agent: $RandomUA" \ + -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ + -H "Accept-Language: en-US,en;q=0.5" \ + -H "Accept-Encoding: gzip, deflate, br" \ + -H "Connection: keep-alive" \ + -H "Cookie: lng=eng" \ + -H "Upgrade-Insecure-Requests: 1" \ + -H "Sec-Fetch-Dest: document" \ + -H "Sec-Fetch-Mode: navigate" \ + -H "Sec-Fetch-Site: same-origin" \ + -H "Sec-Fetch-User: ?1" \ + --referer "$remote_url" "$download_url" \ + --continue-at - --output "$file_path" + else + tor_curl_request --insecure -L -G --no-alpn \ + -b "${bd_cookie_jar}" -c "${bd_cookie_jar}" \ + -H "User-Agent: $RandomUA" \ + -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ + -H "Accept-Language: en-US,en;q=0.5" \ + -H "Accept-Encoding: gzip, deflate, br" \ + -H "Connection: keep-alive" \ + -H "Cookie: lng=eng" \ + -H "Upgrade-Insecure-Requests: 1" \ + -H "Sec-Fetch-Dest: document" \ + -H "Sec-Fetch-Mode: navigate" \ + -H "Sec-Fetch-Site: same-origin" \ + -H "Sec-Fetch-User: ?1" \ + --referer "$remote_url" "$download_url" \ + --continue-at - --output "$file_path" + fi + 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"; + rm -f "${bd_cookie_jar}"; + ProcessCompletedDownload "$remote_url" "$MoveToFolder" "$filecnt" "$filename" "$file_size_bytes" "$completed_location" "$file_path" + return 0 +} +#! +#! --------------- Host Extra Functions ------------------- # +#! diff --git a/hosts/biteblob.sh b/hosts/biteblob.sh new file mode 100755 index 0000000..fbfb170 --- /dev/null +++ b/hosts/biteblob.sh @@ -0,0 +1,364 @@ +#! Name: biteblob.sh +#! Author: kittykat +#! Version: 2024.09.13 +#! 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: (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: (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='bite' +HostNick='biteblob' +HostFuncPrefix='bite' +HostUrls='biteblob.com' +HostDomainRegex='^(http|https)://(.*\.)?biteblob\.(com|org)' +#! +#! !! 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: +#! _DownloadFile() +bite_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 bite_FetchFileInfo $finalAttempt && bite_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 ----------------- # +#! +bite_FetchFileInfo() { + finalAttempt=$1 + maxfetchretries=5 + fixed_url=${remote_url} + if grep -Eqi "biteblob.org" <<< "$fixed_url"; then + fixed_url=${remote_url/biteblob.org/biteblob.com} + fi + if grep -Eqi "biteblob.com/Download/" <<< "$fixed_url"; then + fixed_url=${remote_url/biteblob.com\/Download/biteblob.com\/Information} + fi + download_url=${fixed_url/Information/Download} + echo -e "${GREEN}# Fetching download link…${NC}" + for ((j=1; j<=$maxfetchretries; j++)); do + mkdir -p "${WorkDir}/.temp" + printf " ." + tor_identity="${RANDOM}" + CLEANSTRING=${remote_url//[^a-zA-Z0-9]/} + trap "rm -f ${WorkDir}/.flocks/${CLEANSTRING}; echo ""; tput cnorm; exit" 0 1 2 3 6 15 + response=$(tor_curl_request --insecure -L -s "${fixed_url}") + if [ "${DebugAllEnabled}" == "true" ] ; then + debugHtml "${remote_url##*/}" "bite_dwnpage$j" "url: $fixed_url"$'\n'"${response}" + fi + if [[ -z $response ]] ; then + if [ $j == $maxfetchretries ] ; then + printf "\\n" + echo -e "${RED}| Failed to extract download link${NC}" + warnAndRetryUnknownError=true + if [ "${finalAttempt}" == "true" ] ; then + failedRetryDownload "${remote_url}" "" "" + fi + return 1 + else + continue + fi + fi + if grep -Eqi 'Not Found|Invalid Request|Link Unauthorized|No download available|file was removed|file has been deleted' <<< "$response"; then + printf "\\n" + echo -e "${RED}| The file was not found. It could be deleted or expired.${NC}" + exitDownloadError=true + removedDownload "${remote_url}" + return 1 + fi + if grep -Eqi '