184 lines
4.0 KiB
JavaScript
184 lines
4.0 KiB
JavaScript
|
{
|
||
|
"translatorID": "79c3d292-0afc-42a1-bd86-7e706fc35aa5",
|
||
|
"label": "EIDR",
|
||
|
"creator": "Aurimas Vinckevicius",
|
||
|
"target": "",
|
||
|
"minVersion": "1.0",
|
||
|
"maxVersion": "",
|
||
|
"priority": 80,
|
||
|
"inRepository": true,
|
||
|
"translatorType": 8,
|
||
|
"browserSupport": "gcsibv",
|
||
|
"lastUpdated": "2017-06-03 11:41:00"
|
||
|
}
|
||
|
|
||
|
var typeMap = {
|
||
|
// 'Series'
|
||
|
// 'Season'
|
||
|
// 'Supplemental'
|
||
|
// 'Composite'
|
||
|
// 'Compilation'
|
||
|
// Interactive Material'
|
||
|
'TV': 'tvBroadcast',
|
||
|
'Movie': 'film',
|
||
|
'Short': 'videoRecording',
|
||
|
'Web': 'videoRecording'
|
||
|
};
|
||
|
|
||
|
var creatorMap = {
|
||
|
'Director': 'director',
|
||
|
'Actor': 'castMember'
|
||
|
};
|
||
|
|
||
|
function checkEIDR(eidr) {
|
||
|
var suffix = eidr.trim().match(/10.5240\/((?:[0-9A-F]{4}-){5})([0-9A-Z])/i);
|
||
|
if (!suffix) return false;
|
||
|
|
||
|
//checksum
|
||
|
//ISO 7064 Mod 37,36
|
||
|
var id = suffix[1].replace(/-/g,'').toUpperCase().split('');
|
||
|
var sum = 0;
|
||
|
for (var i=0, n=id.length; i<n; i++) {
|
||
|
sum += '0123456789ABCDEF'.indexOf(id[i]);
|
||
|
sum = ( ((sum % 36) || 36) * 2 ) % 37;
|
||
|
}
|
||
|
|
||
|
sum += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.indexOf(suffix[2]);
|
||
|
|
||
|
return (sum % 36)===1;
|
||
|
}
|
||
|
|
||
|
function getValue(parentNode, node) {
|
||
|
var n = parentNode.getElementsByTagName(node)[0];
|
||
|
|
||
|
return n !== undefined ? n.textContent : undefined;
|
||
|
}
|
||
|
|
||
|
function detectSearch(item) {
|
||
|
if (!item.DOI)
|
||
|
return;
|
||
|
|
||
|
//we should detect party and user but throw an error later
|
||
|
//this way other translators don't need to process the DOI
|
||
|
var prefix = item.DOI.split('/')[0];
|
||
|
if ([
|
||
|
'10.5237', // Parties
|
||
|
'10.5238', // Users
|
||
|
'10.5239', // Video Services
|
||
|
'10.5240' // Content Records
|
||
|
].indexOf(prefix) != -1)
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function doSearch(searchItem) {
|
||
|
if (!searchItem.DOI)
|
||
|
throw new Error("EIDR not specified.");
|
||
|
if (!checkEIDR(searchItem.DOI))
|
||
|
throw new Error("EIDR not supported: " + searchItem.DOI);
|
||
|
|
||
|
var request = 'https://resolve.eidr.org/EIDR/object/' + searchItem.DOI
|
||
|
+ '/?type=Full&followAlias=true';
|
||
|
ZU.doGet(request, function(text) {
|
||
|
var parser = new DOMParser();
|
||
|
var res = parser.parseFromString(text, "application/xml");
|
||
|
|
||
|
var ns = {
|
||
|
'n' : 'http://www.eidr.org/schema',
|
||
|
'md': 'http://www.movielabs.com/schema/md/v2.1/md'
|
||
|
};
|
||
|
|
||
|
if (res.getElementsByTagName('Response').length) {
|
||
|
|
||
|
throw new Error("Server returned error: ("
|
||
|
+ getValue(res, 'Code') + ") "
|
||
|
+ getValue(res, 'Type'));
|
||
|
}
|
||
|
|
||
|
var base = res.getElementsByTagName('BaseObjectData')[0];
|
||
|
|
||
|
var type = typeMap[getValue(base,'ReferentType')];
|
||
|
if (!type) {
|
||
|
Z.debug("Unhandled ReferentType: " + getValue(base,'ReferentType'));
|
||
|
return
|
||
|
}
|
||
|
var item = new Zotero.Item(type);
|
||
|
|
||
|
//localize?
|
||
|
item.title = getValue(base,'ResourceName');
|
||
|
item.language = ZU.xpathText(base, './n:PrimaryLanguage/n:Language', ns);
|
||
|
item.date = getValue(base,'ReleaseDate');
|
||
|
item.place = getValue(base,'CountryOfOrigin');
|
||
|
|
||
|
//running time
|
||
|
var time = getValue(base,'ApproximateLength')
|
||
|
.match(/PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?/i);
|
||
|
item.runningTime = ((time[1] || 0) * 3600 +
|
||
|
(time[2] || 0) * 60 +
|
||
|
(time[3] || 0)) + 's';
|
||
|
|
||
|
//creators
|
||
|
var creators = base.getElementsByTagName('Credits')[0];
|
||
|
var c, t;
|
||
|
if (creators) {
|
||
|
c = creators.firstChild;
|
||
|
while (c) {
|
||
|
t = creatorMap[c.nodeName];
|
||
|
if (!t) continue;
|
||
|
|
||
|
item.creators.push(
|
||
|
ZU.cleanAuthor(getValue(c,'md:DisplayName'), t)
|
||
|
);
|
||
|
|
||
|
c = c.nextSibling;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**TODO: Handle producers*/
|
||
|
|
||
|
item.complete();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/** BEGIN TEST CASES **/
|
||
|
var testCases = [
|
||
|
{
|
||
|
"type": "search",
|
||
|
"input": {
|
||
|
"DOI": "10.5240/6F7E-EF59-329B-1F0A-8440-2"
|
||
|
},
|
||
|
"items": [
|
||
|
{
|
||
|
"itemType": "videoRecording",
|
||
|
"creators": [
|
||
|
{
|
||
|
"lastName": "Rowland",
|
||
|
"firstName": "Roy",
|
||
|
"creatorType": "director"
|
||
|
},
|
||
|
{
|
||
|
"firstName": "Byron",
|
||
|
"lastName": "Shores",
|
||
|
"creatorType": "castMember"
|
||
|
},
|
||
|
{
|
||
|
"firstName": "C. Henry",
|
||
|
"lastName": "Gordon",
|
||
|
"creatorType": "castMember"
|
||
|
}
|
||
|
],
|
||
|
"notes": [],
|
||
|
"tags": [],
|
||
|
"seeAlso": [],
|
||
|
"attachments": [],
|
||
|
"libraryCatalog": "EIDR",
|
||
|
"title": "You, the People",
|
||
|
"date": "1940",
|
||
|
"place": "US",
|
||
|
"runningTime": "1260s"
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
]
|
||
|
/** END TEST CASES **/
|