2 # -*- coding: utf-8 -*-
17 "BDAY" : "День рождения",
22 "X-NICKNAME": "Прозвище",
23 "NOTE" : "Примечание",
25 "ORG" : "Организация",
28 "X-SKYPE-USERNAME" : "Skype",
36 for part in name.split(";"):
37 if part in printnames:
38 s.append(printnames[part])
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=="":
49 print ("%s: %s"%(printable_name,value))
50 def printcard_mail(card):
51 for (name,value) in card:
52 if name.find("EMAIL")==0:
55 def printcard_vcard(card):
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)
68 def printcard_tab(card):
69 d=dict(map(lambda x:(x,""),['N','TEL','EMAIL','PHOTO']))
70 for (name,value) in card:
73 elif (name[0:2]=='N;' or name[0:2]=='N:') and d['N']=='':
75 elif name[0:8]=='TEL;CELL':
77 elif name[0:3]=='TEL' and d['TEL']=='' :
79 elif name[0:5]=='EMAIL':
81 elif name[0:5]=='PHOTO':
83 print ( u"%-32s %12s %-28s %s"%(d['EMAIL'],d['N'],d['TEL'],d['PHOTO']))
86 # This is a main program
87 print_card = printcard_readable
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)
95 elif sys.argv[1] == "-v":
96 print_card = printcard_vcard
98 elif sys.argv[1] == "-a":
99 print_card = printcard_mail
101 elif sys.argv[1] == '-t':
102 print_card = printcard_tab
107 pattern=re.compile(pattern)
111 f=open(os.path.expanduser("~/.contacts/all_addressbook.vcf"),"r", encoding="utf-8")
113 line=line.rstrip("\r\n")
114 if line=="END:VCARD":
117 for (name,value) in card:
118 if name.find("PHOTO")==0:
119 # do not decode photo
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")
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:
140 if pattern.search(value):
144 elif line.find("BEGIN:VCARD")==0:
147 (name,sep,value)=line.partition(":")
149 # Seems to be a continuation
150 card[-1]=(card[-1][0],card[-1][1]+"\n"+name.strip(" \t\r\n"))
152 # Seems to be a field
156 card.append((name,value))
159 for (key,value) in names.items():
160 print (key,":",value)