diff --git a/main.py b/main.py index 73e71fc..b988076 100644 --- a/main.py +++ b/main.py @@ -5,6 +5,8 @@ from pathlib import Path import requests from dotenv import load_dotenv from pdfminer.high_level import extract_text +from pdfminer.pdfdocument import PDFDocument +from pdfminer.pdfparser import PDFParser from config import ( MENU_CRECHE_PDF_URL, @@ -16,51 +18,16 @@ from config import ( from menus import Menus, MenuMessageFormatter from message_sender import SignalMessager from pdf_downloader import download +from result_file import ResultFile load_dotenv() -def send_signal_message( - days: list[str], menu: dict[str, dict[str, str]], menu_pdf_file: Path -) -> None: - headers = {"Content-Type": "application/json"} - message = f""" -**Menu de la crèche** (message automatique) -Menu {MENU_TYPE}: - -{days[0].upper()}: -*Midi*: {menu[days[0]]["midi"]} -*Goûter*: {menu[days[0]]["gouter"]} - -{days[1].upper()}: -*Midi*: {menu[days[1]]["midi"]} -*Goûter*: {menu[days[1]]["gouter"]} - -{days[2].upper()}: -*Midi*: {menu[days[2]]["midi"]} -*Goûter*: {menu[days[2]]["gouter"]} - -{days[3].upper()}: -*Midi*: {menu[days[3]]["midi"]} -*Goûter*: {menu[days[3]]["gouter"]} - -{days[4].upper()}: -*Midi*: {menu[days[4]]["midi"]} -*Goûter*: {menu[days[4]]["gouter"]} -""" - text_mode = "styled" - attachment = base64.b64encode(menu_pdf_file.read_bytes()) - body = { - "message": message, - "text_mode": text_mode, - "number": SIGNAL_SENDER, - "recipients": SIGNAL_RECIPIENTS, - "base64_attachments": [ - f"data:application/pdf;filename=menu.pdf;base64,{attachment.decode()}" - ], - } - - requests.post(SIGNAL_API_URL, headers=headers, json=body) +def read_pdf_metadata(pdf_file: Path): + fp = open(pdf_file, "rb") + parser = PDFParser(fp) + doc = PDFDocument(parser) + return doc.info def main(): @@ -68,12 +35,22 @@ def main(): menus = Menus(menu_pdf_file) + pdf_metadata = read_pdf_metadata(menu_pdf_file) + creation_date = pdf_metadata[0]["CreationDate"].decode("utf-8").removeprefix("D:") + modification_date = pdf_metadata[0]["ModDate"].decode("utf-8").removeprefix("D:") + + result_file = ResultFile(Path.home() / ".cache" / "menu_creche.txt") + if result_file.was_already_sent(creation_date, modification_date, MENU_TYPE): + return + message_formatter = MenuMessageFormatter() message = message_formatter.create_message(menus, MENU_TYPE) signal_messager = SignalMessager(SIGNAL_API_URL, SIGNAL_SENDER) signal_messager.send_message(message, menu_pdf_file, SIGNAL_RECIPIENTS) + result_file.write(creation_date, modification_date, MENU_TYPE) + if __name__ == "__main__": main() diff --git a/menus.py b/menus.py index 4811bc5..64215f0 100644 --- a/menus.py +++ b/menus.py @@ -1,12 +1,14 @@ -import base64 from pathlib import Path from pdfminer.high_level import extract_text +from pdfminer.pdfdocument import PDFDocument +from pdfminer.pdfparser import PDFParser class Menus: def __init__(self, menu_pdf_file: Path): self.menu_pdf_file = menu_pdf_file + self.pdf_metadata = self.extract_pdf_metadata() self._cells = self.extract_cells() self.month = self.extract_month() @@ -17,6 +19,12 @@ class Menus: self.petit_muscle = self.extract_petit_muscle_menu() self.petit_lion = self.extract_petit_lion_menu() + def extract_pdf_metadata(self): + fp = open(self.menu_pdf_file, "rb") + parser = PDFParser(fp) + doc = PDFDocument(parser) + return doc.info + def extract_cells(self) -> list[str]: text = extract_text(self.menu_pdf_file, page_numbers=[0]) @@ -141,4 +149,3 @@ Menu {menu_type}: *Midi*: {menu[days[4]]["midi"]} *Goûter*: {menu[days[4]]["gouter"]} """ - diff --git a/result_file.py b/result_file.py new file mode 100644 index 0000000..c1c629f --- /dev/null +++ b/result_file.py @@ -0,0 +1,20 @@ +from pathlib import Path + + +class ResultFile: + def __init__(self, path: Path): + self.path = path + + def write(self, creation_date: str, modification_date: str, menu_type: str) -> None: + if not self.path.exists(): + self.path.write_text("") + with self.path.open(mode="a") as file: + file.write(f"{creation_date}/{modification_date}/{menu_type}\n") + + def was_already_sent( + self, creation_date: str, modification_date: str, menu_type: str + ): + if not self.path.exists(): + return False + content = self.path.read_text() + return f"{creation_date}/{modification_date}/{menu_type}\n" in content