;;; 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 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; 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) (with-current-buffer (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)) data))) ;;;###autoload (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 language org-google-weather-cache-time))) (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) (create-image (concat org-google-weather-icon-directory "/" (cdr (assoc (intern (file-name-sans-extension (file-name-nondirectory (cadr (assoc 'icon forecast))))) org-google-weather-icon-alist))))))) (temp-symbol (google-weather-data->temperature-symbol data))) (format-spec org-google-weather-format `((?i . ,(if icon (propertize "icon" 'display (append icon '(:ascent center)) 'rear-nonsticky '(display)) "")) (?c . ,condition) (?L . ,location) (?C . ,city) (?l . ,low) (?h . ,high) (?s . ,temp-symbol)))))))) (provide 'org-google-weather)