Skip to content

Commit dac97f8

Browse files
teh-hippoCopilot
andcommitted
feat: add --accept-apple-changes flag
--accept-apple-changes: re-download files when iCloud reports a different version_size. Without this flag, version changes are logged as warnings but files are not re-downloaded. Metadata updates from iCloud are always applied regardless. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent df201a6 commit dac97f8

File tree

5 files changed

+35
-9
lines changed

5 files changed

+35
-9
lines changed

src/icloudpd/base.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,7 @@ def password_provider(_username: str) -> str | None:
484484
user_config.align_raw,
485485
dir_cache,
486486
manifest,
487+
user_config.accept_apple_changes,
487488
)
488489
if user_config.directory is not None
489490
else (lambda _s, _c, _p: False)
@@ -813,6 +814,7 @@ def download_builder(
813814
raw_policy: RawTreatmentPolicy,
814815
dir_cache: DirCache,
815816
manifest: "ManifestDB | None",
817+
accept_apple_changes: bool,
816818
icloud: PyiCloudService,
817819
counter: Counter,
818820
photo: PhotoAsset,
@@ -923,15 +925,24 @@ def download_builder(
923925
)
924926
dedup_download = dedup_suffix is not None and not file_exists
925927
if dedup_suffix is None and manifest_row.version_size != version.size:
926-
# iCloud has a different version — re-download to the canonical path
927-
file_exists = False
928-
rel_path = os.path.relpath(download_path, directory)
929-
logger.debug(
930-
"%s version changed (manifest: %d, iCloud: %d), re-downloading",
931-
truncate_middle(download_path, 96),
932-
manifest_row.version_size,
933-
version.size,
934-
)
928+
# iCloud has a different version
929+
if accept_apple_changes:
930+
file_exists = False
931+
rel_path = os.path.relpath(download_path, directory)
932+
logger.info(
933+
"%s version changed (manifest: %d, iCloud: %d), re-downloading",
934+
truncate_middle(download_path, 96),
935+
manifest_row.version_size,
936+
version.size,
937+
)
938+
else:
939+
logger.warning(
940+
"%s version changed (manifest: %d, iCloud: %d), "
941+
"use --accept-apple-changes to re-download",
942+
truncate_middle(download_path, 96),
943+
manifest_row.version_size,
944+
version.size,
945+
)
935946
elif dedup_suffix is None:
936947
# No collision, version matches — update metadata if needed
937948
meta = _extract_manifest_metadata(photo, version)

src/icloudpd/cli.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,15 @@ def add_options_for_user(parser: argparse.ArgumentParser) -> argparse.ArgumentPa
312312
help="Don't download any photos (default: download all photos and videos)",
313313
action="store_true",
314314
)
315+
cloned.add_argument(
316+
"--accept-apple-changes",
317+
help=(
318+
"Re-download files when iCloud reports a different version. "
319+
"Without this flag, version changes are logged as warnings. "
320+
"Metadata updates from iCloud are always applied regardless."
321+
),
322+
action="store_true",
323+
)
315324
return cloned
316325

317326

@@ -560,6 +569,7 @@ def map_to_config(user_ns: argparse.Namespace) -> UserConfig:
560569
skip_created_before=user_ns.skip_created_before,
561570
skip_created_after=user_ns.skip_created_after,
562571
skip_photos=user_ns.skip_photos,
572+
accept_apple_changes=user_ns.accept_apple_changes,
563573
)
564574

565575

src/icloudpd/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class _DefaultConfig:
5151
skip_created_before: datetime.datetime | datetime.timedelta | None
5252
skip_created_after: datetime.datetime | datetime.timedelta | None
5353
skip_photos: bool
54+
accept_apple_changes: bool
5455

5556

5657
@dataclass(kw_only=True)

tests/test_cli.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ def test_cli_parser(self) -> None:
235235
skip_created_before=None,
236236
skip_created_after=None,
237237
skip_photos=False,
238+
accept_apple_changes=False,
238239
),
239240
UserConfig(
240241
directory="def",
@@ -276,6 +277,7 @@ def test_cli_parser(self) -> None:
276277
skip_created_before=None,
277278
skip_created_after=None,
278279
skip_photos=False,
280+
accept_apple_changes=False,
279281
),
280282
],
281283
),
@@ -355,6 +357,7 @@ def test_cli_parser(self) -> None:
355357
).astimezone(get_localzone()),
356358
skip_created_after=datetime.timedelta(days=2),
357359
skip_photos=False,
360+
accept_apple_changes=False,
358361
),
359362
],
360363
),

tests/test_dedup_exif.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ def fake_download(
175175
"--set-exif-datetime",
176176
"--no-progress-bar",
177177
"--threads-num", "1",
178+
"--accept-apple-changes",
178179
])
179180

180181
self.assertIn("version changed", result.output)

0 commit comments

Comments
 (0)