## 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 Sierra 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. ## ## Minimum roles for API: Bibs Read ## ## Libraries to install: ## pip install clrprint ## pip install requests ## import base64 import requests import json from clrprint import * ## ## Fill in the next 3 elements to connect Python to your Sierra server. ## ## Example API Key and Secret from Sierra Admin: ## ## apiKey = 'm5uaRP22WI6g3a4PdPjCG+GFEYtk' ## apiSecret = 'P@ssword123' ## ## Base URL is starting part for Sierra Application ## base_url = 'https://sierra.iii.com' ## apiKey = apiSecret = base_url = rest_uri = base_url + ':443/iii/sierra-api/v6/' auth_uri = rest_uri + 'token' bib_uri = rest_uri + 'bibs/' def video_game_check(bib): cf6_byte_0 = '0' cf6_byte_9 = '0' for num in bib: if num['fieldTag'] != '_' and num['marcTag'] == '006': cf6_byte_0 = num['content'][0:1] cf6_byte_9 = num['content'][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['fieldTag'] != '_' and num['marcTag'] == '006': cf6_byte_0 = num['content'][0:1] flag = True if flag == False or cf6_byte_0 != 'm': byte_0 = '0' for num in bib: if num['fieldTag'] == '_': byte_0 = num['content'][6:7] if byte_0 == 'm': cf8_byte_26 = '0' for num in bib: if num['fieldTag'] != '_' and num['marcTag'] == '008': cf8_byte_26 = num['content'][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' for num in bib: if num['fieldTag'] == '_': byte_6 = num['content'][6:7] byte_7 = num['content'][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): for num in bib: if num['fieldTag'] == '_': byte_7 = num['content'][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 'marcTag' in num: if num['marcTag'] == marc: check = True return(check) def field_retrieval (bib, marc, sub): for num in bib: if 'marcTag' in num: if num['marcTag'] == marc: for num2 in num['subfields']: if num2['tag'] == sub: return(num2['content']) 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): ckt = 0 cke = 0 authe = None for num in range(len(bib)): if 'marcTag' in bib[num] and bib[num]['marcTag'] in ('100', '110', '111') and ckt == 0: tag = bib[num]['marcTag'] ckt = 1 for num2 in range(len(bib[num]['subfields'])): if 'e' in bib[num]['subfields'][num2]['tag']: if afield_norm(bib[num]['subfields'][num2]['content']).lower() in ('aut', 'author', 'edt', 'editor') and cke == 0: authe = bib[num]['subfields'][num2]['content'] cke = 1 else: cke = 0 if cke == 1: for num2 in range(len(bib[num]['subfields'])): if 'a' in bib[num]['subfields'][num2]['tag']: autha = bib[num]['subfields'][num2]['content'] ckt = 1 else: for num2 in range(len(bib[num]['subfields'])): if 'a' in bib[num]['subfields'][num2]['tag']: autha = bib[num]['subfields'][num2]['content'] ckt = 1 if 'marcTag' in bib[num] and bib[num]['marcTag'] in ('700', '710', '711') and ckt == 0: tag = bib[num]['marcTag'] ckt = 1 for num2 in range(len(bib[num]['subfields'])): if 'e' in bib[num]['subfields'][num2]['tag']: if afield_norm(bib[num]['subfields'][num2]['content']).lower() in ('aut', 'author', 'edt', 'editor') and cke == 0: authe = bib[num]['subfields'][num2]['content'] cke = 1 else: cke = 0 else: ckt = 0 if cke == 1: for num2 in range(len(bib[num]['subfields'])): if 'a' in bib[num]['subfields'][num2]['tag']: autha = bib[num]['subfields'][num2]['content'] ckt = 1 if ckt == 0: return('---', None, None) else: return(tag, autha, authe) def auth_vid (bib): pub_array = [] ind = 0 for num in bib: if 'marcTag' in num and num['marcTag'] in ('260', '264'): for num2 in num['subfields']: if num2['tag'] == 'b': pub_array.insert (ind, num['marcTag']) pub_array.insert (ind+1, num2['content']) ind = ind + 2 return(pub_array) def lang_008 (bib): byte_35 = '0' for num in bib: if 'marcTag' in num: if num['marcTag'] == '008': byte_35 = num['content'][35:38] return(num['marcTag'], byte_35) def lang_041 (bib): pub_array = [] ind = 0 for num in bib: if 'marcTag' in num: if num['marcTag'] == '041': for num2 in num['subfields']: if num2['tag'] == 'a': for num3 in range(0,len(num2['content']),3): pub_array.insert(ind, num2['content'][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()) ## Aquire API token auth_str = apiKey + ':' + apiSecret auth_bytes = auth_str.encode('ascii') auth_b64 = base64.b64encode(auth_bytes) b64_str = auth_b64.decode('ascii') token = requests.post(auth_uri, headers={"Authorization": "Basic " + b64_str}) token_string = token.content.decode("UTF-8") token_json = json.loads(token_string) token_value = token_json["access_token"] ## Prompt for bib records check1 = 0 check2 = 0 while check1 == 0: bib1 = str(input("Enter bib record number 1 without preceding 'b' or check digit: ")) if bib1.isdigit() == True: bibf1 = requests.get(bib_uri + bib1 + '?fields=varFields', headers={"Authorization": "Bearer " + token_value}) if bibf1.status_code == 200: check1 = 1 else: print("\nInvalid bib record number") else: print("\nInvalid bib record number") while check2 == 0: bib2 = str(input("Enter bib record number 2 without preceding 'b' or check digit: ")) if bib2.isdigit() == True: bibf2 = requests.get(bib_uri + bib2 + '?fields=varFields', headers={"Authorization": "Bearer " + token_value}) if bibf2.status_code == 200: check2 = 1 else: print("\nInvalid bib record number") else: print("\nInvalid bib record number") # Retreive variable-length field data from bib record #1 & bib record #2 str_bib1 = bibf1.content.decode("UTF-8") str_mod_bib1 = str_bib1[str_bib1.find('['):-1] bib1_datafield = json.loads(str_mod_bib1) str_bib2 = bibf2.content.decode("UTF-8") str_mod_bib2 = str_bib2[str_bib2.find('['):-1] bib2_datafield = json.loads(str_mod_bib2) # 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_datafield) if bib1_mat_type != 'Video Game': bib1_byte6, bib1_byte7, bib1_mat_type = mat_format (bib1_datafield) # 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_datafield) # Extract title data from bib record #1 bib1_field_245 = field_check(bib1_datafield, '245') bib1_field_130 = field_check(bib1_datafield, '130') bib1_field_240 = field_check(bib1_datafield, '240') bib1_title = True if 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' elif 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' else: bib1_title = False # Extract author data from bib record #1 if bib1_mat_type != 'Video': 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' bib1_auth = [] ind = 0 for num in range(1, len(bib1_auth_list), 2): bib1_auth.insert (ind, bib1_auth_list[num]) ind = ind + 1 if bib1_auth: bib1_auth.sort() bib1_auth_norm = [] ind = 0 for num in range(len(bib1_auth)): bib1_auth_norm.insert(ind, field_norm(bib1_auth[num].lower())) ind = ind + 1 # Extract language data from bib record #1 bib1_lang_tag, bib1_lang = lang_008(bib1_datafield) 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_datafield) if bib2_mat_type != 'Video Game': bib2_byte6, bib2_byte7, bib2_mat_type = mat_format (bib2_datafield) # 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_datafield) # Extract title data from bib record #2 bib2_field_245 = field_check(bib2_datafield, '245') bib2_field_130 = field_check(bib2_datafield, '130') bib2_field_240 = field_check(bib2_datafield, '240') bib2_title = True if bib1_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).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' elif 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() 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() 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' else: bib2_title = False # Extract author data from bib record #2 if bib2_mat_type != 'Video': 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 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' bib2_auth = [] ind = 0 for num in range(1, len(bib2_auth_list), 2): bib2_auth.insert (ind, bib2_auth_list[num]) ind = ind + 1 if bib2_auth: bib2_auth.sort() bib2_auth_norm = [] ind = 0 for num in range(len(bib2_auth)): bib2_auth_norm.insert(ind, field_norm(bib2_auth[num].lower())) ind = ind + 1 # Extract language data from bib record #2 bib2_lang_tag, bib2_lang = lang_008(bib2_datafield) 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 ('\n** Format check (MARC Leader)**') if (bib1_mat_type == 'Video Game' and bib2_mat_type != 'Video Game'): clrprint ('Mismatch on Format: Video Games do not roll up', clr = 'red') clrprint('b{} has {}: '.format(bib1, bib1_mat_type_elem1), end="", clr = 'blue') clrprint('{}'.format(bib1_mat_type_val1), end="", clr = 'red') clrprint(', {}: '.format(bib1_mat_type_elem2), end="", clr = 'blue') clrprint('{}'.format(bib1_mat_type_val2), end="", clr = 'red') clrprint(', Format: ', end="", clr = 'blue') clrprint('{}'.format(bib1_mat_type), clr = 'red') clrprint('b{} has Leader byte 6: '.format(bib2), end="", clr = 'blue') clrprint('{}'.format(bib2_byte6), end="", clr = 'red') clrprint(', Leader byte 7: ', end="", clr = 'blue') clrprint('{}'.format(bib2_byte7), end="", clr = 'red') clrprint(', Format: ', end="", clr = 'blue') clrprint('{}'.format(bib2_mat_type), clr = 'red') fcheck = False elif (bib1_mat_type != 'Video Game' and bib2_mat_type == 'Video Game'): clrprint ('Mismatch on Format: Video Games do not roll up', clr = 'red') clrprint('b{} has Leader byte 6: '.format(bib1), end="", clr = 'blue') clrprint('{}'.format(bib1_byte6), end="", clr = 'red') clrprint(', Leader byte 7: ', end="", clr = 'blue') clrprint('{}'.format(bib1_byte7), end="", clr = 'red') clrprint(', Format: ', end="", clr = 'blue') clrprint('{}'.format(bib1_mat_type), clr = 'red') clrprint('b{} has {}: '.format(bib2, bib2_mat_type_elem1), end="", clr = 'blue') clrprint('{}'.format(bib2_mat_type_val1), end="", clr = 'red') clrprint(', {}: '.format(bib2_mat_type_elem2), end="", clr = 'blue') clrprint('{}'.format(bib2_mat_type_val2), end="", clr = 'red') clrprint(', Format: ', end="", clr = 'blue') clrprint('{}'.format(bib2_mat_type), clr = 'red') fcheck = False elif (bib1_mat_type == 'Video Game' and bib2_mat_type == 'Video Game'): clrprint ('Mismatch on Format: Video Games do not roll up', clr = 'red') clrprint('b{} has {}: '.format(bib1, bib1_mat_type_elem1), end="", clr = 'blue') clrprint('{}'.format(bib1_mat_type_val1), end="", clr = 'red') clrprint(', {}: '.format(bib1_mat_type_elem2), end="", clr = 'blue') clrprint('{}'.format(bib1_mat_type_val2), end="", clr = 'red') clrprint(', Format: ', end="", clr = 'blue') clrprint('{}'.format(bib1_mat_type), clr = 'red') clrprint('b{} has {}: '.format(bib2, bib2_mat_type_elem1), end="", clr = 'blue') clrprint('{}'.format(bib2_mat_type_val1), end="", clr = 'red') clrprint(', {}: '.format(bib2_mat_type_elem2), end="", clr = 'blue') clrprint('{}'.format(bib2_mat_type_val2), end="", clr = 'red') clrprint(', Format: ', end="", clr = 'blue') clrprint('{}'.format(bib2_mat_type), clr = 'red') fcheck = False elif (bib1_mat_type == 'Other' or bib2_mat_type == 'Other') or (bib1_mat_type != bib2_mat_type): clrprint ('Mismatch on Format', clr = 'red') clrprint('b{} has Leader byte 6: '.format(bib1), end="", clr = 'blue') clrprint('{}'.format(bib1_byte6), end="", clr = 'red') clrprint(', Leader byte 7: ', end="", clr = 'blue') clrprint('{}'.format(bib1_byte7), end="", clr = 'red') clrprint(', Format: ', end="", clr = 'blue') clrprint('b{} has Leader byte 6: '.format(bib2), end="", clr = 'blue') clrprint('{}'.format(bib2_byte6), end="", clr = 'red') clrprint(', Leader byte 7: ', end="", clr = 'blue') clrprint('{}'.format(bib2_byte7), end="", clr = 'red') clrprint(', Format: ', end="", clr = 'blue') clrprint('{}'.format(bib2_mat_type), clr = 'red') fcheck = False else: clrprint ('Match on Format', clr = 'green') clrprint('b{} has Leader byte 6: '.format(bib1), end="", clr = 'blue') clrprint('{}'.format(bib1_byte6), end="", clr = 'green') clrprint(', Leader byte 7: ', end="", clr = 'blue') clrprint('{}'.format(bib1_byte7), end="", clr = 'green') clrprint(', Format: ', end="", clr = 'blue') clrprint('{}'.format(bib1_mat_type), clr = 'green') clrprint('b{} has Leader byte 6: '.format(bib2), end="", clr = 'blue') clrprint('{}'.format(bib2_byte6), end="", clr = 'green') clrprint(', Leader byte 7: ', end="", clr = 'blue') clrprint('{}'.format(bib2_byte7), end="", clr = 'green') clrprint(', Format: ', end="", clr = 'blue') clrprint('{}'.format(bib2_mat_type), clr = 'green') fcheck = True if bib1_mat_type == 'Print' and bib2_mat_type == 'Print': # Compare bib levels clrprint ('\n** Bib Level check (MARC Leader)**') if (bib1_bib_level != bib2_bib_level): clrprint ('Mismatch on Bib Level', clr = 'red') clrprint('b{} has Leader byte 7: '.format(bib1), end="", clr = 'blue') clrprint('{}'.format(bib1_bl_byte7), end="", clr = 'red') clrprint(', Format: ', end="", clr = 'blue') clrprint('{}'.format(bib1_bib_level), clr = 'red') clrprint('b{} has Leader byte 7: '.format(bib2), end="", clr = 'blue') clrprint('{}'.format(bib2_bl_byte7), end="", clr = 'red') clrprint(', Format: ', end="", clr = 'blue') clrprint('{}'.format(bib2_bib_level), clr = 'red') bcheck = False else: clrprint ('Match on Format', clr = 'green') clrprint('b{} has Leader byte 7: '.format(bib1), end="", clr = 'blue') clrprint('{}'.format(bib1_bl_byte7), end="", clr = 'green') clrprint(', Format: ', end="", clr = 'blue') clrprint('{}'.format(bib1_bib_level), clr = 'green') clrprint('b{} has Leader byte 7: '.format(bib2), end="", clr = 'blue') clrprint('{}'.format(bib2_bl_byte7), end="", clr = 'green') clrprint(', Format: ', end="", clr = 'blue') clrprint('{}'.format(bib2_bib_level), clr = 'green') bcheck = True # Compare titles 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 ('Match on Title', clr = 'green') clrprint ('b' + bib1 + ' has MARC ' + bib1_title_tag + ' a: ', end="", clr = 'blue') clrprint (bib1_title_suba, end="", clr = 'green') clrprint (', b: ', end="", clr = 'blue') clrprint (bib1_title_subb, end="", clr = 'green') clrprint (', n: ', end="", clr = 'blue') clrprint (bib1_title_subn, end="", clr = 'green') clrprint (', p: ', end="", clr = 'blue') clrprint (bib1_title_subp, clr = 'green') clrprint ('b' + bib2 + ' has MARC ' + bib2_title_tag + ' a: ', end="", clr = 'blue') clrprint (bib2_title_suba, end="", clr = 'green') clrprint (', b: ', end="", clr = 'blue') clrprint (bib2_title_subb, end="", clr = 'green') clrprint (', n: ', end="", clr = 'blue') clrprint (bib2_title_subn, end="", clr = 'green') clrprint (', p: ', end="", clr = 'blue') clrprint (bib2_title_subp, clr = 'green') clrprint ('\nNormalized:', clr = 'blue') clrprint ('b' + bib1 + ' has MARC ' + bib1_title_tag + ' a: ', end="", clr = 'blue') clrprint (bib1_title_suba_norm, end="", clr = 'green') clrprint (', b: ', end="", clr = 'blue') clrprint (bib1_title_subb_norm, end="", clr = 'green') clrprint (', n: ', end="", clr = 'blue') clrprint (bib1_title_subn_norm, end="", clr = 'green') clrprint (', p: ', end="", clr = 'blue') clrprint (bib1_title_subp_norm, clr = 'green') clrprint ('b' + bib2 + ' has MARC ' + bib2_title_tag + ' a: ', end="", clr = 'blue') clrprint (bib2_title_suba_norm, end="", clr = 'green') clrprint (', b: ', end="", clr = 'blue') clrprint (bib2_title_subb_norm, end="", clr = 'green') clrprint (', n: ', end="", clr = 'blue') clrprint (bib2_title_subn_norm, end="", clr = 'green') clrprint (', p: ', end="", clr = 'blue') clrprint (bib2_title_subp_norm, clr = 'green') tcheck = True else: clrprint ('Mismatch on Title', clr = 'red') if bib1_title: clrprint ('b' + bib1 + ' has MARC ' + bib1_title_tag + ' a: ', end="", clr = 'blue') clrprint (bib1_title_suba, end="", clr = 'red') clrprint (', b: ', end="", clr = 'blue') clrprint (bib1_title_subb, end="", clr = 'red') clrprint (', n: ', end="", clr = 'blue') clrprint (bib1_title_subn, end="", clr = 'red') clrprint (', p: ', end="", clr = 'blue') clrprint (bib1_title_subp, clr = 'red') else: clrprint ('b{} has no title'.format(bib1), clr = 'red') if bib2_title: clrprint ('b' + bib2 + ' has MARC ' + bib2_title_tag + ' a: ', end="", clr = 'blue') clrprint (bib2_title_suba, end="", clr = 'red') clrprint (', b: ', end="", clr = 'blue') clrprint (bib2_title_subb, end="", clr = 'red') clrprint (', n: ', end="", clr = 'blue') clrprint (bib2_title_subn, end="", clr = 'red') clrprint (', p: ', end="", clr = 'blue') clrprint (bib2_title_subp, clr = 'red') else: clrprint ('b{} has no title'.format(bib1), clr = 'red') clrprint ('\nNormalized:', clr = 'blue') if bib1_title: clrprint ('b' + bib1 + ' has MARC ' + bib1_title_tag + ' a: ', end="", clr = 'blue') clrprint (bib1_title_suba_norm, end="", clr = 'red') clrprint (', b: ', end="", clr = 'blue') clrprint (bib1_title_subb_norm, end="", clr = 'red') clrprint (', n: ', end="", clr = 'blue') clrprint (bib1_title_subn_norm, end="", clr = 'red') clrprint (', p: ', end="", clr = 'blue') clrprint (bib1_title_subp_norm, clr = 'red') else: clrprint ('b{} has no title'.format(bib1), clr = 'red') if bib2_title: clrprint ('b' + bib2 + ' has MARC ' + bib2_title_tag + ' a: ', end="", clr = 'blue') clrprint (bib2_title_suba_norm, end="", clr = 'red') clrprint (', b: ', end="", clr = 'blue') clrprint (bib2_title_subb_norm, end="", clr = 'red') clrprint (', n: ', end="", clr = 'blue') clrprint (bib2_title_subn_norm, end="", clr = 'red') clrprint (', p: ', end="", clr = 'blue') clrprint (bib2_title_subp_norm, clr = 'red') else: clrprint ('b{} has no title'.format(bib2), clr = 'red') tcheck = False # Compare authors if (bib1_mat_type == 'Other' or bib2_mat_type == 'Other') or (bib1_mat_type != bib2_mat_type): 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 != 'Video': clrprint ('\n** Author check (MARC 1xx/7xx) **') if bib1_mat_type == 'Video': clrprint ('\n** Author check (MARC 260/264) **') if bib1_mat_type != 'Video': if bib1_autha_norm == bib2_autha_norm: clrprint('Match on Author.', clr = 'green') clrprint('b' + bib1 + ' has MARC ' + bib1_auth_tag + ' a: ', end="", clr = 'blue') clrprint(bib1_autha, end="", clr = 'green') clrprint(' e: ', end="", clr = 'blue') clrprint(bib1_authe, clr = 'green') clrprint('b' + bib2 + ' has MARC ' + bib2_auth_tag + ' a: ', end="", clr = 'blue') clrprint(bib2_autha, end="", clr = 'green') clrprint(' e: ', end="", clr = 'blue') clrprint(bib2_authe, clr = 'green') clrprint('\nNormalized:', clr = 'blue') clrprint('b' + bib1 + ' has MARC ' + bib1_auth_tag + ' a: ', end="", clr = 'blue') clrprint(bib1_autha_norm, end="", clr = 'green') clrprint(' e: ', end="", clr = 'blue') clrprint(bib1_authe_norm, clr = 'green') clrprint('b' + bib2 + ' has MARC ' + bib2_auth_tag + ' a: ', end="", clr = 'blue') clrprint(bib2_autha_norm, end="", clr = 'green') clrprint(' e: ', end="", clr = 'blue') clrprint(bib2_authe_norm, clr = 'green') acheck = True else: clrprint('Misatch on Author.', clr = 'red') if bib1_autha: clrprint('b' + bib1 + ' has MARC ' + bib1_auth_tag + ' a: ', end="", clr = 'blue') clrprint(bib1_autha, end="", clr = 'red') clrprint(' e: ', end="", clr = 'blue') clrprint(bib1_authe, clr = 'red') else: clrprint ('b{} has no author'.format(bib1), clr = 'red') if bib2_autha: clrprint('b' + bib2 + ' has MARC ' + bib2_auth_tag + ' a: ', end="", clr = 'blue') clrprint(bib2_autha, end="", clr = 'red') clrprint(' e: ', end="", clr = 'blue') clrprint(bib2_authe, clr = 'red') else: clrprint ('b{} has no author'.format(bib2), clr = 'red') clrprint('\nNormalized:', clr = 'blue') if bib1_autha: clrprint('\nNormalized:', clr = 'blue') clrprint('b' + bib1 + ' has MARC ' + bib1_auth_tag + ' a: ', end="", clr = 'blue') clrprint(bib1_autha_norm, end="", clr = 'red') clrprint(' e: ', end="", clr = 'blue') clrprint(bib1_authe_norm, clr = 'red') else: clrprint ('b{} has no author'.format(bib1), clr = 'red') if bib2_autha: clrprint('b' + bib2 + ' has MARC ' + bib2_auth_tag + ' a: ', end="", clr = 'blue') clrprint(bib2_autha_norm, end="", clr = 'red') clrprint(' e: ', end="", clr = 'blue') clrprint(bib2_authe_norm, clr = 'red') else: clrprint ('b{} has no author'.format(bib2), clr = 'red') acheck = False else: if bib1_auth_norm == bib2_auth_norm: clrprint('Match on Publisher.', clr = 'green') clrprint('b{} has MARC {} {}'.format(bib1, bib1_auth_tag, bib1_auth), clr = 'green') clrprint('b{} has MARC {} {}'.format(bib2, bib2_auth_tag, bib2_auth), clr = 'green') clrprint('\nNormalized:', clr = 'blue') clrprint('b{} has MARC {} {}'.format(bib1, bib1_auth_tag, bib1_auth_norm), clr = 'green') clrprint('b{} has MARC {} {}'.format(bib2, bib2_auth_tag, bib2_auth_norm), clr = 'green') acheck = True else: clrprint('Mismatch on Publisher.', clr = 'red') if bib1_auth: clrprint('b{} has MARC {} {}'.format(bib1, bib1_auth_tag, bib1_auth), clr = 'red') else: clrprint ('b{} has no publisher'.format(bib1), clr = 'red') if bib2_auth: clrprint('b{} has MARC {} {}'.format(bib2, bib2_auth_tag, bib2_auth), clr = 'red') else: clrprint ('b{} has no publisher'.format(bib2), clr = 'red') clrprint('\nNormalized:', clr = 'blue') if bib1_auth: clrprint('b{} has MARC {} {}'.format(bib1, bib1_auth_tag, bib1_auth_norm), clr = 'red') else: clrprint ('b{} has no publisher'.format(bib1), clr = 'red') if bib2_auth: clrprint('b{} has MARC {} {}'.format(bib2, bib2_auth_tag, bib2_auth_norm), clr = 'red') else: clrprint ('b{} has no publisher'.format(bib2), clr = 'red') acheck = False # Compare languages clrprint ('\n** Language check (MARC 008/041/130/240) **') if bib1_lang_norm == bib2_lang_norm: clrprint('Match on Language.', clr = 'green') clrprint('b' + bib1 + ' has MARC ' + bib1_lang_tag + ' ', end="", clr = 'blue') clrprint(bib1_lang, clr = 'green') clrprint('b' + bib2 + ' has MARC ' + bib2_lang_tag + ' ', end="", clr = 'blue') clrprint(bib2_lang, clr = 'green') clrprint('\nNormalized:', clr = 'blue') clrprint('b' + bib1 + ' has MARC ' + bib1_lang_tag + ' ', end="", clr = 'blue') clrprint(bib1_lang_norm, clr = 'green') clrprint('b' + bib2 + ' has MARC ' + bib2_lang_tag + ' ', end="", clr = 'blue') clrprint(bib2_lang_norm, clr = 'green') lcheck = True else: clrprint('Mismatch on Language.', clr = 'red') clrprint('b' + bib1 + ' has MARC ' + bib1_lang_tag + ' ', end="", clr = 'blue') clrprint(bib1_lang, clr = 'red') clrprint('b' + bib2 + ' has MARC ' + bib2_lang_tag + ' ', end="", clr = 'blue') clrprint(bib2_lang, clr = 'red') clrprint('\nNormalized:', clr = 'blue') clrprint('b' + bib1 + ' has MARC ' + bib1_lang_tag + ' ', end="", clr = 'blue') clrprint(bib1_lang_norm, clr = 'red') clrprint('b' + bib2 + ' has MARC ' + bib2_lang_tag + ' ', end="", clr = 'blue') clrprint(bib2_lang_norm, clr = 'red') lcheck = False #Rollup Analysis clrprint ('\n** Rollup Analysis **') if fcheck == True: clrprint ('Format:'.ljust(9), 'Pass', clr = ['blue', 'green']) else: clrprint ('Format:'.ljust(9), 'Fail', clr = ['blue', 'red']) if bib1_mat_type == 'Print' and bib2_mat_type == 'Print': if bcheck == True: clrprint ('Bib Lev:'.ljust(9), 'Pass', clr = ['blue', 'green']) else: clrprint ('Bib Lev:'.ljust(9), 'Fail', clr = ['blue', 'red']) if tcheck == True: clrprint ('Title:'.ljust(9), 'Pass', clr = ['blue', 'green']) else: clrprint ('Title:'.ljust(9), 'Fail', clr = ['blue', 'red']) if acheck == True: clrprint ('Author:'.ljust(9), 'Pass', clr = ['blue', 'green']) else: clrprint ('Author:'.ljust(9), 'Fail', clr = ['blue', 'red']) if lcheck == True: clrprint ('Language:'.ljust(9), 'Pass', clr = ['blue', 'green']) else: 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 ('RESULT:'.ljust(9), 'The two bib records will rollup', clr = ['blue', 'green']) else: clrprint ('RESULT:'.ljust(9), 'The two bib records will not rollup', clr = ['blue', 'red']) else: if fcheck and tcheck and acheck and lcheck: clrprint ('RESULT:'.ljust(9), 'The two bib records will rollup', clr = ['blue', 'green']) else: clrprint ('RESULT:'.ljust(9), 'The two bib records will not rollup', clr = ['blue', 'red'])