kidsnote-backup/README.md
Jeena 8413179b5f Fix photo filename collisions, video downloads, and EXIF dates
Photos in the same report with identical timestamps were overwriting each
other due to missing image index in the filename. Videos failed to download
because attached_video is a dict with resolution URLs, not a plain URL.

Also read EXIF DateTimeOriginal before modifying the file and write the
report date as fallback when the image has no original timestamp. Embed
creation_time metadata in downloaded videos using ffmpeg.
2026-04-04 01:50:24 +00:00

1.8 KiB

Kidsnote backup

I found the original script here https://gist.github.com/Leuconoe/21f6a07f50389c4de1ec127944af7008

I'm adding info to be able to easier use it.

What it does

  • Downloads all reports (text, photos, and videos) from kidsnote.com
  • Organizes them into a YYYY/MM/DD folder structure
  • Writes EXIF metadata into photos (report content, GPS location, and date when missing)
  • Embeds report date into video files when missing (requires ffmpeg)
  • Skips already-downloaded reports for incremental backups

Installation

pipenv install

Optional: install ffmpeg to embed date metadata into downloaded videos. Without it, videos are still saved but without creation date information.

How to use:

  1. Copy the env-sample file to .env
  2. Put in your username and password
  3. Put in the path where you want the photos and videos stored, it will create a YYYY/MM/DD structure there
  4. Run pipenv run python get_report.py to get the report, it stores it in a file report.json
  5. Run pipenv run python report_json_down.py to download all the reports, photos, and videos

Run automatically with a systemd timer

This will run the script every day at midnight or once you wake up your computer:

  1. Change the working directory to where you checked out the code in systemd/kidsnote.service
  2. cp systemd/kidsnote.service ~/.config/systemd/user/
  3. cp systemd/kidsnote.timer ~/.config/systemd/user/
  4. systemctl --user daemon-reload
  5. systemctl --user enable --now kidsnote.timer

It assumes you already set up the .env file.

Why username and password?

In the old script you had to get the report manually from the browser. I added get_report.py which logs in with a headless chromium browser, gets the report for you so it's possible to automate it with cron.

License

GPL v3