zotero-db/translators/Libraries Tasmania.js

786 lines
23 KiB
JavaScript

{
"translatorID": "44699e59-a196-4716-ae33-141ec605e394",
"label": "Libraries Tasmania",
"creator": "Tim Sherratt (tim@timsherratt.org)",
"target": "^https?://librariestas\\.ent\\.sirsidynix\\.net\\.au/client/en_AU/",
"minVersion": "5.0",
"maxVersion": "",
"priority": 100,
"inRepository": true,
"translatorType": 4,
"browserSupport": "gcsibv",
"lastUpdated": "2022-07-07 00:58:32"
}
/*
***** BEGIN LICENSE BLOCK *****
Copyright © 2022 Tim Sherratt
This file is part of Zotero.
Zotero is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Zotero is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Zotero. If not, see <http://www.gnu.org/licenses/>.
***** END LICENSE BLOCK *****
*/
const formatMapping = {
photograph: "artwork",
"image (online)": "artwork",
eMusic: "audioRecording",
cd: "audioRecording",
"audiobook cd": "audioRecording",
eAudiobook: "audioRecording",
dvd: "videoRecording",
"archived website": "webpage",
manuscript: "manuscript",
map: "map",
picture: "artwork",
print: "artwork",
postcard: "artwork"
};
function detectWeb(doc, url) {
let catType = url.match(/en_AU\/(library|tas|names)\/search/);
if (url.includes("results") && getSearchResults(doc, true)) {
return "multiple";
}
else if ((catType && catType[1] == "tas") || url.includes("ARCHIVES_")) {
return "manuscript";
}
else if ((catType && catType[1] == "names") || url.includes("NAME_INDEXES")) {
return "manuscript";
}
else {
var formats = doc.querySelectorAll(".displayElementText.LOCAL_FORMAT");
for (let i = 0; i < formats.length; i++) {
if (formats[i].textContent in formatMapping) {
return formatMapping[formats[i].textContent];
}
}
return "book";
}
}
function doWeb(doc, url) {
if (detectWeb(doc, url) == "multiple") {
Zotero.selectItems(getSearchResults(doc, false), function (items) {
if (!items) return;
ZU.processDocuments(Object.keys(items), scrape);
});
}
else {
scrape(doc, url);
}
}
function getSearchResults(doc, checkOnly) {
var items = {};
var found = false;
var rows = doc.querySelectorAll(".displayDetailLink a");
for (let i = 0; i < rows.length; i++) {
let href = rows[i].href;
let title = ZU.trimInternal(rows[i].textContent);
if (!href || !title) continue;
if (checkOnly) return true;
found = true;
items[href] = title;
}
return found ? items : false;
}
function getFieldText(doc, label) {
let fields = doc.querySelectorAll(".displayElementText." + label);
if (fields) {
let fieldTexts = [];
for (let i = 0; i < fields.length; ++i) {
fieldTexts.push(ZU.trimInternal(fields[i].textContent));
}
return fieldTexts.join(" | ");
}
return "";
}
function getLinkLists(doc, label, idx) {
var values = [];
let links = doc.querySelectorAll("." + label + " a[href*='" + idx + "']");
if (links) {
for (let i = 0; i < links.length; ++i) {
values.push(links[i].textContent);
}
}
return values;
}
function addPermalink(doc, item, idType) {
// The permalink is rendered via Javascript so not always available when you save mutiple items.
// The logic to create the permalinks is quite complicated for library items,
// so best to fallback to the system url for now.
// Try permalink first
let permalink = doc.querySelector("a[onclick^='return permalink']");
let archivesId = getFieldText(doc, "ARCHIVE_915");
let namesId = getFieldText(doc, "DOC_ID");
if (permalink) {
item.url = permalink.getAttribute("onclick").match(/(https.+)'\);$/)[1];
}
// Archives and Names indexes seem to have a consistent permalink pattern
else if (idType == "AI" && archivesId) {
item.url = "https://stors.tas.gov.au/" + idType + "/" + archivesId.replace(/\//g, "-");
}
else if (idType == "NI" && namesId) {
namesId = ZU.trim(namesId.split(":")[1]);
item.url = "https://stors.tas.gov.au/" + idType + "/" + namesId;
}
// Fall back to system url
else {
item.url = doc.location.href;
}
return item;
}
function addDigitalFiles(doc, item) {
// Add snapshots
item.attachments.push({
title: "Snapshot",
mimeType: "text/html",
document: doc
});
var digitalUrls = [];
var digitalLabels = {};
// Some digital file links are in hidden cells, with the links generated by JS.
// Scraping the generated links fails when processing multiple, presumably because
// the scrape completed before the links appeared. So we'll get them from the hidden cells.
var embeddedLinks = doc.querySelectorAll('.NI_URL_value');
if (embeddedLinks.length > 0) {
for (let i = 0; i < embeddedLinks.length; ++i) {
var url = text(embeddedLinks[i], "subfield_u");
// Link labels
let labelParts = [];
// Record type
if (embeddedLinks[i].querySelector("subfield_x")) {
labelParts.push(embeddedLinks[i].querySelector("subfield_x").textContent);
}
// Record ID
if (embeddedLinks[i].querySelector("subfield_z")) {
labelParts.push(embeddedLinks[i].querySelector("subfield_z").textContent);
}
// Convict records
if (url.includes("image_viewer.htm")) {
let urlParts = url.match(/image_viewer\.htm\?([A-Z0-9]+-\d+-\d+),\d+,(\d+)/);
// Z.debug(urlParts);
url = "https://stors.tas.gov.au/" + urlParts[1] + "p" + urlParts[2];
digitalUrls.push(url);
digitalLabels[url] = labelParts.join(", ") + ", page " + urlParts[2];
}
// Other records
else if (url.includes("stors.tas.gov.au")) {
// Z.debug(url);
let initPath = url.match(/\$init=(.+)/);
if (initPath) {
url = "https://stors.tas.gov.au/" + initPath[1];
}
var page = "";
if (url.match(/p(\d+)$/)) {
page = ", page " + url.match(/p(\d+)$/)[1];
}
digitalUrls.push(url);
digitalLabels[url] = labelParts.join(", ") + page;
}
}
}
// If the values aren't in hidden cells we'll get the links instead.
// Links to digital versions have a range of labels in the catalogue
// so we'll look for any links that look right.
else {
let digitalLinks = doc.querySelectorAll("a[href^='https://stors.tas.gov.au'][target='_new'], a[href^='https://stors.tas.gov.au'][target='_blank']");
for (let i = 0; i < digitalLinks.length; ++i) {
url = digitalLinks[i].href;
// If there's an init value we can use this to get the url for a specific page
let initPath = url.match(/\$init=(.+)/);
if (initPath) {
url = "https://stors.tas.gov.au/" + initPath[1];
}
digitalUrls.push(url);
// Save the link's text to use in the attachment label
digitalLabels[url] = digitalLinks[i].textContent;
}
}
// Zotero.debug(digitalUrls);
// Zotero.debug(digitalLabels);
// Process image viewer links
// This will only attach single images or PDFs
// The multi-page viewers use iFrames and seem to draw images from a couple of different sources.
// This makes it difficult to get at them reliably.
// Because there are so many variations that could break things, processDocs calls item.done() on error.
if (digitalUrls.length > 0) {
ZU.processDocuments(digitalUrls, function (digitalDoc) {
var mimeType = "image/jpeg";
// Find the download link
var downloadLink = digitalDoc.querySelector("a[title='Download'], a[id='downloadLink']");
// Sometimes the download link opens a modal, if so get the link from the modal code
if (downloadLink && !downloadLink.href.includes("/download/")) {
downloadLink = digitalDoc.querySelector("div.downloadDialog a");
}
if (downloadLink) {
// Z.debug(downloadLink.href);
// If the page is using a PDF viewer, set mime type to pdf
// Otherwise use default jpeg mimetype
let viewer = digitalDoc.querySelector("#viewer");
if (viewer && viewer.className.startsWith("pdf")) {
mimeType = "application/pdf";
}
// Zotero.debug(digitalDoc.location.href);
// Add file as attachment
item.attachments.push({
title: 'Libraries Tasmania digital item: ' + digitalLabels[digitalDoc.location.href],
mimeType: mimeType,
url: downloadLink.href
});
}
},
// On complete
function () {
item.complete();
},
// On error
function (e) {
Z.debug(e);
item.complete();
});
}
else {
item.complete();
}
}
function cleanText(text) {
// Removes unnecessary stuff from catalogue strings
var replace = ["[", "]", "<", ">"];
text = ZU.trim(text);
for (let i = 0; i < replace.length; ++i) {
text = text.replace(replace[i], "");
}
text = text.replace(/\.$/, "");
return text;
}
function scrape(doc, url) {
// Catalogue search type
var catType = url.match(/en_AU\/(library|tas|names|all)\/search/)[1];
// The 'all' search type can include anything.
// In this case URL checks should identify archives and names.
// Including both checks to try and catch as much as possible.
if (catType == "tas" || url.includes("ARCHIVES_")) {
scrapeArchives(doc, url);
}
else if (catType == "names" || url.includes("NAME_INDEXES")) {
scrapeNames(doc, url);
}
else {
scrapeLibrary(doc, url);
}
}
function scrapeLibrary(doc, url) {
// Format of item
var format = detectWeb(doc, url);
// If there's a 'Library View' tab we can use MARC
if (doc.querySelector("div#marc-tab0")) {
// call MARC translator
var translator = Zotero.loadTranslator("import");
translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
translator.getTranslatorObject(function (marc) {
var record = new marc.record();
var item = new Zotero.Item();
var fieldTag, indicators, fieldContent;
for (let row of doc.querySelectorAll("div#marc-tab0 table tr")) {
let fields = row.querySelectorAll("td");
fieldTag = ZU.trim(fields[0].textContent);
indicators = ZU.trim(fields[1].textContent);
// There don't seem to be any subfields in the records.
// Or at least I haven't found any.
// Adding in a subfield is necessary to get the translator to work.
fieldContent = marc.subfieldDelimiter + "a" + ZU.trim(fields[2].textContent);
record.addField(fieldTag, indicators, fieldContent);
}
record.translate(item);
// Doesn't seem to get format correctly from MARC, so add manually
item.itemType = format;
// Add reference number
item.callNumber = getFieldText(doc, "DOC_ID");
// Add permalink
item = addPermalink(doc, item, null);
// Add digitised files as attachments
addDigitalFiles(doc, item);
});
// No MARC so we have to scrape manually
}
else {
var item = new Zotero.Item(format);
item.title = getFieldText(doc, "T245_DISPLAY");
item.callNumber = getFieldText(doc, "DOC_ID");
// Creators
let authors = getLinkLists(doc, "AUTHOR_TALIS_FULL", "AUTHOR_INDEX");
for (let i = 0; i < authors.length; ++i) {
item.creators.push(ZU.cleanAuthor(authors[i], "author", true));
}
let contribs = getLinkLists(doc, "AUTHOR_OTHER_TALIS_FULL", "AUTHOR_INDEX");
for (let i = 0; i < contribs.length; ++i) {
item.creators.push(ZU.cleanAuthor(contribs[i], "contributor", true));
}
// PUBLICATION DETAILS
var pubInfo = getFieldText(doc, "PUBLICATION_INFO");
// Music can have a distributor
if (!pubInfo) {
pubInfo = getFieldText(doc, "DISTRIBUTION_264");
}
// eBooks?
if (!pubInfo) {
pubInfo = getFieldText(doc, "PUBLICATION_264");
}
// See if it matches standard format
var pubParts = pubInfo.match(/^(.+):(.+),(.+)$/);
if (pubParts) {
item.place = cleanText(pubParts[1]);
item.publisher = cleanText(pubParts[2]);
item.date = cleanText(pubParts[3]);
}
else {
item.publisher = pubInfo;
}
let contents = getFieldText(doc, "CONTENTS_TALIS");
let summary = getFieldText(doc, "SUMMARY_TALIS");
let notes = getFieldText(doc, "NOTES_TALIS");
let combined = [summary, contents, notes].join("\n\n");
item.abstractNote = combined ? combined : "";
// Physical description
let physDesc = getFieldText(doc, "DESC_TALIS");
let physParts = physDesc.split(";");
if (physParts.length == 2 && format == "book") {
item.numPages = cleanText(physParts[0]);
item["physical description"] = cleanText(physParts[1]);
}
else {
item["physical description"] = cleanText(physDesc);
}
item = addPermalink(doc, item, null);
addDigitalFiles(doc, item);
}
}
function scrapeArchives(doc) {
var item = new Zotero.Item("manuscript");
// Types should be Agency, Series, or Item
let typeLabel = ZU.trim(text(doc, ".T245_DISPLAY_label")).replace(/:$/, "").toLowerCase();
if (typeLabel == "description") {
item.manuscriptType = "item";
}
else {
item.manuscriptType = typeLabel;
}
item.title = getFieldText(doc, "T245_DISPLAY");
item.callNumber = getFieldText(doc, "ARCHIVE_915");
item.archiveLocation = getFieldText(doc, "ARCHIVES_ITEM_LOCN_BAY");
var description = getFieldText(doc, "ARCHIVES_ITEM_FURTHER_DESC");
// Agencies and series have a different note field
if (!description) {
description = getFieldText(doc, "TAS_IDX_500");
}
item.abstractNote = description;
// If there are start and end dates (as for series) save as a range
let startDate = getFieldText(doc, "ARCHIVES_SERIES_START_DATE");
let endDate = getFieldText(doc, "ARCHIVES_SERIES_END_DATE");
if (startDate && endDate) {
item.date = ZU.strToISO(startDate) + "/" + ZU.strToISO(endDate);
}
else if (startDate) {
item.date = ZU.strToISO(startDate);
}
// Save linked agencies as contributors
let agencyLabel = doc.querySelector("div[class*='ARCHIVES_SERIES_CREATING_AGEN'");
if (agencyLabel) {
let agencies = agencyLabel.nextElementSibling.querySelectorAll("td.ASlink");
for (let i = 0; i < agencies.length; ++i) {
item.creators.push({ lastName: agencies[i].innerText, creatorType: "contributor" });
}
}
// Save additional information to Extra
// Series
item.series = text(doc, "a[href*='ARCHIVES_SERIES']");
// Functions
let functions = getLinkLists(doc, "ARCHIVES_FUN_DIX");
if (functions.length > 0) {
item.functions = functions.join(", ");
}
// Descriptive fields -- add values to Extra
var tasFields = [
"ARCHIVES_ACCESS",
"ARCHIVES_AGENCY_SOURCES",
"ARCHIVES_AGENCIES_CREATING",
"ARCHIVES_SERIES_ARRANGEMENT"
];
for (let i = 0; i < tasFields.length; ++i) {
let label = doc.querySelector("." + tasFields[i] + "_label");
if (label) {
item[ZU.trim(label.textContent).replace(/:$/, "")] = getFieldText(doc, tasFields[i]);
}
}
item = addPermalink(doc, item, "AI");
addDigitalFiles(doc, item);
}
function scrapeNames(doc) {
var item = new Zotero.Item("manuscript");
// There can be multiple entries for title -- eg in case of divorce there are two names.
// getFieldText() will join multiple values with | delimiters
item.title = getFieldText(doc, "NI_NAME_FULL_DISPLAY");
item.callNumber = getFieldText(doc, "DOC_ID");
item.manuscriptType = "item";
item.index = getFieldText(doc, "NI_INDEX");
// Dates have many different labels, loop through this list until one is found
// then save to item.date
// Dates will also be saved to Extra (see below) with their specific labels.
const dateLabels = [
"NI_YEAR_DISPLAY",
"NI_ADMISS_DATE",
"NI_TRIAL_DATE",
"NI_BIRTH_DATE",
"NI_DEATH_DATE",
"NI_MARRIAGE_DATE",
"NI_ARRIVAL_DATE",
"NI_DEPARTURE_DATE",
"NI_INQUEST_DATE",
"NI_LAND_DATE",
"NI_DOC_HEALTH_DATE",
"NI_EMPLOY_DATE",
];
for (let i = 0; i < dateLabels.length; ++i) {
let displayDate = getFieldText(doc, dateLabels[i]);
if (displayDate) {
item.date = displayDate;
break;
}
}
// Name index records have many possible fields.
// This list was made by scanning sample records, so labels could be missing.
// Loop through this list, and if values exist save them to Extra.
const fields = [
"NI_OCCUP",
"NI_YEAR_DISPLAY",
"NI_SHIP_NATIVE_PLACE",
"NI_REMARKS",
"NI_GENDER",
"NI_MOTHER",
"NI_P_OCCUP",
"NI_BIRTH_DATE",
"NI_BAPTISM_DATE",
"NI_REG_PLACE",
"NI_REG_YEAR",
"NI_AGE",
"NI_DEATH_DATE",
"NI_SPOUSE",
"NI_SPOUSE_GENDER",
"NI_SPOUSE_AGE",
"NI_MARRIAGE_DATE",
"NI_NAME_RANK",
"NI_DEPARTURE_DATE",
"NI_DEPARTURE_PORT",
"NI_SHIP",
"NI_BOUND",
"NI_WILL_NO",
"NI_PAGE",
"NI_NAME_TITLE",
"NI_ARRIVAL_DATE",
"NI_VOYAGE_NO",
"NI_CON_IDX",
"NI_SHIP_OR_FREE1",
"NI_NAME2",
"NI_SHIP_OR_FREE2",
"NI_MP_DATE",
"NI_CORONER",
"NI_DESC",
"NI_INQUEST_DATE",
"NI_VERDICT",
"NI_LAND_DATE",
"NI_LOCATION",
"NI_DOC_HEALTH_DATE",
"NI_UNDER14",
"NI_CENSUS_DISTRICT",
"NI_NAME_STATUS",
"NI_TRIAL_DATE",
"NI_OFFENSE",
"NI_VERDICT",
"NI_PP_ID",
"NI_EMPLOYER",
"NI_PROPERTY",
"NI_EMPLOY_DATE",
"NI_NOMINATOR",
"NI_DOC_DATE",
"NI_FATHER",
"NI_P_OCCUP",
"NI_PRE_SCHOOL",
"NI_ADMISS_DATE"
];
// Add field values to Extras
for (let i = 0; i < fields.length; ++i) {
let label = doc.querySelector("." + fields[i] + "_label");
if (label) {
item[ZU.trim(label.textContent).replace(/:$/, "")] = getFieldText(doc, fields[i]);
}
}
item = addPermalink(doc, item, "NI");
addDigitalFiles(doc, item);
}
/** BEGIN TEST CASES **/
var testCases = [
{
"type": "web",
"url": "https://librariestas.ent.sirsidynix.net.au/client/en_AU/tas/search/detailnonmodal/ent:$002f$002fARCHIVES_SERIES$002f0$002fARCHIVES_SER_DIX:AD940/one",
"defer": true,
"items": [
{
"itemType": "manuscript",
"title": "Minutes of Meetings of Council",
"creators": [
{
"lastName": "University of Tasmania (TA92)",
"creatorType": "contributor"
}
],
"date": "1890-01-19/1992-07-10",
"abstractNote": "Official minutes of meetings. | These records are part of the holdings of the Tasmanian Archives",
"callNumber": "AD940",
"libraryCatalog": "Libraries Tasmania",
"manuscriptType": "series",
"url": "https://stors.tas.gov.au/AI/AD940",
"attachments": [
{
"title": "Snapshot",
"mimeType": "text/html"
}
],
"tags": [],
"notes": [],
"seeAlso": []
}
]
},
{
"type": "web",
"url": "https://librariestas.ent.sirsidynix.net.au/client/en_AU/tas/search/detailnonmodal/ent:$002f$002fARCHIVES_DIGITISED$002f0$002fARCHIVES_DIG_DIX:NS6985-1-1/one",
"defer": true,
"items": [
{
"itemType": "manuscript",
"title": "COVID-19 Story / Elizabeth Kelly (Beth)",
"creators": [
{
"lastName": "Covid-19 Stories Project (TA2205)",
"creatorType": "contributor"
}
],
"date": "2021-01-20/2021-01-20",
"archiveLocation": "Hobart X 1 1",
"callNumber": "NS6985/1/1",
"libraryCatalog": "Libraries Tasmania",
"manuscriptType": "item",
"url": "https://stors.tas.gov.au/AI/NS6985-1-1",
"attachments": [
{
"title": "Snapshot",
"mimeType": "text/html"
},
{
"title": "Libraries Tasmania digital item: NS6985-1-1",
"mimeType": "application/pdf"
}
],
"tags": [],
"notes": [],
"seeAlso": []
}
]
},
{
"type": "web",
"url": "https://librariestas.ent.sirsidynix.net.au/client/en_AU/library/search/detailnonmodal/ent:$002f$002fSD_ILS$002f0$002fSD_ILS:491298/one",
"defer": true,
"items": [
{
"itemType": "book",
"title": "Lives of the most eminent English poets, with critical observations on their works: to which are added the \"Preface to Shakespeare\" and the review of \"The origin of evil\" / With a sketch of the author's life by Walter Scott",
"creators": [
{
"firstName": "Samuel",
"lastName": "Johnson",
"creatorType": "author"
}
],
"callNumber": "SD_ILS:491298",
"extra": "OCLC: 614762888",
"libraryCatalog": "Libraries Tasmania",
"numPages": "588",
"place": "London : Warne, [187- ]",
"shortTitle": "Lives of the most eminent English poets, with critical observations on their works",
"url": "https://stors.tas.gov.au/ILS/SD_ILS-491298",
"attachments": [
{
"title": "Snapshot",
"mimeType": "text/html"
}
],
"tags": [
{
"tag": "English poetry--18th century--History and criticism"
},
{
"tag": "English poetry--Early modern, 1500-1700--History and criticism"
},
{
"tag": "Poets, English"
}
],
"notes": [],
"seeAlso": []
}
]
},
{
"type": "web",
"url": "https://librariestas.ent.sirsidynix.net.au/client/en_AU/library/search/detailnonmodal/ent:$002f$002fLT_NAXOS_DIX$002f0$002fLT_NAXOS_DIX:TC871901/one",
"defer": true,
"items": [
{
"itemType": "audioRecording",
"title": "SCALERO, R.: Violin and Piano Works (M. Tortorelli, Meluso)",
"creators": [
{
"firstName": "Rosario",
"lastName": "Scalero",
"creatorType": "author"
},
{
"lastName": "Naxos Digital Services US",
"creatorType": "contributor"
}
],
"abstractNote": "I. Allegro (08 min. 26 sec.) / Scalero -- II. Adagio (06 min. 21 sec.) / Scalero -- III. Vivace, ma appassionato (08 min. 13 sec.) / Scalero -- No. 1. Lento, poi tempo di walzer (04 min. 31 sec.) / Scalero -- No. 2. Andante malinconico (03 min. 48 sec.) / Scalero -- No. 3. Allegro con brio (05 min. 39 sec.) / Scalero -- No. 1. Allegro (04 min. 50 sec.) / Scalero -- No. 2. Allegro, alla Scarlatti (03 min. 31 sec.) / Scalero -- No. 3. Allegro giusto (05 min. 30 sec.) / Scalero -- 12 Variazioni nach den Barucaba von Paganini, Op. 15 (16 min. 44 sec.) / Scalero",
"callNumber": "LT_NAXOS_DIX:TC871901",
"label": "Hong Kong : Naxos Digital Services US Inc. 3014",
"libraryCatalog": "Libraries Tasmania",
"shortTitle": "SCALERO, R.",
"url": "https://librariestas.ent.sirsidynix.net.au/client/en_AU/library/search/detailnonmodal/ent:$002f$002fLT_NAXOS_DIX$002f0$002fLT_NAXOS_DIX:TC871901/one",
"attachments": [
{
"title": "Snapshot",
"mimeType": "text/html"
}
],
"tags": [],
"notes": [],
"seeAlso": []
}
]
},
{
"type": "web",
"url": "https://librariestas.ent.sirsidynix.net.au/client/en_AU/names/search/detailnonmodal/ent:$002f$002fNAME_INDEXES$002f0$002fNAME_INDEXES:1384365/one",
"defer": true,
"items": [
{
"itemType": "manuscript",
"title": "Crimey, Mary",
"creators": [],
"date": "10 Apr 1842",
"callNumber": "NAME_INDEXES:1384365",
"libraryCatalog": "Libraries Tasmania",
"manuscriptType": "item",
"url": "https://stors.tas.gov.au/NI/1384365",
"attachments": [
{
"title": "Snapshot",
"mimeType": "text/html"
},
{
"title": "Libraries Tasmania digital item: Conduct Record, CON40/1/2, page 224",
"mimeType": "image/jpeg"
},
{
"title": "Libraries Tasmania digital item: Description List, CON19/1/3, page 139",
"mimeType": "image/jpeg"
},
{
"title": "Libraries Tasmania digital item: Indent, CON15/1/1 Pages 48-49",
"mimeType": "image/jpeg"
}
],
"tags": [],
"notes": [],
"seeAlso": []
}
]
},
{
"type": "web",
"url": "https://librariestas.ent.sirsidynix.net.au/client/en_AU/names/search/detailnonmodal/ent:$002f$002fNAME_INDEXES$002f0$002fNAME_INDEXES:974802/one",
"defer": true,
"items": [
{
"itemType": "manuscript",
"title": "Crothers, Louisa",
"creators": [],
"date": "10 Sep 1872",
"callNumber": "NAME_INDEXES:974802",
"libraryCatalog": "Libraries Tasmania",
"manuscriptType": "item",
"url": "https://stors.tas.gov.au/NI/974802",
"attachments": [
{
"title": "Snapshot",
"mimeType": "text/html"
},
{
"title": "Libraries Tasmania digital item: RGD33/1/10/ no 2801",
"mimeType": "image/jpeg"
}
],
"tags": [],
"notes": [],
"seeAlso": []
}
]
}
]
/** END TEST CASES **/