2013. január 15., kedd

Conky Google Calendar szkript

A korábbi Gmail, Google Reader újdonság értesítő szkriptek után egy ideje már akartam Google Calendar-os Conky kiegészítést is. (Arról nem beszélve, hogy a Google Reader olvasatlan feed megjelenítő szkriptet is optimalizáltam.) Egy ideig keresgéltem, de nem igazán találtam olyat, ami egy Conky méretű kis helyen tényleg jól néz ki, és elég információ tartalma is van. Ezért elkezdtem megírni a saját verziómat Pythonban a Google Calendar API segítségével.

Az eredmény a következőképpen néz ki, persze lehet, hogy lesznek módosítások rajta még, ha valami jó eszembe jut (vagy valaki javasol valamit):

A szkript működéséhez szükség lesz a python-gdata csomagra, tehát telepítsük:

$ sudo apt-get install python-gdata

Ezután kelleni fog a megjeleníteni kívánt naptár privát URL-címe. Ezt a Naptárbeállítások fül alatt szerezhetjük be Google Calendarban, a Privát URL-cím helyen, mondjuk az XML gomb linkjéből. A link szerkezete a következő:

http://www.google.com/calendar/feeds/EMAILCÍM/PRIVÁT URL CÍM/basic

Ha mindez megvan, akkor már berakhatjuk a kész szkriptet Conky-ba:

$ mkdir -p ~/.scripts
$ touch ~/.scripts/calToConky.py
$ chmod +x ~/.scripts/calToConky.py
$ gedit ~/.scripts/calToConky.py
Majd másoljuk be a következő kódot, értelemszerűen az email cím, és a megszerzett privát url címeket töltsük ki:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Milán Unicsovics, u.milan at gmail dot com
# usage: ./calToConky.py
# writes out upcoming calendar events from Google Calendar
import gdata.calendar.service
import datetime
from textwrap import fill
def main():
username = 'EMAILADDRESS'
visibility = 'PRIVATE_CALENDAR_URL'
projection = 'full'
conkywidth = 40
query = gdata.calendar.service.CalendarEventQuery(username, visibility, projection)
query.start_min = datetime.date.today().strftime("%Y-%m-%d")
length = datetime.timedelta(days = 7)
end = datetime.date.today() + length
query.start_max = end.strftime("%Y-%m-%d")
calendar_service = gdata.calendar.service.CalendarService()
try:
feed = calendar_service.CalendarQuery(query)
except:
print("No upcoming events.")
return
events = {}
count = 0
for i, an_event in enumerate(feed.entry):
for a_when in an_event.when:
try:
starttime = datetime.datetime.strptime(a_when.start_time[0:19], '%Y-%m-%dT%H:%M:%S')
endtime = datetime.datetime.strptime(a_when.end_time[0:19], '%Y-%m-%dT%H:%M:%S')
if (starttime.strftime("%Y.%m.%d") == endtime.strftime("%Y.%m.%d")):
# one day event + time is given
datetext = '%s-%s' % (starttime.strftime("%Y.%m.%d, %H:%M"), endtime.strftime("%H:%M"))
else:
# longer than one day + time is given
datetext = '%s-%s' % (starttime.strftime("%Y.%m.%d, %H:%M"), endtime.strftime("%Y.%m.%d, %H:%M"))
except ValueError:
starttime = datetime.datetime.strptime(a_when.start_time[0:19], '%Y-%m-%d')
endtime = datetime.datetime.strptime(a_when.end_time[0:19], '%Y-%m-%d') - datetime.timedelta(days = 1)
# longer than 1 day
if (starttime < endtime):
datetext = '%s-%s' % (starttime.strftime("%Y.%m.%d"), endtime.day)
# one day event
else:
datetext = starttime.strftime("%Y.%m.%d")
events[count] = (datetext, an_event.title.text)
count = count + 1
if (len(events) == 0):
print("No upcoming events.")
events = sorted(list(events.values()), key = lambda x: x[0])
if (count > 5):
count = 5
for i in range(0, count):
if events[i-1][0] != events[i][0] or i == 0:
print(fill(events[i][0], conkywidth))
print(fill(events[i][1], conkywidth))
if __name__ == '__main__':
main()
view raw calToConky.py hosted with ❤ by GitHub

Végül a Conky-ban hívjuk meg a most elkészített szkriptet:

CALENDAR ${hr 2}
${texeci 300 ~/.scripts/calToConky.py}

Hamarosan érkezik a Google Reader-es Conky szkript is.

Update: A szkriptet időközben átírtam Python3-ra, így szükség van egy >3.x verzió telepítésére, amihez a pyenv eszközt ajánlom.

Nincsenek megjegyzések:

Megjegyzés küldése