Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
f104172
add naive cli parser
AndreyNikiforov Aug 23, 2025
7c3e5ca
add all native params to new parser
AndreyNikiforov Aug 25, 2025
5e40698
generalize split
AndreyNikiforov Aug 24, 2025
f418a61
add password- and mfa- provider clean ups
AndreyNikiforov Aug 25, 2025
0ea1e04
clear align-raw param
AndreyNikiforov Aug 25, 2025
ac8aa47
clean file match policy
AndreyNikiforov Aug 25, 2025
47742e9
clean live photo size
AndreyNikiforov Aug 25, 2025
3b36ec6
clean asset version sizes
AndreyNikiforov Aug 25, 2025
2cffc2e
clean live photo filename policy
AndreyNikiforov Aug 25, 2025
83c0855
add enum for password provider
AndreyNikiforov Aug 25, 2025
9e9677f
clean skip-created params
AndreyNikiforov Aug 26, 2025
bb7750f
clean help
AndreyNikiforov Aug 26, 2025
2e8abe1
add check for param incompatibilities
AndreyNikiforov Aug 26, 2025
ab5fb4e
fix error handling for skip-created-* params
AndreyNikiforov Aug 26, 2025
25ac773
refactor
AndreyNikiforov Aug 26, 2025
de650fb
clear log-level & folder-structure params; minor refactor
AndreyNikiforov Aug 27, 2025
d6a5921
bridge new config to old
AndreyNikiforov Aug 27, 2025
9d0bb9a
fix: multi-user watch mode and shared web server improvements
AndreyNikiforov Aug 27, 2025
461f565
feat: complete argparse CLI migration with 100% test compatibility
AndreyNikiforov Aug 28, 2025
97877a5
fix: disable argparse abbreviations and simplify test helper
AndreyNikiforov Aug 28, 2025
f0e4048
docs: add multi-user support to changelog
AndreyNikiforov Aug 28, 2025
244e689
feat: switch main icloudpd command to new argparse CLI
AndreyNikiforov Aug 28, 2025
2b3fba4
chore: remove all icloudpd_ex references from build infrastructure
AndreyNikiforov Aug 28, 2025
ca88263
chore: remove unused icloudpd_ex.py starter file
AndreyNikiforov Aug 28, 2025
2143938
feat: switch icloudpd starter to use new argparse CLI
AndreyNikiforov Aug 28, 2025
b41bb7d
fix: ensure Python 3.10 compatibility for CLI help formatting
AndreyNikiforov Aug 28, 2025
e33f1df
feat: add help text for --directory/-d parameter in CLI
AndreyNikiforov Aug 28, 2025
3eaafff
feat: add multi-version Python testing infrastructure and fix argpars…
AndreyNikiforov Aug 28, 2025
b2a9283
add claude to dev container
AndreyNikiforov Aug 28, 2025
efc3094
feat: verify multi-version Python compatibility and improve code quality
AndreyNikiforov Aug 28, 2025
353538f
ignore claude settings
AndreyNikiforov Aug 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .devcontainer/python/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {}
},
"postCreateCommand": "sudo apt-get update && sudo apt-get install -y locales-all"
"postCreateCommand": "sudo apt-get update && sudo apt-get install -y locales-all && (curl -fsSL https://claude.ai/install.sh | bash)"

// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
Expand Down
6 changes: 4 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ cron_script.sh
.coverage
.coverage.*
.git
tests/
.venv
venv
create/
create/
Dockerfile.test-py310
.dockerignore.test
check_py310_compat.py
33 changes: 3 additions & 30 deletions .github/workflows/build-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,6 @@ jobs:
run: |
mv dist/icloud dist/icloud-${{inputs.icloudpd_version}}-linux-${{ matrix.platform[1] }}
mv dist/icloudpd dist/icloudpd-${{inputs.icloudpd_version}}-linux-${{ matrix.platform[1] }}
mv dist/icloudpd_ex dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-${{ matrix.platform[1] }}

- name: Upload artifacts
uses: actions/upload-artifact@v4
Expand Down Expand Up @@ -542,7 +541,6 @@ jobs:
run: |
mv dist/icloud dist/icloud-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.platform[1] }}
mv dist/icloudpd dist/icloudpd-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.platform[1] }}
mv dist/icloudpd_ex dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.platform[1] }}

- name: Upload artifacts
uses: actions/upload-artifact@v4
Expand Down Expand Up @@ -583,10 +581,8 @@ jobs:
run: |
scripts/build_bin2 icloudpd icloud && \
scripts/build_bin1 icloud && \
scripts/build_bin1 icloudpd_ex && \
mv dist/icloud dist/icloud-${{inputs.icloudpd_version}}-macos-amd64 && \
mv dist/icloudpd dist/icloudpd-${{inputs.icloudpd_version}}-macos-amd64 && \
mv dist/icloudpd_ex dist/icloudpd-ex-${{inputs.icloudpd_version}}-macos-amd64
mv dist/icloudpd dist/icloudpd-${{inputs.icloudpd_version}}-macos-amd64

- name: Build Python Binary Wheel
run: |
Expand Down Expand Up @@ -631,10 +627,8 @@ jobs:
run: |
scripts/build_bin2 icloudpd icloud && \
scripts/build_bin1 icloud && \
scripts/build_bin1 icloudpd_ex && \
mv dist/icloud dist/icloud-${{inputs.icloudpd_version}}-windows-amd64 && \
mv dist/icloudpd dist/icloudpd-${{inputs.icloudpd_version}}-windows-amd64 && \
mv dist/icloudpd_ex dist/icloudpd-ex-${{inputs.icloudpd_version}}-windows-amd64
mv dist/icloudpd dist/icloudpd-${{inputs.icloudpd_version}}-windows-amd64

- name: Build Python Binary Wheel
run: |
Expand Down Expand Up @@ -1450,13 +1444,10 @@ jobs:
cd /work &&
chmod +x dist/icloud-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} &&
echo "test icloud..." &&
dist/icloud-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} --version &&
echo "test icloudpd..." &&
dist/icloudpd-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} --version &&
echo "test icloudpd-ex..." &&
dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} --version &&
touch /work/compatibility/bin.${{ matrix.image[0] }}.${{ matrix.prop[0] }}.pass

- name: Record failure for ${{ matrix.prop[2] }}${{ matrix.image[1] }} on ${{ matrix.prop[1] }}
Expand Down Expand Up @@ -1489,7 +1480,6 @@ jobs:
cd /work &&
chmod +x dist/icloud-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} &&
echo "test icloudpd..." &&
TZ=America/Los_Angeles LC_ALL=ru_RU.UTF-8 dist/icloudpd-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} --use-os-locale --version 1>.result &&
cat .result &&
Expand Down Expand Up @@ -1644,13 +1634,10 @@ jobs:
cd /work &&
chmod +x dist/icloud-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} &&
echo "test icloud..." &&
dist/icloud-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} --version &&
echo "test icloudpd..." &&
dist/icloudpd-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} --version &&
echo "test icloudpd-ex..." &&
dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} --version &&
touch /work/compatibility/bin-musl.${{ matrix.image[0] }}.${{ matrix.prop[0] }}.pass

- name: Record failure for ${{ matrix.prop[2] }}${{ matrix.image[1] }} on ${{ matrix.prop[1] }}
Expand Down Expand Up @@ -1683,7 +1670,6 @@ jobs:
cd /work &&
chmod +x dist/icloud-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} &&
echo "test icloudpd..." &&
TZ=America/Los_Angeles LC_ALL=ru_RU.UTF-8 dist/icloudpd-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} --use-os-locale --version 1>.result &&
cat .result &&
Expand Down Expand Up @@ -1835,13 +1821,10 @@ jobs:
cd /work &&
chmod +x dist/icloud-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} &&
echo "test icloud..." &&
dist/icloud-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} --version &&
echo "test icloudpd..." &&
dist/icloudpd-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} --version &&
echo "test icloudpd-ex..." &&
dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} --version &&
touch /work/compatibility/bin.${{ matrix.image[0] }}.${{ matrix.prop[0] }}.pass

- name: Record failure for ${{ matrix.prop[2] }}${{ matrix.image[1] }} on ${{ matrix.prop[1] }}
Expand Down Expand Up @@ -1875,7 +1858,6 @@ jobs:
cd /work &&
chmod +x dist/icloud-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} &&
echo "test icloudpd..." &&
TZ=America/Los_Angeles LC_ALL=ru_RU.UTF-8 dist/icloudpd-${{inputs.icloudpd_version}}-linux-${{ matrix.prop[0] }} --use-os-locale --version 1>.result &&
cat .result &&
Expand Down Expand Up @@ -2027,13 +2009,10 @@ jobs:
cd /work &&
chmod +x dist/icloud-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} &&
echo "test icloud..." &&
dist/icloud-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} --version &&
echo "test icloudpd..." &&
dist/icloudpd-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} --version &&
echo "test icloudpd-ex..." &&
dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} --version &&
touch /work/compatibility/bin-musl.${{ matrix.image[0] }}.${{ matrix.prop[0] }}.pass

- name: Record failure for ${{ matrix.prop[2] }}${{ matrix.image[1] }} on ${{ matrix.prop[1] }}
Expand Down Expand Up @@ -2067,7 +2046,6 @@ jobs:
cd /work &&
chmod +x dist/icloud-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} &&
chmod +x dist/icloudpd-ex-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} &&
echo "test icloudpd..." &&
TZ=America/Los_Angeles LC_ALL=ru_RU.UTF-8 dist/icloudpd-${{inputs.icloudpd_version}}-linux-musl-${{ matrix.prop[0] }} --use-os-locale --version 1>.result &&
cat .result &&
Expand Down Expand Up @@ -2129,13 +2107,10 @@ jobs:
echo "prep test..." &&
chmod +x dist/icloud-${{inputs.icloudpd_version}}-macos-amd64 &&
chmod +x dist/icloudpd-${{inputs.icloudpd_version}}-macos-amd64 &&
chmod +x dist/icloudpd-ex-${{inputs.icloudpd_version}}-macos-amd64 &&
echo "test icloud..." &&
dist/icloud-${{inputs.icloudpd_version}}-macos-amd64 --version &&
echo "test icloudpd..." &&
dist/icloudpd-${{inputs.icloudpd_version}}-macos-amd64 --version &&
echo "test icloudpd-ex..." &&
dist/icloudpd-ex-${{inputs.icloudpd_version}}-macos-amd64 --version &&
touch compatibility/bin.${{ matrix.prop[0] }}.${{ matrix.prop[1] }}.pass

- name: Record failure for ${{ matrix.prop[0] }} on amd64
Expand All @@ -2158,7 +2133,6 @@ jobs:
echo "prep test..." &&
chmod +x dist/icloud-${{inputs.icloudpd_version}}-macos-amd64 &&
chmod +x dist/icloudpd-${{inputs.icloudpd_version}}-macos-amd64 &&
chmod +x dist/icloudpd-ex-${{inputs.icloudpd_version}}-macos-amd64 &&
echo "test icloudpd..." &&
TZ=America/Los_Angeles LC_ALL=ru_RU.UTF-8 dist/icloudpd-${{inputs.icloudpd_version}}-macos-amd64 --use-os-locale --version 1>.result &&
cat .result &&
Expand Down Expand Up @@ -2216,8 +2190,7 @@ jobs:
dist/icloud-${{inputs.icloudpd_version}}-${{ matrix.prop[1] }}-amd64.exe --version &&
echo "test icloudpd..." &&
dist/icloudpd-${{inputs.icloudpd_version}}-${{ matrix.prop[1] }}-amd64.exe --version &&
echo "test icloudpd-ex..." &&
dist/icloudpd-ex-${{inputs.icloudpd_version}}-${{ matrix.prop[1] }}-amd64.exe --version &&

touch compatibility/bin.${{ matrix.prop[0] }}.amd64.pass

- name: Record failure for ${{ matrix.prop[0] }} on amd64
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,5 @@ node_modules/
# used for local troubleshooting
.photos
.cookies/

.claude/
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Unreleased

- feat: support multiple user configurations in single command [#1067](https://github.com/icloud-photos-downloader/icloud_photos_downloader/issues/1067) [#923](https://github.com/icloud-photos-downloader/icloud_photos_downloader/issues/923)

## 1.31.0 (2025-08-20)

- fix: OOMing on large downloads [#1214](https://github.com/icloud-photos-downloader/icloud_photos_downloader/issues/1214)
Expand Down
2 changes: 0 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ Building platform executables:
``` sh
scripts/build_bin2 icloudpd icloud
scripts/build_bin1 icloud
scripts/build_bin1 icloudpd_ex
```
Note: that command is for Linux, including devcontainers. Windows & macOS scripts must be executed on respective platforms.

Expand All @@ -132,7 +131,6 @@ Building Linux static executables:
``` sh
scripts/build_static icloudpd
scripts/build_static icloud
scripts/build_static icloudpd_ex
```

Building Python wheels (with executable):
Expand Down
37 changes: 32 additions & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,50 @@ FROM alpine:3.18 AS runtime_amd64_none
ENV MUSL_LOCPATH="/usr/share/i18n/locales/musl"
RUN apk update && apk add --no-cache tzdata musl-locales musl-locales-lang
WORKDIR /app
COPY dist/icloudpd-ex-*.*.*-linux-musl-amd64 icloudpd_ex
COPY dist/icloud-*.*.*-linux-musl-amd64 icloud
COPY dist/icloudpd-*.*.*-linux-musl-amd64 icloudpd

FROM alpine:3.18 AS runtime_arm64_none
ENV MUSL_LOCPATH="/usr/share/i18n/locales/musl"
RUN apk update && apk add --no-cache tzdata musl-locales musl-locales-lang
WORKDIR /app
COPY dist/icloudpd-ex-*.*.*-linux-musl-arm64 icloudpd_ex
COPY dist/icloud-*.*.*-linux-musl-arm64 icloud
COPY dist/icloudpd-*.*.*-linux-musl-arm64 icloudpd

FROM alpine:3.18 AS runtime_arm_v7
ENV MUSL_LOCPATH="/usr/share/i18n/locales/musl"
RUN apk update && apk add --no-cache tzdata musl-locales musl-locales-lang
WORKDIR /app
COPY dist/icloudpd-ex-*.*.*-linux-musl-arm32v7 icloudpd_ex
COPY dist/icloud-*.*.*-linux-musl-arm32v7 icloud
COPY dist/icloudpd-*.*.*-linux-musl-arm32v7 icloudpd

FROM runtime_${TARGETARCH}_${TARGETVARIANT:-none} AS runtime
ENV TZ=UTC
EXPOSE 8080
WORKDIR /app
RUN chmod +x /app/icloudpd_ex
ENTRYPOINT ["/app/icloudpd_ex"]
RUN chmod +x /app/icloud /app/icloudpd

# Use a shell script to allow command selection
COPY <<EOF /app/entrypoint.sh
#!/bin/sh
# If first argument is 'icloud' or 'icloudpd', run the corresponding binary
case "\$1" in
icloud)
shift
exec /app/icloud "\$@"
;;
icloudpd)
shift
exec /app/icloudpd "\$@"
;;
*)
# Default to icloudpd
exec /app/icloudpd "\$@"
;;
esac
EOF

RUN chmod +x /app/entrypoint.sh

# Default entrypoint allows command selection
ENTRYPOINT ["/app/entrypoint.sh"]
2 changes: 0 additions & 2 deletions Dockerfile.build
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,8 @@ RUN \
echo "Building binaries..." && \
scripts/build_bin2 icloudpd icloud && \
scripts/build_bin1 icloud && \
scripts/build_bin1 icloudpd_ex && \
scripts/build_static icloudpd && \
scripts/build_static icloud && \
scripts/build_static icloudpd_ex && \
scripts/build_whl

FROM scratch
Expand Down
1 change: 0 additions & 1 deletion Dockerfile.build-musl
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ RUN \
. .venv/bin/activate && \
scripts/build_bin2 icloudpd icloud && \
scripts/build_bin1 icloud && \
scripts/build_bin1 icloudpd_ex && \
scripts/build_whl

FROM scratch
Expand Down
Empty file added help_current.txt
Empty file.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ test = [
Homepage="https://github.com/icloud-photos-downloader/icloud_photos_downloader"

[project.scripts]
icloudpd = "icloudpd.base:main"
icloudpd = "icloudpd.cli:cli"
icloud = "pyicloud_ipd.cmdline:main"

[tool.pytest.ini_options]
Expand Down
Loading
Loading