#!/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