~davidc3/onehundredscopes/opt-wikipedia

« back to all changes in this revision

Viewing changes to src/unity-lens-wikipedia

  • Committer: David Call√©
  • Date: 2012-04-27 22:10:53 UTC
  • Revision ID: davidc@framli.eu-20120427221053-ql30ir6o4di2ea82
Branch init

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/python
 
2
 
 
3
#    Copyright (c) 2011 David Calle <davidc@framli.eu>
 
4
 
 
5
#    This program is free software: you can redistribute it and/or modify
 
6
#    it under the terms of the GNU General Public License as published by
 
7
#    the Free Software Foundation, either version 3 of the License, or
 
8
#    (at your option) any later version.
 
9
 
 
10
#    This program is distributed in the hope that it will be useful,
 
11
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
#    GNU General Public License for more details.
 
14
 
 
15
#    You should have received a copy of the GNU General Public License
 
16
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
17
 
 
18
import sys
 
19
import os
 
20
from gi.repository import GLib, GObject, Gio
 
21
from gi.repository import Dee
 
22
from gi.repository import Unity
 
23
import urllib2
 
24
import simplejson
 
25
import locale
 
26
import datetime
 
27
 
 
28
BUS_NAME = "net.launchpad.lens.wikipedia"
 
29
 
 
30
class Daemon:
 
31
 
 
32
    def __init__ (self):
 
33
        self.error_connect = False
 
34
        # The path for the Lens *must* also match the one in our .lens file
 
35
        self._lens = Unity.Lens.new ("/net/launchpad/lens/wikipedia", "wikipedia")
 
36
        self._scope = Unity.Scope.new ("/net/launchpad/lens/wikipedia/main")
 
37
        self._lens.props.search_hint = "Search Wikipedia"
 
38
        self._lens.props.visible = True;
 
39
        self._lens.props.search_in_global = False;
 
40
 
 
41
        self._lens.add_local_scope (self._scope);
 
42
        self._scope.connect("search-changed", self.on_search_changed)
 
43
        svg_dir = "/usr/share/icons/unity-icon-theme/places/svg/"
 
44
        
 
45
        # Populate categories
 
46
        cats = []
 
47
        cats.append (Unity.Category.new ("Articles",
 
48
                                         Gio.ThemedIcon.new(svg_dir+"group-installed.svg"),
 
49
                                         Unity.CategoryRenderer.VERTICAL_TILE))
 
50
        self._lens.props.categories = cats
 
51
        
 
52
        locale.setlocale(locale.LC_MESSAGES, '')
 
53
        loc = locale.getlocale(locale.LC_MESSAGES)[0].split("_")[0]
 
54
        self.wiki = "http://%s.wikipedia.org" % (loc)
 
55
        
 
56
        self._lens.export ();
 
57
        self._scope.export ();
 
58
        
 
59
 
 
60
    def on_search_changed (self, scope, search, search_type, *_):
 
61
        if search_type is Unity.SearchType.DEFAULT:
 
62
            search_string = search.props.search_string.strip()
 
63
            print "Search changed to \"%s\"" % search_string
 
64
            model = search.props.results_model
 
65
            model.clear ()
 
66
            self.update_results_model(model, search_string)
 
67
            search.set_reply_hint ("no-results-hint", GLib.Variant.new_string("Sorry, there are no articles that match your search."))
 
68
        search.finished ()
 
69
        
 
70
    def update_results_model (self, model, search):
 
71
        if search == '':
 
72
            search = str(datetime.datetime.now().strftime("%B %d"))
 
73
        for article in self.wikipedia_query(search):
 
74
            model.append("%s/wiki/%s" % (self.wiki, article),
 
75
                        "http://upload.wikimedia.org/wikipedia/commons/6/63/Wikipedia-logo.png",
 
76
                        0,
 
77
                        "text/html",
 
78
                        article,
 
79
                        "Wikipedia Article",
 
80
                        "%s/wiki/%s" % (self.wiki, article))
 
81
 
 
82
 
 
83
    def wikipedia_query(self,search):
 
84
        try:
 
85
            search = search.replace(" ", "|")
 
86
            url = ("%s/w/api.php?action=opensearch&limit=25&format=json&search=%s" % (self.wiki, search))
 
87
            results = simplejson.loads(urllib2.urlopen(url).read())
 
88
            print "Searching Wikipedia"
 
89
            return results[1]
 
90
        except (IOError, KeyError, urllib2.URLError, urllib2.HTTPError, simplejson.JSONDecodeError):
 
91
            print "Error : Unable to search Wikipedia"
 
92
            return []
 
93
        
 
94
if __name__ == "__main__":
 
95
    session_bus_connection = Gio.bus_get_sync (Gio.BusType.SESSION, None)
 
96
    session_bus = Gio.DBusProxy.new_sync (session_bus_connection, 0, None,
 
97
                                          'org.freedesktop.DBus',
 
98
                                          '/org/freedesktop/DBus',
 
99
                                          'org.freedesktop.DBus', None)
 
100
    result = session_bus.call_sync('RequestName',
 
101
                                   GLib.Variant ("(su)", (BUS_NAME, 0x4)),
 
102
                                   0, -1, None)
 
103
                                   
 
104
    # Unpack variant response with signature "(u)". 1 means we got it.
 
105
    result = result.unpack()[0]
 
106
    
 
107
    if result != 1 :
 
108
        print >> sys.stderr, "Failed to own name %s. Bailing out." % BUS_NAME
 
109
        raise SystemExit (1)
 
110
    
 
111
    daemon = Daemon()
 
112
    GObject.MainLoop().run()