Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions __tests__/integration/mirador/authz.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<title>Mirador</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500">
</head>
<body>
<div id="mirador" style="position: absolute; top: 0; bottom: 0; left: 0; right: 0;"></div>
<script>document.write("<script type='text/javascript' src='../../../dist/mirador.min.js?v=" + Date.now() + "'><\/script>");</script>
<script type="text/javascript">
var miradorInstance = Mirador.viewer({
id: 'mirador',
windows: [
{
manifestId: 'https://iiifauth.digtest.co.uk/manifest/01_standard-login'
}
],
});
</script>
</body>
</html>
63 changes: 63 additions & 0 deletions __tests__/integration/mirador/canvaslink.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<title>Mirador</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500">
</head>
<body>
<div id="mirador" style="position: absolute; top: 0; bottom: 0; left: 0; right: 0;" data-manifest="https://dlc-staging.library.columbia.edu/iiif/3/presentation/10.7916/d8-bjct-g075/manifest"></div>
<script>document.write("<script type='text/javascript' src='../../../dist/mirador.min.js?v=" + Date.now() + "'><\/script>");</script>
<script type="text/javascript">
const manifestUrl = document.getElementById('mirador').dataset['manifest'];
const startCanvas = function(queryParams) {
if (queryParams.get("canvas")) {
const canvases = queryParams.get("canvas").split(',');
const canvas = canvases[0];
return canvas.startsWith('../') ? manifestUrl.replace('/manifest', canvas.slice(2)) : canvas;
} else return null;
}(new URL(document.location).searchParams);
var miradorInstance = Mirador.viewer({
id: 'mirador',
theme: {
transitions: window.location.port === '4488' ? { create: () => 'none' } : {},
},
window: {
allowClose: false,
allowFullscreen: true,
panels: {
info: true,
canvas: true
},
canvasLink: {
active: true,
enabled: true,
singleCanvasOnly: false,
providers: [],
getCanvasLink: (manifestId, canvases) => {
const baseUri = window.location.href.replace(window.location.search, '');
const canvasIndices = canvases.map(
(canvas) => canvas.id.startsWith(manifestId.replace('/manifest', '')) ? '../canvas/' + canvas.id.split("/").slice(-2).join('/') : canvas.id,
);
return `${baseUri}?canvas=${canvasIndices.join(",",)}`;
}
},
},
workspace: {
showZoomControls: true,
},
workspaceControlPanel: {
enabled: false
},
windows: [{
manifestId: manifestUrl,
canvasId: startCanvas,
thumbnailNavigationPosition: 'far-bottom',
}],
},
[...Mirador.culPlugins.canvasLinkPlugin]);
</script>
</body>
</html>
44 changes: 44 additions & 0 deletions __tests__/integration/mirador/cul.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<title>Mirador</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500">
</head>
<body>
<div id="mirador" style="position: absolute; top: 0; bottom: 0; left: 0; right: 0;"></div>
<script>document.write("<script type='text/javascript' src='../../../dist/mirador.min.js?v=" + Date.now() + "'><\/script>");</script>
<script type="text/javascript">
var miradorInstance = Mirador.viewer({
id: 'mirador',
theme: {
transitions: window.location.port === '4488' ? { create: () => 'none' } : {},
},
windows: [{
manifestId: 'https://www.dev.local:3000/iiif/3/presentation/10.7916/d8-346v-m088/manifest',
thumbnailNavigationPosition: 'far-bottom'
}],
catalog: [
// a resource with an image canvas
{ manifestId: 'https://www.dev.local:3000/iiif/3/presentation/10.7916/D8F76D6D/manifest',
provider: 'Basic image examples' },
// a resource with multiple paginated image canvases
{ manifestId: 'https://www.dev.local:3000/iiif/3/presentation/10.7916/d8-bjct-g075/manifest', provider: 'Paginated images examples' },
// a resource with a PDF canvas
{ manifestId: 'https://www.dev.local:3000/iiif/3/presentation/10.7916/n8qs-6964/manifest', provider: 'Public PDF examples'},
// a resource with a limited-access PDF canvas
{ manifestId: 'https://www.dev.local:3000/iiif/3/presentation/10.7916/D88D13C6/manifest', provider: 'Columbia community PDF examples'},
// a resource with an AV canvas
{ manifestId: "https://www.dev.local:3000/iiif/3/presentation/10.7916/D8698MF9/manifest", provider: 'Public AV canvas examples'},
// a resource with a limited-access AV canvas
{ manifestId: 'https://www.dev.local:3000/iiif/3/presentation/10.7916/d8-346v-m088/manifest', provider: 'Columbia community AV canvas examples'},
{ manifestId: 'https://iiif.harvardartmuseums.org/manifests/object/299843', provider: 'Other Organization' },
]
},
[...Mirador.culPlugins.downloadDialogPlugin].concat([...Mirador.culPlugins.viewXmlPlugin]).concat([...Mirador.culPlugins.citationsSidebarPlugin]).concat([...Mirador.culPlugins.videojsPlugin]).concat([...Mirador.culPlugins.canvasRelatedLinksPlugin])
);
</script>
</body>
</html>
2 changes: 1 addition & 1 deletion bundlewatch.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"files": [
{
"path": "dist/mirador.min.js",
"maxSize": "625 KB"
"maxSize": "850 KB"
}
]
}
10 changes: 7 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@columbia-libraries/mirador",
"version": "3.3.1-3789.2",
"version": "3.3.1-3789.4",
"description": "An open-source, web-based 'multi-up' viewer that supports zoom-pan-rotate functionality, ability to display/compare simple images, and images with annotations.",
"main": "dist/cjs/src/index.js",
"module": "dist/es/src/index.js",
Expand Down Expand Up @@ -80,7 +80,6 @@
"stylis-plugin-rtl": "^2.1.1",
"url": "^0.11.0",
"uuid": "^8.1.0 || ^9.0.0",
"video.js": "^7.17.0",
"whatwg-fetch": "^3.6.20"
},
"devDependencies": {
Expand Down Expand Up @@ -109,6 +108,7 @@
"canvas": "^2.11.0",
"chalk": "^4.1.0",
"core-js": "^3.21.1",
"css-loader": "^6.8.1",
"eslint": "^8.11.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-react-app": "^7.0.0",
Expand All @@ -134,13 +134,17 @@
"react-refresh": "^0.14.0",
"redux-mock-store": "^1.5.1",
"redux-saga-test-plan": "^4.0.0-rc.3",
"sass-loader": "^13.3.2",
"style-loader": "^3.3.3",
"terser-webpack-plugin": "^5.3.1",
"webpack": "^5.70.0",
"webpack-cli": "^5.0.0",
"webpack-dev-server": "^4.7.4"
},
"peerDependencies": {
"react": "^18.0.0",
"react-dom": "^18.0.0"
"react-dom": "^18.0.0",
"sass": "^1.34.0",
"video.js": "^7.17.0"
}
}
File renamed without changes.
15 changes: 15 additions & 0 deletions src/culPlugins/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import canvasLinkPlugin from './mirador-canvaslink';
import canvasRelatedLinksPlugin from './mirador-canvasRelatedLinks';
import citationsSidebarPlugin from './mirador-citations';
import downloadDialogPlugin from './mirador-downloaddialog';
import videojsPlugin from './mirador-videojs';
import viewXmlPlugin from './mirador-viewXml';

export default {
canvasLinkPlugin,
canvasRelatedLinksPlugin,
citationsSidebarPlugin,
downloadDialogPlugin,
videojsPlugin,
viewXmlPlugin,
};
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ const DownloadButton = ({
aria-expanded={dialogOpen}
aria-haspopup
aria-label={t('showDownloadOptions')}
containerId={containerId}
onClick={() => updateConfig({
...config,
dialogOpen: !dialogOpen,
Expand Down
67 changes: 67 additions & 0 deletions src/culPlugins/mirador-videojs/components/VideoJSAudioViewer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { Component } from 'react';
import { connect } from 'react-redux';
import { compose } from 'redux';
import { withTranslation } from 'react-i18next';
import { AudioViewer } from '../../../components/AudioViewer';
import { getConfig, getVisibleCanvasCaptions, getVisibleCanvasAudioResources } from '../../../state/selectors';

import { VideoJS } from './VideoJS';
import ForbiddenComponent from '../../ForbiddenComponent';

/** */
const mapStateToProps = (state, { windowId }) => (
{
captions: getVisibleCanvasCaptions(state, { windowId }) || [],
audioOptions: getConfig(state).audioOptions,
audioResources: getVisibleCanvasAudioResources(state, { windowId }) || [],
}
);

const enhance = compose(
withTranslation(),
connect(mapStateToProps, null),
);

/** */
class VideoJSAudioViewerBase extends Component {
/** */
render() {
const {
captions, audioOptions, audioResources,
} = this.props;

const debugResources = audioResources.filter(audio => audio.id && audio.getFormat()).map(
audio => ({ src: audio.id, type: audio.getFormat() }),
);
console.log({audioResources, debugResources});
const videoJsOptions = {
autoplay: false,
controlBar: {
remainingTimeDisplay: false,
},
controls: true,
fluid: true,
playbackRates: [0.5, 1, 1.5, 2],
responsive: true,
sources: audioResources.filter(audio => audio.id && audio.getFormat()).map(
audio => ({ src: audio.id, type: audio.getFormat() }),
),
tracks: captions.filter(caption => caption.id).map(caption => ({ kind: (caption.kind || 'captions'), src: caption.id })),
};

console.log({ state: this.state, videoJsOptions });
if (videoJsOptions.sources.length === 0) return <ForbiddenComponent id="this content" />;
return (
<div className="video-js vjs-fill" data-vjs-player>
<VideoJS options={videoJsOptions} />
</div>
);
}
}

export const VideoJSAudioViewer = enhance(VideoJSAudioViewerBase);

/** */
export default function ({ _targetComponent, targetProps }) {
return <VideoJSAudioViewer {...targetProps} />;
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class VideoJSViewerBase extends VideoViewer {
console.log({ state: this.state, videoJsOptions });
if (videoJsOptions.sources.length === 0) return <ForbiddenComponent id="this content" />;
return (
<div className="video-js w-100" data-vjs-player>
<div className="video-js vjs-fill" data-vjs-player>
<VideoJS options={videoJsOptions} />
</div>
);
Expand Down
19 changes: 19 additions & 0 deletions src/culPlugins/mirador-videojs/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import VideoJSAudioViewerComponent from './components/VideoJSAudioViewer';
import VideoJSViewerComponent from './components/VideoJSViewer';

export default [
{
component: VideoJSAudioViewerComponent,
mode: 'wrap',
name: 'VideoJSAudioViewer',
target: 'AudioViewer',
},
{
component: VideoJSViewerComponent,
mode: 'wrap',
name: 'VideoJSViewer',
target: 'VideoViewer',
},
];

export { VideoJSAudioViewerComponent, VideoJSViewerComponent };
2 changes: 2 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import init from './init';
import state from './state';
import culPlugins from './culPlugins';

export default {
...init,
...state,
culPlugins,
};
1 change: 0 additions & 1 deletion src/init.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import MiradorViewer from './lib/MiradorViewer';

/**
* Default Mirador instantiation
*/
Expand Down
28 changes: 23 additions & 5 deletions src/lib/getServices.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import { Utils } from 'manifesto.js';
import { filterByTypes } from './typeFilters';
import flatten from 'lodash/flatten';

/**
*/
export function anyAuthServices(resource) {
console.log({resource, services: Utils.getServices(resource)});
return resource
&& Utils.getServices(resource).filter(s => (s.getProfile()
&& s.getProfile().match(/http:\/\/iiif.io\/api\/auth\//))
|| (s.getProperty('type')
&& s.getProperty('type').match(/^Auth.*2$/)));
|| (s.getProperty('type')?.match(/^Auth.*Service2$/)));
}

/**
Expand All @@ -26,9 +27,7 @@ export function getProbeService(resource) {
&& anyProbeServices(resource)[0];
}

/**
*/
export function getTokenService(resource) {
function auth1TokenService(resource) {
return resource
&& (
Utils.getService(resource, 'http://iiif.io/api/auth/1/token')
Expand All @@ -37,6 +36,25 @@ export function getTokenService(resource) {
);
}

export function anyTokenServices(resource) {
const v1TokenService = auth1TokenService(resource);
if (v1TokenService) return [ v1TokenService ];
const services = resource && filterByTypes(Utils.getServices(resource), 'AuthAccessTokenService2');
if (services && services[0]) return services;
if (resource) {
// probe services are separated from token services by access services
const authServices = anyAuthServices(resource);
if (authServices[0]) return flatten(authServices.map(authSvc => anyTokenServices(authSvc)));
}
return [];
}

/**
*/
export function getTokenService(resource) {
return anyTokenServices(resource)[0];
}

/**
*/
export function getLogoutService(resource) {
Expand Down
12 changes: 0 additions & 12 deletions src/plugins/mirador-videojs/index.js

This file was deleted.

Loading