initial import
This commit is contained in:
34
mirage/PKGBUILD
Normal file
34
mirage/PKGBUILD
Normal file
@@ -0,0 +1,34 @@
|
||||
# Maintainer: Jesus E. <heckyel@riseup.net>
|
||||
|
||||
pkgname=mirage
|
||||
pkgver=1.0_pre2
|
||||
pkgrel=2
|
||||
pkgdesc="A simple GTK+ Image Viewer"
|
||||
url='https://sourceforge.net/projects/mirageiv.berlios/'
|
||||
license=('GPL-3')
|
||||
arch=('i686' 'x86_64')
|
||||
depends=('tauthon-pygtk' 'libexif')
|
||||
makedepends=('tauthon' 'gettext-tiny')
|
||||
source=(http://downloads.sourceforge.net/project/mirageiv.berlios/${pkgname}-${pkgver}.tar.bz2
|
||||
exif.patch
|
||||
exif.c)
|
||||
sha512sums=('90050376461e5e6b28cdaeaee9da21b168231dc10a1f6551e841742a8fd5b0c34c8ac58e02c76fcb1c628d6205d5c20655e31daa2a06372cf354ff8956479846'
|
||||
'22d508994144f93a4cf9a4129da6f9689e10fb5de1c6a4e6f59ff5adde1b59be157122e8bd13ab6e15ce1d2fa4011e15d6b4239ad6ce3e6f6cdea0b983f3c25a'
|
||||
'019c4e60155d373f11fb13156c509ef6c9f6e18a05c9b76af06ed649604ee7f703c9913a51960d3dedb6226279ec7f261e48e1599ca0dd76433bd73d053a2040')
|
||||
|
||||
prepare() {
|
||||
cd "${pkgname}-${pkgver}"
|
||||
patch --forward --strip=1 --input="${srcdir}/exif.patch"
|
||||
cp "${srcdir}/exif.c" .
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "${pkgname}-${pkgver}"
|
||||
tauthon setup.py build
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "${pkgname}-${pkgver}"
|
||||
tauthon setup.py install --root="${pkgdir}" --optimize=1 --skip-build
|
||||
install -Dm644 COPYING -t "${pkgdir}/usr/share/licenses/$pkgname"
|
||||
}
|
||||
206
mirage/exif.c
Normal file
206
mirage/exif.c
Normal file
@@ -0,0 +1,206 @@
|
||||
// This module is a replacement for pyexiv2 in the mirage image viewer.
|
||||
//
|
||||
// pyexiv2 is a Python 2 binding to the exiv2, a popular library for reading
|
||||
// EXIF, IPTC and XMP metadata from image files. mirage 1.0_pre1 and later uses
|
||||
// it to get some basic metadata like image orientation, camera model and some
|
||||
// other tags related to picture-taking. This library is not required, but is
|
||||
// nice to have. The problem is that pyexiv2 depends on an outdated version of
|
||||
// exiv2, so it can't be compiled with the latest one (0.27.2). I had the
|
||||
// following choices:
|
||||
//
|
||||
// 1. Use libgexiv2, it provides Python bindings through PyGObject. The problem
|
||||
// is that PyGObject uses GTK3 and mirage is written with GTK2 (PyGTK), this
|
||||
// would require porting the entire application to GTK3 and this is not a
|
||||
// very straigh-forward solution.
|
||||
// 2. Use py3exiv2 which supports only Python 3. But PyGTK does not support
|
||||
// Python 3. So again, I'd need to port mirage to GTK3 and this has the
|
||||
// exact same problems that solution #1 has.
|
||||
// 3. Use GObject 2 which works on Python 2. However, libgexiv2 doesn't provide
|
||||
// bindings for GObject 2.
|
||||
// 4. Patch pyexiv2 so that it can be compiled with modern exiv2. This is a
|
||||
// very hard task for me since I don't have much experience with C/C++,
|
||||
// Boost.Python and Python internals. And nobody needs this binding nowadays
|
||||
// anyway.
|
||||
// 5. Create a replacement bindings for exiv2 just for this application. I
|
||||
// tried to do this, but quickly abandoned this idea because C++ is just too
|
||||
// hard for me.
|
||||
//
|
||||
// Then I examined the source code of mirage and noticed that it only uses EXIF
|
||||
// metadata and ignores IPTC and XMP. I quickly found a popular C library for
|
||||
// parsing EXIF called libexif. "Why not use a Python library?" you might ask.
|
||||
// Well, for two reasons:
|
||||
//
|
||||
// a) I was packaging mirage for latest version of mirage (1.0_pre2) for AUR
|
||||
// (Arch User Repository) and decided to use a well-known library which can
|
||||
// be found in official Arch Linux repositories and is used by other popular
|
||||
// applications. libexif is a perfect candidate because it is in the 'extra'
|
||||
// repo and is used by GIMP, PCManFM, Thunar, Ristretto and (indirectly)
|
||||
// Mono.
|
||||
// b) libexif is written in C and I wrote C for Arduino in the past, plus I
|
||||
// have a lot of experience with Rust. It ain't much, but I wanted to learn
|
||||
// something new.
|
||||
//
|
||||
// So, I decided to write a Python extension in C that is a binding to libexif
|
||||
// that allows you only to read metadata of an image file (because that's the
|
||||
// only feature mirage needs).
|
||||
|
||||
// Useful Links:
|
||||
// https://libexif.github.io/api/index.html
|
||||
// https://github.com/libexif/libexif
|
||||
// https://docs.python.org/2/extending/extending.html
|
||||
// https://docs.python.org/2/c-api/concrete.html
|
||||
// https://pythonextensionpatterns.readthedocs.io/en/latest/refcount.html
|
||||
// https://www.exif.org/Exif2-2.PDF
|
||||
|
||||
#include <Python.h>
|
||||
#include <libexif/exif-data.h>
|
||||
|
||||
// Converts a numeric value stored in an EXIF entry to a Python object. Returns
|
||||
// NULL If a non-numeric format is provided.
|
||||
PyObject* mirage_exif_number_to_py(const unsigned char* ptr, ExifFormat format, ExifByteOrder bo) {
|
||||
PyObject* py_num = NULL;
|
||||
switch (format) {
|
||||
// Size of all EXIF integers is <= 32 bits, so they can be safely stored in
|
||||
// PyInt. All numeric types are signed by default and 'S' in type names
|
||||
// means 'signed'.
|
||||
// 8-bit
|
||||
case EXIF_FORMAT_BYTE:
|
||||
case EXIF_FORMAT_SBYTE:
|
||||
py_num = PyInt_FromLong(*ptr);
|
||||
break;
|
||||
// 16-bit
|
||||
case EXIF_FORMAT_SHORT:
|
||||
py_num = PyInt_FromLong(exif_get_short(ptr, bo));
|
||||
break;
|
||||
case EXIF_FORMAT_SSHORT:
|
||||
py_num = PyInt_FromLong(exif_get_sshort(ptr, bo));
|
||||
break;
|
||||
// 32-bit
|
||||
case EXIF_FORMAT_LONG:
|
||||
py_num = PyInt_FromLong(exif_get_long(ptr, bo));
|
||||
break;
|
||||
case EXIF_FORMAT_SLONG:
|
||||
py_num = PyInt_FromLong(exif_get_slong(ptr, bo));
|
||||
break;
|
||||
// rational numbers consist of two LONGs, they are represented as a PyTuple
|
||||
// with two PyInts
|
||||
// TODO: can code duplication be reduced here?
|
||||
case EXIF_FORMAT_RATIONAL: {
|
||||
ExifRational r = exif_get_rational(ptr, bo);
|
||||
PyObject* n = PyInt_FromLong(r.numerator);
|
||||
PyObject* d = PyInt_FromLong(r.denominator);
|
||||
py_num = PyTuple_Pack(2, n, d);
|
||||
Py_DECREF(n);
|
||||
Py_DECREF(d);
|
||||
} break;
|
||||
case EXIF_FORMAT_SRATIONAL: {
|
||||
ExifSRational r = exif_get_srational(ptr, bo);
|
||||
PyObject* n = PyInt_FromLong(r.numerator);
|
||||
PyObject* d = PyInt_FromLong(r.denominator);
|
||||
py_num = PyTuple_Pack(2, n, d);
|
||||
Py_DECREF(n);
|
||||
Py_DECREF(d);
|
||||
} break;
|
||||
}
|
||||
return py_num;
|
||||
}
|
||||
|
||||
// Converts contents of an EXIF entry to a Python object.
|
||||
PyObject* mirage_exif_entry_to_py(ExifEntry* e, ExifByteOrder byte_order) {
|
||||
PyObject* py_value = NULL;
|
||||
switch (e->format) {
|
||||
case EXIF_FORMAT_BYTE:
|
||||
case EXIF_FORMAT_SBYTE:
|
||||
case EXIF_FORMAT_SHORT:
|
||||
case EXIF_FORMAT_SSHORT:
|
||||
case EXIF_FORMAT_LONG:
|
||||
case EXIF_FORMAT_SLONG:
|
||||
case EXIF_FORMAT_RATIONAL:
|
||||
case EXIF_FORMAT_SRATIONAL:
|
||||
// numeric values are stored in a PyList even if e->components == 1 to
|
||||
// reduce code complexity
|
||||
py_value = PyList_New(e->components);
|
||||
unsigned char format_size = exif_format_get_size(e->format);
|
||||
for (Py_ssize_t i = 0; i < e->components; i++) {
|
||||
const unsigned char* ptr = e->data + i*format_size;
|
||||
PyObject* py_num = mirage_exif_number_to_py(ptr, e->format, byte_order);
|
||||
// Note that PyList_SetItem does not increase refcount of added item
|
||||
// (py_num in this case), documentation says that it "steals" a
|
||||
// reference to it, so refcount shouldn't be decremented here.
|
||||
PyList_SetItem(py_value, i, py_num);
|
||||
}
|
||||
break;
|
||||
|
||||
case EXIF_FORMAT_ASCII:
|
||||
// ASCII entries contain a null-terminated string of bytes with 7-bit
|
||||
// ASCII codes. 1 is subtracted here to chop off the last null ('\0')
|
||||
// byte.
|
||||
py_value = PyString_FromStringAndSize(e->data, e->size ? e->size - 1 : 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
// Content of an entry with an unknown format (including
|
||||
// EXIF_FORMAT_UNDEFINED) is simply converted to a PyByteArray.
|
||||
py_value = PyByteArray_FromStringAndSize(e->data, e->size);
|
||||
}
|
||||
return py_value;
|
||||
}
|
||||
|
||||
// Converts all entries inside an IFD (image file directory) to a PyDict with
|
||||
// EXIF tag names as keys and entry values (see mirage_exif_entry_to_py) as
|
||||
// values.
|
||||
PyObject* mirage_exif_ifd_entries_to_py(ExifContent* c, ExifIfd ifd, ExifByteOrder byte_order) {
|
||||
PyObject* py_entries = PyDict_New();
|
||||
|
||||
for (Py_ssize_t i = 0; i < c->count; i++) {
|
||||
ExifEntry* entry = c->entries[i];
|
||||
if (!entry) continue;
|
||||
|
||||
const char* tag_name = exif_tag_get_name_in_ifd(entry->tag, ifd);
|
||||
PyObject* py_entry_value = mirage_exif_entry_to_py(entry, byte_order);
|
||||
PyDict_SetItemString(py_entries, tag_name, py_entry_value);
|
||||
Py_DECREF(py_entry_value);
|
||||
}
|
||||
|
||||
return py_entries;
|
||||
}
|
||||
|
||||
// Reads EXIF metadata from a file and returns a PyDict with IFD names ('EXIF',
|
||||
// '0', '1', 'GPS' etc, see EXIF specification) as keys and PyDicts of IFD
|
||||
// entries (see mirage_exif_ifd_entries_to_py) as values.
|
||||
PyObject* mirage_exif_read_metadata(PyObject* self, PyObject* args) {
|
||||
const char* filename;
|
||||
int filename_len;
|
||||
if (!PyArg_ParseTuple(args, "s#", &filename, &filename_len))
|
||||
return NULL;
|
||||
|
||||
ExifData* data = exif_data_new_from_file(filename);
|
||||
if (!data) Py_RETURN_NONE;
|
||||
|
||||
ExifByteOrder byte_order = exif_data_get_byte_order(data);
|
||||
|
||||
PyObject* py_dict = PyDict_New();
|
||||
|
||||
for (ExifIfd ifd = 0; ifd < EXIF_IFD_COUNT; ifd++) {
|
||||
ExifContent* content = data->ifd[ifd];
|
||||
if (!content) continue;
|
||||
|
||||
const char* ifd_name = exif_ifd_get_name(ifd);
|
||||
PyObject* py_entries = mirage_exif_ifd_entries_to_py(content, ifd, byte_order);
|
||||
PyDict_SetItemString(py_dict, ifd_name, py_entries);
|
||||
Py_DECREF(py_entries);
|
||||
}
|
||||
|
||||
exif_data_unref(data);
|
||||
|
||||
return py_dict;
|
||||
}
|
||||
|
||||
PyMethodDef methods[] = {
|
||||
{"read_metadata", mirage_exif_read_metadata, METH_VARARGS},
|
||||
{NULL, NULL, 0},
|
||||
};
|
||||
|
||||
void initexif(void) {
|
||||
Py_InitModule("exif", methods);
|
||||
}
|
||||
289
mirage/exif.patch
Normal file
289
mirage/exif.patch
Normal file
@@ -0,0 +1,289 @@
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/mirage.py mirage-1.0_pre2/mirage.py
|
||||
--- mirage-1.0_pre2/mirage.py.orig 2012-12-10 13:28:48.000000000 +0200
|
||||
+++ mirage-1.0_pre2/mirage.py 2019-08-24 15:01:22.110133416 +0300
|
||||
@@ -64,11 +64,11 @@
|
||||
print _("xmouse.so module not found, some screenshot capabilities will be disabled.")
|
||||
|
||||
try:
|
||||
- import pyexiv2
|
||||
+ import exif
|
||||
HAS_EXIF = True
|
||||
except:
|
||||
HAS_EXIF = False
|
||||
- print _("pyexiv2 module not found, exifdata reading/writing are disabled")
|
||||
+ print _("exif.so module not found, exifdata reading/writing are disabled")
|
||||
|
||||
try:
|
||||
import gconf
|
||||
@@ -2337,9 +2337,8 @@
|
||||
hbox.pack_start(vbox_right, False, False, 3)
|
||||
includes_exif = False
|
||||
if HAS_EXIF:
|
||||
- exifd = pyexiv2.ImageMetadata(self.currimg.name)
|
||||
- exifd.read()
|
||||
- if ([x for x in exifd.exif_keys if "Exif.Photo" in x]):
|
||||
+ metadata = self.currimg.exif_metadata
|
||||
+ if metadata is not None:
|
||||
includes_exif = True
|
||||
# The exif data
|
||||
exif_lbox = gtk.VBox()
|
||||
@@ -2349,13 +2348,13 @@
|
||||
exif_vbox = gtk.VBox()
|
||||
exif_empty = gtk.Label(" ")
|
||||
|
||||
- expo_l, expo_v = self.exif_return_label(exifd, _("Exposure time:"), _("%s sec"),"Exif.Photo.ExposureTime", "rat_frac")
|
||||
- aperture_l, aperture_v = self.exif_return_label(exifd, _("Aperture:"), _("%s"),"Exif.Photo.FNumber", "rat_float")
|
||||
- focal_l, focal_v = self.exif_return_label(exifd, _("Focal length:"), _("%s mm"),"Exif.Photo.FocalLength", "rat_int")
|
||||
- date_l, date_v = self.exif_return_label(exifd, _("Time taken:"), _("%s"),"Exif.Photo.DateTimeOriginal", "str")
|
||||
- ISO_l, ISO_v = self.exif_return_label(exifd, _("ISO Speed:"), _("%s"),"Exif.Photo.ISOSpeedRatings", "int")
|
||||
- bias_l, bias_v = self.exif_return_label(exifd, _("Exposure bias:"), _("%s"),"Exif.Photo.ExposureBiasValue", "rat_frac")
|
||||
- model_l, model_v = self.exif_return_label(exifd, _("Camera:"), _("%s"),"Exif.Image.Model", "str")
|
||||
+ expo_l, expo_v = self.exif_return_label(metadata, _("Exposure time:"), _("%s sec"),'EXIF',"ExposureTime", "rat_frac")
|
||||
+ aperture_l, aperture_v = self.exif_return_label(metadata, _("Aperture:"), _("%s"),'EXIF',"FNumber", "rat_float")
|
||||
+ focal_l, focal_v = self.exif_return_label(metadata, _("Focal length:"), _("%s mm"),'EXIF',"FocalLength", "rat_int")
|
||||
+ date_l, date_v = self.exif_return_label(metadata, _("Time taken:"), _("%s"),'EXIF',"DateTimeOriginal", "str")
|
||||
+ ISO_l, ISO_v = self.exif_return_label(metadata, _("ISO Speed:"), _("%s"),'EXIF',"ISOSpeedRatings", "int")
|
||||
+ bias_l, bias_v = self.exif_return_label(metadata, _("Exposure bias:"), _("%s"),'EXIF',"ExposureBiasValue", "rat_frac")
|
||||
+ model_l, model_v = self.exif_return_label(metadata, _("Camera:"), _("%s"),'0',"Model", "str")
|
||||
exif_lbox.pack_start(exif_title, False, False, 2)
|
||||
exif_lbox.pack_start(aperture_l, False, False, 2)
|
||||
exif_lbox.pack_start(focal_l, False, False, 2)
|
||||
@@ -2390,19 +2389,19 @@
|
||||
show_props.run()
|
||||
show_props.destroy()
|
||||
|
||||
- def exif_return_label(self, exif, label_v, format, tag, type="str"):
|
||||
+ def exif_return_label(self, metadata, label_v, format, ifd, tag, type="str"):
|
||||
label = gtk.Label(label_v)
|
||||
label.set_alignment(1, 1)
|
||||
- if tag in exif.exif_keys:
|
||||
- raw = exif[tag].value
|
||||
+ if ifd in metadata and tag in metadata[ifd]:
|
||||
+ raw = metadata[ifd][tag]
|
||||
if type == "rat_frac":
|
||||
- val = Fraction(str(raw))
|
||||
+ val = Fraction(raw[0][0], raw[0][1])
|
||||
elif type == "rat_float":
|
||||
- val = float(raw)
|
||||
+ val = float(raw[0][0]) / float(raw[0][1])
|
||||
elif type == "rat_int":
|
||||
- val = int(raw)
|
||||
+ val = int(round(float(raw[0][0]) / float(raw[0][1])))
|
||||
elif type == "int":
|
||||
- val = int(raw)
|
||||
+ val = int(raw[0])
|
||||
else:
|
||||
val = raw
|
||||
value = gtk.Label(format % str(val))
|
||||
@@ -4629,16 +4628,20 @@
|
||||
self.height_original = self.height
|
||||
self.orientation = ImageData.ORIENT_NORMAL
|
||||
if HAS_EXIF :
|
||||
- exifd = pyexiv2.ImageMetadata(self.name)
|
||||
- exifd.read()
|
||||
- if "Exif.Image.Orientation" in exifd.exif_keys :
|
||||
- self.orientation = exifd["Exif.Image.Orientation"].value
|
||||
- if self.orientation == ImageData.ORIENT_LEFT :
|
||||
- self.rotate_pixbuf(90)
|
||||
- elif self.orientation == ImageData.ORIENT_MIRROR :
|
||||
- self.rotate_pixbuf(180)
|
||||
- elif self.orientation == ImageData.ORIENT_RIGHT :
|
||||
- self.rotate_pixbuf(270)
|
||||
+ self.exif_metadata = exif.read_metadata(self.name)
|
||||
+ if self.exif_metadata is not None:
|
||||
+ try:
|
||||
+ orientation = self.exif_metadata['1']['Orientation'][0]
|
||||
+ except KeyError:
|
||||
+ orientation = None
|
||||
+ if orientation is not None :
|
||||
+ self.orientation = orientation
|
||||
+ if self.orientation == ImageData.ORIENT_LEFT :
|
||||
+ self.rotate_pixbuf(90)
|
||||
+ elif self.orientation == ImageData.ORIENT_MIRROR :
|
||||
+ self.rotate_pixbuf(180)
|
||||
+ elif self.orientation == ImageData.ORIENT_RIGHT :
|
||||
+ self.rotate_pixbuf(270)
|
||||
self.zoomratio = 1
|
||||
self.isloaded = True
|
||||
self.fileinfo = gtk.gdk.pixbuf_get_file_info(self.name)[0]
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/cs.po mirage-1.0_pre2/po/cs.po
|
||||
--- mirage-1.0_pre2.orig/po/cs.po 2012-12-10 12:43:02.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/cs.po 2019-08-22 15:18:10.630214010 +0300
|
||||
@@ -31,7 +31,7 @@
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:79
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/de.po mirage-1.0_pre2/po/de.po
|
||||
--- mirage-1.0_pre2.orig/po/de.po 2012-12-10 12:43:02.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/de.po 2019-08-22 15:18:10.600214010 +0300
|
||||
@@ -32,7 +32,7 @@
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:79
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/es.po mirage-1.0_pre2/po/es.po
|
||||
--- mirage-1.0_pre2.orig/po/es.po 2012-12-10 12:43:02.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/es.po 2019-08-22 15:18:10.640214010 +0300
|
||||
@@ -32,7 +32,7 @@
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:79
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/fr.po mirage-1.0_pre2/po/fr.po
|
||||
--- mirage-1.0_pre2.orig/po/fr.po 2012-12-10 12:43:02.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/fr.po 2019-08-22 15:18:10.630214010 +0300
|
||||
@@ -34,7 +34,7 @@
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:79
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/he.po mirage-1.0_pre2/po/he.po
|
||||
--- mirage-1.0_pre2.orig/po/he.po 2012-12-10 12:49:54.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/he.po 2019-08-22 15:18:10.620214010 +0300
|
||||
@@ -32,7 +32,7 @@
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:79
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/hu.po mirage-1.0_pre2/po/hu.po
|
||||
--- mirage-1.0_pre2.orig/po/hu.po 2012-12-10 12:43:02.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/hu.po 2019-08-22 15:18:10.610214010 +0300
|
||||
@@ -36,7 +36,7 @@
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:79
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/it.po mirage-1.0_pre2/po/it.po
|
||||
--- mirage-1.0_pre2.orig/po/it.po 2012-12-10 12:43:02.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/it.po 2019-08-22 15:18:10.620214010 +0300
|
||||
@@ -33,7 +33,7 @@
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:79
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/messages.po mirage-1.0_pre2/po/messages.po
|
||||
--- mirage-1.0_pre2.orig/po/messages.po 2012-12-10 12:43:02.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/messages.po 2019-08-22 15:18:10.630214010 +0300
|
||||
@@ -32,7 +32,7 @@
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:79
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/nl.po mirage-1.0_pre2/po/nl.po
|
||||
--- mirage-1.0_pre2.orig/po/nl.po 2012-12-10 12:43:02.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/nl.po 2019-08-22 15:18:10.620214010 +0300
|
||||
@@ -31,7 +31,7 @@
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:79
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/pl.po mirage-1.0_pre2/po/pl.po
|
||||
--- mirage-1.0_pre2.orig/po/pl.po 2012-12-10 12:43:02.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/pl.po 2019-08-22 15:18:10.640214010 +0300
|
||||
@@ -36,7 +36,7 @@
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:79
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/pt_BR.po mirage-1.0_pre2/po/pt_BR.po
|
||||
--- mirage-1.0_pre2.orig/po/pt_BR.po 2012-12-10 12:43:02.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/pt_BR.po 2019-08-22 15:18:10.610214010 +0300
|
||||
@@ -33,7 +33,7 @@
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:79
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/ru.po mirage-1.0_pre2/po/ru.po
|
||||
--- mirage-1.0_pre2.orig/po/ru.po 2012-12-10 12:43:02.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/ru.po 2019-08-22 15:18:10.630214010 +0300
|
||||
@@ -31,7 +31,7 @@
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:79
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/uk.po mirage-1.0_pre2/po/uk.po
|
||||
--- mirage-1.0_pre2.orig/po/uk.po 2012-12-10 12:43:02.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/uk.po 2019-08-22 15:18:10.620214010 +0300
|
||||
@@ -38,8 +38,8 @@
|
||||
"буде відключено."
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
-msgstr "Модуль pyexiv2 не знайдено, читання/запис exifdata буде відключено."
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
+msgstr "Модуль exif.so не знайдено, читання/запис exifdata буде відключено."
|
||||
|
||||
#: mirage.py:79
|
||||
#, python-format
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/po/zh_CN.po mirage-1.0_pre2/po/zh_CN.po
|
||||
--- mirage-1.0_pre2.orig/po/zh_CN.po 2012-12-10 12:43:02.000000000 +0200
|
||||
+++ mirage-1.0_pre2/po/zh_CN.po 2019-08-22 15:18:10.610214010 +0300
|
||||
@@ -34,7 +34,7 @@
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:71
|
||||
-msgid "pyexiv2 module not found, exifdata reading/writing are disabled"
|
||||
+msgid "exif.so module not found, exifdata reading/writing are disabled"
|
||||
msgstr ""
|
||||
|
||||
#: mirage.py:79
|
||||
diff --recursive --unified mirage-1.0_pre2.orig/setup.py mirage-1.0_pre2/setup.py
|
||||
--- mirage-1.0_pre2.orig/setup.py 2012-12-10 13:28:31.000000000 +0200
|
||||
+++ mirage-1.0_pre2/setup.py 2019-08-22 15:07:14.900205205 +0300
|
||||
@@ -37,6 +37,7 @@
|
||||
py_modules = ['mirage'],
|
||||
ext_modules = [Extension(name='imgfuncs', sources=['imgfuncs.c']),
|
||||
Extension(name='xmouse', sources=['xmouse.c'], libraries=['X11']),
|
||||
+ Extension(name='exif', sources=['exif.c'], libraries=['exif']),
|
||||
Extension(name='mirage_numacomp', sources=['mirage_numacomp.c'])],
|
||||
scripts = ['mirage'],
|
||||
data_files=[('share/mirage', ['README', 'COPYING', 'CHANGELOG', 'TODO', 'TRANSLATORS', 'stock_shuffle.png', 'stock_leave-fullscreen.png', 'stock_fullscreen.png', 'mirage_blank.png']),
|
||||
Reference in New Issue
Block a user