## Written by Jason Boland, Clarivateâ„¢ ## jason.boland@clarivate.com ## ## 2022-11-01: Original script produced ## 2023-09-15: Added support for serials in roll ups ## 2023-12-22: Added support for video games in roll ups ## 2024-03-13: Updated order of MARC fields that contribute to title: 245/130/240 ## ## This Python script prompts for two Polaris bib records and will check if they ## qualify to roll up or not in Vega. It also provides the reason that the two ## records do or do not roll up. ## ## Libraries to install: ## pip install clrprint ## pip install requests ## pip install xmltodict ## import hashlib import hmac import base64 import requests import json import ast from wsgiref.handlers import format_date_time from datetime import datetime from time import mktime import xmltodict import clrprint.clrprint ## ## Fill in the next 6 elements to connect Python script to your Polaris server. ## ## Example API Key and Secret from Web Admin: ## ## apiID = 'MyLibraryAPI' ## apiKey = '37GC3F54-60E0-I77D-BBA3-FCJE00C840E7' ## ## Example Polaris login: polaris\PolarisUser ## ## domain = 'polaris' ## userName = 'PolarisUser' ## password = 'P@ssword123' ## ## Base URL is starting part of URL for Web Admin ## base_url = 'https://polaris.polarislibrary.com' ## apiID = apiKey = domain = userName = password = base_url = rest_uri = base_url + '/PAPIService/REST/protected/1/1033/100/1/' apiKey = bytes(apiKey, 'UTF-8') def video_game_check(bib, bibl): cf6_byte_0 = '0' cf6_byte_9 = '0' for num in bib: if num['@tag'] == '006': cf6_byte_0 = num['#text'][0:1] cf6_byte_9 = num['#text'][9:10] if cf6_byte_0 == 'm' and cf6_byte_9 in ('b', 'g', 'i'): return('Video Game', 'MARC 006 byte 0', cf6_byte_0, 'MARC 006 byte 9', cf6_byte_9) elif cf6_byte_0 != 'm' or cf6_byte_9 not in ('b', 'g', 'i'): flag = False for num in bib: if num['@tag'] == '006': cf6_byte_0 = num['#text'][0:1] flag = True if flag == False or cf6_byte_0 != 'm': byte_0 = bibl[6:7] if byte_0 == 'm': cf8_byte_26 = '0' for num in bib: if num['@tag'] == '008': cf8_byte_26 = num['#text'][26:27] if cf8_byte_26 in ('b', 'g', 'i'): return('Video Game', 'Leader byte 6', byte_0, 'MARC 008 byte 26', cf8_byte_26) else: return('Not Video Game', '0', '0', '0', '0') else: return('Not Video Game', '0', '0', '0', '0') def mat_format (bib): byte_6 = 'a' byte_7 = 'm' byte_6 = bib[6:7] byte_7 = bib[7:8] if (byte_6 == 'a' and byte_7 in ('a', 'b', 'i', 'm', 's')) or (byte_6 == 'i'): m_form = 'Print' elif (byte_6 == 'g'): m_form = 'Video' else: m_form = 'Other' return(byte_6, byte_7, m_form) def bib_level (bib): byte_7 = bib[7:8] if byte_7 in ('a', 'm'): b_lev = 'Monograph' elif byte_7 in ('b', 'i', 's'): b_lev = 'Serial' else: b_lev = 'Text Materials' return(byte_7, b_lev) def field_check(bib, marc): check = False for num in bib: if num['@tag'] == marc: check = True return(check) def field_retrieval (bib, marc, sub): for num in bib: if num['@tag'] == marc: for num2 in num['marc:subfield']: if num2['@code'] == sub: return(num2['#text']) def afield_norm (field): for num in range(len(field)): if field[len(field) - 1] in ('.', ',', ':', ';', '[', ']', '/', ' '): field = field[:-1] return(field.strip()) def auth_print (bib): check = 0 for num in bib: if num['@tag'] in ('100', '110', '111'): tag = num['@tag'] for num2 in num['marc:subfield']: if num2['@code'] == 'a': autha = num2['#text'] check = 0 for num2 in num['marc:subfield']: if 'e' in num2['@code']: if afield_norm(num2['#text']).lower() in ("aut", "author", "edt", "editor"): authe = num2['#text'] check = 1 else: check = 0 else: check = 1 authe = None if check == 1: return(num['@tag'], autha, authe) if check == 0: for num in bib: if num['@tag'] in ('700', '710', '711'): tag = num['@tag'] for num2 in num['marc:subfield']: if num2['@code'] == 'a': autha = num2['#text'] for num2 in num['marc:subfield']: if 'e' in num2['@code']: if afield_norm(num2['#text']).lower() in ("aut", "author", "edt", "editor"): authe = num2['#text'] check = 1 if check == 0: authe = None if check == 1: return(tag, autha, authe) else: return('---', None, None) def auth_vid (bib): pub_array = [] ind = 0 for num in bib: if num['@tag'] in ('260', '264') and num['@ind2'] == '1': for num2 in num['marc:subfield']: if num2['@code'] == 'b': pub_array.insert (ind, num['@tag']) pub_array.insert (ind+1, num2['#text']) ind = ind + 2 return(pub_array) def lang_008 (bib): for num in bib: if num['@tag'] == '008': byte_35 = num['#text'][35:38] return(num['@tag'], byte_35) def lang_041 (bib): pub_array = [] ind = 0 for num in bib: if num['@tag'] == '041': for num2 in num['marc:subfield']: if num2['@code'] == 'a': for num3 in range(0,len(num2['#text']),3): pub_array.insert(ind, num2['#text'][num3:num3 + 3]) ind = ind + 1 return('041', pub_array) def lang_norm (lang): lang = [x.lower() for x in lang] return(lang) def subb_check(field): for num in range(len(field)): if field[len(field) - 1] in ('.', ',', ':', ';', '[', ']', '/', ' '): field = field[:-1] if field.lower() in ('a novel', 'a thriller'): return(None) else: return(field) def bracket_rem (field): if '[' in field: field1 = field[:field.find('[')] field2 = field[field.find(']') + 1:] field = field1 + field2 return(field.replace(' ', ' ')) def paren_rem (field): if '(' in field: field1 = field[:field.find('(')] field2 = field[field.find(')') + 1:] field = (field1 + field2).strip() return(field.replace(' ', ' ')) def field_norm (field): for num in range(len(field)): if field[len(field) - 1] in ('.', ',', ':', ';', '[', ']', '/', ' '): field = field[:-1] return(field.strip()) def list_norm (field): for num in bib1_auth: if num[len(num) - 1] in ('.', ',', ':', ';', '[', ']', '/', ' '): num = num[:-1] return (num.strip().lower()) httpMethod_auth = 'POST' httpMethod_bib = 'GET' URI_auth = rest_uri + 'authenticator/staff' body_auth = "{ 'Domain': '" + domain + "', 'Username': '" + userName + "', 'Password': '" + password + "' }" ## Prompt for bib records check1 = 0 check2 = 0 while check1 == 0: bib1 = str(input("Enter bib record number 1: ")) if bib1.isdigit() == True: check1 = 1 else: print("\nInvalid bib record number") while check2 == 0: bib2 = str(input("Enter bib record number 2: ")) if bib2.isdigit() == True: check2 = 1 else: print("\nInvalid bib record number") # Bib 1 retrieval check = 0 while check == 0: now = datetime.now() stamp = mktime(now.timetuple()) Date = format_date_time(stamp) message_auth = bytes(httpMethod_auth + URI_auth + Date, 'UTF-8') digester_auth = hmac.new(apiKey, message_auth, hashlib.sha1) signature1_auth = digester_auth.digest() signature2_auth = base64.urlsafe_b64encode(signature1_auth) sig_str_auth = signature2_auth.decode('ascii') if '_' in sig_str_auth or '-' in sig_str_auth: check = 0 else: check = 1 auth = requests.post(url = URI_auth, headers = {'PolarisDate': Date, 'Authorization':'PWS ' + apiID + ':' + sig_str_auth, 'Content-type':'application/json', 'Accept':'application/json'}, data = body_auth) str_auth = auth.content.decode("UTF-8") str_auth_json = json.loads(str_auth) token = str_auth_json['AccessToken'] token_key = str_auth_json['AccessSecret'] URI_bib1 = rest_uri + token + '/synch/bibs/MARCXML?bibids=' + bib1 check = 0 while check == 0: now = datetime.now() stamp = mktime(now.timetuple()) Date = format_date_time(stamp) message_bib1 = bytes(httpMethod_bib + URI_bib1 + Date + token_key, 'UTF-8') digester_bib1 = hmac.new(apiKey, message_bib1, hashlib.sha1) signature1_bib1 = digester_bib1.digest() signature2_bib1 = base64.urlsafe_b64encode(signature1_bib1) sig_str_bib1 = signature2_bib1.decode('ascii') if '_' in sig_str_bib1 or '-' in sig_str_bib1: check = 0 else: check = 1 bib1_req = requests.get(url = URI_bib1, headers = {'PolarisDate': Date, 'Authorization':'PWS ' + apiID + ':' + sig_str_bib1, 'Content-type':'application/xml', 'Accept':'application/xml'}) xml_bib1 = bib1_req.content.decode("UTF-8") obj_bib1 = xmltodict.parse(xml_bib1) if (obj_bib1['GetBibsByIDResult']['GetBibsByIDRows']) is None: print("\nBib record number 1 is not valid") else: bib1_data = xmltodict.parse(obj_bib1['GetBibsByIDResult']['GetBibsByIDRows']['GetBibsByIDRow']['BibliographicRecordXML']) bib1_data = bib1_data['marc:collection']['marc:record'] bib1_leader = bib1_data['marc:leader'] bib1_control = bib1_data['marc:controlfield'] bib1_dataf1 = bib1_data['marc:datafield'] bib1_dataf2 = str(bib1_dataf1).replace("subfield': {", "subfield': [{") bib1_dataf2 = bib1_dataf2.replace("}}", "}]}") bib1_datafield = ast.literal_eval(bib1_dataf2) # Bib 2 retrieval URI_bib2 = rest_uri + token + '/synch/bibs/MARCXML?bibids=' + bib2 check = 0 while check == 0: now = datetime.now() stamp = mktime(now.timetuple()) Date = format_date_time(stamp) message_bib2 = bytes(httpMethod_bib + URI_bib2 + Date + token_key, 'UTF-8') digester_bib2 = hmac.new(apiKey, message_bib2, hashlib.sha1) signature1_bib2 = digester_bib2.digest() signature2_bib2 = base64.urlsafe_b64encode(signature1_bib2) sig_str_bib2 = signature2_bib2.decode('ascii') if '_' in sig_str_bib2 or '-' in sig_str_bib2: check = 0 else: check = 1 bib2_req = requests.get(url = URI_bib2, headers = {'PolarisDate': Date, 'Authorization':'PWS ' + apiID + ':' + sig_str_bib2, 'Content-type':'application/xml', 'Accept':'application/xml'}) xml_bib2 = bib2_req.content.decode("UTF-8") obj_bib2 = xmltodict.parse(xml_bib2) if (obj_bib2['GetBibsByIDResult']['GetBibsByIDRows']) is None: print("\nBib record number 2 is not valid") else: bib2_data = xmltodict.parse(obj_bib2['GetBibsByIDResult']['GetBibsByIDRows']['GetBibsByIDRow']['BibliographicRecordXML']) bib2_data = bib2_data['marc:collection']['marc:record'] bib2_leader = bib2_data['marc:leader'] bib2_control = bib2_data['marc:controlfield'] bib2_dataf1 = bib2_data['marc:datafield'] bib2_dataf2 = str(bib2_dataf1).replace("subfield': {", "subfield': [{") bib2_dataf2 = bib2_dataf2.replace("}}", "}]}") bib2_datafield = ast.literal_eval(bib2_dataf2) # Extract format data from bib record #1 bib1_mat_type, bib1_mat_type_elem1, bib1_mat_type_val1, bib1_mat_type_elem2, bib1_mat_type_val2 = video_game_check(bib1_control, bib1_leader) if bib1_mat_type != 'Video Game': bib1_byte6, bib1_byte7, bib1_mat_type = mat_format (bib1_leader) # If print material type, extract bib level from bib record #1 if bib1_mat_type == 'Print': bib1_bl_byte7, bib1_bib_level = bib_level (bib1_leader) # Extract title data from bib record #1 bib1_field_130 = field_check(bib1_datafield, '130') bib1_field_240 = field_check(bib1_datafield, '240') bib1_field_245 = field_check(bib1_datafield, '245') bib1_title = True if bib1_field_130: bib1_title_suba = field_retrieval(bib1_datafield, '130', 'a') if bib1_title_suba: bib1_title_suba_norm = field_norm(bib1_title_suba).lower() bib1_title_suba_norm = paren_rem(bib1_title_suba_norm) else: bib1_title_suba_norm = None bib1_title_subn = field_retrieval(bib1_datafield, '130', 'n') if bib1_title_subn: bib1_title_subn_norm = field_norm(bib1_title_subn).lower() else: bib1_title_subn_norm = None bib1_title_subp = field_retrieval(bib1_datafield, '130', 'p') if bib1_title_subp: bib1_title_subp_norm = field_norm(bib1_title_subp).lower() else: bib1_title_subp_norm = None bib1_title_subb = None bib1_title_subb_norm = None bib1_title_tag = '130' elif bib1_field_240: bib1_title_suba = field_retrieval(bib1_datafield, '240', 'a') if bib1_title_suba: bib1_title_suba_norm = field_norm(bib1_title_suba).lower() bib1_title_suba_norm = paren_rem(bib1_title_suba_norm) else: bib1_title_suba_norm = None bib1_title_subn = field_retrieval(bib1_datafield, '240', 'n') if bib1_title_subn: bib1_title_subn_norm = field_norm(bib1_title_subn).lower() else: bib1_title_subn_norm = None bib1_title_subp = field_retrieval(bib1_datafield, '240', 'p') if bib1_title_subp: bib1_title_subp_norm = field_norm(bib1_title_subp).lower() else: bib1_title_subp_norm = None bib1_title_subb = None bib1_title_subb_norm = None bib1_title_tag = '240' elif bib1_field_245: bib1_title_suba = field_retrieval(bib1_datafield, '245', 'a') if bib1_title_suba: bib1_title_suba_norm = field_norm(bib1_title_suba) bib1_title_suba_norm = paren_rem(bib1_title_suba_norm) bib1_title_suba_norm = field_norm(bib1_title_suba).lower() else: bib1_title_suba_norm = None bib1_title_subb = field_retrieval(bib1_datafield, '245', 'b') if bib1_title_subb: bib1_title_subb_norm = field_norm(bib1_title_subb) bib1_title_subb_norm = bracket_rem(bib1_title_subb_norm).lower() bib1_title_subb_norm = subb_check(bib1_title_subb_norm) else: bib1_title_subb_norm = None bib1_title_subn = field_retrieval(bib1_datafield, '245', 'n') if bib1_title_subn: bib1_title_subn_norm = field_norm(bib1_title_subn).lower() else: bib1_title_subn_norm = None bib1_title_subp = field_retrieval(bib1_datafield, '245', 'p') if bib1_title_subp: bib1_title_subp_norm = field_norm(bib1_title_subp).lower() else: bib1_title_subp_norm = None bib1_title_tag = '245' else: bib1_title = False # Extract author data from bib record #1 if bib1_mat_type == 'Print': bib1_auth_tag, bib1_autha, bib1_authe = auth_print(bib1_datafield) if bib1_autha: bib1_autha_norm = field_norm(bib1_autha).lower() else: bib1_autha_norm = None if bib1_authe: bib1_authe_norm = field_norm(bib1_authe).lower() else: bib1_authe_norm = None # Check for 260/264 to assign marc tag; create list of publishers if bib1_mat_type == 'Video': bib1_auth_list = auth_vid(bib1_datafield) if '260' in bib1_auth_list: bib1_auth_tag = '260' if '264' in bib1_auth_list: bib1_auth_tag = '260 & 264' elif '264' in bib1_auth_list: bib1_auth_tag = '264' if bib1_auth_list: bib1_autha = [] ind = 0 for num in range(1, len(bib1_auth_list), 2): bib1_autha.insert (ind, bib1_auth_list[num]) ind = ind + 1 if bib1_autha: bib1_autha.sort() bib1_autha_norm = [] ind = 0 for num in range(len(bib1_autha)): bib1_autha_norm.insert(ind, field_norm(bib1_autha[num].lower())) ind = ind + 1 else: bib1_autha = [] bib1_autha_norm = [] # Extract language data from bib record #1 bib1_lang_tag, bib1_lang = lang_008(bib1_control) if bib1_lang: bib1_lang_norm = field_norm(bib1_lang).lower() if bib1_lang.lower() in ('0', 'und', 'mul', 'zxx', '|||', '###'): bib1_lang_tag, bib1_lang = lang_041(bib1_datafield) if bib1_lang: bib1_lang.sort() bib1_lang_norm = lang_norm(bib1_lang) else: bib1_lang = field_retrieval(bib1_datafield, '130', 'l') bib1_lang_tag = '130' if bib1_lang is None: bib1_lang = field_retrieval(bib1_datafield, '240', 'l') bib1_lang_tag = '240' if bib1_lang is None: bib1_lang = 'eng' bib1_lang_tag = '---' bib1_lang_norm = field_norm(bib1_lang).lower() # Extract format data from bib record #2 bib2_mat_type, bib2_mat_type_elem1, bib2_mat_type_val1, bib2_mat_type_elem2, bib2_mat_type_val2 = video_game_check(bib2_control, bib2_leader) if bib2_mat_type != 'Video Game': bib2_byte6, bib2_byte7, bib2_mat_type = mat_format (bib2_leader) # If print material type, extract bib level from bib record #2 if bib2_mat_type == 'Print': bib2_bl_byte7, bib2_bib_level = bib_level (bib2_leader) # Extract title data from bib record #2 bib2_field_130 = field_check(bib2_datafield, '130') bib2_field_240 = field_check(bib2_datafield, '240') bib2_field_245 = field_check(bib2_datafield, '245') bib2_title = True if bib2_field_130: bib2_title_suba = field_retrieval(bib2_datafield, '130', 'a') if bib2_title_suba: bib2_title_suba_norm = field_norm(bib2_title_suba).lower() bib2_title_suba_norm = paren_rem(bib2_title_suba_norm) else: bib2_title_suba_norm = None bib2_title_subn = field_retrieval(bib2_datafield, '130', 'n') if bib2_title_subn: bib2_title_subn_norm = field_norm(bib2_title_subn).lower() else: bib2_title_subn_norm = None bib2_title_subp = field_retrieval(bib2_datafield, '130', 'p') if bib2_title_subp: bib2_title_subp_norm = field_norm(bib2_title_subp).lower() else: bib2_title_subp_norm = None bib2_title_subb = None bib2_title_subb_norm = None bib2_title_tag = '130' elif bib2_field_240: bib2_title_suba = field_retrieval(bib2_datafield, '240', 'a') if bib2_title_suba: bib2_title_suba_norm = field_norm(bib2_title_suba).lower() bib2_title_suba_norm = paren_rem(bib2_title_suba_norm) else: bib2_title_suba_norm = None bib2_title_subn = field_retrieval(bib2_datafield, '240', 'n') if bib2_title_subn: bib2_title_subn_norm = field_norm(bib2_title_subn).lower() else: bib2_title_subn_norm = None bib2_title_subp = field_retrieval(bib2_datafield, '240', 'p') if bib2_title_subp: bib2_title_subp_norm = field_norm(bib2_title_subp).lower() else: bib2_title_subp_norm = None bib2_title_subb = None bib2_title_subb_norm = None bib2_title_tag = '240' elif bib2_field_245: bib2_title_suba = field_retrieval(bib2_datafield, '245', 'a') if bib2_title_suba: bib2_title_suba_norm = field_norm(bib2_title_suba) bib2_title_suba_norm = paren_rem(bib2_title_suba_norm) bib2_title_suba_norm = field_norm(bib2_title_suba).lower() else: bib2_title_suba_norm = None bib2_title_subb = field_retrieval(bib2_datafield, '245', 'b') if bib2_title_subb: bib2_title_subb_norm = field_norm(bib2_title_subb) bib2_title_subb_norm = bracket_rem(bib2_title_subb_norm).lower() bib2_title_subb_norm = subb_check(bib2_title_subb_norm) else: bib2_title_subb_norm = None bib2_title_subn = field_retrieval(bib2_datafield, '245', 'n') if bib2_title_subn: bib2_title_subn_norm = field_norm(bib2_title_subn).lower() else: bib2_title_subn_norm = None bib2_title_subp = field_retrieval(bib2_datafield, '245', 'p') if bib2_title_subp: bib2_title_subp_norm = field_norm(bib2_title_subp).lower() else: bib2_title_subp_norm = None bib2_title_tag = '245' else: bib2_title = False # Extract author data from bib record #2 if bib2_mat_type == 'Print': bib2_auth_tag, bib2_autha, bib2_authe = auth_print(bib2_datafield) if bib2_autha: bib2_autha_norm = field_norm(bib2_autha).lower() else: bib2_autha_norm = None if bib2_authe: bib2_authe_norm = field_norm(bib2_authe).lower() else: bib2_authe_norm = None # Check for 260/264 to assign marc tag; create list of publishers if bib2_mat_type == 'Video': bib2_auth_list = auth_vid(bib2_datafield) if '260' in bib2_auth_list: bib2_auth_tag = '260' if '264' in bib2_auth_list: bib2_auth_tag = '260 & 264' elif '264' in bib2_auth_list: bib2_auth_tag = '264' if bib2_auth_list: bib2_autha = [] ind = 0 for num in range(1, len(bib2_auth_list), 2): bib2_autha.insert (ind, bib2_auth_list[num]) ind = ind + 1 if bib2_autha: bib2_autha.sort() bib2_autha_norm = [] ind = 0 for num in range(len(bib2_autha)): bib2_autha_norm.insert(ind, field_norm(bib2_autha[num].lower())) ind = ind + 1 else: bib2_autha = [] bib2_autha_norm = [] # Extract language data from bib record #2 bib2_lang_tag, bib2_lang = lang_008(bib2_control) if bib2_lang: bib2_lang_norm = field_norm(bib2_lang).lower() if bib2_lang.lower() in ('0', 'und', 'mul', 'zxx', '|||', '###'): bib2_lang_tag, bib2_lang = lang_041(bib2_datafield) if bib2_lang: bib2_lang.sort() bib2_lang_norm = lang_norm(bib2_lang) else: bib2_lang = field_retrieval(bib2_datafield, '130', 'l') bib2_lang_tag = '130' if bib2_lang is None: bib2_lang = field_retrieval(bib2_datafield, '240', 'l') bib2_lang_tag = '240' if bib2_lang is None: bib2_lang = 'eng' bib2_lang_tag = '---' bib2_lang_norm = field_norm(bib2_lang).lower() ## # Compare formats clrprint.clrprint ('\n** Format check (MARC Leader)**') if (bib1_mat_type == 'Video Game' and bib2_mat_type != 'Video Game'): clrprint.clrprint ('Mismatch on Format: Video Games do not roll up', clr = 'red') clrprint.clrprint('{} has {}: '.format(bib1, bib1_mat_type_elem1), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_mat_type_val1), end="", clr = 'red') clrprint.clrprint(', {}: '.format(bib1_mat_type_elem2), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_mat_type_val2), end="", clr = 'red') clrprint.clrprint(', Format: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_mat_type), clr = 'red') clrprint.clrprint('{} has Leader byte 6: '.format(bib2), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_byte6), end="", clr = 'red') clrprint.clrprint(', Leader byte 7: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_byte7), end="", clr = 'red') clrprint.clrprint(', Format: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_mat_type), clr = 'red') fcheck = False elif (bib1_mat_type != 'Video Game' and bib2_mat_type == 'Video Game'): clrprint.clrprint ('Mismatch on Format: Video Games do not roll up', clr = 'red') clrprint.clrprint('{} has Leader byte 6: '.format(bib1), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_byte6), end="", clr = 'red') clrprint.clrprint(', Leader byte 7: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_byte7), end="", clr = 'red') clrprint.clrprint(', Format: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_mat_type), clr = 'red') clrprint.clrprint('{} has {}: '.format(bib2, bib2_mat_type_elem1), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_mat_type_val1), end="", clr = 'red') clrprint.clrprint(', {}: '.format(bib2_mat_type_elem2), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_mat_type_val2), end="", clr = 'red') clrprint.clrprint(', Format: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_mat_type), clr = 'red') fcheck = False elif (bib1_mat_type == 'Video Game' and bib2_mat_type == 'Video Game'): clrprint.clrprint ('Mismatch on Format: Video Games do not roll up', clr = 'red') clrprint.clrprint('{} has {}: '.format(bib1, bib1_mat_type_elem1), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_mat_type_val1), end="", clr = 'red') clrprint.clrprint(', {}: '.format(bib1_mat_type_elem2), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_mat_type_val2), end="", clr = 'red') clrprint.clrprint(', Format: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_mat_type), clr = 'red') clrprint.clrprint('{} has {}: '.format(bib2, bib2_mat_type_elem1), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_mat_type_val1), end="", clr = 'red') clrprint.clrprint(', {}: '.format(bib2_mat_type_elem2), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_mat_type_val2), end="", clr = 'red') clrprint.clrprint(', Format: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_mat_type), clr = 'red') fcheck = False elif (bib1_mat_type == 'Other' and bib2_mat_type == 'Other') or (bib1_mat_type != bib2_mat_type): clrprint.clrprint ('Mismatch on Format', clr = 'red') clrprint.clrprint('{} has Leader byte 6: '.format(bib1), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_byte6), end="", clr = 'red') clrprint.clrprint(', Leader byte 7: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_byte7), end="", clr = 'red') clrprint.clrprint(', Format: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_mat_type), clr = 'red') clrprint.clrprint('{} has Leader byte 6: '.format(bib2), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_byte6), end="", clr = 'red') clrprint.clrprint(', Leader byte 7: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_byte7), end="", clr = 'red') clrprint.clrprint(', Format: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_mat_type), clr = 'red') fcheck = False else: clrprint.clrprint ('Match on Format', clr = 'green') clrprint.clrprint('{} has Leader byte 6: '.format(bib1), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_byte6), end="", clr = 'green') clrprint.clrprint(', Leader byte 7: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_byte7), end="", clr = 'green') clrprint.clrprint(', Format: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib1_mat_type), clr = 'green') clrprint.clrprint('{} has Leader byte 6: '.format(bib2), end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_byte6), end="", clr = 'green') clrprint.clrprint(', Leader byte 7: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_byte7), end="", clr = 'green') clrprint.clrprint(', Format: ', end="", clr = 'blue') clrprint.clrprint('{}'.format(bib2_mat_type), clr = 'green') fcheck = True if bib1_mat_type == 'Print' and bib2_mat_type == 'Print': # Compare bib levels clrprint.clrprint ('\n** Bib Level check (MARC Leader)**') if (bib1_bib_level != bib2_bib_level): clrprint.clrprint ('Mismatch on Bib Level', clr = 'red') clrprint.clrprint ('{} has Leader byte 7: '.format(bib1), end="", clr = 'blue') clrprint.clrprint ('{}'.format(bib1_bl_byte7), end="", clr = 'red') clrprint.clrprint (', Format: ', end="", clr = 'blue') clrprint.clrprint ('{}'.format(bib1_bib_level), clr = 'red') clrprint.clrprint ('{} has Leader byte 7: '.format(bib2), end="", clr = 'blue') clrprint.clrprint ('{}'.format(bib2_bl_byte7), end="", clr = 'red') clrprint.clrprint (', Format: ', end="", clr = 'blue') clrprint.clrprint ('{}'.format(bib2_bib_level), clr = 'red') bcheck = False else: clrprint.clrprint ('Match on Format', clr = 'green') clrprint.clrprint ('{} has Leader byte 7: '.format(bib1), end="", clr = 'blue') clrprint.clrprint ('{}'.format(bib1_bl_byte7), end="", clr = 'green') clrprint.clrprint (', Format: ', end="", clr = 'blue') clrprint.clrprint ('{}'.format(bib1_bib_level), clr = 'green') clrprint.clrprint ('{} has Leader byte 7: '.format(bib2), end="", clr = 'blue') clrprint.clrprint ('{}'.format(bib2_bl_byte7), end="", clr = 'green') clrprint.clrprint (', Format: ', end="", clr = 'blue') clrprint.clrprint ('{}'.format(bib2_bib_level), clr = 'green') bcheck = True # Compare titles clrprint.clrprint ('\n** Title check (MARC 130/240/245) **') if (bib1_title_suba_norm == bib2_title_suba_norm) and (bib1_title_subb_norm == bib2_title_subb_norm) and (bib1_title_subn_norm == bib2_title_subn_norm) and (bib1_title_subp_norm == bib2_title_subp_norm): clrprint.clrprint ('Match on Title', clr = 'green') clrprint.clrprint (bib1 + ' has MARC ' + bib1_title_tag + ' a: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_suba, end="", clr = 'green') clrprint.clrprint (', b: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_subb, end="", clr = 'green') clrprint.clrprint (', n: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_subn, end="", clr = 'green') clrprint.clrprint (', p: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_subp, clr = 'green') clrprint.clrprint (bib2 + ' has MARC ' + bib2_title_tag + ' a: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_suba, end="", clr = 'green') clrprint.clrprint (', b: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_subb, end="", clr = 'green') clrprint.clrprint (', n: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_subn, end="", clr = 'green') clrprint.clrprint (', p: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_subp, clr = 'green') clrprint.clrprint ('\nNormalized:', clr = 'blue') clrprint.clrprint (bib1 + ' has MARC ' + bib1_title_tag + ' a: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_suba_norm, end="", clr = 'green') clrprint.clrprint (', b: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_subb_norm, end="", clr = 'green') clrprint.clrprint (', n: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_subn_norm, end="", clr = 'green') clrprint.clrprint (', p: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_subp_norm, clr = 'green') clrprint.clrprint (bib2 + ' has MARC ' + bib2_title_tag + ' a: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_suba_norm, end="", clr = 'green') clrprint.clrprint (', b: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_subb_norm, end="", clr = 'green') clrprint.clrprint (', n: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_subn_norm, end="", clr = 'green') clrprint.clrprint (', p: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_subp_norm, clr = 'green') tcheck = True else: clrprint.clrprint ('Mismatch on Title', clr = 'red') if bib1_title: clrprint.clrprint (bib1 + ' has MARC ' + bib1_title_tag + ' a: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_suba, end="", clr = 'red') clrprint.clrprint (', b: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_subb, end="", clr = 'red') clrprint.clrprint (', n: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_subn, end="", clr = 'red') clrprint.clrprint (', p: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_subp, clr = 'red') else: clrprint.clrprint ('b{} has no title'.format(bib1), clr = 'red') if bib2_title: clrprint.clrprint (bib2 + ' has MARC ' + bib2_title_tag + ' a: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_suba, end="", clr = 'red') clrprint.clrprint (', b: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_subb, end="", clr = 'red') clrprint.clrprint (', n: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_subn, end="", clr = 'red') clrprint.clrprint (', p: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_subp, clr = 'red') else: clrprint.clrprint ('b{} has no title'.format(bib1), clr = 'red') clrprint.clrprint ('\nNormalized:', clr = 'blue') if bib1_title: clrprint.clrprint (bib1 + ' has MARC ' + bib1_title_tag + ' a: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_suba_norm, end="", clr = 'red') clrprint.clrprint (', b: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_subb_norm, end="", clr = 'red') clrprint.clrprint (', n: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_subn_norm, end="", clr = 'red') clrprint.clrprint (', p: ', end="", clr = 'blue') clrprint.clrprint (bib1_title_subp_norm, clr = 'red') else: clrprint ('b{} has no title'.format(bib1), clr = 'red') if bib2_title: clrprint.clrprint (bib2 + ' has MARC ' + bib2_title_tag + ' a: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_suba_norm, end="", clr = 'red') clrprint.clrprint (', b: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_subb_norm, end="", clr = 'red') clrprint.clrprint (', n: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_subn_norm, end="", clr = 'red') clrprint.clrprint (', p: ', end="", clr = 'blue') clrprint.clrprint (bib2_title_subp_norm, clr = 'red') else: clrprint.clrprint ('{} has no title'.format(bib2), clr = 'red') tcheck = False # Compare authors if (bib1_mat_type in ('Other', 'Video Game') or bib2_mat_type in ('Other', 'Video Game')) or (bib1_mat_type != bib2_mat_type): clrprint.clrprint('\n** Author check **','\nUnable to compare authors because bibs are not both print or video', clr = ['blue','red']) acheck = False else: if bib1_mat_type == 'Print': clrprint.clrprint ('\n** Author check (MARC 1xx/7xx) **') if bib1_mat_type == 'Video': clrprint.clrprint ('\n** Author check (MARC 260/264) **') if bib1_mat_type == 'Print': if bib1_autha_norm == bib2_autha_norm: clrprint.clrprint('Match on Author.', clr = 'green') clrprint.clrprint(bib1 + ' has MARC ' + bib1_auth_tag + ' a: ', end="", clr = 'blue') clrprint.clrprint(bib1_autha, end="", clr = 'green') clrprint.clrprint(' e: ', end="", clr = 'blue') clrprint.clrprint(bib1_authe, clr = 'green') clrprint.clrprint(bib2 + ' has MARC ' + bib2_auth_tag + ' a: ', end="", clr = 'blue') clrprint.clrprint(bib2_autha, end="", clr = 'green') clrprint.clrprint(' e: ', end="", clr = 'blue') clrprint.clrprint(bib2_authe, clr = 'green') clrprint.clrprint('\nNormalized:', clr = 'blue') clrprint.clrprint(bib1 + ' has MARC ' + bib1_auth_tag + ' a: ', end="", clr = 'blue') clrprint.clrprint(bib1_autha_norm, end="", clr = 'green') clrprint.clrprint(' e: ', end="", clr = 'blue') clrprint.clrprint(bib1_authe_norm, clr = 'green') clrprint.clrprint(bib2 + ' has MARC ' + bib2_auth_tag + ' a: ', end="", clr = 'blue') clrprint.clrprint(bib2_autha_norm, end="", clr = 'green') clrprint.clrprint(' e: ', end="", clr = 'blue') clrprint.clrprint(bib2_authe_norm, clr = 'green') acheck = True else: clrprint.clrprint('Misatch on Author.', clr = 'red') if bib1_autha: clrprint.clrprint(bib1 + ' has MARC ' + bib1_auth_tag + ' ', end="", clr = 'blue') clrprint.clrprint(bib1_autha, clr = 'red') else: clrprint.clrprint ('b{} has no author'.format(bib1), clr = 'red') if bib2_autha: clrprint.clrprint(bib2 + ' has MARC ' + bib2_auth_tag + ' ', end="", clr = 'blue') clrprint.clrprint(bib2_autha, clr = 'red') else: clrprint.clrprint ('{} has no author'.format(bib2), clr = 'red') clrprint.clrprint('\nNormalized:', clr = 'blue') if bib1_autha: clrprint.clrprint(bib1 + ' has MARC ' + bib1_auth_tag + ' ', end="", clr = 'blue') clrprint.clrprint(bib1_autha_norm, clr = 'red') else: clrprint.clrprint ('{} has no author'.format(bib1), clr = 'red') if bib2_autha: clrprint.clrprint(bib2 + ' has MARC ' + bib2_auth_tag + ' ', end="", clr = 'blue') clrprint.clrprint(bib2_autha_norm, clr = 'red') else: clrprint.clrprint ('{} has no author'.format(bib2), clr = 'red') acheck = False else: if bib1_autha_norm == bib2_autha_norm: clrprint.clrprint('Match on Publisher.', clr = 'green') clrprint.clrprint('{} has MARC {} {}'.format(bib1, bib1_auth_tag, bib1_autha), clr = 'green') clrprint.clrprint('{} has MARC {} {}'.format(bib2, bib2_auth_tag, bib2_autha), clr = 'green') clrprint.clrprint('\nNormalized:', clr = 'blue') clrprint.clrprint('{} has MARC {} {}'.format(bib1, bib1_auth_tag, bib1_autha_norm), clr = 'green') clrprint.clrprint('{} has MARC {} {}'.format(bib2, bib2_auth_tag, bib2_autha_norm), clr = 'green') acheck = True else: clrprint.clrprint('Mismatch on Publisher.', clr = 'red') if bib1_autha: clrprint.clrprint('{} has MARC {} {}'.format(bib1, bib1_auth_tag, bib1_autha), clr = 'red') else: clrprint.clrprint ('{} has no publisher'.format(bib1), clr = 'red') if bib2_autha: clrprint.clrprint('{} has MARC {} {}'.format(bib2, bib2_auth_tag, bib2_autha), clr = 'red') else: clrprint.clrprint ('{} has no publisher'.format(bib2), clr = 'red') clrprint.clrprint('\nNormalized:', clr = 'blue') if bib1_autha: clrprint.clrprint('{} has MARC {} {}'.format(bib1, bib1_auth_tag, bib1_autha_norm), clr = 'red') else: clrprint.clrprint ('{} has no publisher'.format(bib1), clr = 'red') if bib2_autha: clrprint.clrprint('{} has MARC {} {}'.format(bib2, bib2_auth_tag, bib2_autha_norm), clr = 'red') else: clrprint.clrprint ('{} has no publisher'.format(bib2), clr = 'red') acheck = False # Compare languages clrprint.clrprint ('\n** Language check (MARC 008/041/130/240) **') if bib1_lang_norm == bib2_lang_norm: clrprint.clrprint('Match on Language.', clr = 'green') clrprint.clrprint(bib1 + ' has MARC ' + bib1_lang_tag + ' ', end="", clr = 'blue') clrprint.clrprint(bib1_lang, clr = 'green') clrprint.clrprint(bib2 + ' has MARC ' + bib2_lang_tag + ' ', end="", clr = 'blue') clrprint.clrprint(bib2_lang, clr = 'green') clrprint.clrprint('\nNormalized:', clr = 'blue') clrprint.clrprint(bib1 + ' has MARC ' + bib1_lang_tag + ' ', end="", clr = 'blue') clrprint.clrprint(bib1_lang_norm, clr = 'green') clrprint.clrprint(bib2 + ' has MARC ' + bib2_lang_tag + ' ', end="", clr = 'blue') clrprint.clrprint(bib2_lang_norm, clr = 'green') lcheck = True else: clrprint.clrprint('Mismatch on Language.', clr = 'red') clrprint.clrprint(bib1 + ' has MARC ' + bib1_lang_tag + ' ', end="", clr = 'blue') clrprint.clrprint(bib1_lang, clr = 'red') clrprint.clrprint(bib2 + ' has MARC ' + bib2_lang_tag + ' ', end="", clr = 'blue') clrprint.clrprint(bib2_lang, clr = 'red') clrprint.clrprint('\nNormalized:', clr = 'blue') clrprint.clrprint(bib1 + ' has MARC ' + bib1_lang_tag + ' ', end="", clr = 'blue') clrprint.clrprint(bib1_lang_norm, clr = 'red') clrprint.clrprint(bib2 + ' has MARC ' + bib2_lang_tag + ' ', end="", clr = 'blue') clrprint.clrprint(bib2_lang_norm, clr = 'red') lcheck = False #Rollup Analysis clrprint.clrprint ('\n** Rollup Analysis **') if fcheck == True: clrprint.clrprint ('Format:'.ljust(9), 'Pass', clr = ['blue', 'green']) else: clrprint.clrprint ('Format:'.ljust(9), 'Fail', clr = ['blue', 'red']) if bib1_mat_type == 'Print' and bib2_mat_type == 'Print': if bcheck == True: clrprint.clrprint ('Bib Lev:'.ljust(9), 'Pass', clr = ['blue', 'green']) else: clrprint.clrprint ('Bib Lev:'.ljust(9), 'Fail', clr = ['blue', 'red']) if tcheck == True: clrprint.clrprint ('Title:'.ljust(9), 'Pass', clr = ['blue', 'green']) else: clrprint.clrprint ('Title:'.ljust(9), 'Fail', clr = ['blue', 'red']) if acheck == True: clrprint.clrprint ('Author:'.ljust(9), 'Pass', clr = ['blue', 'green']) else: clrprint.clrprint ('Author:'.ljust(9), 'Fail', clr = ['blue', 'red']) if lcheck == True: clrprint.clrprint ('Language:'.ljust(9), 'Pass', clr = ['blue', 'green']) else: clrprint.clrprint ('Language:'.ljust(9), 'Fail', clr = ['blue', 'red']) if bib1_mat_type == 'Print' and bib2_mat_type == 'Print': if fcheck and bcheck and tcheck and acheck and lcheck: clrprint.clrprint ('RESULT:'.ljust(9), 'The two bib records will rollup', clr = ['blue', 'green']) else: clrprint.clrprint ('RESULT:'.ljust(9), 'The two bib records will not rollup', clr = ['blue', 'red']) else: if fcheck and tcheck and acheck and lcheck: clrprint.clrprint ('RESULT:'.ljust(9), 'The two bib records will rollup', clr = ['blue', 'green']) else: clrprint.clrprint ('RESULT:'.ljust(9), 'The two bib records will not rollup', clr = ['blue', 'red'])