UNPKG

@natlibfi/melinda-record-match-validator

Version:

Validates if two records matched by melinda-record-matching can be merged and sets merge priority

171 lines (170 loc) 5.65 kB
import createDebugLogger from "debug"; const debug = createDebugLogger("@natlibfi/melinda-record-match-validator:audio"); const debugDev = debug.extend("dev"); const debugData = debug.extend("data"); function containsCdAanilevy(subfield) { if (subfield.code !== "a") { return false; } if (subfield.value?.match(/CD-(?:äänilevy|ljudskiv)/ui)) { return true; } return false; } function containsLpAanilevy(subfield) { if (subfield.code !== "a") { return false; } if (subfield.value?.match(/LP-(?:äänilevy|levy|ljudskiv|skiv)/ui)) { return true; } return false; } function physicalDescriptionContainsAanikela(fields300) { return fields300.some((field) => field.subfields.some((subfield) => containsAanikela(subfield))); function containsAanikela(subfield) { if (subfield.code !== "a") { return false; } if (subfield.value?.match(/(?:audiotape reel|ljudspol(?:e|ar)|äänikela)/ui)) { return true; } return false; } } function physicalDescriptionContainsAanilevy(fields300) { return fields300.some((field) => field.subfields.some((subfield) => containsAanilevy(subfield))); function containsAanilevy(subfield) { if (subfield.code !== "a") { return false; } if (containsCdAanilevy(subfield) || containsLpAanilevy(subfield) || subfield.value?.match(/(?:audio disc|ljudskiv|äänilevy)/ui)) { return true; } return false; } } function physicalDescriptionContainsCdAanilevy(fields300) { return fields300.some((field) => field.subfields.some((subfield) => containsCdAanilevy(subfield))); } function physicalDescriptionContainsKasetti(fields300) { return fields300.some((field) => field.subfields.some((subfield) => containsKasetti(subfield))); function containsKasetti(subfield) { if (subfield.code !== "a" || !subfield.value) { return false; } const value = subfield.value.replace(/video.?[ck]as+ett/iug, "VIDEO"); if (value.match(/[ck]as+ett/ui)) { return true; } return false; } } function physicalDescriptionContainsLpAanilevy(fields300) { return fields300.some((field) => field.subfields.some((subfield) => containsLpAanilevy(subfield))); } function isAanilevy(record) { const fields007 = record.get(/^007$/u); if (fields007.some((field) => field.value.match(/^sd/u))) { return true; } const fields = record.get(/^300$/u); if (physicalDescriptionContainsAanilevy(fields)) { return true; } return false; } function isAanikela(record) { const fields007 = record.get(/^007$/u); if (fields007.some((field) => field.value.match(/^st/u))) { return true; } const fields = record.get(/^300$/u); if (physicalDescriptionContainsAanikela(fields)) { return true; } return false; } function isCdAanilevy(record) { const fields007 = record.get(/^007$/u); if (fields007.some((field) => field.value.match(/^sd.f..g...m/u))) { return true; } const fields = record.get(/^300$/u); if (physicalDescriptionContainsCdAanilevy(fields)) { return true; } return false; } function isKasetti(record) { const fields007 = record.get(/^007$/u); if (fields007.some((field) => field.value.match(/^ss/u))) { return true; } const fields = record.get(/^300$/u); if (physicalDescriptionContainsKasetti(fields)) { return true; } return false; } function isLpAanilevy(record) { const fields007 = record.get(/^007$/u); if (fields007.some((field) => field.value.match(/^sd.[cd]..e...p/u))) { return true; } const fields300 = record.get(/^300$/u); if (physicalDescriptionContainsLpAanilevy(fields300)) { return true; } return false; } function getPhysicalDescription(record) { const result = { containsCdAanilevy: isCdAanilevy(record), containsLpAanilevy: isLpAanilevy(record), containsAanilevy: isAanilevy(record), containsKasetti: isKasetti(record), containsAanikela: isAanikela(record) }; return result; } export function performAudioSanityCheck({ record1, record2 }) { const results1 = getPhysicalDescription(record1); const results2 = getPhysicalDescription(record2); debugData("COMPARE AUDIO TYPES"); debugData(JSON.stringify(results1)); debugData(JSON.stringify(results2)); const checkLp = results1.containsCdAanilevy || results2.containsCdAanilevy; const checkCd = results1.containsLpAanilevy || results2.containsLpAanilevy; if (checkCd && results1.containsCdAanilevy !== results2.containsCdAanilevy) { return false; } if (checkLp) { if (results1.containsLpAanilevy !== results2.containsLpAanilevy) { return false; } if (containsNonCdAanilevy(results1) || containsNonCdAanilevy(results2)) { return false; } } const checkKasetti = results1.containsAanilevy || results2.containsAanilevy || results1.containsAanikela || results2.containsAanikela; const checkAanilevy = results1.containsKasetti || results2.containsKasetti || results1.containsAanikela || results2.containsAanikela; const checkAanikela = results1.containsAanilevy || results2.containsAanilevy || results1.containsKasetti || results2.containsKasetti; if (checkKasetti && results1.containsKasetti !== results2.containsKasetti) { return false; } if (checkAanilevy && results1.containsAanilevy !== results2.containsAanilevy) { return false; } if (checkAanikela && results1.containsAanikela !== results2.containsAanikela) { return false; } return true; function containsNonCdAanilevy(results) { if (results.containsCdAanilevy) { return false; } return results.containsAanilevy; } } //# sourceMappingURL=sanityCheckAudio.js.map