Skip to content

Instantly share code, notes, and snippets.

@javiribera
Created March 15, 2020 17:10
Show Gist options
  • Save javiribera/3c1cbb0f2831d42d83bb2473188e3fac to your computer and use it in GitHub Desktop.
Save javiribera/3c1cbb0f2831d42d83bb2473188e3fac to your computer and use it in GitHub Desktop.
Download entire iCloud shared albums icloud-album-download.sh
#!/bin/bash
# requires jq
# arg 1: iCloud web album URL
# arg 2: folder to download into (optional)
#
# Credits: https://gist.github.com/zneak/8f719cd81967e0eb2234897491e051ec
# icloud-album-download.sh
function curl_post_json {
curl -sH "Content-Type: application/json" -X POST -d "@-" "$@"
}
BASE_API_URL="https://p23-sharedstreams.icloud.com/$(echo $1 | cut -d# -f2)/sharedstreams"
pushd $2 > /dev/null
STREAM=$(echo '{"streamCtag":null}' | curl_post_json "$BASE_API_URL/webstream")
HOST=$(echo $STREAM | jq '.["X-Apple-MMe-Host"]' | cut -c 2- | rev | cut -c 2- | rev)
if [ "$HOST" ]; then
BASE_API_URL="https://$(echo $HOST)/$(echo $1 | cut -d# -f2)/sharedstreams"
STREAM=$(echo '{"streamCtag":null}' | curl_post_json "$BASE_API_URL/webstream")
fi
CHECKSUMS=$(echo $STREAM | jq -r '.photos[] | [(.derivatives[] | {size: .fileSize | tonumber, value: .checksum})] | max_by(.size | tonumber).value')
echo $STREAM \
| jq -c "{photoGuids: [.photos[].photoGuid]}" \
| curl_post_json "$BASE_API_URL/webasseturls" \
| jq -r '.items | to_entries[] | "https://" + .value.url_location + .value.url_path + "&" + .key' \
| while read URL; do
for CHECKSUM in $CHECKSUMS; do
if echo $URL | grep $CHECKSUM > /dev/null; then
curl -sOJ $URL &
break
fi
done
done
popd > /dev/null
wait
@tubit
Copy link

tubit commented Jul 8, 2022

Hi!

Thanks for providing this script, it helped me to build a digital picture frame. 👍

I'm wondering why you did this

HOST=$(echo $STREAM | jq '.["X-Apple-MMe-Host"]' | cut -c 2- | rev | cut -c 2- | rev)

instead of this:

HOST=$(echo $STREAM | jq -r '.["X-Apple-MMe-Host"]')

Cheers,
Dennis

@SDK665
Copy link

SDK665 commented Feb 23, 2023

Hi

I cam across this while trying to find a way to download a shared icloud album.
I have the link to the album but is looking for a method / tool to paste the link in and it download the entire album to my local computer.
This seems to do the job but I don't know how to use this.
Can someone show me please...or point me to where I can learn to use this.

Thank you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment