#!/bin/bash # Download a curated shortlist of iOS 9.3.5-compatible IPAs from archive.org # (iOSObscura collection) on a network where archive.org DNS is blocked. # # Usage: bash fetch-ios935-ipas.sh [outdir] # Default outdir: ./ipas935 # # WHY --resolve: the home router DNS (192.168.1.1) does not resolve archive.org. # archive.org 302-redirects downloads to dn####.ca.archive.org, which ALSO must # be pinned, otherwise curl resolves it and fails. # # Requires: curl, dig. Run from anywhere. set -u OUT="${1:-./ipas935}" mkdir -p "$OUT" ORIGIN_IP=207.241.224.2 # archive.org (nlb). Re-check with: dig +short archive.org @1.1.1.1 BASE="https://archive.org/download/iOSObscura" # Relative archive paths. Spaces MUST be %20-encoded in the URL. PATHS=( # --- music / MIDI --- "iOS 4/jp.co.korg.iMS-20/iMS-20-(jp.co.korg.iMS-20)-1.5.2-(iOS_4.2)-b907eac71f276430c76260efb4bc88a2.ipa" "iOS 4/jp.co.korg.iELECTRIBE/iELECTRIBE-(jp.co.korg.iELECTRIBE)-1.5.2-(iOS_4.2)-9402340e34240bb1ec56487a6e8c2006.ipa" "iOS 5/jp.co.korg.iPolysix/iPolysix-(jp.co.korg.iPolysix)-146-(iOS_5.1)-cf0662fa0ecfac24cd633eeec2f758d7.ipa" "iOS 5/jp.co.korg.ikaossilator/iKaossilator-(jp.co.korg.ikaossilator)-2.3.0-(iOS_5.1)-7f78df777b8eea3ac3a7421383b1107e.ipa" "iOS 5/com.moogmusic.animoog/Animoog-(com.moogmusic.animoog)-2.1.1-(iOS_5.0)-005cf967f702b9cd728a8e90869bae2d.ipa" "iOS 5/com.moogmusic.filtatron/Filtatron-(com.moogmusic.filtatron)-1.2.0-(iOS_5.0)-41c0b0b57ae11a7127098218b2fa8b35.ipa" "iOS 5/com.arturia.imini/iMini-(com.arturia.imini)-1.1-(iOS_5.1)-3a7d6691ce8d5aeff9247471a7e4c065.ipa" "iOS 5/com.giku.Horizon/Sunrizer-(com.giku.Horizon)-3.0-(iOS_5.0)-32152900a4482119c57590557514dd6a.ipa" "iOS 4/jp.co.yamaha.emi.tenopad/TNR-i-(jp.co.yamaha.emi.tenopad)-1.2.1-(iOS_4.3)-2fcfb9205482329a25b73d3df866b7c0.ipa" "iOS 6/com.pulsecodeinc.ModularSynthesizer/modular-(com.pulsecodeinc.ModularSynthesizer)-1.04-(iOS_6.0)-1a62151edacb566c74bc4afd70200eef.ipa" "iOS 8/com.apple.mobilegarageband/GarageBand-(com.apple.mobilegarageband)-3417.29-(iOS_8.0)-b3b43b5ab1b763afdbc7c3b7293fc19a.ipa" "iOS 8/com.steinberg.cubasis/Cubasis-(com.steinberg.cubasis)-2.2.0.8-(iOS_8.3)-e133725270833b6bca3fb97db0eb2f61.ipa" "iOS 5/net.intua.beatmaker2/BeatMaker 2-(net.intua.beatmaker2)-2.5.4-(iOS_5.0)-78f41efe78dae096ccf1b472fe2f4bd8.ipa" "iOS 8/net.fingerlab.beat/DM1-(net.fingerlab.beat)-01-(iOS_8.0)-351e437413b9f3765d0b6d967750977b.ipa" "iOS 6/net.fingerlab.musyc/Musyc-(net.fingerlab.musyc)-017-(iOS_6.0)-1e5da2d554b6803e6dde327f6ac79304.ipa" "iOS 7/se.propellerheads.figure/Figure-(se.propellerheads.figure)-341-(iOS_7.0)-d2ba4bce45e5ca0d23a0863c98d90673.ipa" "iOS 5/co.uk.blipinteractive.NanoStudio/NanoStudio-(co.uk.blipinteractive.NanoStudio)-1.43-(iOS_5.0)-7a3bdf08297a38060d045afdd7751de0.ipa" "iOS 5/us.audiob.Audiobus/Audiobus-(us.audiob.Audiobus)-1.0.2.5-(iOS_5.0)-39dc47e3dc76359207763652f99a065e.ipa" "iOS 6/com.native-instruments.traktordj/Traktor DJ-(com.native-instruments.traktordj)-1.3.3.383-(iOS_6.1)-57b48c1607bc00f53cdf5832e492c071.ipa" "iOS 5/com.sonosaurus.thumbjam/ThumbJam-(com.sonosaurus.thumbjam)-2.4.2-(iOS_5.0)-0479efba0d47b4672117f5a2ccfeed6e.ipa" "iOS 5/com.ikmultimediaus.igrandpadfull/iGrand Piano-(com.ikmultimediaus.igrandpadfull)-1.0.1-(iOS_5.1)-5b480775a406e8bd16e75c29daf098a9.ipa" "iOS 7/com.collect3.beatwave/Beatwave-(com.collect3.beatwave)-2.6.1.2-(iOS_7.0)-f720430fc4c0d1a0568c4b9b2a047bff.ipa" # --- general utility (from top-level Clutch-renamed files) --- "VLC-v2.6.6--iOS6.1-(Clutch-1.4.6).ipa" "Puffin-v4.7.3--iOS6.0-(Clutch-1.4.6).ipa" "Kodi Remote-v1.5.5--iOS5.1.1-(Clutch-1.4.6).ipa" "VNC Viewer-v2.3.5--iOS5.1.1-(Clutch-1.4.6).ipa" "TeamViewer-v10.0.37492--iOS5.0-(Clutch-1.4.6).ipa" ) ok=0; fail=0 for rel in "${PATHS[@]}"; do enc=$(printf '%s' "$rel" | sed 's/ /%20/g') url="$BASE/$enc" fname=$(basename "$rel") printf '>> %s\n' "$fname" # resolve the redirect host once per file DN=$(curl -sI --resolve archive.org:443:"$ORIGIN_IP" --max-time 30 "$url" \ | grep -i '^location' | tr -d '\r' | sed 's/^[Ll]ocation: //') if [ -z "$DN" ]; then printf ' !! no redirect / not found\n'; fail=$((fail+1)); continue fi HOST=$(printf '%s' "$DN" | sed -E 's#https://([^/]+)/.*#\1#') IP=$(dig +short +time=5 +tries=2 "$HOST" @1.1.1.1 | tail -1) if [ -z "$IP" ]; then printf ' !! no DNS for %s\n' "$HOST"; fail=$((fail+1)); continue fi curl -sL --resolve archive.org:443:"$ORIGIN_IP" --resolve "$HOST:443:$IP" \ --max-time 300 -o "$OUT/$fname" "$url" if [ -s "$OUT/$fname" ] && file "$OUT/$fname" | grep -qi 'zip archive'; then printf ' ok %s\n' "$(du -h "$OUT/$fname" | cut -f1)"; ok=$((ok+1)) else printf ' !! bad download\n'; fail=$((fail+1)) fi done printf '\n=== done: %d ok, %d failed -> %s ===\n' "$ok" "$fail" "$OUT" printf 'Install requires jailbreak + AppSync Unified (Cydia).\n'