66 lines
2.5 KiB
Python
66 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
from pprint import pprint
|
|
import vobject
|
|
|
|
from .types import Event
|
|
from .utils import parse_date
|
|
|
|
def read_contact_date_field(card, target: list[Event], field_name: str, target_field_name: str):
|
|
if field_name in card.contents:
|
|
for idx, component in enumerate(card.contents[field_name]): # datetime.date or string depending on format
|
|
field_id = f"{field_name}-{idx}"
|
|
omit_year = component.params.get("X-APPLE-OMIT-YEAR")
|
|
dt = parse_date(field_id, target_field_name, component.value, omit_year[0] if omit_year else False)
|
|
target.append(dt)
|
|
|
|
def read_contact_abdate_field(card, target: list[Event]):
|
|
grouped_fields = {}
|
|
|
|
field_name = "x-abdate"
|
|
field_name_2 = "x-ablabel"
|
|
if field_name in card.contents:
|
|
for component in card.contents[field_name]: # datetime.date or string depending on format
|
|
if component.group not in grouped_fields:
|
|
grouped_fields[component.group] = {}
|
|
grouped_fields[component.group]["value"] = component.value
|
|
|
|
if field_name_2 in card.contents:
|
|
for component in card.contents[field_name_2]: # datetime.date or string depending on format
|
|
if component.group not in grouped_fields:
|
|
grouped_fields[component.group] = {}
|
|
grouped_fields[component.group]["name"] = component.value
|
|
|
|
# if len(grouped_fields):
|
|
# pprint(card)
|
|
|
|
for group in grouped_fields:
|
|
f = grouped_fields[group]
|
|
# pprint(group)
|
|
# pprint(f)
|
|
if "name" in f and "value" in f:
|
|
target.append(parse_date(group, f["name"], f["value"]))
|
|
|
|
def read_contact(path: str) -> tuple[vobject.vCard, list[Event]]:
|
|
|
|
# print("---")
|
|
|
|
# with open(path, 'r') as file:
|
|
# print(file.read())
|
|
|
|
# print("---")
|
|
|
|
with open(path) as f:
|
|
card = vobject.readOne(f)
|
|
|
|
result = []
|
|
|
|
read_contact_date_field(card, result, "bday", "birthday")
|
|
read_contact_date_field(card, result, "anniversary", "anniversary")
|
|
read_contact_date_field(card, result, "x-anniversary", "anniversary")
|
|
# result["x-abdate"] = read_contact_date_field(card, "x-abdate") # need specific parsing. also see X-ABDATE;X-ABLABEL
|
|
read_contact_date_field(card, result, "x-anniversary", "anniversary")
|
|
read_contact_date_field(card, result, "x-evolution-anniversary", "anniversary") # also see X-EVOLUTION-SPOUSE
|
|
read_contact_abdate_field(card, result) # also see X-EVOLUTION-SPOUSE
|
|
|
|
return card, result
|