[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1950":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":15,"starSnapshotCount":15,"syncStatus":28,"lastSyncTime":29,"discoverSource":30},1950,"iCloudPhotoSync","Euphonique\u002FiCloudPhotoSync","Euphonique","Sync Apple iCloud Photos with Synology Diskstation","",null,"Python",156,12,5,0,3,10,9,3.34,"MIT License",false,"main",true,[],"2026-06-12 02:00:35","# Synology iCloud Photo Sync\nA native Synology DSM 7.2 package that automatically mirrors your iCloud photo library to your NAS — so your memories live on storage you own, not just on Apple's servers.\nRuns as a proper DSM app with its own tile, settings UI, scheduler daemon, and DSM notifications. No Docker, no cron hacks, no SSH fiddling.\n\nBuilt with the [SynoCommunity\u002Fspksrc](https:\u002F\u002Fgithub.com\u002FSynoCommunity\u002Fspksrc) cross-compilation framework.\n\n## Features\n\n- **iCloud Photostream, Albums & Shared Libraries** — incremental sync with deduplication via hardlinks\n- **Multi-account** — several Apple IDs side by side, each with its own settings\n- **Parallel downloads** — 1\u002F2\u002F4\u002F8 configurable per account\n- **Folder structure** — year \u002F year-month \u002F year-month-day \u002F flat\n- **HEIC \u002F JPG conversion** — keep originals, convert, or both\n- **Apple 2FA** via trusted-device push or SMS fallback\n- **Native DSM UI** — built with SYNO.ux components\n- **Multi-language** — English and German\n- **Unprivileged** — runs as `iCloudPhotoSync`, not root\n\n## Prebuild Releases\n\nYou always find the latest version under releases:\n\n[https:\u002F\u002Fgithub.com\u002FEuphonique\u002FiCloudPhotoSync\u002Freleases\u002Flatest](https:\u002F\u002Fgithub.com\u002FEuphonique\u002FiCloudPhotoSync\u002Freleases\u002Flatest)\n\n## Building\n\n### Standalone build (recommended)\n\nNo spksrc checkout required — just run the included build script:\n\n```bash\n.\u002Fbuild.sh\n```\n\nThe resulting `.spk` file is created in the project root (e.g. `iCloudPhotoSync-1.4.4.spk`).\n\n### Building with spksrc\n\nAlternatively, build via the full [spksrc](https:\u002F\u002Fgithub.com\u002FSynoCommunity\u002Fspksrc) cross-compilation framework:\n\n1. Clone spksrc and set up the build environment (Docker recommended):\n   ```bash\n   git clone https:\u002F\u002Fgithub.com\u002FSynoCommunity\u002Fspksrc.git\n   cd spksrc\n   docker build -t spksrc .\n   ```\n\n2. Copy or symlink the package directory into your spksrc checkout:\n   ```bash\n   cp -r \u002Fpath\u002Fto\u002FiCloudPhotoSync-spksrc\u002Fspk\u002Ficloudphotosync spk\u002F\n   ```\n\n3. Build:\n   ```bash\n   cd spk\u002Ficloudphotosync\n   make arch-x64-7.2\n   ```\n\nThe resulting `.spk` files land in `packages\u002F`.\n\n## Package structure (spksrc layout)\n\n```\nspk\u002Ficloudphotosync\u002F\n  Makefile                 spksrc package definition\n  PLIST                    File list for SPK contents\n  src\u002F\n    service-setup.sh       DSM lifecycle hooks (start\u002Fstop\u002Finstall\u002Fupgrade)\n    PACKAGE_ICON.PNG       Package icons\n    PACKAGE_ICON_256.PNG\n    requirements-pure.txt  Python wheel dependencies\n    bin\u002F\n      scheduler.py         Long-running daemon, triggers syncs per interval\n      sync_runner.py       Single-sync entry point (UI sync-now button)\n      move_runner.py       Target-folder migration helper\n      heif\u002F                Bundled HEIC conversion binaries (per architecture)\n    lib\u002F\n      sync_engine.py       Core sync loop: list -> dedupe -> download -> verify\n      icloud_client.py     iCloud API wrapper (pyicloud_ipd)\n      config_manager.py    Global + per-account config with atomic file locking\n      heic_converter.py    HEIC -> JPG conversion with multi-backend fallback\n      handlers\u002F            CGI request handlers\n      vendor\u002F              Bundled Python deps (pyicloud_ipd, srp, six)\n    app\u002F                   DSM SPA — Ext.js + SYNO.ux components\n    conf\u002F\n      privilege            run-as: package\n      resource             data-share for \u002Fvolume1\u002FiCloudPhotos\n```\n\n## Requirements\n\n- Synology DSM **7.2** or newer\n- Python 3.8+ (provided by spksrc cross\u002Fpython311 dependency)\n- An Apple ID with 2FA enabled\n- **iCloud Advanced Data Protection (ADP) must be disabled** for iCloud Photos\n\n## Known limitations\n\n### iCloud Advanced Data Protection (ADP)\n\nIf you have ADP enabled, this app cannot access your iCloud Photos. ADP encrypts photos end-to-end so only trusted Apple devices hold decryption keys.\n\n**Workarounds:**\n1. Disable ADP: *Settings -> Apple ID -> iCloud -> Advanced Data Protection -> Turn Off*\n2. Enable temporary web access at [icloud.com](https:\u002F\u002Ficloud.com) (grants ~1 hour API access)\n\n### Shared Albums (legacy)\n\nSadly had to remove the Shared Albums feature from Settings, Albums tab, and sync engine. Legacy Shared Albums use a separate Apple API (sharedstreams.icloud.com) that is not accessible via CloudKit. Use the iCloud Shared Library (iOS 16+) feature instead.\n\n## Privacy & security\n\n- Apple password is **never stored permanently** — it is only held temporarily during the 2FA handshake, encrypted with PBKDF2-derived keys and HMAC-authenticated, and kept in RAM only (`\u002Fdev\u002Fshm`). It is discarded immediately after authentication completes.\n- Session cookies stored under `\u002Fvar\u002Fpackages\u002Ficloudphotosync\u002Fvar\u002Faccounts\u002F{id}\u002Fsession\u002F` with restrictive file permissions (owner-only)\n- All API endpoints require a valid DSM session and CSRF token\n- No telemetry, no analytics, no phone-home\n\n\n## License\n\n[MIT](LICENSE). Vendored third-party code keeps its original license:\n- [pyicloud_ipd](https:\u002F\u002Fgithub.com\u002Ficloud-photos-downloader\u002Fpyicloud_ipd) — MIT\n- [srp](https:\u002F\u002Fgithub.com\u002Fcocagne\u002Fpysrp) — BSD\n\n## Disclaimer\n\nNot affiliated with or endorsed by Apple Inc. \"Apple\", \"iCloud\", and related marks are trademarks of Apple Inc.\n","iCloudPhotoSync 是一个用于将 Apple iCloud 照片库同步到 Synology Diskstation 的工具。它通过提供增量同步、去重、多账户支持以及并行下载等功能，确保用户的照片能够高效地存储在自己的 NAS 设备上，而不仅仅是依赖于苹果的服务器。该应用还支持 HEIC 和 JPG 格式之间的转换，并且可以通过 DSM 7.2 作为原生应用程序运行，拥有独立的界面和通知系统，无需 Docker 或 SSH 操作。适合需要将个人或家庭照片从 iCloud 自动备份到本地 Synology NAS 的用户使用。",2,"2026-06-11 02:46:59","CREATED_QUERY"]