Skip to main content

Synchronize recordings from BlackVue dashcams to a local directory

Project description

BlackVue Sync

CI Build Docker image Quality Gate Status Coverage Bugs Code Smells Maintainability Rating Reliability Rating Security Rating

Synchronizes recordings from a BlackVue dashcam with a local directory over a LAN.

BlackVue dashcams expose an HTTP server that can be used to download all recordings. This project downloads only recordings that are not already downloaded, optionally limiting downloads in a local directory to a date range.

A typical setup would be a periodic cron job or a Docker container running on a local server.

Features

  • Portable runtimes:
  • Smart: Only downloads recordings that haven't already been downloaded.
  • Resilient: If a download interrupts for whatever reason, the script resumes where it left off the next time it runs. This is especially useful for possibly unreliable Wi-Fi connections from a garage.
  • Hands-off: Optionally retains recordings for a set amount of time. Outdated recordings are automatically removed.
  • Cron-friendly: Only one process is allowed to run at any given time for a specific download destination.
  • Safe: Stops executing if the destination disk is almost full.
  • Friendly error reporting: Communicates a range of known error conditions with sensible verbosity.

Prerequisites

Software

  • Python 3.9+ or Docker.
  • Sufficient disk space on a file system local to the script. Plan for about 5GB/hr per camera.
  • BlackVue Viewer or a media player to view the recordings.

Hardware

A cloud-enabled BlackVue dashcam must be connected via Wi-Fi to the local network with a static IP address.

The dashcam must be kept powered for some time after the vehicle is turned off. BlackVue offers hardwiring kits and batteries.

The camera should stay active for a period sufficiently long for recordings to be downloaded. Consult the dashcam manual for the bit rate for your chosen image quality, and compare it with the download speed reported by BlackVue Sync.

Example with a DR750S-2CH recording with two cameras at the highest quality setting and a good but conservative download speed:

# dashcam bitrates
dashcam_bitrate_front = 12Mbps
dashcam_bitrate_back = 10Mbps
dashcam_bitrate = dashcam_bitrate_front + dashcam_bitrate_back

download_speed = 20Mbps

# hours on the timer for every hour of recording
ratio = dashcam_bitrate / download_speed => 1.1

Verifying Connectivity

For illustration purposes, all examples assume that the camera is reachable at the dashcam.example.net address. A static numeric IP address works just as well.

A quick way to verify that the dashcam is online is by using curl.

$ curl http://dashcam.example.net/blackvue_vod.cgi
v:1.00
n:/Record/20181026_135003_PF.mp4,s:1000000
n:/Record/20181026_140658_PF.mp4,s:1000000
n:/Record/20181026_140953_PF.mp4,s:1000000
...
$

Another way is by browsing to: http://dashcam.example.net/blackvue_vod.cgi.

Usage

Installation

BlackVue Sync is a single script, and can be obtained in a number of ways:

  • uv: Run with uvx blackvuesync <args>, or install with uv tool install blackvuesync and run with blackvuesync <args>.
  • Pip: Install with pip install blackvuesync and run with blackvuesync <args>.
  • Direct: Download from GitHub, save to the desired location, and either run it with python3 blackvuesync.py <args>, or mark it executable and run it with blackvuesync.py <args>.

The interactive instructions assume a uv or Pip installation.

Manual Usage

The dashcam address is the only required parameter. The --dry-run option makes it so that the script communicates what it would do without actually doing anything. Example:

blackvuesync dashcam.example.net --dry-run

It's also possible to specify a destination directory other than the current directory with --destination:

blackvuesync dashcam.example.net --destination /data/dashcam --dry-run

A retention period can be indicated with the --keep option. Recordings prior to the retention period will be removed from the destination directory. Accepted units are d for days and w for weeks. If no unit is indicated, days are assumed.

blackvuesync dashcam.example.net --destination /data/dashcam --keep 2w --dry-run

A typical invocation would be:

blackvuesync dashcam.example.net --destination /data/dashcam --keep 2w

Other options:

  • --grouping: Groups downloaded recordings in directories according to different schemes. Grouping speeds up loading recordings in the BlackVue Viewer app. The supported groupings are:
    • daily: By day, e.g. 2018-10-26;
    • weekly: By week, with the directory indicating the date of that week's monday, e.g. 2018-10-22;
    • monthly: By month, e.g. 2018-10;
    • yearly: By year, e.g. 2018;
    • none: No grouping, the default.
  • --priority: Downloads recordings with different priorities: date downloads oldest to newest; rdate downloads newest to oldest; type downloads manual, event (all types), normal and (non-event) parking recordings in that order. Defaults to date.
  • --max-used-disk: Downloads stop once the specified used disk percentage threshold is reached. Defaults to 90 (i.e. 90%.)
  • --timeout: Sets a timeout for establishing a connection to the dashcam, in seconds. Defaults to 10.0 seconds.
  • --quiet: Quiets down output messages, except for unexpected errors. Takes precedence over --verbose.
  • --verbose: Increases verbosity. Can be specified multiple times to indicate additional verbosity.

Unattended Usage

Plain cron

The script can run periodically by setting up a cron job on UNIX systems.

Simple example with crontab for a hypothetical media user:

*/15 * * * * /home/media/bin/blackvuesync.py dashcam.example.net --keep 2w --destination /data/dashcam --cron

The --cron option changes the logging level with the assumption that the output may be emailed. When this option is enabled, the script only produces logs when it downloads recordings and when it encounters unexpected errors. One would typically see an email only after driving or when something goes wrong.

Note that if the dashcam is unreachable for whatever reason, in --cron mode no output is generated, since this is an expected condition whenever the dashcam is away from the local network.

If cron jobs overlap, the script recognizes that another instance is currently running via a lock file on the destination directory. For the lock to work correctly, the destination directory must be on a local filesystem relative to the script.

NAS

Many NAS systems allow running commands periodically at set intervals.

openmediavault

The openmediavault NAS solution allows running scheduled jobs with support for mail notifications.

Example:

openmediavault Scheduled Job

Docker

Overview

The acolomba/blackvuesync docker image sets up a cron job internal to the container that runs the synchronization operation every 15 minutes.

Quick Start

It's a good idea to do a single, interactive dry run first with verbose logging:

docker run -it --rm \
    -e ADDRESS=dashcam.example.net \
    -v $PWD:/recordings \
    -e DRY_RUN=1 \
    -e VERBOSE=1 \
    -e RUN_ONCE=1 \
    --name blackvuesync \
acolomba/blackvuesync

Once that works, a typical invocation would be similar to:

docker run -d --restart unless-stopped \
    -v /data/dashcam:/recordings \
    -e ADDRESS=dashcam.example.net \
    -e PUID=$(id -u) \
    -e PGID=$(id -g) \
    -e TZ="America/New_York" \
    -e KEEP=2w \
    --name blackvuesync \
acolomba/blackvuesync
Docker Compose

Docker Compose may offer an easier, more repeatable and extensible option for running a BlackVueSync Docker container.

After downloading the Docker Compose file and editing its values as desired, BlackVueSync can be started with:

docker-compose up -d

OR, depending on the Docker version:

docker compose up -d
Reference

These options are required for the docker image to operate correctly:

  • The /recordings volume mapped to the desired destination of the downloaded recordings.
  • The ADDRESS parameter set to the dashcam address.
  • The PUID and PGID parameters set to the desired destination directory's user id and group id.
  • The TZ parameter set to the same timezone as the dashcam. Note that BlackVue dashcams do not respect Daylight Savings Time, so their clock needs to be adjusted periodically.

Other parameters:

  • GROUPING: Groups downloaded recordings in directories, daily, weekly, monthly, yearly and none are supported. (Default: none.)
  • KEEP: Sets the retention period of downloaded recordings. Recordings prior to the retention period will be removed from the destination. Accepted units are d for days and w for weeks. If no unit is indicated, days are assumed. (Default: empty, meaning recordings are kept forever.)
  • PRIORITY: Sets the priority to download recordings. Pick date to download from oldest to newest; pick rdate to download from newset to oldest; pick type to download manual, event (all types), normal and (non-event) parking recordings in that order. Defaults to date.
  • MAX_USED_DISK: If set to a percentage value, stops downloading if the amount of used disk space exceeds the indicated percentage value. (Default: 90, i.e. 90%.)
  • TIMEOUT: If set to a float value, sets the timeout in seconds for connecting to the dashcam. (Default: 10.0 seconds.)
  • VERBOSE: If set to a number greater than zero, increases logging verbosity. (Default: 0.)
  • QUIET: If set to any value, quiets down logs: only unexpected errors will be logged. (Default: empty.)
  • CRON: Set by default, makes it so downloads of normal recordings and unexpected error conditions are logged. Can be set to "" to disable.
  • DRY_RUN: If set to any value, makes it so that the script communicates what it would do without actually doing anything. (Default: empty.)
  • RUN_ONCE: If set to any value, the docker image runs the sync operation once and exits without setting up the cron job. (Default: empty. Not supported in Docker Compose.)

License

This project is licensed under the MIT License - see the COPYING file for details

Copyright 2018-2026 Alessandro Colomba

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

blackvuesync-2.0.tar.gz (17.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

blackvuesync-2.0-py3-none-any.whl (16.2 kB view details)

Uploaded Python 3

File details

Details for the file blackvuesync-2.0.tar.gz.

File metadata

  • Download URL: blackvuesync-2.0.tar.gz
  • Upload date:
  • Size: 17.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for blackvuesync-2.0.tar.gz
Algorithm Hash digest
SHA256 ee7b723533318fdbbc57097817670401e177f8fd2d0b5b5991faf1f036340b54
MD5 817c89d38892e9852344844cd8181eed
BLAKE2b-256 60f3a88a1f2cbdfa2ec98abee9a0f5f5e8664726f3ecb7bef0fadfcd544c71e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for blackvuesync-2.0.tar.gz:

Publisher: ci.yml on acolomba/blackvuesync

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file blackvuesync-2.0-py3-none-any.whl.

File metadata

  • Download URL: blackvuesync-2.0-py3-none-any.whl
  • Upload date:
  • Size: 16.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for blackvuesync-2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f4de474c47e60d10e2ab8bddee5945335240693dfd0214adb38d0d1d6c766a0a
MD5 60750769d03fa0a941d39cc67fae98ea
BLAKE2b-256 27d24217c1ec3e03674702e9777b352373511d99d876b4042d4804096110fbb0

See more details on using hashes here.

Provenance

The following attestation bundles were made for blackvuesync-2.0-py3-none-any.whl:

Publisher: ci.yml on acolomba/blackvuesync

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page