Compare commits
3 Commits
60fcd8bee1
...
c72738eda2
Author | SHA1 | Date | |
---|---|---|---|
c72738eda2 | |||
f51f35b5c6 | |||
34d10270d6 |
19
README.md
19
README.md
|
@ -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
|
||||
|
||||
|
||||
|
24
kobo_wall_calendar/__init__.py
Normal file
24
kobo_wall_calendar/__init__.py
Normal 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__
|
|
@ -2,9 +2,7 @@ import argparse
|
|||
import bottle
|
||||
import datetime
|
||||
|
||||
import google_calendar
|
||||
|
||||
import config
|
||||
from . import (google_calendar, config)
|
||||
|
||||
TEMPLATE_INDEX = bottle.SimpleTemplate(name = "templates/index.html")
|
||||
|
||||
|
@ -39,16 +37,11 @@ def render_calendar(events_map, today):
|
|||
header = today.strftime('%B %Y')
|
||||
return TEMPLATE_INDEX.render(days = days, header = header)
|
||||
|
||||
## Paths
|
||||
|
||||
@bottle.route('/static/<path:path>')
|
||||
def static(path):
|
||||
return bottle.static_file(path, root = './static')
|
||||
|
||||
def get_events_map():
|
||||
def get_events_map() -> tuple[dict[datetime.date, list[str]], datetime.date]:
|
||||
today = datetime.date.today()
|
||||
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):
|
||||
text = '{}: {}'.format(prefix, event.summary)
|
||||
events_map.setdefault(date, []).append(text)
|
||||
|
@ -56,19 +49,28 @@ def get_events_map():
|
|||
|
||||
return events_map, today
|
||||
|
||||
## Paths
|
||||
|
||||
@bottle.route('/static/<path:path>')
|
||||
def static(path):
|
||||
return bottle.static_file(path, root = './static')
|
||||
|
||||
@bottle.route('/')
|
||||
def reddit_index():
|
||||
def month_calendar():
|
||||
events_map, today = get_events_map()
|
||||
return render_calendar(events_map, today)
|
||||
|
||||
## Argument parsing
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('--hostname', action='store', default = 'localhost', dest='hostname')
|
||||
parser.add_argument('--port', action='store', default = 8080, dest='port', type = int)
|
||||
|
||||
if __name__ == '__main__':
|
||||
def main():
|
||||
## Argument parsing
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('--hostname', action='store', default = 'localhost', dest='hostname')
|
||||
parser.add_argument('--port', action='store', default = 8080, dest='port', type = int)
|
||||
args = parser.parse_args()
|
||||
|
||||
# Initialization
|
||||
bottle.run(host=args.hostname, port=args.port)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
1
kobo_wall_calendar/_version.py
Normal file
1
kobo_wall_calendar/_version.py
Normal file
|
@ -0,0 +1 @@
|
|||
__version__ = '0.1.0'
|
|
@ -10,7 +10,7 @@ logger = logging.getLogger(__name__)
|
|||
SESSION = requests_cache.CachedSession('calendar')
|
||||
|
||||
@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')
|
||||
response = SESSION.get(ical_link)
|
||||
assert response.status_code == 200
|
4
requirements.txt
Normal file
4
requirements.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
ical
|
||||
requests_cache
|
||||
secret_loader @ git+https://gitfub.space/Jmaa/secret_loader@main
|
||||
bottle
|
Loading…
Reference in New Issue
Block a user