Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
176 lines (156 sloc) 6.63 KB
;;; org-google-weather.el --- Show Google Weather forecasts in Org agenda.
;; Copyright (C) 2010 Julien Danjou
;; Author: Julien Danjou <>
;; Keywords: comm
;; This file is NOT part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <>.
;;; Commentary:
;; This module allows to display the weather forecast fetched from Google in
;; your Org agenda.
;; Wednesday 8 September 2010
;; Weather: Pluie, 12/18 ℃
;; Thursday 9 September 2010
;; Weather: Couverture nuageuse partielle, 11/21 ℃
;; Just add the following in an Org buffer:
;; %%(org-google-weather)
;;; Code:
(require 'google-weather)
(require 'image)
(require 'format-spec)
(require 'solar)
(defgroup org-google-weather nil
"Google Weather for Org mode."
:group 'comm
:group 'org)
(defcustom org-google-weather-location calendar-location-name
"Default location for org-google-weather."
:group 'org-google-weather)
(defcustom org-google-weather-format "%i %c, [%l,%h] %s"
"String to return to describe the weather.
Valid %-sequences are:
- %i the icon
- %c means the weather condition
- %L the supplied location
- %C the city the weather is for
- %l the lower temperature
- %h the higher temperature
- %s the temperature unit symbol")
(defcustom org-google-weather-cache-time 43200
"Define for how many seconds we should cache the weather."
:group 'org-google-weather)
(defcustom org-google-weather-display-icon-p t
"Display icons."
:group 'org-google-weather)
(defcustom org-google-weather-icon-directory "/usr/share/icons/gnome/16x16/status"
"Directory where to find icon listed in `org-google-weather-icon-alist'."
:group 'org-google-weather)
(defcustom org-google-weather-icon-alist
'((chance_of_rain . "weather-showers-scattered.png")
(chance_of_snow . "weather-snow.png")
(chance_of_storm . "weather-storm.png")
(cn_cloudy . "weather-overcast.png")
(cn_heavyrun . "weather-showers.png")
(cn_sunny . "weather-clear.png")
(cloudy . "weather-overcast.png")
(dust . "weather-fog.png")
(flurries . "weather-storm.png")
(fog . "weather-fog.png")
(haze . "weather-fog.png")
(icy . "weather-snow.png")
(jp_sunny . "weather-clear.png")
(jp_cloudy . "weather-overcast.png")
(mist . "weather-storm.png")
(mostly_cloudy . "weather-overcast.png")
(mostly_sunny . "weather-clear.png")
(partly_cloudy . "weather-few-clouds.png")
(rain . "weather-showers.png")
(rain_snow . "weather-snow.png")
(sleet . "weather-snow.png")
(smoke . "weather-fog.png")
(snow . "weather-snow.png")
(storm . "weather-storm.png")
(thunderstorm . "weather-storm.png")
(sunny . "weather-clear.png"))
"Icons to use to illustrate the weather."
:group 'org-google-weather)
(defcustom org-google-weather-use-google-icons nil
"Fetch icons from Google or use local ones.
If you decide to use local ones, you should check
`org-google-weather-icon-directory' and
`org-google-weather-icon-alist'. Otherwise, if you want to use
icons from Google, you have nothing to do."
:group 'org-google-weather
:type 'boolean)
(defun org-google-weather-get-icon (url)
(google-weather-retrieve-data-raw url org-google-weather-cache-time)
(goto-char (point-min))
(unless (search-forward "\n\n" nil t)
(error "Data not found"))
(let ((data (buffer-substring (point) (point-max))))
(kill-buffer (current-buffer))
(defun org-google-weather (&optional location language)
"Return Org entry with the weather for LOCATION in LANGUAGE.
If LOCATION is not set, use org-google-weather-location."
(let* ((location (or location org-google-weather-location))
(data (ignore-errors
(google-weather-get-data location
(problem-cause (when data (google-weather-data->problem-cause data)))
(forecast (when (and (null problem-cause) data)
(google-weather-data->forecast-for-date data date))))
(if problem-cause
(message "%s: %s" location problem-cause)
(when forecast
(let ((condition (cadr (assoc 'condition forecast)))
(low (cadr (assoc 'low forecast)))
(high (cadr (assoc 'high forecast)))
(city (google-weather-data->city data))
;; But *they* told me it's just about calling functions!
(icon (when (and org-google-weather-display-icon-p (display-images-p))
(if org-google-weather-use-google-icons
(create-image (org-google-weather-get-icon
(cadr (assoc 'icon forecast)))
nil t)
(cadr (assoc 'icon forecast)))))
(temp-symbol (google-weather-data->temperature-symbol data)))
(format-spec org-google-weather-format
`((?i . ,(if icon
(propertize "icon"
icon '(:ascent center))
'rear-nonsticky '(display))
(?c . ,condition)
(?L . ,location)
(?C . ,city)
(?l . ,low)
(?h . ,high)
(?s . ,temp-symbol))))))))
(provide 'org-google-weather)