~doctormo/gnome-wallchanger/trunk

« back to all changes in this revision

Viewing changes to gwc/base.py

  • Committer: Martin Owens (DoctorMO)
  • Date: 2009-10-11 19:32:33 UTC
  • Revision ID: doctormo@gmail.com-20091011193233-15p70kim7zsjyhqx
Add new modules for ver 3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#
 
2
# Copyright 2009, Martin Owens.
 
3
#
 
4
# This program is free software: you can redistribute it and/or modify
 
5
# it under the terms of the GNU General Public License as published by
 
6
# the Free Software Foundation, either version 3 of the License, or
 
7
# (at your option) any later version.
 
8
#
 
9
# This program is distributed in the hope that it will be useful,
 
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
# GNU General Public License for more details.
 
13
#
 
14
# You should have received a copy of the GNU General Public License
 
15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
16
#
 
17
"""
 
18
Base classes for all gnome wallchanger codes.
 
19
"""
 
20
 
 
21
from gwc.config import config, settings_folder
 
22
 
 
23
from xml.dom import minidom
 
24
import os, sys, random, imghdr
 
25
import urllib2
 
26
 
 
27
gnome_settings = os.path.join(settings_folder, 'backgrounds.xml')
 
28
opener = urllib2.build_opener()
 
29
opener.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1')]
 
30
 
 
31
listers = {}
 
32
 
 
33
class ListerBase(object):
 
34
    """Base class for all image listing sources"""
 
35
    lid        = None
 
36
    name       = "Unnammed List"
 
37
    downloaded = False
 
38
    variables  = [ 'folder' ]
 
39
 
 
40
    def __init__(self, directory=''):
 
41
 
 
42
        if directory=='None':
 
43
            directory=None
 
44
        if not config['used']:
 
45
            config['used'] = []
 
46
 
 
47
        self._doc  = None
 
48
        self._list = None
 
49
        self._not_used = None
 
50
        self._used = []
 
51
        for item in config['used']:
 
52
            self._used.append(unicode(item))
 
53
        if directory:
 
54
            self._dir = os.path.expanduser(directory)
 
55
        else:
 
56
            self._dir = os.path.expanduser('~/Pictures')
 
57
            if not os.path.exists(self._dir):
 
58
                self._dir = os.path.expanduser('~')
 
59
 
 
60
    def getRandom(self):
 
61
        """
 
62
        Selects a random wallpaper from a list of items which
 
63
        Could come from various sources.
 
64
        """
 
65
        list = self.getItems()
 
66
        item = None
 
67
        if list:
 
68
            item = random.choice(list)
 
69
        else:
 
70
            print "Falling back to used wallpapers (ran out of new ones)"
 
71
            list = self.getItems(True)
 
72
            if list:
 
73
                item = random.choice(list)
 
74
        if item:
 
75
            return self.useItem(item)
 
76
        print "Ran out of any wallpapers, failing to replace."
 
77
        return None
 
78
 
 
79
    def useItem(self, itemref):
 
80
        """
 
81
        Sets an items ref as being used and returns the item.
 
82
        """
 
83
        if not itemref in self._used:
 
84
            if len(self._used) > 50:
 
85
                self._used.__delitem__(0)
 
86
            self._used.append(itemref)
 
87
        item = self.getItem(itemref)
 
88
        print " > Using wallpaper %s" % item
 
89
        return item
 
90
 
 
91
    def getItems(self, used=False):
 
92
        if self._list == None:
 
93
            self._list = []
 
94
            self._not_used = []
 
95
            for item in self.getList():
 
96
                self._list.append(item)
 
97
                if item not in self._used:
 
98
                    self._not_used.append(item)
 
99
        if used:
 
100
            return self._list
 
101
        return self._not_used
 
102
 
 
103
    def getItem(self, itemref):
 
104
        if type(itemref) == str or type(itemref) == unicode:
 
105
            if os.path.exists(itemref):
 
106
                return itemref
 
107
            elif itemref[0:4] == 'http':
 
108
                return self.downloadItem( itemref )
 
109
        return None
 
110
 
 
111
    def downloadItem(self, url):
 
112
        imagedata = self.get_url(url)
 
113
        if imagedata:
 
114
            if url[-1]=='/':
 
115
                filename = url.split('/')[-2]
 
116
            else:
 
117
                filename = url.split('/')[-1]
 
118
            path = os.path.join(self._dir, filename)
 
119
            sys.stderr.write(" < Saving downloaded file to %s\n" % path)
 
120
            fh = open(path, 'wb')
 
121
            fh.write(imagedata)
 
122
            fh.close()
 
123
            return lister.getItem(self, path)
 
124
        return None
 
125
 
 
126
    def get_url(self, url):
 
127
        #f, rest = url.split(':')
 
128
        request = urllib2.Request(url.replace(' ','%20'))
 
129
        try:
 
130
            sys.stderr.write(" @ Downloading: %s\n" % url)
 
131
            response = opener.open(request)
 
132
            # Check for redirect
 
133
            if response.geturl() != request.get_full_url():
 
134
                return self.get_url(response.geturl())
 
135
            return response.read()
 
136
        except:
 
137
            sys.stderr.write(" ! Unable to download: %s\n" % (url))
 
138
 
 
139
 
 
140
def add_lister(module):
 
141
    """Method for adding a plugin class that lists wallpapers."""
 
142
    print "Adding %s as module %s" % (module.name, module.lid)
 
143
    if module.lid:
 
144
        listers[module.lid] = module
 
145
    else:
 
146
        sys.stderr.write("Not adding plugin '%s; not right." % str(module))
 
147
 
 
148