First step in reading and processing GPSAltitude, and GPSTimeStamp.

svn: r17642
This commit is contained in:
Rob G. Healey 2011-06-01 00:14:24 +00:00
parent 7901808c88
commit 10906f43be

View File

@ -164,9 +164,11 @@ _DATAMAP = {
"Exif.GPSInfo.GPSLatitude" : "Latitude", "Exif.GPSInfo.GPSLatitude" : "Latitude",
"Exif.GPSInfo.GPSLongitudeRef" : "LongitudeRef", "Exif.GPSInfo.GPSLongitudeRef" : "LongitudeRef",
"Exif.GPSInfo.GPSLongitude" : "Longitude", "Exif.GPSInfo.GPSLongitude" : "Longitude",
"Exif.GPSInfo.GPSTimeStamp" : "GPSTimeStamp"} "Exif.GPSInfo.AltitudeRef" : "AltitudeRef",
_DATAMAP = dict( (key, val) for key, val in _DATAMAP.items() ) "Exif.GPSInfo.GPSAltitude" : "Altitude",
_DATAMAP.update( (val, key) for key, val in _DATAMAP.items() ) "Exif.GPSInfo.GPSTimeStamp" : "gpsTimeStamp"}
_DATAMAP = dict((key, val) for key, val in _DATAMAP.items())
_DATAMAP.update( (val, key) for key, val in _DATAMAP.items())
# define tooltips for all data entry fields... # define tooltips for all data entry fields...
_TOOLTIPS = { _TOOLTIPS = {
@ -190,7 +192,13 @@ _TOOLTIPS = {
"Example: 43.722965, 43 43 22 N, 38° 38 03″ N, 38 38 3"), "Example: 43.722965, 43 43 22 N, 38° 38 03″ N, 38 38 3"),
"Longitude" : _("Enter the Longitude GPS Coordinates for this image,\n" "Longitude" : _("Enter the Longitude GPS Coordinates for this image,\n"
"Example: 10.396378, 10 23 46 E, 105° 6 6″ W, -105 6 6") } "Example: 10.396378, 10 23 46 E, 105° 6 6″ W, -105 6 6"),
"Altitude" : _("This is the amount of meters that you are either above or below sea level.\n"
"Example: 54 1, 54 0"),
"gpsTimeStamp" : _("The Hour Minutes Seconds that the GPS Coordinates were received.\n"
"Example: 13 30 25") }
_TOOLTIPS = dict( (key, tip) for key, tip in _TOOLTIPS.items() ) _TOOLTIPS = dict( (key, tip) for key, tip in _TOOLTIPS.items() )
@ -248,31 +256,25 @@ class EditExifMetadata(Gramplet):
# Displays the file name... # Displays the file name...
medialabel = gtk.HBox(False) medialabel = gtk.HBox(False)
label = gtk.Label()
label.set_alignment(0.0, 0.0) label = self.__create_label("MediaLabel", False, False, False)
label.set_line_wrap(True)
medialabel.pack_start(label, expand =False) medialabel.pack_start(label, expand =False)
self.exif_widgets["MediaLabel"] = label
main_vbox.pack_start(medialabel, expand =False, fill =False, padding =2) main_vbox.pack_start(medialabel, expand =False, fill =False, padding =2)
label.show() label.show()
# Displays mime type information... # Displays mime type information...
mimetype = gtk.HBox(False) mimetype = gtk.HBox(False)
label = gtk.Label()
label.set_alignment(0.0, 0.0) label = self.__create_label("MimeType", False, False, False)
label.set_line_wrap(True)
mimetype.pack_start(label, expand =False) mimetype.pack_start(label, expand =False)
self.exif_widgets["MimeType"] = label
main_vbox.pack_start(mimetype, expand =False, fill =False, padding =2) main_vbox.pack_start(mimetype, expand =False, fill =False, padding =2)
label.show() label.show()
# Displays all plugin messages... # Displays all plugin messages...
messagearea = gtk.HBox(False) messagearea = gtk.HBox(False)
label = gtk.Label()
label.set_alignment(0.5, 0.0) label = self.__create_label("MessageArea", False, False, False)
label.set_line_wrap(True)
messagearea.pack_start(label, expand =False) messagearea.pack_start(label, expand =False)
self.exif_widgets["MessageArea"] = label
main_vbox.pack_start(messagearea, expand =False, fill =False, padding =2) main_vbox.pack_start(messagearea, expand =False, fill =False, padding =2)
label.show() label.show()
@ -405,7 +407,6 @@ class EditExifMetadata(Gramplet):
# display all exif metadata... # display all exif metadata...
mediadatatags = _get_exif_keypairs(self.plugin_image) mediadatatags = _get_exif_keypairs(self.plugin_image)
self.set_has_data( len(mediadatatags) > 0)
if mediadatatags: if mediadatatags:
self.display_metadata(mediadatatags) self.display_metadata(mediadatatags)
@ -574,6 +575,28 @@ class EditExifMetadata(Gramplet):
return button return button
def __create_label(self, widget, text, width, height, wrap =True):
"""
creates a label for this addon.
"""
label = gtk.Label()
label.set_alignment(0.0, 0.0)
if wrap:
label.set_line_wrap(True)
if (width and height):
label.set_size_request(width, height)
if text:
label.set_text(text)
if widget:
self.exif_widgets[widget] = label
return label
def build_shaded_display(self): def build_shaded_display(self):
""" """
Build the GUI interface. Build the GUI interface.
@ -760,7 +783,7 @@ class EditExifMetadata(Gramplet):
if not self.exif_widgets["Save"].get_sensitive(): if not self.exif_widgets["Save"].get_sensitive():
self.activate_buttons(["Save"]) self.activate_buttons(["Save"])
def display_edit_window(self, obj): def display_edit_window(self, object):
""" """
creates the editing area fields. creates the editing area fields.
""" """
@ -770,14 +793,14 @@ class EditExifMetadata(Gramplet):
self.edtarea = gtk.Window(gtk.WINDOW_TOPLEVEL) self.edtarea = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.edtarea.tooltip = tip self.edtarea.tooltip = tip
self.edtarea.set_title( self.orig_image.get_description() ) self.edtarea.set_title( self.orig_image.get_description() )
self.edtarea.set_default_size(550, 642) self.edtarea.set_default_size(570, 642)
self.edtarea.set_border_width(10) self.edtarea.set_border_width(10)
self.edtarea.connect("destroy", lambda w: self.edtarea.destroy() ) self.edtarea.connect("destroy", lambda w: self.edtarea.destroy() )
# create a new scrolled window. # create a new scrolled window.
scrollwindow = gtk.ScrolledWindow() scrollwindow = gtk.ScrolledWindow()
scrollwindow.set_border_width(10) scrollwindow.set_border_width(10)
scrollwindow.set_size_request(490, 588) scrollwindow.set_size_request(510, 542)
scrollwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scrollwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
# The dialog window is created with a vbox packed into it. # The dialog window is created with a vbox packed into it.
@ -799,7 +822,10 @@ class EditExifMetadata(Gramplet):
self._setup_widget_tips([True, True]) self._setup_widget_tips([True, True])
# display all Exif metadata if they are in _DATAMAP, see line #151... # display all Exif metadata if they are in _DATAMAP, see line #151...
self.EditArea([KeyTag for KeyTag in _get_exif_keypairs(self.plugin_image) if KeyTag in _DATAMAP]) mediadatatags = _get_exif_keypairs(self.plugin_image)
if mediadatatags:
mediadatatags = [KeyTag for KeyTag in mediadatatags if KeyTag in _DATAMAP]
self.EditArea(mediadatatags)
def build_edit_gui(self): def build_edit_gui(self):
""" """
@ -808,18 +834,16 @@ class EditExifMetadata(Gramplet):
main_vbox = gtk.VBox() main_vbox = gtk.VBox()
main_vbox.set_border_width(10) main_vbox.set_border_width(10)
main_vbox.set_size_request(480, 578) main_vbox.set_size_request(500, 690)
label = gtk.Label() label = self.__create_label("Edit:Message", False, False, False)
label.set_alignment(0.0, 0.0)
main_vbox.pack_start(label, expand =False, fill =False, padding =5) main_vbox.pack_start(label, expand =False, fill =False, padding =5)
label.show() label.show()
self.exif_widgets["Edit:Message"] = label
# create the data fields... # create the data fields...
# ***Label/ Title, Description, Artist, and Copyright # ***Label/ Title, Description, Artist, and Copyright
gen_frame = gtk.Frame(_("General Data")) gen_frame = gtk.Frame(_("General Data"))
gen_frame.set_size_request(460, 200) gen_frame.set_size_request(470, 200)
main_vbox.pack_start(gen_frame, expand =False, fill =True, padding =10) main_vbox.pack_start(gen_frame, expand =False, fill =True, padding =10)
gen_frame.show() gen_frame.show()
@ -827,43 +851,34 @@ class EditExifMetadata(Gramplet):
gen_frame.add(new_vbox) gen_frame.add(new_vbox)
new_vbox.show() new_vbox.show()
textNames = list( (text) for text in [_("Exif Title :"), _("Description :"), _("Artist :"), _("Copyright :") ] ) for widget, text in [
widgetsNames = list( (widget) for widget in ["ExifLabel", "Description", "Artist", "Copyright"] ) ("ExifLabel", _("Exif Label :") ),
while (textNames and widgetsNames): ("Description", _("Description :") ),
text = textNames[0] ("Artist", _("Artist :") ),
widget = widgetsNames[0] ("Copyright", _("Copyright :") ) ]:
new_hbox = gtk.HBox(False, 0) new_hbox = gtk.HBox(False, 0)
new_vbox.pack_start(new_hbox, expand =False, fill =False, padding =5) new_vbox.pack_start(new_hbox, expand =False, fill =False, padding =5)
new_hbox.show() new_hbox.show()
label = gtk.Label(text) label = self.__create_label(False, text, width =90, height =25)
label.set_alignment(0.0, 0.0)
label.set_size_request(80, 25)
new_hbox.pack_start(label, expand =False, fill =False, padding =0) new_hbox.pack_start(label, expand =False, fill =False, padding =0)
label.show() label.show()
event_box = gtk.EventBox() event_box = gtk.EventBox()
event_box.set_size_request(380, 30) event_box.set_size_request(380, 30)
new_hbox.pack_start(event_box, expand =False, fill =False, padding =0) new_hbox.pack_start(event_box, expand =False, fill =False, padding =0)
event_box.show()
self.exif_widgets[widget + "Box"] = event_box self.exif_widgets[widget + "Box"] = event_box
event_box.show()
entry = gtk.Entry(max =50) entry = gtk.Entry(max =50)
event_box.add(entry) event_box.add(entry)
entry.show()
self.exif_widgets[widget] = entry self.exif_widgets[widget] = entry
entry.show()
# remove text and widget from their list...
textNames.remove(text)
widgetsNames.remove(widget)
# get current date and time from this computer...
now = time.localtime()
# iso format: Year, Month, Day spinners... # iso format: Year, Month, Day spinners...
datetime_frame = gtk.Frame(_("Date/ Time")) datetime_frame = gtk.Frame(_("Date/ Time"))
datetime_frame.set_size_request(460, 180) datetime_frame.set_size_request(470, 180)
main_vbox.pack_start(datetime_frame, expand =False, fill =False, padding =0) main_vbox.pack_start(datetime_frame, expand =False, fill =False, padding =0)
datetime_frame.show() datetime_frame.show()
@ -885,14 +900,12 @@ class EditExifMetadata(Gramplet):
new_hbox.pack_start(vbox2, expand =False, fill =False, padding =5) new_hbox.pack_start(vbox2, expand =False, fill =False, padding =5)
vbox2.show() vbox2.show()
label = gtk.Label(text) label = self.__create_label(widget, text, width =460, height = 25)
label.set_alignment(0.0, 0.0)
label.set_size_request(440, 25)
vbox2.pack_start(label, expand =False, fill =False, padding =0) vbox2.pack_start(label, expand =False, fill =False, padding =0)
label.show() label.show()
event_box = gtk.EventBox() event_box = gtk.EventBox()
event_box.set_size_request(440, 40) event_box.set_size_request(460, 40)
# set eventbox background color to "black" # set eventbox background color to "black"
event_box.modify_bg(gtk.STATE_NORMAL, event_box.modify_bg(gtk.STATE_NORMAL,
@ -908,7 +921,7 @@ class EditExifMetadata(Gramplet):
# GPS Coordinates... # GPS Coordinates...
latlong_frame = gtk.Frame(_("Latitude/ Longitude GPS Coordinates")) latlong_frame = gtk.Frame(_("Latitude/ Longitude GPS Coordinates"))
latlong_frame.set_size_request(460, 100) latlong_frame.set_size_request(470, 180)
main_vbox.pack_start(latlong_frame, expand =False, fill =False, padding =0) main_vbox.pack_start(latlong_frame, expand =False, fill =False, padding =0)
latlong_frame.show() latlong_frame.show()
@ -923,34 +936,63 @@ class EditExifMetadata(Gramplet):
# Latitude/ Longitude GPS Coordinates... # Latitude/ Longitude GPS Coordinates...
for widget, text in [ for widget, text in [
("Latitude", _("Latitude :") ), ("Latitude", _("Latitude :") ),
("Longitude", _("Longitude :") ), ("Longitude", _("Longitude :") ) ]:
("GPSTimeStamp", _("GPS TimeStamp :") ) ]:
vbox2 = gtk.VBox(False, 0) vbox2 = gtk.VBox(False, 0)
new_hbox.pack_start(vbox2, expand =False, fill =False, padding =5) new_hbox.pack_start(vbox2, expand =False, fill =False, padding =5)
vbox2.show() vbox2.show()
label = gtk.Label(text) label = self.__create_label(widget, text, width =230, height =25)
label.set_alignment(0.0, 0.0)
label.set_size_request(150, 25)
vbox2.pack_start(label, expand =False, fill =False, padding =0) vbox2.pack_start(label, expand =False, fill =False, padding =0)
label.show() label.show()
event_box = gtk.EventBox() event_box = gtk.EventBox()
event_box.set_border_width(2) event_box.set_border_width(2)
event_box.set_size_request(150, 40) event_box.set_size_request(230, 40)
# set eventbox background color to "blue" # set eventbox background color to "blue"
event_box.modify_bg(gtk.STATE_NORMAL, event_box.modify_bg(gtk.STATE_NORMAL,
event_box.get_colormap().alloc_color("blue")) event_box.get_colormap().alloc_color("blue"))
vbox2.pack_start(event_box, expand =False, fill =False, padding =0) vbox2.pack_start(event_box, expand =False, fill =False, padding =0)
event_box.show()
self.exif_widgets[widget + "Box"] = event_box self.exif_widgets[widget + "Box"] = event_box
event_box.show()
entry = gtk.Entry(max =25) entry = gtk.Entry(max =30)
event_box.add(entry) event_box.add(entry)
entry.show()
self.exif_widgets[widget] = entry self.exif_widgets[widget] = entry
entry.show()
new_hbox = gtk.HBox(False, 0)
new_vbox.pack_start(new_hbox, expand =False, fill =False, padding =0)
new_hbox.show()
for widget, text in [
("Altitude", _("Altitude") ),
("gpsTimeStamp", _("GPS Time Stamp") ) ]:
vbox2 = gtk.VBox(False, 0)
new_hbox.pack_start(vbox2, expand =False, fill =False, padding =5)
vbox2.show()
label = self.__create_label(widget, text, width =230, height =25)
vbox2.pack_start(label, expand =False, fill =False, padding =0)
label.show()
event_box = gtk.EventBox()
event_box.set_border_width(2)
event_box.set_size_request(230, 40)
# set eventbox background color to "blue"
event_box.modify_bg(gtk.STATE_NORMAL,
event_box.get_colormap().alloc_color("blue"))
vbox2.pack_start(event_box, expand =False, fill =False, padding =0)
self.exif_widgets[widget + "Box"] = event_box
event_box.show()
entry = gtk.Entry(max =30)
event_box.add(entry)
self.exif_widgets[widget] = entry
entry.show()
# Help, Save, Clear, and Close horizontal box # Help, Save, Clear, and Close horizontal box
hscc_box = gtk.HButtonBox() hscc_box = gtk.HButtonBox()
@ -1019,7 +1061,7 @@ class EditExifMetadata(Gramplet):
""" """
for widget in ["ExifLabel", "Description", "Artist", "Copyright", "Modified", "Original", for widget in ["ExifLabel", "Description", "Artist", "Copyright", "Modified", "Original",
"Latitude", "Longitude", "GPSTimeStamp", "Edit:Message"]: "Latitude", "Longitude", "gpsTimeStamp", "Edit:Message"]:
self.exif_widgets[widget].set_text("") self.exif_widgets[widget].set_text("")
def clear_display(self, object): def clear_display(self, object):
@ -1043,10 +1085,6 @@ class EditExifMetadata(Gramplet):
displays the image Exif metadata in the Edit Area... displays the image Exif metadata in the Edit Area...
""" """
# update has_data()
self.set_has_data( len(MediaDataTags) > 0)
# if no Exif metadata, disable the has_data() functionality?
if MediaDataTags: if MediaDataTags:
for KeyTag in MediaDataTags: for KeyTag in MediaDataTags:
@ -1057,7 +1095,7 @@ class EditExifMetadata(Gramplet):
tagValue = self._get_value(KeyTag) tagValue = self._get_value(KeyTag)
if tagValue: if tagValue:
if widgetsName in ["ExifLabel", "Description", "Artist", "Copyright", "GPSTimeStamp"]: if widgetsName in ["ExifLabel", "Description", "Artist", "Copyright"]:
self.exif_widgets[widgetsName].set_text(tagValue) self.exif_widgets[widgetsName].set_text(tagValue)
# Last Changed/ Modified... # Last Changed/ Modified...
@ -1077,17 +1115,17 @@ class EditExifMetadata(Gramplet):
if isinstance(use_date, str): if isinstance(use_date, str):
use_date = _get_date_format(use_date) use_date = _get_date_format(use_date)
if use_date: if use_date:
year, month, day, hour, minutes, seconds = use_date[0:6] pyear, pmonth, day, hour, minutes, seconds = use_date[0:6]
elif isinstance(use_date, datetime): elif isinstance(use_date, datetime):
year, month, day = use_date.year, use_date.month, use_date.day pyear, pmonth, day = use_date.year, use_date.month, use_date.day
hour, minutes, seconds = use_date.hour, use_date.minute, use_date.second hour, minutes, seconds = use_date.hour, use_date.minute, use_date.second
else: else:
year = False pyear = False
if year: if pyear:
use_date = _create_datetime(year, month, day, hour, minutes, seconds) use_date = _create_datetime(pyear, pmonth, day, hour, minutes, seconds)
self.exif_widgets["Original"].set_text( _format_datetime(use_date) ) self.exif_widgets["Original"].set_text( _format_datetime(use_date) )
# LatitudeRef, Latitude, LongitudeRef, Longitude... # LatitudeRef, Latitude, LongitudeRef, Longitude...
@ -1124,13 +1162,30 @@ class EditExifMetadata(Gramplet):
self.exif_widgets["Longitude"].set_text( self.exif_widgets["Longitude"].set_text(
"""%s° %s %s%s""" % (longdeg, longmin, longsec, LongRef) ) """%s° %s %s%s""" % (longdeg, longmin, longsec, LongRef) )
else: elif widgetsName == "Altitude":
AltitudeRef = self._get_value(_DATAMAP["AltitudeRef"] )
Altitude = str((Decimal(tagValue.numerator) / Decimal(tagValue.denominator)))
if AltitudeRef is not False:
if AltitudeRef == 0:
AltRef = _("Above Sea Level")
else:
AltRef = _("Below Sea Level")
self.exif_widgets[widgetsName] = "%s, %s" % (Altitude, AltRef)
elif widgetsName == "gpsTimeStamp":
gpsTimeStamp = rational_to_dms(tagValue)
hour, minutes, seconds = gpsTimeStamp
hour, minutes, seconds = int(hour), int(minutes), int(seconds)
self.exif_widgets[widgetsName].set_text("%02d:%02d:%02d" % (hour, minutes, seconds) )
else:
# set Message Area to None... # set Message Area to None...
self.exif_widgets["MessageArea"].set_text(_("There is NO Exif " self.exif_widgets["Edit:Message"].set_text(_("There is NO Exif "
"metadata for this image yet...")) "metadata for this image yet..."))
for widgetsName in ["ExifLabel", "Description", "Artist", "Copyright", "Latitude", "Longitude"]: for widgetsName, text in _TOOLTIPS.items():
# once the user types in that field, # once the user types in that field,
# the Edit, Clear, and Delete buttons will become active... # the Edit, Clear, and Delete buttons will become active...
@ -1276,7 +1331,7 @@ class EditExifMetadata(Gramplet):
self.exif_widgets["Latitude"].set_text(latitude) self.exif_widgets["Latitude"].set_text(latitude)
self.exif_widgets["Longitude"].set_text(longitude) self.exif_widgets["Longitude"].set_text(longitude)
def convert2dms(self, latitude, longitude): def convert2dms(self, latitude =False, longitude =False):
""" """
will convert a decimal GPS Coordinates into degrees, minutes, seconds will convert a decimal GPS Coordinates into degrees, minutes, seconds
for display only for display only
@ -1478,20 +1533,25 @@ def _get_exif_keypairs(plugin_image):
""" """
Will be used to retrieve and update the Exif metadata from the image. Will be used to retrieve and update the Exif metadata from the image.
""" """
if not plugin_image:
return False
MediaDataTags = False MediaDataTags = False
if LesserVersion: # prior to pyexiv2-0.2.0
if plugin_image: # get all KeyTags for this image for diplay only...
if LesserVersion: # prior to pyexiv2-0.2.0 MediaDataTags = [KeyTag for KeyTag in chain(
# get all KeyTags for this image for diplay only... plugin_image.exifKeys(), plugin_image.xmpKeys(),
MediaDataTags = [KeyTag for KeyTag in chain( plugin_image.iptcKeys() ) ]
plugin_image.exifKeys(), plugin_image.xmpKeys(),
plugin_image.iptcKeys() ) ] else: # pyexiv2-0.2.0 and above
# get all KeyTags for this image for diplay only...
MediaDataTags = [KeyTag for KeyTag in chain(
plugin_image.exif_keys, plugin_image.xmp_keys,
plugin_image.iptc_keys) ]
else: # pyexiv2-0.2.0 and above
# get all KeyTags for this image for diplay only...
MediaDataTags = [KeyTag for KeyTag in chain(
plugin_image.exif_keys, plugin_image.xmp_keys,
plugin_image.iptc_keys) ]
return MediaDataTags return MediaDataTags
def string_to_rational(coordinate): def string_to_rational(coordinate):