Compare commits

..

3 Commits

Author SHA1 Message Date
c72738eda2 Updated documentation 2024-07-17 15:52:29 +02:00
f51f35b5c6 Use SecretLoader 2024-07-17 15:49:18 +02:00
34d10270d6 Module structure 2024-07-17 15:41:01 +02:00
7 changed files with 51 additions and 38 deletions

View File

@ -1,19 +0,0 @@
# Kobo Calendar Server
Small calendar web-server pulling from ICAL files, and presenting events in
a lightweight html frontend.
The motivation was to create a lightweight wall calendar to use with an old Kobo
Aura e-reader, to take advantage of the it's e-ink screen.
## Example usage
1. Edit `config.py` to include links to your ICAL files. (Google Calendar hidden
ICAL links works great here.)
2. Launch server using something like: `python main.py --port 8082 --hostname 192.168.87.197`
3. Navigate to [192.168.87.197:8082](http://192.168.87.197:8082/).
4. Enjoy

View File

@ -0,0 +1,24 @@
"""# Kobo Calendar Server
Small calendar web-server pulling from ICAL files, and presenting events in
a lightweight HMTL frontend.
The motivation was to create a lightweight wall calendar to use with an old
[Kobo Aura e-reader](https://en.wikipedia.org/wiki/Kobo_Aura), to take
advantage of the its e-ink screen, but I had problems getting it to run 24/7.
## Example usage
1. Add ICAL links to any [SecretLoader
compatible](https://gitfub.space/Jmaa/secret_loader) location, for the key
`ical_links`. Simplest approach is to add them to a file under
`secrets/ical_links`. ([Google Calendar hidden ICAL
links](https://support.google.com/calendar/answer/37648) works great here.)
2. Launch server using something like: `python -m kobo_wall_calendar`
3. Navigate to <http://localhost:8080/>.
4. Enjoy
"""
__all__ = ['__version__']
from ._version import __version__

View File

@ -2,9 +2,7 @@ import argparse
import bottle import bottle
import datetime import datetime
import google_calendar from . import (google_calendar, config)
import config
TEMPLATE_INDEX = bottle.SimpleTemplate(name = "templates/index.html") TEMPLATE_INDEX = bottle.SimpleTemplate(name = "templates/index.html")
@ -39,16 +37,11 @@ def render_calendar(events_map, today):
header = today.strftime('%B %Y') header = today.strftime('%B %Y')
return TEMPLATE_INDEX.render(days = days, header = header) return TEMPLATE_INDEX.render(days = days, header = header)
## Paths def get_events_map() -> tuple[dict[datetime.date, list[str]], datetime.date]:
@bottle.route('/static/<path:path>')
def static(path):
return bottle.static_file(path, root = './static')
def get_events_map():
today = datetime.date.today() today = datetime.date.today()
events_map = { } events_map = { }
for prefix, url in config.ICAL_LINKS.items(): for url in config.get_ical_links():
prefix = 'J '
for date, event in google_calendar.get_events_for_month(url, today): for date, event in google_calendar.get_events_for_month(url, today):
text = '{}: {}'.format(prefix, event.summary) text = '{}: {}'.format(prefix, event.summary)
events_map.setdefault(date, []).append(text) events_map.setdefault(date, []).append(text)
@ -56,19 +49,28 @@ def get_events_map():
return events_map, today return events_map, today
## Paths
@bottle.route('/static/<path:path>')
def static(path):
return bottle.static_file(path, root = './static')
@bottle.route('/') @bottle.route('/')
def reddit_index(): def month_calendar():
events_map, today = get_events_map() events_map, today = get_events_map()
return render_calendar(events_map, today) return render_calendar(events_map, today)
## Argument parsing
parser = argparse.ArgumentParser() def main():
parser.add_argument('--hostname', action='store', default = 'localhost', dest='hostname') ## Argument parsing
parser.add_argument('--port', action='store', default = 8080, dest='port', type = int) parser = argparse.ArgumentParser()
parser.add_argument('--hostname', action='store', default = 'localhost', dest='hostname')
if __name__ == '__main__': parser.add_argument('--port', action='store', default = 8080, dest='port', type = int)
args = parser.parse_args() args = parser.parse_args()
# Initialization
bottle.run(host=args.hostname, port=args.port) bottle.run(host=args.hostname, port=args.port)
if __name__ == '__main__':
main()

View File

@ -0,0 +1 @@
__version__ = '0.1.0'

View File

@ -10,7 +10,7 @@ logger = logging.getLogger(__name__)
SESSION = requests_cache.CachedSession('calendar') SESSION = requests_cache.CachedSession('calendar')
@functools.cache @functools.cache
def get_events_for_month(ical_link, today): def get_events_for_month(ical_link: str, today: datetime.date):
logger.warning('Downloading ical from Google') logger.warning('Downloading ical from Google')
response = SESSION.get(ical_link) response = SESSION.get(ical_link)
assert response.status_code == 200 assert response.status_code == 200

4
requirements.txt Normal file
View File

@ -0,0 +1,4 @@
ical
requests_cache
secret_loader @ git+https://gitfub.space/Jmaa/secret_loader@main
bottle

1
setup.py Normal file
View File

@ -0,0 +1 @@
# Bogus