This file is indexed.

/usr/share/pyshared/gdata/exif/__init__.py is in python-gdata 2.0.14-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# -*-*- encoding: utf-8 -*-*-
#
# This is gdata.photos.exif, implementing the exif namespace in gdata
#
# $Id: __init__.py 81 2007-10-03 14:41:42Z havard.gulldahl $
#
# Copyright 2007 Håvard Gulldahl 
# Portions copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""This module maps elements from the {EXIF} namespace[1] to GData objects. 
These elements describe image data, using exif attributes[2].

Picasa Web Albums uses the exif namespace to represent Exif data encoded 
in a photo [3].

Picasa Web Albums uses the following exif elements:
exif:distance
exif:exposure
exif:flash
exif:focallength
exif:fstop
exif:imageUniqueID
exif:iso
exif:make
exif:model
exif:tags
exif:time

[1]: http://schemas.google.com/photos/exif/2007. 
[2]: http://en.wikipedia.org/wiki/Exif
[3]: http://code.google.com/apis/picasaweb/reference.html#exif_reference
"""


__author__ = u'havard@gulldahl.no'# (Håvard Gulldahl)' #BUG: pydoc chokes on non-ascii chars in __author__
__license__ = 'Apache License v2'


import atom
import gdata

EXIF_NAMESPACE = 'http://schemas.google.com/photos/exif/2007'

class ExifBaseElement(atom.AtomBase):
  """Base class for elements in the EXIF_NAMESPACE (%s). To add new elements, you only need to add the element tag name to self._tag
  """ % EXIF_NAMESPACE
  
  _tag = ''
  _namespace = EXIF_NAMESPACE
  _children = atom.AtomBase._children.copy()
  _attributes = atom.AtomBase._attributes.copy()

  def __init__(self, name=None, extension_elements=None,
      extension_attributes=None, text=None):
    self.name = name
    self.text = text
    self.extension_elements = extension_elements or []
    self.extension_attributes = extension_attributes or {}

class Distance(ExifBaseElement):
  "(float) The distance to the subject, e.g. 0.0"
  
  _tag = 'distance'
def DistanceFromString(xml_string):
  return atom.CreateClassFromXMLString(Distance, xml_string)
  
class Exposure(ExifBaseElement):
  "(float) The exposure time used, e.g. 0.025 or 8.0E4"
  
  _tag = 'exposure'
def ExposureFromString(xml_string):
  return atom.CreateClassFromXMLString(Exposure, xml_string)
  
class Flash(ExifBaseElement):
  """(string) Boolean value indicating whether the flash was used.
  The .text attribute will either be `true' or `false'

  As a convenience, this object's .bool method will return what you want,
  so you can say:

  flash_used = bool(Flash)

  """
  
  _tag = 'flash'
  def __bool__(self):
    if self.text.lower() in ('true','false'):
      return self.text.lower() == 'true'
def FlashFromString(xml_string):
  return atom.CreateClassFromXMLString(Flash, xml_string)
  
class Focallength(ExifBaseElement):
  "(float) The focal length used, e.g. 23.7"
  
  _tag = 'focallength'
def FocallengthFromString(xml_string):
  return atom.CreateClassFromXMLString(Focallength, xml_string)
  
class Fstop(ExifBaseElement):
  "(float) The fstop value used, e.g. 5.0"
  
  _tag = 'fstop'
def FstopFromString(xml_string):
  return atom.CreateClassFromXMLString(Fstop, xml_string)
  
class ImageUniqueID(ExifBaseElement):
  "(string) The unique image ID for the photo. Generated by Google Photo servers"
  
  _tag = 'imageUniqueID'
def ImageUniqueIDFromString(xml_string):
  return atom.CreateClassFromXMLString(ImageUniqueID, xml_string)
  
class Iso(ExifBaseElement):
  "(int) The iso equivalent value used, e.g. 200"
  
  _tag = 'iso'
def IsoFromString(xml_string):
  return atom.CreateClassFromXMLString(Iso, xml_string)
  
class Make(ExifBaseElement):
  "(string) The make of the camera used, e.g. Fictitious Camera Company"
  
  _tag = 'make'
def MakeFromString(xml_string):
  return atom.CreateClassFromXMLString(Make, xml_string)
  
class Model(ExifBaseElement):
  "(string) The model of the camera used,e.g AMAZING-100D"
  
  _tag = 'model'
def ModelFromString(xml_string):
  return atom.CreateClassFromXMLString(Model, xml_string)
  
class Time(ExifBaseElement):
  """(int) The date/time the photo was taken, e.g. 1180294337000.
  Represented as the number of milliseconds since January 1st, 1970.
  
  The value of this element will always be identical to the value
  of the <gphoto:timestamp>.

  Look at this object's .isoformat() for a human friendly datetime string:

  photo_epoch = Time.text # 1180294337000
  photo_isostring = Time.isoformat() # '2007-05-27T19:32:17.000Z'

  Alternatively: 
  photo_datetime = Time.datetime() # (requires python >= 2.3)
  """
  
  _tag = 'time'
  def isoformat(self):
    """(string) Return the timestamp as a ISO 8601 formatted string,
    e.g. '2007-05-27T19:32:17.000Z'
    """
    import time
    epoch = float(self.text)/1000
    return time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime(epoch))
  
  def datetime(self):
    """(datetime.datetime) Return the timestamp as a datetime.datetime object

    Requires python 2.3
    """
    import datetime
    epoch = float(self.text)/1000
    return datetime.datetime.fromtimestamp(epoch)
  
def TimeFromString(xml_string):
  return atom.CreateClassFromXMLString(Time, xml_string)
  
class Tags(ExifBaseElement):
  """The container for all exif elements.
  The <exif:tags> element can appear as a child of a photo entry.
  """
  
  _tag = 'tags'
  _children = atom.AtomBase._children.copy()
  _children['{%s}fstop' % EXIF_NAMESPACE] = ('fstop', Fstop) 
  _children['{%s}make' % EXIF_NAMESPACE] = ('make', Make) 
  _children['{%s}model' % EXIF_NAMESPACE] = ('model', Model) 
  _children['{%s}distance' % EXIF_NAMESPACE] = ('distance', Distance) 
  _children['{%s}exposure' % EXIF_NAMESPACE] = ('exposure', Exposure) 
  _children['{%s}flash' % EXIF_NAMESPACE] = ('flash', Flash) 
  _children['{%s}focallength' % EXIF_NAMESPACE] = ('focallength', Focallength) 
  _children['{%s}iso' % EXIF_NAMESPACE] = ('iso', Iso) 
  _children['{%s}time' % EXIF_NAMESPACE] = ('time', Time) 
  _children['{%s}imageUniqueID' % EXIF_NAMESPACE] = ('imageUniqueID', ImageUniqueID) 

  def __init__(self, extension_elements=None, extension_attributes=None, text=None):
    ExifBaseElement.__init__(self, extension_elements=extension_elements,
                            extension_attributes=extension_attributes,
                            text=text)
    self.fstop=None
    self.make=None
    self.model=None
    self.distance=None
    self.exposure=None
    self.flash=None
    self.focallength=None
    self.iso=None
    self.time=None
    self.imageUniqueID=None
def TagsFromString(xml_string):
  return atom.CreateClassFromXMLString(Tags, xml_string)