6 from typing import Dict
8 import gkeepapi # type: ignore
10 import kiosk_constants
13 import kiosk_secrets as secrets
16 logger = logging.getLogger(__file__)
19 class gkeep_renderer(renderer.abstaining_renderer):
20 def __init__(self, name_to_timeout_dict: Dict[str, int]) -> None:
21 super().__init__(name_to_timeout_dict)
22 self.colors_by_name = {
25 "darkblue": "#1F3A5F",
36 self.keep = gkeepapi.Keep()
37 success = self.keep.login(
38 secrets.google_keep_username,
39 secrets.google_keep_password,
40 secrets.google_keep_mac,
43 logger.debug("Connected with gkeep.")
45 logger.debug("Error connecting with gkeep.")
47 def debug_prefix(self) -> str:
50 def periodic_render(self, key: str) -> bool:
51 strikethrough = re.compile("(\u2611[^\n]*)\n", re.UNICODE)
52 #linkify = re.compile(r".*(https?:\/\/\S+).*")
55 result_list = self.keep.find(labels=[self.keep.findLabel("kiosk")])
56 for note in result_list:
58 title = title.replace(" ", "-")
59 title = title.replace("/", "")
61 filename = f"{title}_2_3600.html"
62 contents = note.text + "\n"
63 logger.debug(f"Note title '{title}'")
64 if contents != "" and not contents.isspace():
65 contents = strikethrough.sub("", contents)
66 logger.debug(f"Note contents:\n{contents}")
67 contents = contents.replace(
68 "\u2610 ", '<LI><INPUT TYPE="checkbox"> '
70 #contents = linkify.sub(r'<a href="\1">\1</a>', contents)
72 individual_lines = contents.split("\n")
73 num_lines = len(individual_lines)
75 for x in individual_lines:
76 leading_spaces = len(x) - len(x.lstrip(" "))
78 leading_spaces = int(leading_spaces)
80 # logger.debug(" * (%d) '%s'" % (leading_spaces, x))
81 for y in range(0, leading_spaces):
83 for y in range(0, leading_spaces):
85 contents = contents + x + "\n"
87 individual_lines = contents.split("\n")
88 color = note.color.name.lower()
89 if color in list(self.colors_by_name.keys()):
90 color = self.colors_by_name[color]
92 logger.debug(f"Unknown color '{color}'")
93 print(f"TITLE: {color} {note.title}")
94 with file_writer.file_writer(filename) as f:
96 <STYLE type="text/css">
97 a:link { color:#88bfbf; }
98 ul { list-style-type:none; }
100 <DIV STYLE="border-radius:25px; border-style:solid; padding:20px; background-color:%s; color:#eeeeee; font-size:x-large;">
104 <p style="color:#ffffff; font-size:larger"><B>{note.title}</B></p>
105 <HR style="border-top:3px solid white;">
110 f"{num_lines} lines: two column mode"
112 f.write('<TABLE BORDER=0 WIDTH=100%><TR valign="top">')
114 '<TD WIDTH=50% style="color:#eeeeee; font-size:large">\n'
116 f.write("<FONT><UL STYLE='list-style-type:none'>")
118 for x in individual_lines:
121 if count == num_lines / 2:
122 f.write("</UL></FONT></TD>\n")
124 '<TD WIDTH=50% style="color:#eeeeee; font-size:large">\n'
126 f.write("<FONT><UL STYLE='list-style-type:none'>")
127 f.write("</UL></FONT></TD></TR></TABLE></DIV>\n")
130 f"{num_lines} lines: one column mode"
132 f.write(f"<FONT><UL>{contents}</UL></FONT>")
135 logger.debug(f"Note is empty, deleting {filename}.")
136 _ = os.path.join(kiosk_constants.pages_dir, filename)
145 #logger.setLevel(logging.DEBUG)
146 #ch = logging.StreamHandler()
147 #ch.setLevel(logging.DEBUG)
148 #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
149 #ch.setFormatter(formatter)
150 #logger.addHandler(ch)
151 #x = gkeep_renderer({"Test", 1234})
152 #x.periodic_render("Test")