diff --git a/src/plugins/gramplet/EditExifMetadata.py b/src/plugins/gramplet/EditExifMetadata.py index 49ae908b9..9bfac8a14 100644 --- a/src/plugins/gramplet/EditExifMetadata.py +++ b/src/plugins/gramplet/EditExifMetadata.py @@ -35,7 +35,7 @@ from xml.sax.saxutils import escape as _html_escape from itertools import chain from decimal import Decimal, getcontext -getcontext().prec = 4 +getcontext().prec = 6 from fractions import Fraction import subprocess @@ -161,7 +161,6 @@ _DATAMAP = { "Exif.Photo.DateTimeOriginal" : "Original", "Exif.Photo.DateTimeDigitized" : "Digitized", "Xmp.xmp.ModifyDate" : "ModifyDate", - "Exif.GPSInfo.GPSTimeStamp" : "gpsTimeStamp", "Exif.GPSInfo.GPSLatitudeRef" : "LatitudeRef", "Exif.GPSInfo.GPSLatitude" : "Latitude", "Exif.GPSInfo.GPSLongitudeRef" : "LongitudeRef", @@ -205,10 +204,7 @@ _TOOLTIPS = { # GPS Altitude (in meters)... "Altitude" : _("This is the measurement of Above or Below Sea Level. It is measured in meters." - "Example: 200.558, -200.558"), - - # GPS Time (received from the GPS Satellites)... - "gpsTimeStamp" : _("The time that the GPS Latitude/ Longitude was received from the GPS Satellites.")} + "Example: 200.558, -200.558") } _TOOLTIPS = dict( (key, tooltip) for key, tooltip in _TOOLTIPS.items() ) @@ -242,6 +238,13 @@ if (_MAGICK_FOUND or _JHEAD_FOUND): # # ------------------------------------------------------------------------ class EditExifMetadata(Gramplet): + """ + Special symbols... + + degrees symbol = [Ctrl] [Shift] u \00b0 + minutes symbol = \2032 + seconds symbol = \2033 + """ def init(self): self.exif_widgets = {} @@ -385,6 +388,10 @@ class EditExifMetadata(Gramplet): "Please choose a different image...")) return + # make sure that the image type is workable with exiv2? + if not any(exiv2type == self.extension for exiv2type in _vtypes): + return + # Activate the Clear and Edit buttons... self.activate_buttons(["Edit"]) @@ -419,10 +426,26 @@ class EditExifMetadata(Gramplet): # creates, and reads the plugin image instance... self.plugin_image = self.setup_image(self.image_path) - # Check for Thumbnails... - previews = self.plugin_image.previews - if (len(previews) > 0): - self.activate_buttons(["Thumbnail"]) + if LesserVersion: # prior to pyexiv2-0.2.0 + try: + ttype, tdata = self.plugin_image.getThumbnailData() + width, height = tdata.dimensions + thumbnail = True + except (IOError, OSError): + thumbnail = False + + else: # pyexiv2-0.2.0 and above + try: + previews = self.plugin_image.previews + thumbnail = True + if not previews: + thumbnail = False + except (IOError, OSError): + thumbnail = False + + # if a thumbnail exists, then activate the buttton? + if thumbnail: + self.activate_buttons(["Thumbnail"]) # display all exif metadata... mediadatatags = _get_exif_keypairs(self.plugin_image) @@ -750,15 +773,27 @@ class EditExifMetadata(Gramplet): self.convert2Jpeg() if system_platform == "linux2": - delete = subprocess.check_call( [_DEL_FOUND, "-rf", self.image_path] ) - else: - delete = subprocess.check_call( [_DEL_FOUND, "-y", self.image_path] ) - delete_result = str(delete) + try: + delete = subprocess.check_call( ["rm", "-rf", self.image_path] ) + delete_results = str(delete) - if delete_result: + except subprocess.CalledProcessError: + delete_results = False + else: + try: + delete = subprocess.check_call( ["del", "-y", self.image_path]) + delete_results = str(delete) + + except subprocess.CalledProcessError: + delete_results = False + + if delete_results: self.exif_widgets["MessageArea"].set_text(_("Image has been converted to a .jpg image,\n" "and original image has been deleted!")) + else: + self.exif_widgets["Message:Area"].set_text(_("There was an error in converting and deleting your image...")) + def convert2Jpeg(self): """ Will attempt to convert an image to jpeg if it is not? @@ -768,9 +803,15 @@ class EditExifMetadata(Gramplet): basename, oldext = os.path.splitext(self.image_path) newextension = ".jpeg" - convert = subprocess.check_call(["convert", self.image_path, - os.path.join(filepath, basename + newextension) ] ) - if str(convert): + try: + convert = subprocess.check_call(["convert", self.image_path, + os.path.join(filepath, basename + newextension) ] ) + convert_results = str(convert) + + except subprocess.CalledProcessError: + convert_results = False + + if convert_results: # set Message Area to Convert... self.exif_widgets["MessageArea"].set_text(_("Converting image,\n" @@ -778,6 +819,10 @@ class EditExifMetadata(Gramplet): self.deactivate_buttons(["Convert"]) + else: + self.exif_widgets["Message:Area"].set_text(_("There has been an " + "issue in converting your image,\n coverting did not happen...")) + def __help_page(self, object): """ will bring up a Wiki help page. @@ -840,30 +885,26 @@ class EditExifMetadata(Gramplet): creates the editing area fields. """ - tip = _("Click the close button when you are finished modifying this image's Exif metadata.") + tip = _("Click the close button when you are finished modifying this " + "image's Exif metadata.") self.edtarea = gtk.Window(gtk.WINDOW_TOPLEVEL) self.edtarea.tooltip = tip self.edtarea.set_title( self.orig_image.get_description() ) - self.edtarea.set_default_size(570, 642) + self.edtarea.set_default_size(600, 582) self.edtarea.set_border_width(10) self.edtarea.connect("destroy", lambda w: self.edtarea.destroy() ) - if not any(exiv2type == self.extension for exiv2type in _vtypes): - self.close_window(self.edtarea) - return - # create a new scrolled window. scrollwindow = gtk.ScrolledWindow() scrollwindow.set_border_width(10) - scrollwindow.set_size_request(510, 650) + scrollwindow.set_size_request(600, 500) scrollwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - # The dialog window is created with a vbox packed into it. self.edtarea.add(scrollwindow) scrollwindow.show() - vbox = self.build_edit_gui() + vbox = self.__build_edit_gui() scrollwindow.add_with_viewport(vbox) self.edtarea.show() @@ -898,23 +939,22 @@ class EditExifMetadata(Gramplet): # display all data fields and their values... self.EditArea(self.plugin_image) - def build_edit_gui(self): + def __build_edit_gui(self): """ will build the edit screen ... """ - main_vbox = gtk.VBox() main_vbox.set_border_width(10) - main_vbox.set_size_request(500, 640) + main_vbox.set_size_request(560, 500) label = self.__create_label("Edit:Message", False, False, False) - main_vbox.pack_start(label, expand =False, fill =False, padding =5) + main_vbox.pack_start(label, expand =False, fill =False, padding =0) label.show() # create the data fields... # ***Label/ Title, Description, Artist, and Copyright gen_frame = gtk.Frame(_("General Data")) - gen_frame.set_size_request(490, 200) + gen_frame.set_size_request(550, 200) main_vbox.pack_start(gen_frame, expand =False, fill =True, padding =10) gen_frame.show() @@ -937,7 +977,7 @@ class EditExifMetadata(Gramplet): label.show() event_box = gtk.EventBox() - event_box.set_size_request(390, 30) + event_box.set_size_request(430, 30) new_hbox.pack_start(event_box, expand =False, fill =False, padding =0) event_box.show() @@ -948,7 +988,7 @@ class EditExifMetadata(Gramplet): # iso format: Year, Month, Day spinners... datetime_frame = gtk.Frame(_("Date/ Time")) - datetime_frame.set_size_request(490, 110) + datetime_frame.set_size_request(550, 110) main_vbox.pack_start(datetime_frame, expand =False, fill =False, padding =0) datetime_frame.show() @@ -969,18 +1009,18 @@ class EditExifMetadata(Gramplet): new_hbox.pack_start(vbox2, expand =False, fill =False, padding =5) vbox2.show() - label = self.__create_label(widget, text, width =225, height = 25) + label = self.__create_label(widget, text, width =90, height =25) vbox2.pack_start(label, expand =False, fill =False, padding =0) label.show() event_box = gtk.EventBox() - event_box.set_size_request(225, 40) + event_box.set_size_request(250, 30) vbox2.pack_start(event_box, expand =False, fill =False, padding =0) event_box.show() entry = ValidatableMaskedEntry() entry.connect('validate', self.validate_datetime, widget) - entry.connect('content-changed', self.set_datetime, widget) +# entry.connect('content-changed', self.set_datetime, widget) event_box.add(entry) self.exif_widgets[widget] = entry entry.show() @@ -993,7 +1033,7 @@ class EditExifMetadata(Gramplet): # GPS Coordinates... latlong_frame = gtk.Frame(_("Latitude/ Longitude/ Altitude GPS Coordinates")) - latlong_frame.set_size_request(490, 210) + latlong_frame.set_size_request(550, 125) main_vbox.pack_start(latlong_frame, expand =False, fill =False, padding =0) latlong_frame.show() @@ -1007,18 +1047,19 @@ class EditExifMetadata(Gramplet): for widget, text in [ ("Latitude", _("Latitude :") ), - ("Longitude", _("Longitude :") ) ]: + ("Longitude", _("Longitude :") ), + ("Altitude", _("Altitude :") ) ]: 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 =225, height =25) + label = self.__create_label(widget, text, width =90, height =25) vbox2.pack_start(label, expand =False, fill =False, padding =0) label.show() event_box = gtk.EventBox() - event_box.set_size_request(225, 40) + event_box.set_size_request(167, 30) vbox2.pack_start(event_box, expand =False, fill =False, padding =0) event_box.show() @@ -1028,36 +1069,9 @@ class EditExifMetadata(Gramplet): 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() - - # AAltitude and GPS TimeStamp... - for widget, text in [ - ("Altitude", _("Altitude (in meters) :") ), - ("gpsTimeStamp", _("GPS TimeStamp :") ) ]: - - 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_size_request(230, 40) - vbox2.pack_start(event_box, expand =False, fill =False, padding =0) - event_box.show() - - entry = gtk.Entry(max =50) - event_box.add(entry) - self.exif_widgets[widget] = entry - entry.show() - # add an empty row for spacing... new_hbox = gtk.HBox(False, 0) - new_vbox.pack_start(new_hbox, expand =False, fill =False, padding =10) + new_vbox.pack_start(new_hbox, expand =False, fill =False, padding =5) new_hbox.show() new_hbox = gtk.HBox(False, 0) @@ -1065,26 +1079,25 @@ class EditExifMetadata(Gramplet): new_hbox.show() label = self.__create_label( - False, _("Convert GPS :"), width =100, height =25) - new_hbox.pack_start(label, expand =False, fill =False, padding =5) + False, _("Convert GPS :"), 100, 25) + new_hbox.pack_start(label, expand =False, fill =False, padding =0) label.show() # Convert2decimal and DMS buttons... - for widget, text, callback in [ - ("Decimal", _("Decimal"), [self.convert2decimal] ), - ("DMS", _("Deg., Mins., Secs."), [self.convert2dms] ) ]: + decdms_box = gtk.HButtonBox() + decdms_box.set_layout(gtk.BUTTONBOX_END) + new_vbox.pack_end(decdms_box, expand =False, fill =False, padding =0) + decdms_box.show() - event_box = gtk.EventBox() - event_box.set_size_request(180, 40) - new_hbox.pack_end(event_box, expand =False, fill =False, padding =2) - event_box.show() + # Decimal button... + decdms_box.add(self.__create_button( + "Decimal", _("Decimal"), [self.convert2decimal], False, True) ) - button = self.__create_button( - widget, text, callback, False, True) - event_box.add(button) - button.show() + # Degrees, Minutes, Seconds button... + decdms_box.add(self.__create_button( + "DMS", _("Dec., Mins., Secs."), [self.convert2dms], False, True) ) - # Help, Save, Clear, and Close horizontal box + # Help, Save, Clear, Copy, and Close horizontal box hsccc_box = gtk.HButtonBox() hsccc_box.set_layout(gtk.BUTTONBOX_START) main_vbox.pack_start(hsccc_box, expand =False, fill =False, padding =10) @@ -1095,8 +1108,9 @@ class EditExifMetadata(Gramplet): "Help", False, [self.__help_page], gtk.STOCK_HELP, True) ) # Save button... - hsccc_box.add(self.__create_button("Save", False, [self.save_metadata, self.update, - self.display_metadata], gtk.STOCK_SAVE, True) ) + hsccc_box.add(self.__create_button( + "Save", False, [self.save_metadata, self.update, self.display_metadata], + gtk.STOCK_SAVE, True) ) # Clear button... hsccc_box.add(self.__create_button( @@ -1180,7 +1194,7 @@ class EditExifMetadata(Gramplet): for widget in _TOOLTIPS.keys(): self.exif_widgets[widget].set_text("") - def EditArea(self, object): + def EditArea(self, mediadatatags_ =None): """ displays the image Exif metadata in the Edit Area... """ @@ -1203,6 +1217,9 @@ class EditExifMetadata(Gramplet): use_date = _format_datetime(tagValue) if use_date: self.exif_widgets[widgetname_].set_text(use_date) + self.exif_widgets["Modified"].set_editable(False) + else: + self.exif_widgets["Modified"].set_editable(True) # LatitudeRef, Latitude, LongitudeRef, Longitude... elif widgetname_ == "Latitude": @@ -1230,15 +1247,14 @@ class EditExifMetadata(Gramplet): LongRef = self._get_value(_DATAMAP["LongitudeRef"] ) # set display for Latitude GPS Coordinates - self.exif_widgets["Latitude"].set_text( - """%s° %s′ %s″ %s""" % (latdeg, latmin, latsec, LatRef) ) + latitude = """%s° %s′ %s″ %s""" % (latdeg, latmin, latsec, LatRef) + self.exif_widgets["Latitude"].set_text(latitude) # set display for Longitude GPS Coordinates - self.exif_widgets["Longitude"].set_text( - """%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongRef) ) + longitude = """%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongRef) + self.exif_widgets["Longitude"].set_text(longitude) - # translate the direction references - self.convert_format('DEG') + self.convert_format(latitude, longitude, 'DEG') self.exif_widgets["Latitude"].validate() self.exif_widgets["Longitude"].validate() @@ -1254,12 +1270,6 @@ class EditExifMetadata(Gramplet): altitude = "-" + altitude self.exif_widgets[widgetname_].set_text(altitude) - elif widgetname_ == "gpsTimeStamp": - hour, minutes, seconds = rational_to_dms(tagValue) - hour, minutes, seconds = int(hour), int(minutes), int(seconds) - self.exif_widgets[widgetname_].set_text("%02d:%02d:%02d" % ( - hour, minutes, seconds) ) - else: # set Edit Message Area to None... self.exif_widgets["Edit:Message"].set_text(_("There is NO Exif metadata for this image.")) @@ -1275,8 +1285,7 @@ class EditExifMetadata(Gramplet): sets the value for the metadata keytag_s """ - tagClass = keytag_[0:4] - + tagclass_ = keytag_[0:4] if LesserVersion: self.plugin_image[keytag_] = keyvalue_ @@ -1284,12 +1293,15 @@ class EditExifMetadata(Gramplet): try: self.plugin_image.__setitem__(keytag_, keyvalue_) except KeyError: - if tagClass == "Exif": + if tagclass_ == "Exif": self.plugin_image[keytag_] = pyexiv2.ExifTag(keytag_, keyvalue_) - elif tagClass == "Xmp.": + + elif tagclass_ == "Xmp.": self.plugin_image[keytag_] = pyexiv2.XmpTag(keytag_, keyvalue_) - elif tagClass == "Iptc": + + elif tagclass_ == "Iptc": self.plugin_image[keytag_] = IptcTag(keytag_, keyvalue_) + except (ValueError, AttributeError): pass @@ -1313,117 +1325,180 @@ class EditExifMetadata(Gramplet): lambda w: widgetWindow.destroy() - def convert_format(self, format): + def convert_format(self, latitude, longitude, format): """ Convert GPS Coordinates into a specified format. """ - latitude = self.exif_widgets["Latitude"].get_text() - longitude = self.exif_widgets["Longitude"].get_text() - - latitude, longitude = conv_lat_lon(unicode(latitude), - unicode(longitude), - format) - - if latitude is not None: - self.exif_widgets["Latitude"].set_text(latitude) - self.exif_widgets["Longitude"].set_text(longitude) + latitude, longitude = conv_lat_lon( unicode(latitude), + unicode(longitude), + format) + return latitude, longitude def convert2decimal(self, object): """ will convert a decimal GPS Coordinates into decimal format. """ - self.convert_format("D.D8") - def convert2dms(self, object): + return self.convert_format("D.D8") + + def convert2dms(self, latitude, longitude): """ will convert a decimal GPS Coordinates into degrees, minutes, seconds for display only """ - self.convert_format("DEG") - def save_metadata(self, exif_widgets =None): + return self.convert_format(latitude, longitude, "DEG") + + def save_metadata(self, datatags_ =None): """ gets the information from the plugin data fields and sets the keytag_ = keyvalue image metadata """ - for widgetname_ in _TOOLTIPS.keys(): + # get a copy of all the widgets... + datatags_ = ( (widget, self.exif_widgets[widget].get_text() ) for widget in _TOOLTIPS.keys() ) + + for widgetname_, widgetvalue_ in datatags_: # Exif Label, Description, Artist, Copyright... if widgetname_ in ["ExifLabel", "Description", "Artist", "Copyright"]: - widgetvalue_ = self.exif_widgets[widgetname_].get_text() - self._set_value(_DATAMAP[widgetname_], widgetvalue_) + + self._set_value( _DATAMAP[widgetname_], widgetvalue_) # Modify Date/ Time... elif widgetname_ == "Modified": date1 = self.dates["Modified"] - modified = datetime.now() - use_date = date1 if date1 is not None else modified - self._set_value(_DATAMAP[widgetname_], use_date) + widgetvalue_ = date1 if date1 is not None else datetime.now() + self._set_value(_DATAMAP[widgetname_], widgetvalue_) # Original Date/ Time... elif widgetname_ == "Original": - original = self.dates["Original"] - if original is not None: - self._set_value(_DATAMAP[widgetname_], original) + widgetvalue_ = self.dates["Original"] + if widgetvalue_ is not None: + self._set_value(_DATAMAP[widgetname_], widgetvalue_) # Latitude/ Longitude... elif widgetname_ == "Latitude": - latitude = self.exif_widgets["Latitude"].get_text() - longitude = self.exif_widgets["Longitude"].get_text() + latref, latitude, longref, longitude = self.__process_lat_long( + self.exif_widgets["Latitude"].get_text().strip(), + self.exif_widgets["Longitude"].get_text().strip() ) - latitude, longitude = conv_lat_lon(unicode(latitude), - unicode(longitude), - "DEG-:") if latitude is not None: - if "-" in latitude: - latituderef = "S" - else: - latituderef = "N" - latitude = latitude.replace("-", "") + self._set_value(_DATAMAP["LatitudeRef"], latref) + self._set_value(_DATAMAP["Latitude"], latitude) - if "-" in longitude: - longituderef = "W" - else: - longituderef = "E" - longitude = longitude.replace("-", "") - - # convert (degrees, minutes, seconds) to Rational for saving - self._set_value(_DATAMAP["LatitudeRef"], latituderef) - self._set_value(_DATAMAP["Latitude"], - coords_to_rational(latitude)) - - # convert (degrees, minutes, seconds) to Rational for saving - self._set_value(_DATAMAP["LongitudeRef"], longituderef) - self._set_value(_DATAMAP["Longitude"], - coords_to_rational(longitude)) + if longitude is not None: + self._set_value(_DATAMAP["LongitudeRef"], longref) + self._set_value(_DATAMAP["Longitude"], longitude) # Altitude, and Altitude Reference... elif widgetname_ == "Altitude": - altitude = self.exif_widgets[widgetname_].get_text() + altitude = widgetvalue_ if altitude: if "-" in altitude: altitude = altitude.replace("-", "") altituderef = "1" else: - altituderef = "0" + altituderef = "0" + altitude = coords_to_rational(altitude) - # convert altitude to Rational for saving... - self._set_value(_DATAMAP["AltitudeRef"], altituderef) - self._set_value(_DATAMAP["Altitude"], coords_to_rational(altitude)) - - # gpsTimeStamp... - elif widgetname_ == "gpsTimeStamp": - widgetvalue_ = self.exif_widgets[widgetname_].get_text() - if widgetvalue_: - self._set_value(_DATAMAP[widgetname_], coords_to_rational(widgetvalue_)) - - # set Message Area to Saved... - self.exif_widgets["Edit:Message"].set_text(_("Saving Exif metadata to this image...")) + # convert altitude to pyexiv2.Rational for saving... + self._set_value(_DATAMAP["AltitudeRef"], altituderef) + self._set_value(_DATAMAP[widgetname_], altitude) # writes all Exif Metadata to image even if the fields are all empty so as to remove the value... self.write_metadata(self.plugin_image) + if datatags_: + # set Message Area to Saved... + self.exif_widgets["Edit:Message"].set_text(_("Saving Exif metadata to this image...")) + else: + # set Edit Message to Cleared... + self.exif_widgets["Edit:Message"].set_text(_("All Exif metadata has been cleared...")) + + def __process_lat_long(self, latitude, longitude): + """ + process the latitude/ longitude for saving... + """ + + latituderef, longituderef = [False]*2 + if (latitude and longitude): + + # complete some error checking to prevent crashes... + # if "?" character exist, remove it? + if "?" in latitude: + latitude = latitude.replace("?", "") + if "?" in longitude: + longitude = longitude.replace("?", "") + + # if "," character exists, remove it? + if "," in latitude: + latitude = latitude.replace(",", "") + if "," in longitude: + longitude = longitude.replace(",", "") + + latitude = latitude.strip() + longitude = longitude.strip() + + # if there is no spaces then convert to DMS? + if (latitude.count(" ") == longitude.count(" ") == 0): + if ((latitude.find(".") is not -1) and (longitude.find(".") is not -1)): + latitude, longitude = self.convert2dms(latitude, longitude) + + # DMS is True... + if (latitude.count(" ") == longitude.count(" ") > 1): + latsep, longsep = [False]*2 + + if latitude.find("N") > -1: + latituderef = "N" + latsep = "N" + + elif latitude.find(_("S")) > -1: + latituderef = "S" + latsep = "S" + + elif ((latitude.find("N") == -1) and (latitude.find("S") == -1)): + if latitude.find("-") == -1: + latituderef = "N" + latsep = False + else: + latituderef = "S" + latsep = "-" + if latsep is not False: + latitude = latitude.replace(latsep, "") + + if longitude.find("E") > -1: + longituderef = "E" + longsep = "E" + + elif longitude.find("W") > -1: + longituderef = "W" + longsep = "W" + + elif ((longitude.find("E") == -1) and (longitude.find("W") == -1)): + if longitude.find("-") == -1: + longituderef = "E" + longsep = False + + else: + longituderef = "W" + longsep = "W" + if longsep is not False: + longitude = longitude.replace(longsep, "") + + # remove leading and trailing whitespace + latitude = latitude.strip() + longitude = longitude.strip() + + # remove symbols before saving... + latitude, longitude = _removesymbolsb4saving(latitude, longitude) + + # convert to pyexiv2.Rational for saving... + latitude = coords_to_rational(latitude) + longitude = coords_to_rational(longitude) + + return latituderef, latitude, longituderef, longitude + def strip_metadata(self, mediadatatags =None): """ Will completely and irrevocably erase all Exif metadata from this image. @@ -1435,11 +1510,19 @@ class EditExifMetadata(Gramplet): return if _MAGICK_FOUND: - erase = subprocess.check_call( ["convert", self.image_path, "-strip", self.image_path] ) - erase_results = str(erase) + try: + erase = subprocess.check_call( ["convert", self.image_path, "-strip", self.image_path] ) + erase_results = str(erase) + + except subprocess.CalledProcessError: + erase_results = False elif (_JHEAD_FOUND and self.extension in [".jpeg", ".jfif", ".jpg"]): - erase = subprocess.check_call( ["jhead", "-purejpeg", self.image_path] ) + try: + erase = subprocess.check_call( ["jhead", "-purejpeg", self.image_path] ) + + except subprocess.CalledProcessError: + erase_results = False else: if mediadatatags_: @@ -1458,33 +1541,12 @@ class EditExifMetadata(Gramplet): # Clear the Edit Areas self.model.clear() - # set Message Area to Delete... self.exif_widgets["MessageArea"].set_text(_("All Exif metadata has been " "deleted from this image...")) - self.update() - def update_spinners(self, syear, smonth, day, hour, minutes, seconds): - """ - update Date/ Time spinners. - """ - - for widget, value in { - "Year" : syear, - "Month" : smonth, - "Day" : day, - "Hour" : hour, - "Minutes" : minutes, - "Seconds" : seconds}.items(): - - # make sure that the amount of days for that year and month is not > than the number of days selected... - if widget == "Day": - numdays = [0] + [calendar.monthrange(year, month)[1] for year in [syear] for month in range(1, 13) ] - if value > numdays[smonth]: - value = numdays[smonth] - - # set the date/ time SpinButttons - self.exif_widgets[widget].set_value(value) + else: + self.exif_widgets["Message:Area"].set_text(_("There was an error in wiping the Exif metadata from your image...")) def _get_exif_keypairs(plugin_image): """ @@ -1498,8 +1560,36 @@ def _get_exif_keypairs(plugin_image): else chain( plugin_image.exif_keys, plugin_image.xmp_keys, plugin_image.iptc_keys) ) ] + return mediadatatags_ +def _removesymbolsb4saving(latitude, longitude): + """ + will recieve a DMS with symbols and return it without them + + @param: latitude -- Latitude GPS coordinates + @param: longitude -- GPS Longitude coordinates + """ + + # check to see if latitude/ longitude exist? + if (latitude and longitude): + + # remove degrees, minutes, seconds symbols if they exist in + # Latitude/ Longitude... + for symbol in ["°", "#", "먊", "′", "'", '″', '"']: + + if symbol in latitude: + latitude = latitude.replace(symbol, "") + + if symbol in longitude: + longitude = longitude.replace(symbol, "") + + # remove leading and trailing whitespace... + latitude = latitude.strip() + longitude = longitude.strip() + + return latitude, longitude + def string_to_rational(coordinate): """ convert string to rational variable for GPS @@ -1512,13 +1602,13 @@ def string_to_rational(coordinate): def coords_to_rational(Coordinates): """ - returns the rational equivalent for Latitude/ Longitude, gpsTimeStamp, + returns the rational equivalent for Latitude/ Longitude, and Altitude... """ - # Latitude, Longitude, gpsTimeStamp... - if ":" in Coordinates: + # Latitude, Longitude... + if " " in Coordinates: Coordinates = [string_to_rational(coordinate) - for coordinate in Coordinates.split(":")] + for coordinate in Coordinates.split(" ")] # Altitude... else: Coordinates = [string_to_rational(Coordinates)] @@ -1580,18 +1670,12 @@ def _parse_datetime(value): time_part = None if date_part.get_modifier() == Date.MOD_NONE and time_part is not None: - if (date_part.get_year() == 0 or - date_part.get_month() == 0 or - date_part.get_day() == 0): - # Partial date only - return None - else: - return datetime(date_part.get_year(), - date_part.get_month(), - date_part.get_day(), - time_part.tm_hour, - time_part.tm_min, - time_part.tm_sec) + return datetime(date_part.get_year(), + date_part.get_month(), + date_part.get_day(), + time_part.tm_hour, + time_part.tm_min, + time_part.tm_sec) else: return None