Package: piffle
pifflePython library for generating and parsingIIIF Image APIURLs in an
object-oriented, pythonic fashion.Piffle is tested on Python 3.8—3.11.Piffle was originally developed by Rebecca Sutton Koeser at Emory University as a part ofReaduxand forked as a separate project underemory-lits-labs. It was later transferred to Rebecca Sutton Koeser at the Center for Digital Humanities at Princeton.Installation and example use:pip install piffleExample use for generating an IIIF image url:>>> from piffle.image import IIIFImageClient
>>> myimg = IIIFImageClient('http://image.server/path/', 'myimgid')
>>> print myimg
http://image.server/path/myimgid/full/full/0/default.jpg
>>> print myimg.info()
http://image.server/path/myimgid/info.json"
>>> print myimg.size(width=120).format('png')
http://image.server/path/myimgid/full/120,/0/default.pngExample use for parsing an IIIF image url:>>> from piffle.image import IIIFImageClient
>>> myimg = IIIFImageClient.init_from_url('http://www.example.org/image-service/abcd1234/full/full/0/default.jpg')
>>> print myimg
http://www.example.org/image-service/abcd1234/full/full/0/default.jpg
>>> print myimg.info()
http://www.example.org/image-service/abcd1234/info.json
>>> myimg.as_dict()['size']['full']
True
>>> myimg.as_dict()['size']['exact']
False
>>> myimg.as_dict()['rotation']['degrees']
0.0Example use for reading a IIIF manifest:>>> from piffle.image import IIIFImageClient
>>> from piffle.presentation import IIIFPresentation
>>>  manifest = IIIFPresentation.from_url('https://iiif.bodleian.ox.ac.uk/iiif/manifest/60834383-7146-41ab-bfe1-48ee97bc04be.json')
>>> manifest.label
'Bodleian Library MS. Bodl. 264'
>>> manifest.id
'https://iiif.bodleian.ox.ac.uk/iiif/manifest/60834383-7146-41ab-bfe1-48ee97bc04be.json'
>>> manifest.type
'sc:Manifest'
>>> for canvas in manifest.sequences[0].canvases[:5]:
...     image_id = canvas.images[0].resource.id
...     iiif_img = IIIFImageClient(*image_id.rsplit('/', 1))
...     print(str(iiif_img.size(height=250)))
...
https://iiif.bodleian.ox.ac.uk/iiif/image/90701d49-5e0c-4fb5-9c7d-45af96565468/full/,250/0/default.jpg
https://iiif.bodleian.ox.ac.uk/iiif/image/e878cc78-acd3-43ca-ba6e-90a392f15891/full/,250/0/default.jpg
https://iiif.bodleian.ox.ac.uk/iiif/image/0f1ed064-a972-4215-b884-d8d658acefc5/full/,250/0/default.jpg
https://iiif.bodleian.ox.ac.uk/iiif/image/6fe52b9a-5bb7-4b5b-bbcd-ad0489fcad2a/full/,250/0/default.jpg
https://iiif.bodleian.ox.ac.uk/iiif/image/483ff8ec-347d-4070-8442-dbc15bc7b4de/full/,250/0/default.jpgDevelopment and TestingThis project usesgit-flowbranching conventions.Install locally for development (the use of a python virtualenv is recommended):pip install -e .Install test dependencies:pip install -e ".[dev]"Run unit tests:py.testorpython setup.py testInstall pre-commit hooksAnyone who wants to contribute to this codebase should install the configured pre-commit hooks:pre-commit installThis will configure a pre-commit hooks to automatically lint and format python code withruffandblack.Pre-commit hooks and formatting conventions were added at version 0.5, sogit blamemay not reflect the true author of a given change. To makegit blamemore accurate, ignore formatting revisions:git blame <FILE> --ignore-revs-file .git-blame-ignore-revsOr configure your git to always ignore styling revision commits:git config blame.ignoreRevsFile .git-blame-ignore-revsPublishing python packagesA new python packages is automatically built and published toPyPIusing a GitHub Actions workflow when a new release is created on GitHub.