]> www.wagner.pp.ru Git - oss/phonebook.git/blob - phone
Initial commit with data
[oss/phonebook.git] / phone
1 #!/usr/bin/python3
2 # -*- coding: utf-8 -*-
3 import base64
4 import quopri
5 import re
6 import sys
7 import os.path
8
9
10 printnames={
11 "X-JABBER":"Jabber",
12 "EMAIL":"E-Mail",
13 "HOME":"домашний",
14 "ADR" : "Адрес",
15 "TEL":"Телефон",
16 "CELL":"Мобильный",
17 "BDAY" : "День рождения",
18 "X-INTERNET" : "",
19 "VOICE" : "",
20 "FAX" : "(факс)",
21 "WORK" : "рабочий",
22 "X-NICKNAME": "Прозвище",
23 "NOTE" : "Примечание",
24 "URL" : "URL",
25 "ORG" : "Организация",
26 "PHOTO" : "Фото",
27 "N" : "Имя",
28 "X-SKYPE-USERNAME" : "Skype",
29 "FN" : "Полное имя",
30 "PRESENT": "есть",
31 "UID": "UID"
32 }
33
34 def printname(name):
35     s=[]
36     for part in name.split(";"):
37         if part in printnames:
38             s.append(printnames[part])
39     return " ".join(s)
40
41 def printcard_readable(card):
42     print ("---------------------")
43     for (name,value) in card :
44         if name.find("PHOTO")==0:
45             value=printnames["PRESENT"]
46         printable_name = printname(name)    
47         if printable_name=="":
48             continue
49         print ("%s: %s"%(printable_name,value))
50 def printcard_mail(card):
51     for (name,value) in card:
52         if name.find("EMAIL")==0:
53             print(value);
54
55 def printcard_vcard(card):
56     print("BEGIN:VCARD")
57     print("VERSION:2.1")
58     for (name,value) in card:
59         if name.startswith('PHOTO'):
60             value = "\n ".join(value.split("\n"))
61         if name.find('ENCODING=')==-1:
62             u=value.encode("utf-8")
63             if len(value) != len(u):
64                 name=name+";CHARSET=UTF-8;ENCODING=8BIT"
65         print (name+":"+value)
66     print ("END:VCARD")
67
68 def printcard_tab(card):
69     d=dict(map(lambda x:(x,""),['N','TEL','EMAIL','PHOTO']))
70     for (name,value) in card:
71         if name[0:2]=='FN':
72             d['N']=value
73         elif (name[0:2]=='N;' or name[0:2]=='N:') and  d['N']=='':
74             d['N']=value
75         elif name[0:8]=='TEL;CELL':
76             d['TEL']=value
77         elif name[0:3]=='TEL' and d['TEL']=='' :
78             d['TEL']=value
79         elif name[0:5]=='EMAIL':
80             d['EMAIL']=value
81         elif name[0:5]=='PHOTO':
82             d['PHOTO']=u'фото'
83     print ( u"%-32s %12s %-28s %s"%(d['EMAIL'],d['N'],d['TEL'],d['PHOTO']))
84
85
86 # This is a main program
87 print_card = printcard_readable
88
89 if len(sys.argv)<2 or sys.argv[1]=='-h' or sys.argv[1]=='--help':
90     print ("Usage %s [-vta] search-pattern"%(sys.argv[0]),file=sys.stderr)
91     print ( "\t -v output vcards for found persons",file=sys.stderr)
92     print ("\t -a output just E-Mail addresses",file=sys.stderr)
93     print ("\t -t output name, phone and email in tabular format",file=sys.stderr)
94     sys.exit(1)
95 elif sys.argv[1] == "-v":
96     print_card = printcard_vcard
97     pattern=sys.argv[2]
98 elif sys.argv[1] == "-a":
99     print_card = printcard_mail
100     pattern=sys.argv[2]
101 elif sys.argv[1] == '-t':
102     print_card = printcard_tab
103     pattern=sys.argv[2]
104 else:
105     pattern=sys.argv[1]
106
107 pattern=re.compile(pattern)
108
109 card=[]
110 names={}
111 f=open(os.path.expanduser("~/.contacts/all_addressbook.vcf"),"r", encoding="utf-8")
112 for line in f:
113     line=line.rstrip("\r\n")
114     if line=="END:VCARD":
115         decoded=[]
116         toprint=False
117         for (name,value) in card:
118             if name.find("PHOTO")==0:
119                 # do not decode photo
120                 pass
121             elif name.find("ENCODING=BASE64")!=-1:
122                 name=name.replace("ENCODING=BASE64","").replace(";;",";")
123                 value=base64.b64decode(value).decode("utf-8")
124             elif name.find("ENCODING=QUOTED-PRINTABLE")!=-1:
125                 name=name.replace("ENCODING=QUOTED-PRINTABLE","").replace(";;",";")
126                 value=quopri.decodestring(value)
127             elif name.find("ENCODING=8BIT") !=-1:
128                 name=name.replace("ENCODING=8BIT","").replace(";;",";")
129             name=name.replace("CHARSET=UTF-8","").replace(";;",";");
130             name=name.rstrip(";")
131             if isinstance(value, bytes):  
132                 value=value.decode("utf-8")
133             try:
134                 value=value.rstrip(";")
135             except TypeError as e:
136                 print(str(e)+"\n"+repr(value))
137             decoded.append((name,value))
138             if name.find("PHOTO")==0:
139                 continue
140             if pattern.search(value):
141                 toprint=True
142         if toprint:
143             print_card(decoded)
144     elif line.find("BEGIN:VCARD")==0:
145         card = [];
146     else:
147         (name,sep,value)=line.partition(":")
148         if sep == "":
149             # Seems to be a continuation
150             card[-1]=(card[-1][0],card[-1][1]+"\n"+name.strip(" \t\r\n"))
151         else:
152             # Seems to be a field       
153             if name=="VERSION":
154                 #ignore the version
155                 continue
156             card.append((name,value))   
157                 
158 # For broken card
159 for (key,value) in names.items():
160     print (key,":",value)
161