Hello community, here is the log from the commit of package python-exiv2 for openSUSE:Factory checked in at 2019-02-04 14:25:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-exiv2 (Old) and /work/SRC/openSUSE:Factory/.python-exiv2.new.28833 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-exiv2" Mon Feb 4 14:25:05 2019 rev:3 rq:670892 version:0.5.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-exiv2/python-exiv2.changes 2018-06-28 15:15:02.275414928 +0200 +++ /work/SRC/openSUSE:Factory/.python-exiv2.new.28833/python-exiv2.changes 2019-02-04 14:25:06.965062176 +0100 @@ -1,0 +2,13 @@ +Thu Jan 31 14:57:44 UTC 2019 - Andreas Schneider <[email protected]> + +- Update to version 0.5.0 + * Several fixes for exiv2-0.27 +- Removed exiv2-1.0.27.patch (fixed upstream) + +------------------------------------------------------------------- +Tue Jan 29 11:22:25 UTC 2019 - Tomáš Chvátal <[email protected]> + +- Add patch to build with latest exiv2 releases: + * exiv2-1.0.27.patch + +------------------------------------------------------------------- Old: ---- py3exiv2-0.3.0.tar.gz New: ---- py3exiv2-0.5.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-exiv2.spec ++++++ --- /var/tmp/diff_new_pack.3e5cSb/_old 2019-02-04 14:25:07.477061934 +0100 +++ /var/tmp/diff_new_pack.3e5cSb/_new 2019-02-04 14:25:07.477061934 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-exiv2 # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -12,32 +12,29 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # %{?!python_module:%define python_module() python-%{**} python3-%{**}} - # This is a python3 only package %define skip_python2 1 - Name: python-exiv2 -Version: 0.3.0 +Version: 0.5.0 Release: 0 Summary: Python3 bindings for the exiv2 library License: GPL-3.0-only Group: Development/Languages/Python -Url: https://launchpad.net/py3exiv2 +URL: https://launchpad.net/py3exiv2 Source: https://files.pythonhosted.org/packages/source/p/py3exiv2/py3exiv2-%{version}.tar.gz - BuildRequires: %{python_module devel} BuildRequires: %{python_module setuptools} BuildRequires: fdupes BuildRequires: gcc-c++ BuildRequires: libboost_python3-devel -BuildRequires: libexiv2-devel +BuildRequires: pkgconfig BuildRequires: python-rpm-macros - +BuildRequires: pkgconfig(exiv2) %python_subpackages %description ++++++ py3exiv2-0.3.0.tar.gz -> py3exiv2-0.5.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/PKG-INFO new/py3exiv2-0.5.0/PKG-INFO --- old/py3exiv2-0.3.0/PKG-INFO 2018-05-15 12:57:16.000000000 +0200 +++ new/py3exiv2-0.5.0/PKG-INFO 2019-01-30 12:16:29.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: py3exiv2 -Version: 0.3.0 +Version: 0.5.0 Summary: A Python3 binding to the library exiv2 Home-page: https://launchpad.net/py3exiv2 Author: Vincent Vande Vyvre diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/setup.cfg new/py3exiv2-0.5.0/setup.cfg --- old/py3exiv2-0.3.0/setup.cfg 2018-05-15 12:57:16.000000000 +0200 +++ new/py3exiv2-0.5.0/setup.cfg 2019-01-30 12:16:29.000000000 +0100 @@ -1,5 +1,4 @@ [egg_info] -tag_svn_revision = 0 tag_build = tag_date = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/setup.py new/py3exiv2-0.5.0/setup.py --- old/py3exiv2-0.3.0/setup.py 2018-05-15 11:16:06.000000000 +0200 +++ new/py3exiv2-0.5.0/setup.py 2019-01-30 11:49:14.000000000 +0100 @@ -43,7 +43,7 @@ setup( name='py3exiv2', - version='0.3.0', + version='0.5.0', description='A Python3 binding to the library exiv2', long_description=long_description, url='https://launchpad.net/py3exiv2', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/src/exiv2wrapper.cpp new/py3exiv2-0.5.0/src/exiv2wrapper.cpp --- old/py3exiv2-0.3.0/src/exiv2wrapper.cpp 2018-05-15 08:43:21.000000000 +0200 +++ new/py3exiv2-0.5.0/src/exiv2wrapper.cpp 2019-01-29 12:31:06.000000000 +0100 @@ -29,6 +29,7 @@ #include "boost/python/stl_iterator.hpp" #include <fstream> + // Custom error codes for Exiv2 exceptions #define METADATA_NOT_READ 101 #define NON_REPEATABLE 102 @@ -38,9 +39,17 @@ #define BUILTIN_NS 106 #define NOT_REGISTERED 107 +#if EXIV2_MAJOR_VERSION >= 1 || (EXIV2_MAJOR_VERSION == 0 && EXIV2_MINOR_VERSION >= 27) +#define HAVE_EXIV2_ERROR_CODE +#endif // Custom macros +#ifdef HAVE_EXIV2_ERROR_CODE +#define CHECK_METADATA_READ \ + if (!_dataRead) throw Exiv2::Error(Exiv2::kerErrorMessage, "metadata not read"); +#else #define CHECK_METADATA_READ \ if (!_dataRead) throw Exiv2::Error(METADATA_NOT_READ); +#endif namespace exiv2wrapper { @@ -51,7 +60,11 @@ // If an exception is thrown, it has to be done outside of the // Py_{BEGIN,END}_ALLOW_THREADS block. +#ifdef HAVE_EXIV2_ERROR_CODE + Exiv2::Error error = Exiv2::Error(Exiv2::kerSuccess); +#else Exiv2::Error error(0); +#endif // Release the GIL to allow other python threads to run // while opening the file. @@ -68,11 +81,19 @@ _image = Exiv2::ImageFactory::open(_filename); } } + +#ifdef HAVE_EXIV2_ERROR_CODE + catch (Exiv2::Error& err) + { + error = err; + } +#else catch (Exiv2::Error& err) { + std::cout << "Caught Exiv2 exception '" << err << "'\n"; error = err; } - +#endif // Re-acquire the GIL Py_END_ALLOW_THREADS @@ -132,7 +153,11 @@ { // If an exception is thrown, it has to be done outside of the // Py_{BEGIN,END}_ALLOW_THREADS block. +#ifdef HAVE_EXIV2_ERROR_CODE + Exiv2::Error error = Exiv2::Error(Exiv2::kerSuccess); +#else Exiv2::Error error(0); +#endif // Release the GIL to allow other python threads to run // while reading metadata. @@ -146,10 +171,17 @@ _xmpData = &_image->xmpData(); _dataRead = true; } +#ifdef HAVE_EXIV2_ERROR_CODE + catch (Exiv2::Error& err) + { + error = err; + } +#else catch (Exiv2::Error& err) { error = err; } +#endif // Re-acquire the GIL Py_END_ALLOW_THREADS @@ -166,7 +198,11 @@ // If an exception is thrown, it has to be done outside of the // Py_{BEGIN,END}_ALLOW_THREADS block. +#ifdef HAVE_EXIV2_ERROR_CODE + Exiv2::Error error = Exiv2::Error(Exiv2::kerSuccess); +#else Exiv2::Error error(0); +#endif // Release the GIL to allow other python threads to run // while writing metadata. @@ -176,10 +212,17 @@ { _image->writeMetadata(); } +#ifdef HAVE_EXIV2_ERROR_CODE + catch (Exiv2::Error& err) + { + error = err; + } +#else catch (Exiv2::Error& err) { error = err; } +#endif // Re-acquire the GIL Py_END_ALLOW_THREADS @@ -229,9 +272,15 @@ Exiv2::ExifKey exifKey = Exiv2::ExifKey(key); if(_exifData->findKey(exifKey) == _exifData->end()) +#ifdef HAVE_EXIV2_ERROR_CODE + { + throw Exiv2::Error(Exiv2::kerInvalidKey, key); + } +#else { throw Exiv2::Error(KEY_NOT_FOUND, key); } +#endif return ExifTag(key, &(*_exifData)[key], _exifData, _image->byteOrder()); } @@ -243,10 +292,15 @@ Exiv2::ExifKey exifKey = Exiv2::ExifKey(key); Exiv2::ExifMetadata::iterator datum = _exifData->findKey(exifKey); if(datum == _exifData->end()) +#ifdef HAVE_EXIV2_ERROR_CODE + { + throw Exiv2::Error(Exiv2::kerInvalidKey, key); + } +#else { throw Exiv2::Error(KEY_NOT_FOUND, key); } - +#endif _exifData->erase(datum); } @@ -276,10 +330,15 @@ Exiv2::IptcKey iptcKey = Exiv2::IptcKey(key); if(_iptcData->findKey(iptcKey) == _iptcData->end()) +#ifdef HAVE_EXIV2_ERROR_CODE + { + throw Exiv2::Error(Exiv2::kerInvalidKey, key); + } +#else { throw Exiv2::Error(KEY_NOT_FOUND, key); } - +#endif return IptcTag(key, _iptcData); } @@ -291,9 +350,15 @@ Exiv2::IptcMetadata::iterator dataIterator = _iptcData->findKey(iptcKey); if (dataIterator == _iptcData->end()) +#ifdef HAVE_EXIV2_ERROR_CODE + { + throw Exiv2::Error(Exiv2::kerInvalidKey, key); + } +#else { throw Exiv2::Error(KEY_NOT_FOUND, key); } +#endif while (dataIterator != _iptcData->end()) { @@ -329,9 +394,15 @@ Exiv2::XmpKey xmpKey = Exiv2::XmpKey(key); if(_xmpData->findKey(xmpKey) == _xmpData->end()) +#ifdef HAVE_EXIV2_ERROR_CODE + { + throw Exiv2::Error(Exiv2::kerInvalidKey, key); + } +#else { throw Exiv2::Error(KEY_NOT_FOUND, key); } +#endif return XmpTag(key, &(*_xmpData)[key]); } @@ -347,7 +418,15 @@ _xmpData->erase(i); } else - throw Exiv2::Error(KEY_NOT_FOUND, key); +#ifdef HAVE_EXIV2_ERROR_CODE + { + throw Exiv2::Error(Exiv2::kerInvalidKey, key); + } +#else + { + throw Exiv2::Error(KEY_NOT_FOUND, key); + } +#endif } const std::string Image::getComment() const @@ -389,7 +468,18 @@ void Image::copyMetadata(Image& other, bool exif, bool iptc, bool xmp) const { CHECK_METADATA_READ - if (!other._dataRead) throw Exiv2::Error(METADATA_NOT_READ); + if (!other._dataRead) + { +#ifdef HAVE_EXIV2_ERROR_CODE + { + throw Exiv2::Error(Exiv2::kerErrorMessage, "metadata not read"); + } +#else + { + throw Exiv2::Error(METADATA_NOT_READ); + } +#endif + } if (exif) other._image->setExifData(*_exifData); @@ -399,7 +489,7 @@ other._image->setXmpData(*_xmpData); } -std::string Image::getDataBuffer() const +boost::python::object Image::getDataBuffer() const { std::string buffer; @@ -450,7 +540,9 @@ // Re-acquire the GIL Py_END_ALLOW_THREADS - return buffer; + return boost::python::object(boost::python::handle<>( + PyBytes_FromStringAndSize(buffer.c_str(), buffer.size()) + )); } Exiv2::ByteOrder Image::getByteOrder() const @@ -547,7 +639,7 @@ // Conditional code, exiv2 0.21 changed APIs we need // (see https://bugs.launchpad.net/pyexiv2/+bug/684177). -#if EXIV2_TEST_VERSION(0,21,0) +#if EXIV2_MAJOR_VERSION >= 1 || (EXIV2_MAJOR_VERSION == 0 && EXIV2_MINOR_VERSION >= 21) Exiv2::ExifKey exifKey(key); _type = Exiv2::TypeInfo::typeName(exifKey.defaultTypeId()); // Where available, extract the type from the metadata, it is more reliable @@ -604,9 +696,17 @@ { int result = _datum->setValue(value); if (result != 0) +#ifdef HAVE_EXIV2_ERROR_CODE + { + std::string message("Invalid value: "); + message += value; + throw Exiv2::Error(Exiv2::kerInvalidDataset, message); + } +#else { throw Exiv2::Error(INVALID_VALUE); } +#endif } void ExifTag::setParentImage(Image& image) @@ -718,9 +818,17 @@ { ++nb_values; if (!_repeatable && (nb_values > 1)) +#ifdef HAVE_EXIV2_ERROR_CODE + { + std::string mssg("Tag not repeatable: "); + mssg += key; + throw Exiv2::Error(Exiv2::kerErrorMessage, mssg); + } +#else { throw Exiv2::Error(NON_REPEATABLE); } +#endif } } } @@ -740,7 +848,15 @@ { // The tag is not repeatable but we are trying to assign it more than // one value. +#ifdef HAVE_EXIV2_ERROR_CODE + { + throw Exiv2::Error(Exiv2::kerInvalidDataset, "Tag not repeatable"); + } +#else + { throw Exiv2::Error(NON_REPEATABLE); + } +#endif } unsigned int index = 0; @@ -754,9 +870,19 @@ // Override an existing value int result = iterator->setValue(value); if (result != 0) +#ifdef HAVE_EXIV2_ERROR_CODE + { + std::string mssg("Invalid value: "); + mssg += value; + // there's no invalid value error in libexiv2, so we use + // kerInvalidDataset wich raise a Python ValueError + throw Exiv2::Error(Exiv2::kerInvalidDataset, mssg); + } +#else { throw Exiv2::Error(INVALID_VALUE); } +#endif // Jump to the next datum matching the key ++iterator; while ((iterator != _data->end()) && (iterator->key() != _key.key())) @@ -770,14 +896,30 @@ Exiv2::Iptcdatum datum(_key); int result = datum.setValue(value); if (result != 0) +#ifdef HAVE_EXIV2_ERROR_CODE + { + std::string mssg("Invalid value: "); + mssg += value; + throw Exiv2::Error(Exiv2::kerErrorMessage, mssg); + } +#else { throw Exiv2::Error(INVALID_VALUE); } +#endif int state = _data->add(datum); if (state == 6) +#ifdef HAVE_EXIV2_ERROR_CODE + { + std::string mssg("Tag not repeatable: "); + mssg += _key.key(); + throw Exiv2::Error(Exiv2::kerErrorMessage, mssg); + } +#else { throw Exiv2::Error(NON_REPEATABLE); } +#endif // Reset iterator that has been invalidated by appending a datum iterator = _data->end(); } @@ -1003,6 +1145,19 @@ const boost::python::list XmpTag::getArrayValue() { +#ifdef HAVE_EXIV2_ERROR_CODE + // We can't use &_datum->value())->value_ because value_ is private in + // this context (change in libexiv2 0.27) + const Exiv2::XmpArrayValue* xav = + dynamic_cast<const Exiv2::XmpArrayValue*>(&_datum->value()); + boost::python::list rvalue; + for(int i = 0; i < xav->count(); ++i) + { + std::string value = xav->toString(i); + rvalue.append(value); + } + return rvalue; +#else std::vector<std::string> value = dynamic_cast<const Exiv2::XmpArrayValue*>(&_datum->value())->value_; boost::python::list rvalue; @@ -1012,6 +1167,7 @@ rvalue.append(*i); } return rvalue; +#endif } const boost::python::dict XmpTag::getLangAltValue() @@ -1058,7 +1214,352 @@ fd.close(); } +#ifdef HAVE_EXIV2_ERROR_CODE +void translateExiv2Error(Exiv2::Error const& error) +{ + // Use the Python 'C' API to set up an exception object + const char* message = error.what(); + int code = error.code(); + printf("%s: %d\n", message, code); + //int code = error.code(); + //message += (char *) code; + // The type of the Python exception depends on the error code + // Warning: this piece of code should be updated in case the error codes + // defined by Exiv2 (file 'src/error.cpp') are changed + switch (error.code()) + { + case 1: + // kerErrorMessage Unidentified error + PyErr_SetString(PyExc_RuntimeError, message); + break; + case 2: + // kerCallFailed {path}: Call to `{function}' failed: {strerror} + // May be raised when reading a file + PyErr_SetString(PyExc_RuntimeError, message); + break; + case 3: + // kerNotAnImage This does not look like a {image type} image + // May be raised by readMetadata() + PyErr_SetString(PyExc_IOError, message); + break; + case 4: + // kerInvalidDataset Invalid dataset name `{dataset name}' + PyErr_SetString(PyExc_ValueError, message); + break; + case 5: + // kerInvalidRecord Invalid record name `{record name}' + // May be raised when instantiating an IptcKey from a string + PyErr_SetString(PyExc_KeyError, message); + break; + case 6: + // kerInvalidKey Invalid key `{key}' + // May be raised when instantiating an ExifKey, an IptcKey or an + // XmpKey from a string + PyErr_SetString(PyExc_KeyError, message); + break; + case 7: + // kerInvalidTag + // Invalid tag name or ifdId `{tag name}', ifdId {ifdId} + // May be raised when instantiating an ExifKey from a string + PyErr_SetString(PyExc_KeyError, message); + break; + case 8: + // kerValueNotSet Value not set + // May be raised when calling value() on a datum + PyErr_SetString(PyExc_ValueError, message); + break; + case 9: + // kerDataSourceOpenFailed + // {path}: Failed to open the data source: {strerror} + // May be raised by readMetadata() + PyErr_SetString(PyExc_IOError, message); + break; + case 10: + // kerFileOpenFailed + // {path}: Failed to open file ({mode}): {strerror} + // May be raised by writeMetadata() + PyErr_SetString(PyExc_IOError, message); + break; + case 11: + // kerFileOpenFailed + // {path}: The file contains data of an unknown image type + // May be raised when opening an image + PyErr_SetString(PyExc_TypeError, message); + break; + case 12: + // kerMemoryContainsUnknownImageType + //The memory contains data of an unknown image type + // May be raised when instantiating an image from a data buffer + PyErr_SetString(PyExc_IOError, message); + break; + case 13: + // kerUnsupportedImageType Image type {image type} is not supported + // May be raised when creating a new image + PyErr_SetString(PyExc_IOError, message); + break; + case 14: + // kerFailedToReadImageData Failed to read image data + // May be raised by readMetadata() + PyErr_SetString(PyExc_IOError, message); + break; + case 15: + // kerNotAJpeg This does not look like a JPEG image + // May be raised by readMetadata() + PyErr_SetString(PyExc_IOError, message); + break; + case 17: + // kerFileRenameFailed + // {old path}: Failed to rename file to {new path}: {strerror} + // May be raised by writeMetadata() + PyErr_SetString(PyExc_IOError, message); + break; + case 18: + // kerTransferFailed {path}: Transfer failed: {strerror} + // May be raised by writeMetadata() + PyErr_SetString(PyExc_IOError, message); + break; + case 19: + // kerMemoryTransferFailed Memory transfer failed: {strerror} + // May be raised by writeMetadata() + PyErr_SetString(PyExc_IOError, message); + break; + case 20: + // kerInputDataReadFailed Failed to read input data + // May be raised by writeMetadata() + PyErr_SetString(PyExc_IOError, message); + break; + case 21: + // kerImageWriteFailed Failed to write image + // May be raised by writeMetadata() + PyErr_SetString(PyExc_IOError, message); + break; + case 22: + // kerNoImageInInputData Input data does not contain a valid image + // May be raised by writeMetadata() + PyErr_SetString(PyExc_IOError, message); + break; + case 23: + // kerInvalidIfdId Invalid ifdId {ifdId} + // May be raised when instantiating an ExifKey from a tag and + // IFD item string + PyErr_SetString(PyExc_KeyError, message); + break; + case 24: + // kerValueTooLarge + // Entry::setValue: Value too large {tag}, {size}, {requested} + PyErr_SetString(PyExc_ValueError, message); + break; + case 25: + // kerDataAreaValueTooLarge + // Entry::setDataArea: Value too large {tag}, {size}, {requested} + PyErr_SetString(PyExc_ValueError, message); + break; + case 26: + // kerOffsetOutOfRange Offset out of range + // May be raised by writeMetadata() (TIFF) + PyErr_SetString(PyExc_IOError, message); + break; + case 27: + // kerUnsupportedDataAreaOffsetType + // Unsupported data area offset type + // May be raised by writeMetadata() (TIFF) + PyErr_SetString(PyExc_IOError, message); + break; + case 28: + // kerInvalidCharset Invalid charset: `{charset name}' + // May be raised when instantiating a CommentValue from a string + PyErr_SetString(PyExc_ValueError, message); + break; + case 29: + // kerUnsupportedDateFormat Unsupported date format + // May be raised when instantiating a DateValue from a string + PyErr_SetString(PyExc_ValueError, message); + break; + case 30: + // kerUnsupportedTimeFormat Unsupported time format + // May be raised when instantiating a TimeValue from a string + PyErr_SetString(PyExc_ValueError, message); + break; + case 31: + // kerWritingImageFormatUnsupported + // Writing to {image format} images is not supported + // May be raised by writeMetadata() for certain image types + PyErr_SetString(PyExc_IOError, message); + break; + case 32: + // kerInvalidSettingForImage + // Setting {metadata type} in {image format} images is not supported + // May be raised when setting certain types of metadata for certain + // image types that don't support them + PyErr_SetString(PyExc_ValueError, message); + break; + case 33: + // kerNotACrwImage This does not look like a CRW image + // May be raised by readMetadata() (CRW) + PyErr_SetString(PyExc_IOError, message); + break; + case 34: + // kerFunctionNotSupported {function}: Not supported + PyErr_SetString(PyExc_IOError, message); + break; + case 35: + // kerNoNamespaceInfoForXmpPrefix + // No namespace info available for XMP prefix `{prefix}' + // May be raised when retrieving property info for an XmpKey + PyErr_SetString(PyExc_KeyError, message); + break; + case 36: + // kerNoPrefixForNamespace + // No prefix registered for namespace `{namespace}', needed for + // property path `{property path}' + // May be raised by readMetadata() when reading the XMP data + PyErr_SetString(PyExc_KeyError, message); + break; + case 37: + // kerTooLargeJpegSegment + // Size of {type of metadata} JPEG segment is larger than + // 65535 bytes + // May be raised by writeMetadata() (JPEG) + PyErr_SetString(PyExc_ValueError, message); + break; + case 38: + // kerUnhandledXmpdatum + // Unhandled Xmpdatum {key} of type {value type} + // May be raised by readMetadata() when reading the XMP data + PyErr_SetString(PyExc_TypeError, message); + break; + case 39: + // kerUnhandledXmpNode + // Unhandled XMP node {key} with opt={XMP Toolkit option flags} + // May be raised by readMetadata() when reading the XMP data + PyErr_SetString(PyExc_TypeError, message); + break; + case 40: + // kerXMPToolkitError + // XMP Toolkit error {error id}: {error message} + // May be raised by readMetadata() when reading the XMP data + PyErr_SetString(PyExc_RuntimeError, message); + break; + case 41: + // kerDecodeLangAltPropertyFailed + // Failed to decode Lang Alt property {property path} + // with opt={XMP Toolkit option flags} + // May be raised by readMetadata() when reading the XMP data + PyErr_SetString(PyExc_ValueError, message); + break; + case 42: + // kerDecodeLangAltQualifierFailed + // Failed to decode Lang Alt qualifier {qualifier path} + // with opt={XMP Toolkit option flags} + // May be raised by readMetadata() when reading the XMP data + PyErr_SetString(PyExc_ValueError, message); + break; + case 43: + // kerEncodeLangAltPropertyFailed + // Failed to encode Lang Alt property {key} + // May be raised by writeMetadata() + PyErr_SetString(PyExc_ValueError, message); + break; + case 44: + // kerPropertyNameIdentificationFailed + // Failed to determine property name from path {property path}, + // namespace {namespace} + // May be raised by readMetadata() when reading the XMP data + PyErr_SetString(PyExc_KeyError, message); + break; + case 45: + // kerSchemaNamespaceNotRegistered + // Schema namespace {namespace} is not registered with + // the XMP Toolkit + // May be raised by readMetadata() when reading the XMP data + PyErr_SetString(PyExc_ValueError, message); + break; + case 46: + // kerNoNamespaceForPrefix + // No namespace registered for prefix `{prefix}' + // May be raised when instantiating an XmpKey from a string + PyErr_SetString(PyExc_KeyError, message); + break; + case 47: + // kerAliasesNotSupported + // Aliases are not supported. Please send this XMP packet + // to [email protected] `{namespace}', `{property path}', `{value}' + // May be raised by readMetadata() when reading the XMP data + PyErr_SetString(PyExc_ValueError, message); + break; + case 48: + // kerInvalidXmpText + // Invalid XmpText type `{type}' + // May be raised when instantiating an XmpTextValue from a string + PyErr_SetString(PyExc_TypeError, message); + break; + case 49: + // kerTooManyTiffDirectoryEntries + // TIFF directory {TIFF directory name} has too many entries + // May be raised by writeMetadata() (TIFF) + PyErr_SetString(PyExc_IOError, message); + break; + // Added in py3exiv2 + case 50: + // kerMultipleTiffArrayElementTagsInDirectory + // Multiple TIFF array element tags {number} in one directory") + // May be raised by readMetadata() (TIFF) + PyErr_SetString(PyExc_IOError, message); + break; + case 51: + // kerWrongTiffArrayElementTagType + // TIFF array element tag {number} has wrong type") }, // %1=tag number + // May be raised by readMetadata() (TIFF) + PyErr_SetString(PyExc_TypeError, message); + break; + // Added in libexiv2 0.27 + case 52: + // kerInvalidKeyXmpValue {key} has invalid XMP value type {type} + // May be raised by readMetadata() when reading the XMP data + PyErr_SetString(PyExc_ValueError, message); + break; + case 53: + // kerInvalidIccProfile Not a valid ICC Profile + PyErr_SetString(PyExc_ValueError, message); + break; + case 54: + // kerInvalidXMP Not valid XMP + PyErr_SetString(PyExc_TypeError, message); + break; + case 55: + // kerTiffDirectoryTooLarge tiff directory length is too large + PyErr_SetString(PyExc_ValueError, message); + break; + case 56: + // kerInvalidTypeValue + // Invalid type value detected in Image::printIFDStructure + PyErr_SetString(PyExc_TypeError, message); + break; + case 57: + // kerInvalidMalloc + // Invalid memory allocation request + PyErr_SetString(PyExc_MemoryError, message); + break; + case 58: + // kerCorruptedMetadata Corrupted image metadata + PyErr_SetString(PyExc_IOError, message); + break; + case 59: + // kerArithmeticOverflow Arithmetic operation overflow + PyErr_SetString(PyExc_OverflowError, message); + break; + case 60: + // kerMallocFailed Memory allocation failed + PyErr_SetString(PyExc_MemoryError, message); + break; + // Default handler + default: + PyErr_SetString(PyExc_RuntimeError, message); + } +} + +#else void translateExiv2Error(Exiv2::Error const& error) { // Use the Python 'C' API to set up an exception object @@ -1119,7 +1620,7 @@ case 11: // {path}: The file contains data of an unknown image type // May be raised when opening an image - PyErr_SetString(PyExc_IOError, message); + PyErr_SetString(PyExc_TypeError, message); break; case 12: // The memory contains data of an unknown image type @@ -1345,6 +1846,7 @@ PyErr_SetString(PyExc_RuntimeError, message); } } +#endif void registerXmpNs(const std::string& name, const std::string& prefix) @@ -1353,6 +1855,7 @@ { const std::string& ns = Exiv2::XmpProperties::ns(prefix); } + catch (Exiv2::Error& error) { // No namespace exists with the requested prefix, it is safe to @@ -1360,7 +1863,17 @@ Exiv2::XmpProperties::registerNs(name, prefix); return; } - throw Exiv2::Error(EXISTING_PREFIX, prefix); +#ifdef HAVE_EXIV2_ERROR_CODE + { + std::string mssg("Namespace already exists: "); + mssg += prefix; + throw Exiv2::Error(Exiv2::kerInvalidKey, mssg); + } +#else + { + throw Exiv2::Error(EXISTING_PREFIX, prefix); + } +#endif } void unregisterXmpNs(const std::string& name) @@ -1379,12 +1892,30 @@ return; } // The namespace hasn’t been unregistered because it’s builtin. - throw Exiv2::Error(BUILTIN_NS, name); +#ifdef HAVE_EXIV2_ERROR_CODE + { + std::string mssg("Can't unregister builtin namespace: "); + mssg += name; + throw Exiv2::Error(Exiv2::kerInvalidKey, mssg); + } +#else + { + throw Exiv2::Error(BUILTIN_NS, name); + } +#endif } else +#ifdef HAVE_EXIV2_ERROR_CODE + { + std::string mssg("Namespace does not exists: "); + mssg += name; + throw Exiv2::Error(Exiv2::kerInvalidKey, mssg); + } +#else { throw Exiv2::Error(NOT_REGISTERED, name); - } + } +#endif } void unregisterAllXmpNs() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/src/exiv2wrapper.hpp new/py3exiv2-0.5.0/src/exiv2wrapper.hpp --- old/py3exiv2-0.3.0/src/exiv2wrapper.hpp 2018-05-15 08:43:02.000000000 +0200 +++ new/py3exiv2-0.5.0/src/exiv2wrapper.hpp 2019-01-29 12:21:47.000000000 +0100 @@ -1,7 +1,7 @@ // ***************************************************************************** /* * Copyright (C) 2006-2010 Olivier Tilloy <[email protected]> - * Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]> + * Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]> * * This file is part of the py3exiv2 distribution. * @@ -248,7 +248,7 @@ void copyMetadata(Image& other, bool exif=true, bool iptc=true, bool xmp=true) const; // Return the image data buffer. - std::string getDataBuffer() const; + boost::python::object getDataBuffer() const; // Accessors Exiv2::ExifData* getExifData() { return _exifData; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/src/exiv2wrapper_python.cpp new/py3exiv2-0.5.0/src/exiv2wrapper_python.cpp --- old/py3exiv2-0.3.0/src/exiv2wrapper_python.cpp 2018-05-15 08:44:07.000000000 +0200 +++ new/py3exiv2-0.5.0/src/exiv2wrapper_python.cpp 2019-01-29 12:23:14.000000000 +0100 @@ -1,7 +1,7 @@ // ***************************************************************************** /* * Copyright (C) 2006-2012 Olivier Tilloy <[email protected]> - * Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]> + * Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]> * * This file is part of the pyexiv2 distribution. * diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/src/py3exiv2.egg-info/PKG-INFO new/py3exiv2-0.5.0/src/py3exiv2.egg-info/PKG-INFO --- old/py3exiv2-0.3.0/src/py3exiv2.egg-info/PKG-INFO 2018-05-15 12:57:16.000000000 +0200 +++ new/py3exiv2-0.5.0/src/py3exiv2.egg-info/PKG-INFO 2019-01-30 12:16:29.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: py3exiv2 -Version: 0.3.0 +Version: 0.5.0 Summary: A Python3 binding to the library exiv2 Home-page: https://launchpad.net/py3exiv2 Author: Vincent Vande Vyvre diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/__init__.py new/py3exiv2-0.5.0/src/pyexiv2/__init__.py --- old/py3exiv2-0.3.0/src/pyexiv2/__init__.py 2018-05-15 08:49:05.000000000 +0200 +++ new/py3exiv2-0.5.0/src/pyexiv2/__init__.py 2019-01-30 08:40:24.000000000 +0100 @@ -3,7 +3,7 @@ # ****************************************************************************** # # Copyright (C) 2006-2011 Olivier Tilloy <[email protected]> -# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]> +# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]> # # This file is part of the py3exiv2 distribution. # @@ -75,7 +75,7 @@ #: A tuple containing the three components of the version number: major, minor, micro. -version_info = (0, 3, 0) +version_info = (0, 5, 0) #: The version of the module as a string (major.minor.micro). __version__ = _make_version(version_info) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/exif.py new/py3exiv2-0.5.0/src/pyexiv2/exif.py --- old/py3exiv2-0.3.0/src/pyexiv2/exif.py 2018-02-02 14:19:27.000000000 +0100 +++ new/py3exiv2-0.5.0/src/pyexiv2/exif.py 2019-01-30 08:40:36.000000000 +0100 @@ -3,7 +3,7 @@ # ****************************************************************************** # # Copyright (C) 2006-2011 Olivier Tilloy <[email protected]> -# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]> +# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]> # # This file is part of the py3exiv2 distribution. # diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/iptc.py new/py3exiv2-0.5.0/src/pyexiv2/iptc.py --- old/py3exiv2-0.3.0/src/pyexiv2/iptc.py 2018-02-02 14:29:01.000000000 +0100 +++ new/py3exiv2-0.5.0/src/pyexiv2/iptc.py 2019-01-30 08:40:55.000000000 +0100 @@ -3,7 +3,7 @@ # ****************************************************************************** # # Copyright (C) 2006-2011 Olivier Tilloy <[email protected]> -# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]> +# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]> # # This file is part of the py3exiv2 distribution. # diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/metadata.py new/py3exiv2-0.5.0/src/pyexiv2/metadata.py --- old/py3exiv2-0.3.0/src/pyexiv2/metadata.py 2018-05-15 09:05:09.000000000 +0200 +++ new/py3exiv2-0.5.0/src/pyexiv2/metadata.py 2019-01-30 08:41:11.000000000 +0100 @@ -3,7 +3,7 @@ # ****************************************************************************** # # Copyright (C) 2006-2011 Olivier Tilloy <[email protected]> -# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]> +# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]> # # This file is part of the py3exiv2 distribution. # @@ -477,11 +477,12 @@ @property def buffer(self): - """The image buffer as a string. - """ - #XXX Deprecated - return + The image buffer as a string. + If metadata has been modified, the data won't be up-to-date until + :meth:`.write` has been called. + """ + return self._image._getDataBuffer() @property def exif_thumbnail(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/preview.py new/py3exiv2-0.5.0/src/pyexiv2/preview.py --- old/py3exiv2-0.3.0/src/pyexiv2/preview.py 2018-02-02 14:38:54.000000000 +0100 +++ new/py3exiv2-0.5.0/src/pyexiv2/preview.py 2019-01-30 08:41:48.000000000 +0100 @@ -3,7 +3,7 @@ # ****************************************************************************** # # Copyright (C) 2010 Olivier Tilloy <[email protected]> -# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]> +# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]> # # This file is part of the py3exiv2 distribution. # @@ -68,13 +68,14 @@ """ return self.__preview.dimensions - @property - def data(self): - """The preview image data buffer. - - """ - buf = bytes(self.__preview.data) - return buf + #@property + #def data(self): + #"""The preview image data buffer. + + #""" + # TODO + #buf = bytes(self.__preview.data) + #return buf def write_to_file(self, path): """Write the preview image to a file on disk. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/utils.py new/py3exiv2-0.5.0/src/pyexiv2/utils.py --- old/py3exiv2-0.3.0/src/pyexiv2/utils.py 2018-02-02 15:26:42.000000000 +0100 +++ new/py3exiv2-0.5.0/src/pyexiv2/utils.py 2019-01-30 08:42:17.000000000 +0100 @@ -3,7 +3,7 @@ # ****************************************************************************** # # Copyright (C) 2006-2012 Olivier Tilloy <[email protected]> -# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]> +# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]> # # This file is part of the py3exiv2 distribution. # diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/xmp.py new/py3exiv2-0.5.0/src/pyexiv2/xmp.py --- old/py3exiv2-0.3.0/src/pyexiv2/xmp.py 2018-05-15 08:52:04.000000000 +0200 +++ new/py3exiv2-0.5.0/src/pyexiv2/xmp.py 2019-01-30 08:43:19.000000000 +0100 @@ -3,7 +3,7 @@ # ****************************************************************************** # # Copyright (C) 2006-2011 Olivier Tilloy <[email protected]> -# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]> +# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]> # # This file is part of the py3exiv2 distribution. #
