Skip to main content

Python interface to libexiv2

Project description

python-exiv2 is a low level interface (or binding) to the exiv2 C++ library. It is built using SWIG to automatically generate the interface code. The intention is to give direct access to all of the top-level classes in libexiv2, but with additional “Pythonic” helpers where necessary. Not everything in libexiv2 is available in the Python interface. If you need something that’s not there, please let me know.

Introduction

There are several other ways to access libexiv2 from within Python. The first one I used was pyexiv2 (old). After its development ceased I moved on to using gexiv2 and PyGObject. This works well, providing a Metadata object with high level functions such as set_tag_string and set_tag_multiple to get and set metadata values.

A more recent development is pyexiv2 (new). This new project is potentially very useful, providing a simple interface with functions to read and modify metadata using Python dict parameters.

For more complicated metadata operations I think a lower level interface is required, which is where this project comes in. Here is an example of its use:

Python 3.6.12 (default, Dec 02 2020, 09:44:23) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import exiv2
>>> image = exiv2.ImageFactory.open('IMG_0211.JPG')
>>> image.readMetadata()
>>> data = image.exifData()
>>> data['Exif.Image.Artist']._print()
'Jim Easterbrook'
>>>

Documentation

The libexiv2 library is well documented for C++ users, in Doxygen format. Recent versions of SWIG can convert this documentation to pydoc format in the Python interface:

$ pydoc3 exiv2.Image.exifData

Help on method_descriptor in exiv2.Image:

exiv2.Image.exifData = exifData(...)
    Returns an ExifData instance containing currently buffered
        Exif data.

    The contained Exif data may have been read from the image by
    a previous call to readMetadata() or added directly. The Exif
    data in the returned instance will be written to the image when
    writeMetadata() is called.

    :rtype: :py:class:`ExifData`
    :return: modifiable ExifData instance containing Exif values

Assignment

libexiv2 stores metadata values in a generalised container whose type can be set by the type of a value assigned to it, for example:

// C or C++
exifData["Exif.Image.SamplesPerPixel"] = uint16_t(162);

This forces the Exif.Image.SamplesPerPixel value to be an unsigned short. Python doesn’t have such specific integer types, so if you want to set the type you need to create an exiv2 value of the appropriate type and assign that:

# Python
exifData["Exif.Image.SamplesPerPixel"] = exiv2.UShortValue(162)

This allows you to set the value to any type, just like in C++, but the Python interface warns you if you set a type that isn’t the default for that tag. Alternatively you can use any Python object and let libexiv2 convert the string representation of that object to the appropriate type:

# Python
exifData["Exif.Image.SamplesPerPixel"] = 162

Iterators

Several libexiv2 classes use C++ iterators to expose private data, for example the ExifData class has a private member of std::list<Exifdatum> type. The classes have public begin and end methods that return std::list iterators. In C++ you can dereference one of these iterators to access the Exifdatum object, but Python doesn’t have a dereference operator.

This Python interface converts the std::list iterator to a Python object that has access to all the Exifdatum object’s methods. For example:

Python 3.6.12 (default, Dec 02 2020, 09:44:23) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import exiv2
>>> image = exiv2.ImageFactory.open('IMG_0211.JPG')
>>> image.readMetadata()
>>> data = image.exifData()
>>> b = data.begin()
>>> b.key()
'Exif.Image.ProcessingSoftware'
>>>

The Python objects can be used to iterate over the data in a very C++ like style:

>>> data = image.exifData()
>>> b = data.begin()
>>> e = data.end()
>>> while b != e:
...     b.key()
...     next(b)
...
'Exif.Image.ProcessingSoftware'
<Swig Object of type 'ExifDataIterator *' at 0x7f2cbf6c2fb8>
'Exif.Image.ImageDescription'
<Swig Object of type 'ExifDataIterator *' at 0x7f2cbf6c2fb8>
[skip 227 line pairs]
'Exif.Thumbnail.JPEGInterchangeFormat'
<Swig Object of type 'ExifDataIterator *' at 0x7f2cbf6c2fb8>
'Exif.Thumbnail.JPEGInterchangeFormatLength'
<Swig Object of type 'ExifDataIterator *' at 0x7f2cbf6c2fb8>
>>>

The <Swig Object of type 'ExifDataIterator *' at 0x7f2cbf6c2fb8> lines are the Python interpreter showing the return value of next(b). You can also iterate in a more Pythonic style:

>>> data = image.exifData()
>>> for datum in data:
...     datum.key()
...
'Exif.Image.ProcessingSoftware'
'Exif.Image.ImageDescription'
[skip 227 lines]
'Exif.Thumbnail.JPEGInterchangeFormat'
'Exif.Thumbnail.JPEGInterchangeFormatLength'
>>>

Warning: segmentation faults

It is easy to crash python-exiv2 if you delete objects which contain data that another object is pointing to. For example, deleting an Image after extracting its metadata can cause a segfault when the metadata is accessed. Ideally the Python interface to libexiv2 would use Python objects’ reference counts to ensure this doesn’t happen, preventing the deletion of the Image object until all references to it have been deleted. Unfortunately I haven’t found a sensible way to do this in the Python interface, so some care is needed when using it.

Error handling

libexiv2 has a multilevel warning system a bit like Python’s standard logger. The Python interface redirects all Exiv2 messages to Python logging with an appropriate log level. The exiv2.LogMsg.setLevel function can be used to control what severity of messages are logged.

Installation

Python “wheels” are available for Windows (Python 3.5 to 3.9) and Linux & MacOS (Python 3.6 to 3.10). These include the libexiv2 library and should not need any other software to be installed. They can be installed with Python’s pip package. For example, on Windows:

C:\Users\Jim>pip install python-exiv2

or on Linux or MacOS:

$ sudo pip3 install python-exiv2

You can install for a single user with the --user option:

$ pip3 install --user python-exiv2

If the available wheels are not compatible with your operating system then pip will download the python-exiv2 source and attempt to compile it. For more information, and details of how to compile python-exiv2 and libexiv2, see INSTALL.rst.

Problems?

Please email jim@jim-easterbrook.me.uk if you find any problems (or solutions!).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python-exiv2-0.5.3.zip (4.1 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

python_exiv2-0.5.3-cp310-cp310-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.10Windows x86-64

python_exiv2-0.5.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.12+ x86-64

python_exiv2-0.5.3-cp310-cp310-macosx_10_9_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

python_exiv2-0.5.3-cp39-cp39-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.9Windows x86-64

python_exiv2-0.5.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

python_exiv2-0.5.3-cp39-cp39-macosx_10_9_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

python_exiv2-0.5.3-cp38-cp38-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.8Windows x86-64

python_exiv2-0.5.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

python_exiv2-0.5.3-cp38-cp38-macosx_10_9_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

python_exiv2-0.5.3-cp37-cp37m-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.7mWindows x86-64

python_exiv2-0.5.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.1 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

python_exiv2-0.5.3-cp37-cp37m-macosx_10_9_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

python_exiv2-0.5.3-cp36-cp36m-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.6mWindows x86-64

python_exiv2-0.5.3-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.1 MB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64

python_exiv2-0.5.3-cp36-cp36m-macosx_10_9_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

python_exiv2-0.5.3-cp35-cp35m-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.5mWindows x86-64

File details

Details for the file python-exiv2-0.5.3.zip.

File metadata

  • Download URL: python-exiv2-0.5.3.zip
  • Upload date:
  • Size: 4.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python-exiv2-0.5.3.zip
Algorithm Hash digest
SHA256 b2e5342b4f27181062a085c106ec2ba308367cda0feb05700a1f364856c15e42
MD5 d21aeb3c59b06a9af71444f41fc84547
BLAKE2b-256 e7422c49c9d690eb5cb7023f5836b50933d847fbfd6e29ae2979fc9aef147313

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.5.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 40a529ac7d2984e1203112d5ed0c35d68ce0dec49f04210af3f6e5f20053d21c
MD5 e30b3d065f5f43b8a1fd871eff4c12ba
BLAKE2b-256 10377d9600ac5d8c26cb01d327f280f43515296daaa9b0c54bb8d5e8991dbfdc

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.5.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 a386b41595d3c98b0d0c6d53b261adb7603102c7ece4e57afcebe87999da8b12
MD5 5d265e807eb7db671ffdebd5757451bb
BLAKE2b-256 e3f8ab1a83714375813500905b517f7ade4c8a0431872373b17180be642a2e4f

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: python_exiv2-0.5.3-cp310-cp310-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.10, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.3-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3800fddf9af49724733b2cfdf7fd02ae56d9b7e5491b4c3a8c9163f89eb20e47
MD5 e407736069e827f95303f5a362781593
BLAKE2b-256 b986b101b80538d94da40fbb61450cead9296083dd21b2355bff078b87b573d6

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.5.3-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 760ed184f01fbb2002245ba2ece39f646861cef75bfe13caff7c12de317ac39a
MD5 fa50f1400ca6d0bd46d556f001698be2
BLAKE2b-256 60978013760f0fbf02554d8807fe5d091c8e800e3afd55dc8eb6cdef6caf2fa4

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.5.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 44581a5e6dd479795a3181c6454a8b8f5c7017c43ec563b7d6b15c7996e31b25
MD5 7f04fd87cd90fdda9ea03a217d522894
BLAKE2b-256 8b01c67b249876cf7810424dca3a780393992da27195f291afa61905693ce090

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: python_exiv2-0.5.3-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.3-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1fad258fd635ffb5997ea7039d83ee7782c6ed3ee449833a96671846641f03a0
MD5 09a1c57480ce67c8afa1114f85c8117a
BLAKE2b-256 343c06b3bce3e9f9126b00bc6c7dace46fdde32da58f819af10a203b99d96112

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.5.3-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.3-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 85fc9fd37c345c81ce6ddbc3f67e4c51be6fdcd2565fefca949d52fb5cf913dd
MD5 931085467ece6d7e0dfb5eb43c69b7d6
BLAKE2b-256 e316cd2d164f821cbfa446539491648dce4de2e6c44987356205a186998b567e

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.5.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 a9647be944562ff5b45a477c1e9a966deee1ea9f5a7303139b765402b41c3ce4
MD5 303b66cd42c3b1c8ebc8b72cfe474ea9
BLAKE2b-256 79b69f1bc9a12a7cbf7e143ae01aed6ab03625243f7ff35f9f241d026ff33e87

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: python_exiv2-0.5.3-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.3-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 85ab7a97f156dd18ae91c50c4c56b6b5fb93770da72546f1c267e53a6b427b68
MD5 8cea0abae1fad476d245f103592671dd
BLAKE2b-256 832276ff244b692836dfb78b6346921227f7135c06de2ccc643d2c1866f9e83c

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.5.3-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.3-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 500f3aa69d99577820bc747a03905a786ba355964937502e05859665e5ded9c6
MD5 aa99dbaa0af111d049bb8598efb1b4ec
BLAKE2b-256 52a288850061cf1d6263c3b941032ac085f11fdfffff1d0fb655aceacc88e9e4

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.5.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 46fd9392314b73e75be018fc18ec6da6a04da6451e981bfa8085eb9557182105
MD5 61a2e8511868c2bba279c39c9746e233
BLAKE2b-256 41a7f772969a5b0282c24df5b38d54e53a22ad870bbd6bdc048c2a86438eb779

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: python_exiv2-0.5.3-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.3-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3282f00e36ce7b213aaddeeccdd2955453e9f8040a1a1ac085f56c78df11b799
MD5 5b37511aebf4f1594c30597f7c2030df
BLAKE2b-256 15f20354e1f1ae1fe8f9e61fe126da3f71f1ec814dbce8c71401f582ac89ee85

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.5.3-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.3-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 0128fcfc0a292cb52cb3a3b6509f819671277adefc8ca6cd64f0472b55145381
MD5 da5d9f3b4c38e1c4b43006e737728688
BLAKE2b-256 d24959074b00d1aab8086041d047b6e7cc1a1223bee101d4a844bc3c175078c9

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.5.3-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 f5f8e78f1295b2516c66deb4c90fd1f4d05b6ca95abce6e21098448f0f7a4c19
MD5 f891fbed0a281f4983815332d5f63671
BLAKE2b-256 a4dc2e454f2cec75f6265877b6d1f6ff530da9a1590a4ce456d64c475ae4c596

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: python_exiv2-0.5.3-cp36-cp36m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.6m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.3-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1d853303a14c4583281122acc3b39b692994b8c4c7d39ecf22343d7b2a299254
MD5 16a9913097f4bcd223e5c8beea6b2419
BLAKE2b-256 4eeb079b90629b5a8fad55774bed8b8b791793f5aef5eea527e70da246e31bbc

See more details on using hashes here.

File details

Details for the file python_exiv2-0.5.3-cp35-cp35m-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.5.3-cp35-cp35m-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.5m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.26.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.5.3-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 103f6331c3b3f4d717025d987f934571831ac092e3644776c69a8f2feace41f6
MD5 b31c4e4fcbc1c77d7605e82dd49e8c2a
BLAKE2b-256 a37e757248d820303f27b6a70bdb5af431e3c3cecb55fb52bba024f43cccf9f1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page