VCF - Daten extrahieren - Speziell "PHOTO"

  • Frohes Neues zusammen!


    Ich google mir schon den Wolf - alles nah dran aber mir noch nicht nah genug.....


    Ausgangssituation: Ich habe Owncloudauf ner MySql-Datenbank in der Version 9.x am laufen - und auch meine Kontalte in Adressbüchern drin. Einige der Kontakte haben Bildchen mit dabei. Ich möchte nun per sql und python die Bildchen aus der Datenbank im Filesystem ablegen um sie an anderer Stelle anzuzeigen.


    Was ich per mysql und python schon hinbekommen habe, ist das extrahieren der VCF-Daten (die liegen bei OC in einem long blob-Feld "carddata" in der Tabelle oc_cards).


    Das geht so - Beispielhaft für die Card-Id 29.... (hat nen Bildchen):



    Das führt dann zu einer 29.vcf im Filesystem.


    In den VCF-Daten an sich liegt ein "irgendwie"-codierter Bereich - der Anfang davon fängt in etwa so an (wen man sich 29.vcf im vi anschaut - ab "PHOTO;" kommen die Informationen zur Kodierung und zum Typ ab dem ":" - bzw. der n. Zeile kommen die Rohdaten des Bildes.


    Code
    ...
    BDAY;value=date:1973-06-30^M
    PHOTO;ENCODING=b;TYPE=JPEG;X-ABCROP-RECTANGLE=ABClipRect_1&230&1045&2219&2219&r9Ok8Wrvif1DHww1kr1sKw==:^M
     /9j/4AAQSkZJRgABAQAASABIAAD/4QBMRXhpZgAATU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAA^M
     AAA6ABAAMAAAABAAEAAKACAAQAAAABAAAJkKADAAQAAAABAAAMwAAAAAD/7QA4UGhvdG9zaG9w^M
     IDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs+EJ+/8AAEQgMwAmQAw^M
     EiAAIRAQMRAf/EAB8AAAEFA
    ....


    Enden tut der Teil für das Bild mit einem Tag am Beginn einer Zeile (bis dahin fangen alle Daten zum Bild/Zeilen mit einem Blank an)


    Ich bräuchte Hilfe beim extrahieren und abspeichern der Bildinformationen per python (wenn irgendmöglich)

    Einmal editiert, zuletzt von magicamun ()

  • Die vcf-Daten sollte man mit https://eventable.github.io/vobject/ parsen und sich das PHOTO-Attribut holen können. Zeile 4 sieht wie ein base64-encodierter Header einer JPEG-Datei aus:

    Code
    >>> import base64
    >>> base64.b64decode(b'/9j/4AAQSkZJRgABAQAASABIAAD/4QBMRXhpZgAATU0AKgAAAAgAAYdpAAQAAAABAAAAGgAA')
    b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00H\x00H\x00\x00\xff\xe1\x00LExif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x01\x87i\x00\x04\x00\x00\x00\x01\x00\x00\x00\x1a\x00\x00'


    Also sollte es genügen das base64-Encoding rückgängig zu machen und das Ergebnis als Binärdaten in eine Datei zu schreiben.


    Edit: ich habe gerade keinen Beispieldatensatz, aber eventuell erledigt das decoden schon vobject für dich, wenn du dir für eine VCARD vcard.photo.value ausgeben lässt.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Hi - VIELEN Dank!


    jetzt läuft das hier:



    mal soweit, dass ich die Bilder im Filesystem habe - wenn denn eins da ist - Proof of Concept sozusagen


    EDIT: gelöst
    Ich habe jetzt noch 2 kleinere Problemchen:
    1. Ich muss noch rausfinden, ob überhaupt "PHOTO" existiert
    2. Ich muss den TYP noch extrahieren


    Beides müsste aber über vobject ja machbar sein - weiß nur noch nicht wie...


    Siehe oben im Schnipsel - gelöst - Merci vielmals

    Einmal editiert, zuletzt von magicamun ()

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!