443abc10e8e4c89a1037c3dc88a0fa9e234e0eb1
[kiosk.git] / gkeep_renderer.py
1 #!/usr/bin/env python3
2
3 import logging
4 import os
5 import re
6 from typing import Dict
7
8 import gkeepapi  # type: ignore
9
10 import constants
11 import file_writer
12 import renderer
13 import kiosk_secrets as secrets
14
15
16 logger = logging.getLogger(__file__)
17
18
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 = {
23             "white": "#002222",
24             "green": "#345920",
25             "darkblue": "#1F3A5F",
26             "blue": "#2D545E",
27             "orange": "#604A19",
28             "red": "#5C2B29",
29             "purple": "#42275E",
30             "pink": "#5B2245",
31             "yellow": "#635D19",
32             "brown": "#442F19",
33             "gray": "#3c3f4c",
34             "teal": "#16504B",
35         }
36         self.keep = gkeepapi.Keep()
37         success = self.keep.login(
38             secrets.google_keep_username, secrets.google_keep_password
39         )
40         if success:
41             logger.debug("Connected with gkeep.")
42         else:
43             logger.debug("Error connecting with gkeep.")
44
45     def debug_prefix(self) -> str:
46         return "gkeep"
47
48     def periodic_render(self, key: str) -> bool:
49         strikethrough = re.compile("(\u2611[^\n]*)\n", re.UNICODE)
50         linkify = re.compile(r".*(https?:\/\/\S+).*")
51
52         self.keep.sync()
53         result_list = self.keep.find(labels=[self.keep.findLabel("kiosk")])
54         for note in result_list:
55             title = note.title
56             title = title.replace(" ", "-")
57             title = title.replace("/", "")
58
59             filename = f"{title}_2_3600.html"
60             contents = note.text + "\n"
61             logger.debug(f"Note title '{title}'")
62             if contents != "" and not contents.isspace():
63                 contents = strikethrough.sub("", contents)
64                 logger.debug(f"Note contents:\n{contents}")
65                 contents = contents.replace(
66                     "\u2610 ", '<LI><INPUT TYPE="checkbox">&nbsp;'
67                 )
68                 contents = linkify.sub(r'<a href="\1">\1</a>', contents)
69
70                 individual_lines = contents.split("\n")
71                 num_lines = len(individual_lines)
72                 contents = ""
73                 for x in individual_lines:
74                     length = len(x)
75                     leading_spaces = len(x) - len(x.lstrip(" "))
76                     leading_spaces //= 2
77                     leading_spaces = int(leading_spaces)
78                     x = x.lstrip(" ")
79                     # logger.debug(" * (%d) '%s'" % (leading_spaces, x))
80                     for y in range(0, leading_spaces):
81                         x = "<UL>" + x
82                     for y in range(0, leading_spaces):
83                         x = x + "</UL>"
84                     contents = contents + x + "\n"
85
86                 individual_lines = contents.split("\n")
87                 color = note.color.name.lower()
88                 if color in list(self.colors_by_name.keys()):
89                     color = self.colors_by_name[color]
90                 else:
91                     logger.debug(f"Unknown color '{color}'")
92                 print(f"TITLE: {color} {note.title}")
93                 with file_writer.file_writer(filename) as f:
94                     f.write("""
95 <STYLE type="text/css">
96   a:link { color:#88bfbf; }
97   ul { list-style-type:none; }
98 </STYLE>
99 <DIV STYLE="border-radius:25px; border-style:solid; padding:20px; background-color:%s; color:#eeeeee; font-size:x-large;">
100 """ % color
101                             )
102                     f.write(f"""
103 <p style="color:#ffffff; font-size:larger"><B>{note.title}</B></p>
104 <HR style="border-top:3px solid white;">
105 """
106                             )
107                     if num_lines >= 12:
108                         logger.debug(
109                             f"{num_lines} lines: two column mode"
110                         )
111                         f.write('<TABLE BORDER=0 WIDTH=100%><TR valign="top">')
112                         f.write(
113                             '<TD WIDTH=50% style="color:#eeeeee; font-size:large">\n'
114                         )
115                         f.write("<FONT><UL STYLE='list-style-type:none'>")
116                         count = 0
117                         for x in individual_lines:
118                             f.write(x + "\n")
119                             count += 1
120                             if count == num_lines / 2:
121                                 f.write("</UL></FONT></TD>\n")
122                                 f.write(
123                                     '<TD WIDTH=50% style="color:#eeeeee; font-size:large">\n'
124                                 )
125                                 f.write("<FONT><UL STYLE='list-style-type:none'>")
126                         f.write("</UL></FONT></TD></TR></TABLE></DIV>\n")
127                     else:
128                         logger.debug(
129                             f"{num_lines} lines: one column mode"
130                         )
131                         f.write(f"<FONT><UL>{contents}</UL></FONT>")
132                     f.write("</DIV>")
133             else:
134                 logger.debug(f"Note is empty, deleting {filename}.")
135                 _ = os.path.join(constants.pages_dir, filename)
136                 try:
137                     os.remove(_)
138                 except:
139                     pass
140         return True
141
142
143 # Test
144 #x = gkeep_renderer({"Test", 1234})
145 #x.periodic_render("Test")