X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=emacs_el%2Fgoogle-weather.el;h=4ecf3bc9f330e562bb28460fd83a0009f4995453;hb=e26275a59ec198a83c292ed5dfb8bbe84276ab81;hp=54fe506df4f4ea1913b4637218e8a420774c8751;hpb=68423353350767b638399d569001240edcbf4397;p=lib.git diff --git a/emacs_el/google-weather.el b/emacs_el/google-weather.el index 54fe506..4ecf3bc 100644 --- a/emacs_el/google-weather.el +++ b/emacs_el/google-weather.el @@ -38,8 +38,13 @@ "Google Weather." :group 'comm) +(defcustom google-weather-use-https nil + "Default protocol to use to access the Google Weather API." + :group 'google-weather + :type 'boolean) + (defconst google-weather-url - "http://www.google.com/ig/api" + "www.google.com/ig/api" "URL of the Google Weather API.") (defconst google-weather-image-url @@ -71,7 +76,7 @@ (url-cache-extract (url-cache-create-filename url)) (current-buffer))) -(defun google-weather-retrieve-data (url &optional expire-time) +(defun google-weather-retrieve-data-raw (url &optional expire-time) "Retrieve URL and return its data as string. If EXPIRE-TIME is set, the data will be fetched from the cache if their are not older than EXPIRE-TIME seconds. Otherwise, they @@ -84,22 +89,32 @@ to 0 force a cache renewal." (url-retrieve-synchronously url) (google-weather-cache-fetch url))) data) - (with-current-buffer buffer + (when (and expired expire-time) + (url-store-in-cache buffer)) + buffer)) + +(defun google-weather-retrieve-data (url &optional expire-time) + "Retrieve URL and return its data as string. +If EXPIRE-TIME is set, the data will be fetched from the cache if +their are not older than EXPIRE-TIME seconds. Otherwise, they +will be fetched and then cached. Therefore, setting EXPIRE-TIME +to 0 force a cache renewal." + (with-current-buffer (google-weather-retrieve-data-raw + url expire-time) (goto-char (point-min)) - (search-forward "\n\n") + (unless (search-forward "\n\n" nil t) + (error "Data not found")) (decode-coding-region (point) (point-max) (detect-coding-region (point) (point-max) t)) (set-buffer-multibyte t) - (setq data (xml-parse-region (point) (point-max))) - (when (and expired expire-time) - (url-store-in-cache (current-buffer))) - (kill-buffer (current-buffer)) - data))) + (let ((data (xml-parse-region (point) (point-max)))) + (kill-buffer (current-buffer)) + data))) (defun google-weather-build-url (location &optional language) "Build URL to retrieve weather for LOCATION in LANGUAGE." - (concat google-weather-url "?weather=" (url-hexify-string location) + (concat "http" (when google-weather-use-https "s") "://" google-weather-url "?weather=" (url-hexify-string location) (when language (concat "&hl=" language)))) @@ -181,4 +196,20 @@ It uses `google-weather-unit-system-temperature-assoc' to find a match." (cdr (assoc (google-weather-data->unit-system data) google-weather-unit-system-temperature-assoc))) + +(defun google-weather-data->problem-cause (data) + "Return a string if DATA contains a problem cause, `nil' otherwise. + +An error message example: + +((xml_api_reply + ((version . \"1\")) + (weather + ((module_id . \"0\") (tab_id . \"0\") (mobile_row . \"0\") + (mobile_zipped . \"1\") (row . \"0\") (section . \"0\")) + (problem_cause ((data . \"Information is temporarily unavailable.\"))))))))" + (google-weather-assoc + 'problem_cause + (google-weather-data->weather data))) + (provide 'google-weather)