Skip to content

Commit 793cf5a

Browse files
Merge pull request #4133 from ProjectMirador/3553-info-response-services
Handle multiple IIIF resource services; fixes #3553
2 parents d55b9cb + c11515c commit 793cf5a

File tree

9 files changed

+41
-16
lines changed

9 files changed

+41
-16
lines changed

__tests__/src/actions/infoResponse.test.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,8 @@ describe('infoResponse actions', () => {
3030
describe('fetchInfoResponse', () => {
3131
describe('success response', () => {
3232
it('dispatches the REQUEST_INFO_RESPONSE action', () => {
33-
const imageResource = { getServices: () => ['service'] };
34-
expect(actions.fetchInfoResponse({ imageId: 'someUrl', imageResource })).toEqual({
35-
imageResource: 'service',
33+
const imageResource = { getServices: () => [{ getIIIFResourceType: () => 'ImageService2', getProfile: () => '' }] };
34+
expect(actions.fetchInfoResponse({ imageId: 'someUrl', imageResource })).toMatchObject({
3635
infoId: 'someUrl',
3736
type: 'mirador/REQUEST_INFO_RESPONSE',
3837
});

__tests__/src/lib/iiif.test.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Service } from 'manifesto.js';
2+
import { getIiifResourceImageService } from '../../../src/lib/iiif';
3+
4+
describe('IIIF utils', () => {
5+
it('extracts the IIIF image service from the resource', () => {
6+
const subject = {
7+
getServices: () => [
8+
new Service({ id: 'some-service', type: 'SearchService1' }),
9+
new Service({ id: 'image-service', type: 'ImageService2' }),
10+
],
11+
};
12+
const service = getIiifResourceImageService(subject);
13+
14+
expect(service.id).toEqual('image-service');
15+
});
16+
});

src/lib/CanvasWorld.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import normalizeUrl from 'normalize-url';
2-
import MiradorCanvas from './MiradorCanvas';
2+
import { getIiifResourceImageService } from './iiif';
33

44
/**
55
* CanvasWorld
@@ -141,7 +141,7 @@ export default class CanvasWorld {
141141
if (!miradorCanvas) return undefined;
142142
return miradorCanvas.imageResources
143143
.find(r => (
144-
normalizeUrl(r.getServices()[0].id, { stripAuthentication: false })
144+
normalizeUrl(getIiifResourceImageService(r).id, { stripAuthentication: false })
145145
=== normalizeUrl(infoResponseId, { stripAuthentication: false })));
146146
}
147147

src/lib/MiradorCanvas.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import flatten from 'lodash/flatten';
22
import flattenDeep from 'lodash/flattenDeep';
33
import { Canvas, AnnotationPage, Annotation } from 'manifesto.js';
4+
import { getIiifResourceImageService } from './iiif';
5+
46
/**
57
* MiradorCanvas - adds additional, testable logic around Manifesto's Canvas
68
* https://iiif-commons.github.io/manifesto/classes/_canvas_.manifesto.canvas.html
@@ -189,13 +191,12 @@ export default class MiradorCanvas {
189191

190192
/** */
191193
get iiifImageResources() {
192-
return this.imageResources
193-
.filter(r => r && r.getServices()[0] && r.getServices()[0].id);
194+
return this.imageResources.filter(r => r && getIiifResourceImageService(r)?.id);
194195
}
195196

196197
/** */
197198
get imageServiceIds() {
198-
return this.iiifImageResources.map(r => r.getServices()[0].id);
199+
return this.iiifImageResources.map(r => r && getIiifResourceImageService(r)?.id);
199200
}
200201

201202
/**

src/lib/iiif.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { Utils } from 'manifesto.js';
2+
3+
/** @returns an IIIF image service for the given resource */
4+
export function getIiifResourceImageService(resource) {
5+
return resource.getServices().find(service => (
6+
(service.getProfile && Utils.isImageProfile(service.getProfile() || '')) || Utils.isImageServiceType(service.getIIIFResourceType() || '')));
7+
}

src/state/actions/infoResponse.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { getIiifResourceImageService } from '../../lib/iiif';
12
import ActionTypes from './action-types';
23

34
/**
@@ -73,7 +74,7 @@ export function receiveInfoResponseFailure(infoId, error, tokenServiceId) {
7374
* @memberof ActionCreators
7475
*/
7576
export function fetchInfoResponse({ imageId, imageResource, windowId }) {
76-
const imageService = imageResource && imageResource.getServices()[0];
77+
const imageService = imageResource && getIiifResourceImageService(imageResource);
7778
const infoId = (imageId || imageService.id);
7879
return requestInfoResponse(infoId, imageService, windowId);
7980
}

src/state/sagas/windows.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import {
22
all, call, put, select, takeEvery,
33
} from 'redux-saga/effects';
44
import ActionTypes from '../actions/action-types';
5-
import MiradorManifest from '../../lib/MiradorManifest';
6-
import MiradorCanvas from '../../lib/MiradorCanvas';
75
import {
86
setContentSearchCurrentAnnotation,
97
selectAnnotation,
@@ -32,6 +30,7 @@ import {
3230
getMiradorManifestWrapper,
3331
} from '../selectors';
3432
import { fetchManifests } from './iiif';
33+
import { getIiifResourceImageService } from '../../lib/iiif';
3534

3635
/** */
3736
export function* fetchWindowManifest(action) {
@@ -248,7 +247,7 @@ export function* fetchInfoResponses({ visibleCanvases: visibleCanvasIds, windowI
248247
yield all(visibleCanvases.map((canvas) => {
249248
const miradorCanvas = getMiradorCanvas(canvas);
250249
return all(miradorCanvas.iiifImageResources.map(imageResource => (
251-
!infoResponses[imageResource.getServices()[0].id]
250+
!infoResponses[getIiifResourceImageService(imageResource)?.id]
252251
&& put(fetchInfoResponse({ imageResource, windowId }))
253252
)).filter(Boolean));
254253
}));

src/state/selectors/auth.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { createSelector } from 'reselect';
2-
import { Utils } from 'manifesto.js';
32
import flatten from 'lodash/flatten';
3+
import { Utils } from 'manifesto.js';
44
import { miradorSlice, EMPTY_ARRAY, EMPTY_OBJECT } from './utils';
55
import { getConfig } from './config';
66
import { getVisibleCanvases, selectInfoResponses } from './canvases';
77
import { getMiradorCanvasWrapper } from './wrappers';
8+
import { getIiifResourceImageService } from '../../lib/iiif';
89

910
/**
1011
* Returns the authentification profile from the configuration
@@ -56,7 +57,7 @@ export const selectCurrentAuthServices = createSelector(
5657
const images = miradorCanvas.iiifImageResources;
5758

5859
return images.map(i => {
59-
const iiifImageService = i.getServices()[0];
60+
const iiifImageService = getIiifResourceImageService(i);
6061

6162
const infoResponse = infoResponses[iiifImageService.id];
6263
if (infoResponse && infoResponse.json) {

src/state/selectors/canvases.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { createSelector } from 'reselect';
22
import flatten from 'lodash/flatten';
33
import CanvasGroupings from '../../lib/CanvasGroupings';
4+
import { getIiifResourceImageService } from '../../lib/iiif';
45
import { getMiradorCanvasWrapper } from './wrappers';
56
import { miradorSlice, EMPTY_ARRAY } from './utils';
67
import { getWindow } from './getters';
@@ -215,7 +216,7 @@ export const getVisibleCanvasNonTiledResources = createSelector(
215216
],
216217
(canvases, getMiradorCanvas) => flatten(canvases
217218
.map(canvas => getMiradorCanvas(canvas).imageResources))
218-
.filter(resource => resource.getServices().length < 1),
219+
.filter(resource => !getIiifResourceImageService(resource)),
219220
);
220221

221222
/**
@@ -304,7 +305,7 @@ export const selectInfoResponse = createSelector(
304305
if (!infoId) {
305306
if (!canvas) return undefined;
306307
const image = getMiradorCanvas(canvas).iiifImageResources[0];
307-
iiifServiceId = image && image.getServices()[0].id;
308+
iiifServiceId = image && getIiifResourceImageService(image)?.id;
308309
}
309310

310311
return iiifServiceId && infoResponses[iiifServiceId]

0 commit comments

Comments
 (0)