Automatisch Dashcam Beelden Overzetten met Python en udev
Mijn Novatek dashcam schrijft al jaren braaf MP4-bestanden naar een SD-kaart. Elke clip is ~381 MB, zo’n 5 minuten. Na een paar ritjes zit de kaart vol en moet ik hem handmatig leeg halen. Dat werd tijd om te automatiseren.
Het probleem
De dashcam produceert bestanden met een vaste naamconventie:
20260529085848_0003363F.MP4 ← front camera
20260529085848_0003364B.MP4 ← back camera
De F en B suffix geven aan of het beeld van de voor- of achtercamera is. De eerste 8 cijfers (YYYYMMDD) zijn de datum. Sinds ik de dashcam heb (augustus 2025) staat er inmiddels zo’n 1,6 TB aan beelden op een 4TB USB-SSD.
Handmatig overzetten en sorteren is niet alleen saai, maar ook foutgevoelig. Tijd voor een script.
De architectuur
Het systeem werkt in een paar eenvoudige stappen, allemaal geïmplementeerd in één Python-script zonder externe dependencies:
1. Detectie — udev + systemd
Wanneer ik de SD-kaart in de USB-reader steek, wordt hij automatisch gemount op /mnt/sdcard via een systemd automount unit. Een udev rule detecteert het apparaat (/dev/sdd1) en start een systemd oneshot service die het Python-script aanroept.
ACTION=="add", KERNEL=="sdd1", RUN+="/usr/local/bin/dashcam-transfer-trigger"
Het trigger-script wacht kort tot de mount beschikbaar is en start dan de transfer.
2. Bestemming voorbereiden — schijfruimtebeheer
Eerst controleert het script of er genoeg vrije ruimte is voor alle bestanden op de SD-kaart. Als er te weinig is (de 4TB SSD raakt natuurlijk ook een keer vol), worden de oudste datummappen verwijderd tot er weer ruimte is.
Dit is een bewuste keuze: oudste eerst verwijderen. De oudste beelden zijn het minst relevant, en dit patroon is eenvoudig en voorspelbaar.
3. Organisatie
Op de SSD worden de bestanden gestructureerd opgeslagen in een uniforme mapstructuur:
/mnt/ultratouch/dashcam/
└── YYYYMMDD/
├── front/
│ └── 20260529085848_0003363F.MP4
└── back/
└── 20260529085848_0003364B.MP4
Dus per datum één map, met daarin front/ en back/. Simpel, overzichtelijk, en makkelijk te koppelen aan andere tools zoals een mediascanner.
4. Transfer — copy + verify + delete
Elk bestand wordt individueel overgezet met een veilig drieslag-proces:
- Copy —
shutil.copy2()naar de juiste doellocatie - Verify —
os.path.getsize()bron vs doel, precies gelijk? - Delete — alleen bij geslaagde verificatie wordt het bronbestand verwijderd
Deze volgorde is belangrijk. Met shutil.move() zou het mis kunnen gaan op exfat (geen ondersteuning voor metadata-operaties), en zonder verificatie riskeer je beschadigde bestanden. Copy + verify is langzamer, maar 100% betrouwbaar.
Waarom Python?
Er zijn natuurlijk vele talen geschikt voor dit script, maar ik koos voor Python 3 om een paar redenen:
- Standaardbibliotheek —
os,shutil,argparse,logging,hashlib,glob. Geenpip install, geenrequirements.txt, geennode_modules. Het werkt gewoon. - Portable — draait op Linux, macOS, Windows. Mocht ik ooit van server wisselen, dan werkt het direct.
- Onderhoudbaar — Python is leesbaar, ook voor iemand die niet dagelijks codeert. Dit script moet jaren mee kunnen zonder dat ik er wekelijks aan sleutel.
- Error handling — exceptions en try/except zijn volwassen en betrouwbaar, veel beter dan bash fallible patterns.
Retrospectieve herstructurering
Bij het inrichten van dit systeem ontdekte ik dat de bestaande beelden op de SSD niet consistent waren georganiseerd. Afhankelijk van wanneer ik ze had overgezet, waren er drie verschillende structuren gebruikt:
| Periode | Structuur |
|---|---|
| Aug 2025 | chauffeur/ en weg/ (oude dashcam, andere naamgeving) |
| Begin 2026 | Platte bestanden direct in de datummapp |
| Vanaf maart 2026 | front/ en rear/ |
Ik heb een eenmalig herstructureringsscript (restructure.py) geschreven dat alle 4184 bestanden heeft omgezet naar de uniforme front/back structuur. De suffix in de bestandsnaam (F of B) was altijd consistent, dus de camera-positie was ondubbelzinnig te bepalen.
Het resultaat
De volledige transfer van een volle SD-kaart (298 bestanden, ~109 GB) duurde ongeveer 1 uur en 50 minuten. De bottleneck is de USB-kaartlezer op de server, niet het script.
Het script logt naar /tmp/dashcam-transfer.log met voor elk bestand datum, tijd en status. Zo weet ik altijd wat er gebeurd is.
[2026-05-29 19:54:29] INFO Transfer voltooid: 303 ok, 0 fouten
[2026-05-29 19:54:29] INFO Overgezet: 20260529112143_0003403F.MP4 → 20260529/front/ (381203172 bytes)
Conclusie
Het systeem staat nu draaiend op mijn Fedora server. Vanaf nu is het simpel: SD-kaart in de reader, script doet de rest. Geen handmatig kopiëren, geen verkeerd gesorteerde bestanden, geen volle kaarten meer. En omdat alles in Python is geschreven zonder externe dependencies, is het robuust en onderhoudbaar.
De volledige broncode staat op git.eddydevink.nl.