Archive for Januar, 2015

Telefonnummern von ownCloud/Carddav in die Fritz!Box

01:21

Die Fritz!Box kann sich zwar mit z.B. Googlekonten verbinden, aber immer noch nicht via CardDAV (z.B.OwnCloud). Das ist sehr ärgerlich, da ich mein Googlekonto wegen der heutzutage üblichen Datenschnüffelei nicht mehr für persönliche Daten verwenden möchte.

Also habe ich ein Perl-Skript erstellt, welches eine CardDAV Datei einliest und in eine für die Fritz!Box verständliche Backupdatei übersetzt. Alle vorigen Einträge sind dann weg, aber das macht ja nichts, da ja die ownCloud der Master ist.

Das Skript ist sicher keine Meisterleistung moderner Programierkunst, aber zum einen habe ich schon lange kein Perl mehr programmiert, zum anderen brauchte ich einfach nur eine schnelle Lösung.

Das Skript basiert auf Text::vCard::Addressbook, die Installation war etwas ätzend, da diverse Abhängigkeiten aufgelöst werden mußten.

Als Schmankerl schreibe ich noch die Kontaktbilder in das Verzeichnis fonpix. Diese kann man dann ebenfalls auf die Fritz!Box kopieren (via NAS Funktion).

Für mich hat es seinen Zweck erfüllt, vielleicht mag es auch anderen nützlich sein.

#!/usr/bin/perl -w
use utf8;
use open ':std', ':encoding(UTF-8)';
use Text::vCard::Addressbook; # To read an existing address book file:
use strict;
use warnings;

my $fonpixdir='fonpix';

my $address_book = Text::vCard::Addressbook->new({ 
  'source_file'  => 'Contacts.vcf', 
});

unless(-e $fonpixdir) {
  mkdir($fonpixdir) || die;
}

my @allcards=();
foreach my $vcard ( $address_book->vcards() ) {
    my $vc='<contact><person><realName>'.$vcard->fullname().'</realName>';
    
    my $uid=$vcard->get({ 'node_type' => 'UID' });
    if(defined($uid)) {
        bless $uid, 'ARRAY';
        $vc.='<uniqueid>'. $uid->[0]->{'value'}."</uniqueid>\r\n";
      }


    my $img=$vcard->get({ 'node_type' => 'PHOTO' });
    if (defined $img) {
      my $imgtype='wtf';
      if($img->[0]->is_type('jpeg') || $img->[0]->is_type('image/jpeg')) {
        $imgtype='jpg';      
      }
      if($img->[0]->is_type('png')) {
        $imgtype='png';      
      }
    $vc.="<imageURL>file:///var/InternerSpeicher/FRITZ/fonpix/".$uid->[0]->{'value'}.".$imgtype</imageURL>";
    StoreImage($img,$uid->[0]->{'value'}.".$imgtype");
    }
    $vc.="</person>\r\n";


    my @tels = $vcard->get({ 'node_type' => 'tel' });
    if ($#tels >= 0) {
      $vc.='<telephony nid="'.(1+$#tels).'">';
      my $prio=1;
      my $id=0;
      foreach my $tel ( @tels ) {
        if(defined($tel)) {
          my $teltype="home";
          if($tel->is_type('cell')) {$teltype='mobile'}
          if($tel->is_type('work')) {$teltype='work'}
          $vc.='<number type="'.$teltype.'" prio="'.$prio.'" id="'.$id.'">'.$tel->value()."</number>\r\n";
          $id++;
          if($prio == 1) { $prio-- }
        }
      }
      $vc.="</telephony>\r\n";
    }
    $vc.='</contact>';
    push @allcards,$vc;
}

my $filename='FritzOut.xml';
open(my $out, '>', $filename) or die "Could not open file '$filename' $!";
print $out '<?xml version="1.0" encoding="utf-8"?><phonebooks><phonebook>';
print $out join ("\r\n",@allcards);
print $out '</phonebook></phonebooks>';
close($out);


sub StoreImage {
  my $img = shift;
  my $filename = shift;
  open (FH,">$fonpixdir/$filename") or die;
  binmode FH;
  print FH  $img->[0]->{'value'};
  close FH;
  return 0;
}