{ "title": "Source structure and extraction atlas", "version": "2026-09-11-atlas", "doi_status": "reserved; unpublished", "doi": "10.5281/zenodo.22693083", "selection": "61 catalogue entries: 53 registered sources, 5 constituent score collections, 3 audit-only entries", "code_revision": "2bb6e85282e3ab11af1bcc7126290f67af176f53", "code_inspection_method": "Static Python syntax inspection. Effective methods resolve same-class redefinitions and local inheritance. Literal get calls and dictionary entries are syntactic observations, not inferred native schemas or end-to-end mappings. Helpers, dynamic dispatch and imported normalizers require separate examination. No application code was executed.", "scope_limit": "Static implementation inspection and previously dated source observations; no new live-source census, extraction-accuracy validation or full runtime replay. Expressions are code evidence, not automatic source-to-target crosswalks.", "field_guide": { "atlas_editorial_reading": "Authored code reading and interpretation; native observations are kept separately in selected_document.", "implementation.configuration": "Effective literal class defaults with owning class and code locator; runtime overrides were not evaluated.", "implementation.methods": "Effective selected acquisition/domain methods with syntactically observed get calls, HTML queries and dictionary constructions.", "implementation.methods.dictionary_entries": "Local dictionary key and Python expression. This does not establish the final output path, data-flow origin, or execution on a particular record.", "implementation.methods.literal_get_calls": "Literal key read from the named expression. The receiver may be an upstream object, temporary object, configuration or normalized output.", "shared_helper_modules": "Separately indexed helpers and normalizers; availability does not assert that a particular frozen record passed through them.", "selected_document": "Previously documented observation of the cited page on its stated date, not a representative collection sample." }, "records": [ { "catalogue_id": "S001", "source_key": "aeolianskinner", "name": "Aeolian-Skinner Archive", "selection_role": "registered_source", "parent_source_key": null, "attribution": "Steve Layden (website creator); Jeff Scofield (website manager)", "scope_description": "Skinner and Aeolian-Skinner instruments", "documentary_unit": "Factory specification or manufacturer revision", "source_description": "The archive presents stoplists, photographs and recollections arranged around the firm's instruments. Specifications describe delivery from the factory and revisions by Skinner or Aeolian-Skinner; subsequent alterations by other builders are excluded.", "source_description_references": [ "aeolianskinner_main", "record_aeolianskinner" ], "interpretation": "An opus number can join this archive to an instrument register, but the specifications must be attached to the manufacturer's documented configuration. They cannot stand for the instrument's present state.", "rights_observation": "The archive displays its own copyright notice; no general open licence was established.", "rights_observation_basis": "Report of the pages consulted on 10 September 2026; not a determination of legal entitlement or a complete licence audit.", "references": [ "aeolianskinner_main", "record_aeolianskinner" ], "observation_date": "2026-09-10", "selected_document": { "reference": "record_aeolianskinner", "observation_date": "2026-09-11", "selection": "Inherited dossier example; the Orgelseite list was an additional page reached from its homepage. No representative sample is claimed.", "native_form": "Static opus page with identification block, specification and documentary notes", "repeated_information": "Division columns contain stop name, pitch and pipe quantity or borrowing reference.", "date_and_state_distinctions": "The specification represents the manufacturer state. Later alterations appear in a separate narrative note.", "interpretive_limit": "A stoplist and a later note can concern different states of the same instrument.", "observations": [ "Town, state and church head the record.", "Named manufacturer and opus number.", "Delivery year and a separately dated later alteration.", "Division-based stops include pitches and borrowing references.", "Separate Great, Swell, Choir, Echo and Pedal groups.", "The later note describes replacement of the console.", "Photograph and named photo supplier.", "A named specification source is supplied.", "Cross-reference to an OHS instrument record.", "Specification and photograph have separate source credits." ], "uninspected_or_unfilled_material": [], "narrative": "Opus 511 is presented through a factory specification, division columns and documentary notes. Stop entries include pitches, pipe quantities and borrowing references. A later note concerns replacement of the console. The specification and that alteration note therefore describe different documentary states; the date of the later note cannot be assigned to the factory stoplist." }, "atlas_editorial_reading": { "evidence_kind": "code_reading_and_interpretation", "acquisition": "The archive subclass has dedicated index, title and specification extraction for opus pages. Its source scope is the manufacturer configuration described by the archive, subject to the limitations stated in the cited source account.", "transformation": "The specialised stoplist routine handles division-oriented specification material, while the shared transform supplies other metadata, raw text, media and source-qualified identity. Pipe quantities and borrowing annotations in the observed page belong to individual stop entries and the stated factory configuration.", "limitations": "The inspected source may also contain later documentary notes. A note about a replacement console does not redate the factory stoplist. Neither the generic builder/year projection nor a matched opus supplies independent evidence of the current configuration." }, "implementation": { "class": "AeolianSkinnerArchiveCrawler", "class_line": 1172, "path": "aggregator/static_html_crawler.py", "inheritance": [ "AeolianSkinnerArchiveCrawler", "StaticHtmlOrganCrawler", "BaseCrawler" ], "configuration": { "source_key": { "value": "aeolianskinner", "path": "aggregator/static_html_crawler.py", "line": 1173, "class": "AeolianSkinnerArchiveCrawler" }, "id_column": { "value": "aeolianskinner_id", "path": "aggregator/static_html_crawler.py", "line": 1174, "class": "AeolianSkinnerArchiveCrawler" }, "default_country": { "value": "United States", "path": "aggregator/static_html_crawler.py", "line": 1177, "class": "AeolianSkinnerArchiveCrawler" }, "default_region": { "value": "", "path": "aggregator/static_html_crawler.py", "line": 29, "class": "StaticHtmlOrganCrawler" }, "start_urls": { "value": [ "https://archive.pipeorgandatabase.org/aeolianskinner/aeolian_skinner.html", "https://archive.pipeorgandatabase.org/aeolianskinner/skinner.html", "https://archive.pipeorgandatabase.org/aeolianskinner/e_m_skinner_son.html", "https://archive.pipeorgandatabase.org/aeolianskinner/bassett_skinner.html" ], "path": "aggregator/static_html_crawler.py", "line": 1178, "class": "AeolianSkinnerArchiveCrawler" }, "detail_url_patterns": { "value": [ "/aeolianskinner/specs/op" ], "path": "aggregator/static_html_crawler.py", "line": 1184, "class": "AeolianSkinnerArchiveCrawler" }, "exclude_url_patterns": { "value": [], "path": "aggregator/static_html_crawler.py", "line": 32, "class": "StaticHtmlOrganCrawler" }, "BUILDER_LABELS": { "value": [ "builder", "organ builder", "organbuilder", "orgelbouwer", "orgelbauer", "facteur", "facteur d'orgue", "maker" ], "path": "aggregator/static_html_crawler.py", "line": 34, "class": "StaticHtmlOrganCrawler" }, "YEAR_LABELS": { "value": [ "year", "date", "built", "installed", "baujahr", "bouwjaar", "construction" ], "path": "aggregator/static_html_crawler.py", "line": 44, "class": "StaticHtmlOrganCrawler" }, "base_url": { "value": "https://archive.pipeorgandatabase.org/aeolianskinner", "path": "aggregator/static_html_crawler.py", "line": 1176, "class": "AeolianSkinnerArchiveCrawler" } }, "methods": [ { "symbol": "StaticHtmlOrganCrawler._build_involved", "path": "aggregator/static_html_crawler.py", "line_start": 771, "line_end": 781, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 776, "key": "name", "value_expression": "str(builder)" }, { "line": 777, "key": "activities", "value_expression": "['builder']" }, { "line": 778, "key": "dates", "value_expression": "[str(year)] if year else []" }, { "line": 779, "key": "raw_str", "value_expression": "str(builder)" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._clean_label", "path": "aggregator/static_html_crawler.py", "line_start": 850, "line_end": 851, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._division_starts_line", "path": "aggregator/static_html_crawler.py", "line_start": 697, "line_end": 702, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text", "_is_division_heading" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._extract_images", "path": "aggregator/static_html_crawler.py", "line_start": 738, "line_end": 749, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [ { "line": 741, "receiver": "img", "key": "src", "expression": "img.get('src')" }, { "line": 741, "receiver": "img", "key": "data-src", "expression": "img.get('data-src')" }, { "line": 744, "receiver": "img", "key": "alt", "expression": "img.get('alt')" }, { "line": 744, "receiver": "img", "key": "title", "expression": "img.get('title')" } ], "html_queries": [ { "line": 740, "expression": "soup.find_all('img')" } ], "dictionary_entries": [ { "line": 748, "key": "link", "value_expression": "urljoin(page_url or self.base_url, src)" }, { "line": 748, "key": "caption", "value_expression": "alt" }, { "line": 748, "key": "source", "value_expression": "self.source_key" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._extract_links", "path": "aggregator/static_html_crawler.py", "line_start": 751, "line_end": 769, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [ { "line": 755, "expression": "soup.find_all('a', href=True)" } ], "dictionary_entries": [ { "line": 764, "key": "url", "value_expression": "full" }, { "line": 765, "key": "label", "value_expression": "label" }, { "line": 766, "key": "scope", "value_expression": "'internal' if parsed.netloc == base_netloc else 'external'" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._extract_metadata", "path": "aggregator/static_html_crawler.py", "line_start": 538, "line_end": 553, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_label", "_clean_text", "_metadata_key" ], "literal_get_calls": [], "html_queries": [ { "line": 540, "expression": "soup.find_all('tr')" }, { "line": 541, "expression": "row.find_all(['th', 'td'], recursive=False)" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "AeolianSkinnerArchiveCrawler._extract_raw_spec", "path": "aggregator/static_html_crawler.py", "line_start": 1222, "line_end": 1266, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text", "_looks_like_aeolian_stop" ], "literal_get_calls": [], "html_queries": [ { "line": 1227, "expression": "soup.find_all('pre')" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._extract_table_rows", "path": "aggregator/static_html_crawler.py", "line_start": 722, "line_end": 736, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [ { "line": 725, "expression": "soup.find_all('table')" }, { "line": 726, "expression": "table.find_all('tr')" }, { "line": 727, "expression": "row.find_all(['th', 'td'], recursive=False)" } ], "dictionary_entries": [ { "line": 731, "key": "table_index", "value_expression": "table_index" }, { "line": 732, "key": "row_index", "value_expression": "row_index" }, { "line": 733, "key": "cells", "value_expression": "cells" }, { "line": 734, "key": "raw_str", "value_expression": "' | '.join(cells)" } ], "subscript_assignments": [] }, { "symbol": "AeolianSkinnerArchiveCrawler._extract_title", "path": "aggregator/static_html_crawler.py", "line_start": 1206, "line_end": 1209, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._fetch_html", "path": "aggregator/static_html_crawler.py", "line_start": 131, "line_end": 145, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_best_decoding", "_declared_html_encoding", "_repair_mojibake" ], "literal_get_calls": [ { "line": 132, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._first_metadata", "path": "aggregator/static_html_crawler.py", "line_start": 825, "line_end": 829, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._identifier_from_url", "path": "aggregator/static_html_crawler.py", "line_start": 268, "line_end": 277, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._is_detail_url", "path": "aggregator/static_html_crawler.py", "line_start": 213, "line_end": 219, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._is_division_heading", "path": "aggregator/static_html_crawler.py", "line_start": 681, "line_end": 694, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._is_pitch_fragment", "path": "aggregator/static_html_crawler.py", "line_start": 669, "line_end": 678, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "AeolianSkinnerArchiveCrawler._location_parts", "path": "aggregator/static_html_crawler.py", "line_start": 1211, "line_end": 1220, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [ { "line": 1212, "receiver": "raw_data", "key": "title", "expression": "raw_data.get('title')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "AeolianSkinnerArchiveCrawler._looks_like_aeolian_stop", "path": "aggregator/static_html_crawler.py", "line_start": 1269, "line_end": 1271, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._looks_like_stop_line", "path": "aggregator/static_html_crawler.py", "line_start": 705, "line_end": 715, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._main_text", "path": "aggregator/static_html_crawler.py", "line_start": 526, "line_end": 536, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [ { "line": 528, "expression": "main.find_all(['script', 'style', 'nav', 'footer', 'header', 'aside'])" }, { "line": 530, "expression": "main.find_all('br')" }, { "line": 532, "expression": "main.find_all(['p', 'div', 'li', 'tr', 'h1', 'h2', 'h3', 'h4', 'section'])" }, { "line": 527, "expression": "soup.find('main')" }, { "line": 527, "expression": "soup.find('article')" }, { "line": 527, "expression": "soup.find(id='content')" }, { "line": 527, "expression": "soup.find(class_=re.compile('entry-content|post-content|content', re.I))" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._metadata_key", "path": "aggregator/static_html_crawler.py", "line_start": 555, "line_end": 567, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_label" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._parse_divisions_from_text", "path": "aggregator/static_html_crawler.py", "line_start": 596, "line_end": 666, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text", "_is_division_heading", "_is_pitch_fragment", "_looks_like_stop_line" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "AeolianSkinnerArchiveCrawler._parse_index_page", "path": "aggregator/static_html_crawler.py", "line_start": 1186, "line_end": 1204, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text", "_dedupe_refs", "_reference_from_parts" ], "literal_get_calls": [], "html_queries": [ { "line": 1189, "expression": "soup.find_all('a', href=True)" } ], "dictionary_entries": [ { "line": 1201, "key": "opus", "value_expression": "opus" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._preserve_reference_context", "path": "aggregator/static_html_crawler.py", "line_start": 415, "line_end": 432, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_safe_json_loads" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 420, "key": "mapped_extension", "value_expression": "native" }, { "line": 424, "key": "mapped_context", "value_expression": "context" } ], "subscript_assignments": [ { "line": 425, "value_line": 425, "key": "reference_context", "target_expression": "native['reference_context']", "value_expression": "context" }, { "line": 430, "value_line": 430, "key": "raw_data", "target_expression": "context['raw_data']", "value_expression": "self._safe_json_loads(value, value)" } ] }, { "symbol": "StaticHtmlOrganCrawler._reference_from_parts", "path": "aggregator/static_html_crawler.py", "line_start": 221, "line_end": 254, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_identifier_from_url", "_split_title" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 240, "key": "title", "value_expression": "title" }, { "line": 241, "key": "country", "value_expression": "country or self.default_country" }, { "line": 242, "key": "region", "value_expression": "region or self.default_region" }, { "line": 243, "key": "town", "value_expression": "town or parsed_town" }, { "line": 244, "key": "building", "value_expression": "building or parsed_building or title" }, { "line": 245, "key": "builder", "value_expression": "builder" }, { "line": 246, "key": "year", "value_expression": "year" }, { "line": 247, "key": "manual_count", "value_expression": "manual_count" }, { "line": 248, "key": "stop_count", "value_expression": "stop_count" }, { "line": 249, "key": "rank_count", "value_expression": "rank_count" }, { "line": 250, "key": "url", "value_expression": "url" }, { "line": 251, "key": "status", "value_expression": "'initiated'" }, { "line": 252, "key": "raw_data_json", "value_expression": "json.dumps(raw_data or {}, ensure_ascii=False)" }, { "line": 253, "key": "scraped_at", "value_expression": "datetime.now().isoformat()" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._safe_json_loads", "path": "aggregator/static_html_crawler.py", "line_start": 858, "line_end": 864, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._split_title", "path": "aggregator/static_html_crawler.py", "line_start": 813, "line_end": 822, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._title_from_url", "path": "aggregator/static_html_crawler.py", "line_start": 280, "line_end": 283, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler.crawl", "path": "aggregator/static_html_crawler.py", "line_start": 78, "line_end": 129, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_fetch_html", "_identifier_from_url", "_optional_int", "_parse_index_page", "_save_reference", "_update_scrape_status", "is_scrape_stop_requested", "mark_scrape_stopped" ], "literal_get_calls": [ { "line": 79, "receiver": "kwargs", "key": "task_id", "expression": "kwargs.get('task_id')" }, { "line": 80, "receiver": "kwargs", "key": "max_items", "expression": "kwargs.get('max_items')" }, { "line": 81, "receiver": "kwargs", "key": "start_urls", "expression": "kwargs.get('start_urls')" }, { "line": 117, "receiver": "self.config", "key": "rate_limit_delay", "expression": "self.config.get('rate_limit_delay', 0.2)" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line_start": 434, "line_end": 516, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_build_involved", "_extract_images", "_extract_links", "_extract_metadata", "_extract_raw_spec", "_extract_table_rows", "_extract_title", "_first_int", "_first_metadata", "_first_year", "_location_parts", "_main_text", "_safe_json_loads" ], "literal_get_calls": [ { "line": 435, "receiver": "raw_data", "key": "html", "expression": "raw_data.get('html')" }, { "line": 440, "receiver": "raw_data", "key": "builder", "expression": "raw_data.get('builder')" }, { "line": 441, "receiver": "raw_data", "key": "year", "expression": "raw_data.get('year')" }, { "line": 442, "receiver": "raw_data", "key": "manual_count", "expression": "raw_data.get('manual_count')" }, { "line": 443, "receiver": "raw_data", "key": "stop_count", "expression": "raw_data.get('stop_count')" }, { "line": 444, "receiver": "raw_data", "key": "rank_count", "expression": "raw_data.get('rank_count')" }, { "line": 513, "receiver": "raw_data", "key": "url", "expression": "raw_data.get('url')" }, { "line": 442, "receiver": "metadata", "key": "manuals", "expression": "metadata.get('manuals')" }, { "line": 442, "receiver": "metadata", "key": "manual", "expression": "metadata.get('manual')" }, { "line": 443, "receiver": "metadata", "key": "stops", "expression": "metadata.get('stops')" }, { "line": 443, "receiver": "metadata", "key": "stop", "expression": "metadata.get('stop')" }, { "line": 444, "receiver": "metadata", "key": "ranks", "expression": "metadata.get('ranks')" }, { "line": 444, "receiver": "metadata", "key": "rank", "expression": "metadata.get('rank')" }, { "line": 480, "receiver": "raw_data", "key": "url", "expression": "raw_data.get('url')" }, { "line": 453, "receiver": "raw_data", "key": "country", "expression": "raw_data.get('country')" }, { "line": 454, "receiver": "raw_data", "key": "region", "expression": "raw_data.get('region')" }, { "line": 479, "receiver": "raw_data", "key": "url", "expression": "raw_data.get('url')" }, { "line": 487, "receiver": "raw_data", "key": "raw_data_json", "expression": "raw_data.get('raw_data_json')" } ], "html_queries": [], "dictionary_entries": [ { "line": 450, "key": "locations", "value_expression": "[{'status': 'current_location', 'country': raw_data.get('country') or self.default_country, 'region': raw_data.get('region') or self.default_region, 'town': town, 'building': building, 'raw_str': title}]" }, { "line": 460, "key": "involved", "value_expression": "self._build_involved(builder, year)" }, { "line": 461, "key": "events", "value_expression": "[{'type': 'construction', 'date': str(year), 'description': builder}] if year else []" }, { "line": 462, "key": "specifications", "value_expression": "{'manual_count': manual_count, 'stop_count': stop_count, 'rank_count': rank_count, 'stops_by_division': stops_by_division, 'stops': [{'name': stop, 'division': division, 'raw_str': stop} for division, stops in stops_by_division.items() for stop in stops], 'raw_spec': raw_spec, 'technical_rows_unstructured': [{'label': key, 'value': value} for key, value in metadata.items() if value and key not in {'builder', 'year', 'manuals', 'manual', 'stops', 'stop', 'ranks', 'rank'}] + table_rows}" }, { "line": 479, "key": "media", "value_expression": "{'images': self._extract_images(soup, raw_data.get('url') or '')}" }, { "line": 480, "key": "links", "value_expression": "self._extract_links(soup, raw_data.get('url') or '')" }, { "line": 481, "key": "descriptions", "value_expression": "[{'type': 'source_text', 'text': text}] if text else []" }, { "line": 482, "key": "other_identifiers", "value_expression": "[{'type': self.id_column, 'value': raw_data.get(self.id_column)}]" }, { "line": 483, "key": "extensions", "value_expression": "{self.source_key: {'title': title, 'metadata': metadata, 'raw_data': self._safe_json_loads(raw_data.get('raw_data_json'), {}), 'reference_context': {key: raw_data.get(key) for key in (self.id_column, 'title', 'country', 'region', 'town', 'building', 'builder', 'year', 'manual_count', 'stop_count', 'rank_count', 'url') if raw_data.get(key) not in (None, '')}}}" }, { "line": 463, "key": "manual_count", "value_expression": "manual_count" }, { "line": 464, "key": "stop_count", "value_expression": "stop_count" }, { "line": 465, "key": "rank_count", "value_expression": "rank_count" }, { "line": 466, "key": "stops_by_division", "value_expression": "stops_by_division" }, { "line": 467, "key": "stops", "value_expression": "[{'name': stop, 'division': division, 'raw_str': stop} for division, stops in stops_by_division.items() for stop in stops]" }, { "line": 472, "key": "raw_spec", "value_expression": "raw_spec" }, { "line": 473, "key": "technical_rows_unstructured", "value_expression": "[{'label': key, 'value': value} for key, value in metadata.items() if value and key not in {'builder', 'year', 'manuals', 'manual', 'stops', 'stop', 'ranks', 'rank'}] + table_rows" }, { "line": 479, "key": "images", "value_expression": "self._extract_images(soup, raw_data.get('url') or '')" }, { "line": 452, "key": "status", "value_expression": "'current_location'" }, { "line": 453, "key": "country", "value_expression": "raw_data.get('country') or self.default_country" }, { "line": 454, "key": "region", "value_expression": "raw_data.get('region') or self.default_region" }, { "line": 455, "key": "town", "value_expression": "town" }, { "line": 456, "key": "building", "value_expression": "building" }, { "line": 457, "key": "raw_str", "value_expression": "title" }, { "line": 482, "key": "type", "value_expression": "self.id_column" }, { "line": 482, "key": "value", "value_expression": "raw_data.get(self.id_column)" }, { "line": 485, "key": "title", "value_expression": "title" }, { "line": 486, "key": "metadata", "value_expression": "metadata" }, { "line": 487, "key": "raw_data", "value_expression": "self._safe_json_loads(raw_data.get('raw_data_json'), {})" }, { "line": 488, "key": "reference_context", "value_expression": "{key: raw_data.get(key) for key in (self.id_column, 'title', 'country', 'region', 'town', 'building', 'builder', 'year', 'manual_count', 'stop_count', 'rank_count', 'url') if raw_data.get(key) not in (None, '')}" }, { "line": 461, "key": "type", "value_expression": "'construction'" }, { "line": 461, "key": "date", "value_expression": "str(year)" }, { "line": 461, "key": "description", "value_expression": "builder" }, { "line": 468, "key": "name", "value_expression": "stop" }, { "line": 468, "key": "division", "value_expression": "division" }, { "line": 468, "key": "raw_str", "value_expression": "stop" }, { "line": 481, "key": "type", "value_expression": "'source_text'" }, { "line": 481, "key": "text", "value_expression": "text" }, { "line": 474, "key": "label", "value_expression": "key" }, { "line": 474, "key": "value", "value_expression": "value" } ], "subscript_assignments": [] } ], "selected_rule_rows": [ { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line": 464, "key": "stop_count", "value_expression": "stop_count" }, { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line": 463, "key": "manual_count", "value_expression": "manual_count" }, { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line": 465, "key": "rank_count", "value_expression": "rank_count" }, { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line": 466, "key": "stops_by_division", "value_expression": "stops_by_division" }, { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line": 453, "key": "country", "value_expression": "raw_data.get('country') or self.default_country" }, { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line": 457, "key": "raw_str", "value_expression": "title" } ], "bounded_code_passages": [ { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.transform", "line_start": 461, "line_end": 469, "text": " \"events\": [{\"type\": \"construction\", \"date\": str(year), \"description\": builder}] if year else [],\n \"specifications\": {\n \"manual_count\": manual_count,\n \"stop_count\": stop_count,\n \"rank_count\": rank_count,\n \"stops_by_division\": stops_by_division,\n \"stops\": [\n {\"name\": stop, \"division\": division, \"raw_str\": stop}\n for division, stops in stops_by_division.items()" }, { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.transform", "line_start": 460, "line_end": 468, "text": " \"involved\": self._build_involved(builder, year),\n \"events\": [{\"type\": \"construction\", \"date\": str(year), \"description\": builder}] if year else [],\n \"specifications\": {\n \"manual_count\": manual_count,\n \"stop_count\": stop_count,\n \"rank_count\": rank_count,\n \"stops_by_division\": stops_by_division,\n \"stops\": [\n {\"name\": stop, \"division\": division, \"raw_str\": stop}" }, { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.transform", "line_start": 462, "line_end": 470, "text": " \"specifications\": {\n \"manual_count\": manual_count,\n \"stop_count\": stop_count,\n \"rank_count\": rank_count,\n \"stops_by_division\": stops_by_division,\n \"stops\": [\n {\"name\": stop, \"division\": division, \"raw_str\": stop}\n for division, stops in stops_by_division.items()\n for stop in stops" }, { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.transform", "line_start": 463, "line_end": 471, "text": " \"manual_count\": manual_count,\n \"stop_count\": stop_count,\n \"rank_count\": rank_count,\n \"stops_by_division\": stops_by_division,\n \"stops\": [\n {\"name\": stop, \"division\": division, \"raw_str\": stop}\n for division, stops in stops_by_division.items()\n for stop in stops\n ]," }, { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.transform", "line_start": 450, "line_end": 458, "text": " \"locations\": [\n {\n \"status\": \"current_location\",\n \"country\": raw_data.get(\"country\") or self.default_country,\n \"region\": raw_data.get(\"region\") or self.default_region,\n \"town\": town,\n \"building\": building,\n \"raw_str\": title,\n }" }, { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.transform", "line_start": 454, "line_end": 462, "text": " \"region\": raw_data.get(\"region\") or self.default_region,\n \"town\": town,\n \"building\": building,\n \"raw_str\": title,\n }\n ],\n \"involved\": self._build_involved(builder, year),\n \"events\": [{\"type\": \"construction\", \"date\": str(year), \"description\": builder}] if year else [],\n \"specifications\": {" } ] } }, { "catalogue_id": "S002", "source_key": "arpschnitger", "name": "Arp Schnitger Organs", "selection_role": "registered_source", "parent_source_key": null, "attribution": "Geert Jan Pottjewijd", "scope_description": "Arp Schnitger organs; related material on Drenthe", "documentary_unit": "Builder-focused organ profile", "source_description": "This personal site documents Schnitger organs and also carries material on organs in Drenthe. Its entry page names Geert Jan Pottjewijd and gives 4 April 2026 as its last update. Historical announcements remain on the same page.", "source_description_references": [ "arpschnitger", "record_arpschnitger" ], "interpretation": "The builder-centred selection makes this a useful specialist counterpart to regional inventories. The date on the home page does not date every instrument description, and the different sections should not be counted as one geographical census.", "rights_observation": "No general reuse licence was established from the consulted entry page.", "rights_observation_basis": "Report of the pages consulted on 10 September 2026; not a determination of legal entitlement or a complete licence audit.", "references": [ "arpschnitger", "record_arpschnitger" ], "observation_date": "2026-09-10", "selected_document": { "reference": "record_arpschnitger", "observation_date": "2026-09-11", "selection": "Inherited dossier example; the Orgelseite list was an additional page reached from its homepage. No representative sample is claimed.", "native_form": "Static historical essay with photographs and a later specification", "repeated_information": "Dated narrative entries and a division-based stop table.", "date_and_state_distinctions": "One page follows a case across replacement instruments and relocation to another church.", "interpretive_limit": "A page is not necessarily one instrument at one place. The later stoplist belongs to the organ installed in the transferred case.", "observations": [ "Glückstadt and the subsequent destination of the case are named.", "Several builders are associated with dated interventions.", "Chronological entries distinguish construction, replacement and relocation.", "Later specification arranged by divisions and pitches.", "Hauptwerk, Rückpositiv and Pedal are separate groups.", "Case survival and transfer are described.", "The original organ is identified as former; the case survives elsewhere.", "Historical and later case photographs with credits.", "Named information provider and an image-source citation.", "Links to the later case photograph and its Wikimedia source.", "Information and photograph contributors are named." ], "uninspected_or_unfilled_material": [], "narrative": "The Glückstadt account follows the survival and transfer of a case into another instrument. Dated narrative entries concern successive builders and locations, while the later specification belongs to an organ in the transferred case. The page thus supplies evidence about material continuity that would be lost if its URL were treated as one unchanged instrument at one address." }, "atlas_editorial_reading": { "evidence_kind": "code_reading_and_interpretation", "acquisition": "Configured index and detail-link patterns identify the specialist site's organ pages. The subclass supplies page-title and location conventions.", "transformation": "The transform delegates its substantive extraction to the common static-page implementation. The distinction matters: a named source class does not mean that its historical narratives have a dedicated event parser. Raw text, metadata, table material and images are preserved alongside the common summary projection.", "limitations": "A case can move to another location and become part of another instrument. The observed source account documents precisely this problem. A single URL, current-location label or first year cannot establish uninterrupted instrument identity or one configuration." }, "implementation": { "class": "ArpSchnitgerCrawler", "class_line": 1339, "path": "aggregator/static_html_crawler.py", "inheritance": [ "ArpSchnitgerCrawler", "StaticHtmlOrganCrawler", "BaseCrawler" ], "configuration": { "source_key": { "value": "arpschnitger", "path": "aggregator/static_html_crawler.py", "line": 1340, "class": "ArpSchnitgerCrawler" }, "id_column": { "value": "arpschnitger_id", "path": "aggregator/static_html_crawler.py", "line": 1341, "class": "ArpSchnitgerCrawler" }, "default_country": { "value": "", "path": "aggregator/static_html_crawler.py", "line": 28, "class": "StaticHtmlOrganCrawler" }, "default_region": { "value": "", "path": "aggregator/static_html_crawler.py", "line": 29, "class": "StaticHtmlOrganCrawler" }, "start_urls": { "value": [ "https://arpschnitger.nl/schnit.html" ], "path": "aggregator/static_html_crawler.py", "line": 1344, "class": "ArpSchnitgerCrawler" }, "detail_url_patterns": { "value": [ "arpschnitger.nl/s" ], "path": "aggregator/static_html_crawler.py", "line": 1345, "class": "ArpSchnitgerCrawler" }, "exclude_url_patterns": { "value": [ "schnit.html", "schnintro", "sdiscogr", "schnitlit", "schnitdvd", "schnittek", "youtube", ".pdf", ".wmv" ], "path": "aggregator/static_html_crawler.py", "line": 1346, "class": "ArpSchnitgerCrawler" }, "BUILDER_LABELS": { "value": [ "builder", "organ builder", "organbuilder", "orgelbouwer", "orgelbauer", "facteur", "facteur d'orgue", "maker" ], "path": "aggregator/static_html_crawler.py", "line": 34, "class": "StaticHtmlOrganCrawler" }, "YEAR_LABELS": { "value": [ "year", "date", "built", "installed", "baujahr", "bouwjaar", "construction" ], "path": "aggregator/static_html_crawler.py", "line": 44, "class": "StaticHtmlOrganCrawler" }, "base_url": { "value": "https://arpschnitger.nl", "path": "aggregator/static_html_crawler.py", "line": 1343, "class": "ArpSchnitgerCrawler" } }, "methods": [ { "symbol": "StaticHtmlOrganCrawler._build_involved", "path": "aggregator/static_html_crawler.py", "line_start": 771, "line_end": 781, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 776, "key": "name", "value_expression": "str(builder)" }, { "line": 777, "key": "activities", "value_expression": "['builder']" }, { "line": 778, "key": "dates", "value_expression": "[str(year)] if year else []" }, { "line": 779, "key": "raw_str", "value_expression": "str(builder)" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._clean_label", "path": "aggregator/static_html_crawler.py", "line_start": 850, "line_end": 851, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._division_starts_line", "path": "aggregator/static_html_crawler.py", "line_start": 697, "line_end": 702, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text", "_is_division_heading" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._extract_images", "path": "aggregator/static_html_crawler.py", "line_start": 738, "line_end": 749, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [ { "line": 741, "receiver": "img", "key": "src", "expression": "img.get('src')" }, { "line": 741, "receiver": "img", "key": "data-src", "expression": "img.get('data-src')" }, { "line": 744, "receiver": "img", "key": "alt", "expression": "img.get('alt')" }, { "line": 744, "receiver": "img", "key": "title", "expression": "img.get('title')" } ], "html_queries": [ { "line": 740, "expression": "soup.find_all('img')" } ], "dictionary_entries": [ { "line": 748, "key": "link", "value_expression": "urljoin(page_url or self.base_url, src)" }, { "line": 748, "key": "caption", "value_expression": "alt" }, { "line": 748, "key": "source", "value_expression": "self.source_key" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._extract_links", "path": "aggregator/static_html_crawler.py", "line_start": 751, "line_end": 769, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [ { "line": 755, "expression": "soup.find_all('a', href=True)" } ], "dictionary_entries": [ { "line": 764, "key": "url", "value_expression": "full" }, { "line": 765, "key": "label", "value_expression": "label" }, { "line": 766, "key": "scope", "value_expression": "'internal' if parsed.netloc == base_netloc else 'external'" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._extract_metadata", "path": "aggregator/static_html_crawler.py", "line_start": 538, "line_end": 553, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_label", "_clean_text", "_metadata_key" ], "literal_get_calls": [], "html_queries": [ { "line": 540, "expression": "soup.find_all('tr')" }, { "line": 541, "expression": "row.find_all(['th', 'td'], recursive=False)" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._extract_raw_spec", "path": "aggregator/static_html_crawler.py", "line_start": 578, "line_end": 594, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_multiline", "_division_starts_line", "_parse_divisions_from_text" ], "literal_get_calls": [], "html_queries": [ { "line": 580, "expression": "soup.find_all('table')" }, { "line": 581, "expression": "table.find('table')" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._extract_table_rows", "path": "aggregator/static_html_crawler.py", "line_start": 722, "line_end": 736, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [ { "line": 725, "expression": "soup.find_all('table')" }, { "line": 726, "expression": "table.find_all('tr')" }, { "line": 727, "expression": "row.find_all(['th', 'td'], recursive=False)" } ], "dictionary_entries": [ { "line": 731, "key": "table_index", "value_expression": "table_index" }, { "line": 732, "key": "row_index", "value_expression": "row_index" }, { "line": 733, "key": "cells", "value_expression": "cells" }, { "line": 734, "key": "raw_str", "value_expression": "' | '.join(cells)" } ], "subscript_assignments": [] }, { "symbol": "ArpSchnitgerCrawler._extract_title", "path": "aggregator/static_html_crawler.py", "line_start": 1392, "line_end": 1396, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [ { "line": 1393, "expression": "soup.find(['b', 'strong'])" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "ArpSchnitgerCrawler._fetch_html", "path": "aggregator/static_html_crawler.py", "line_start": 1358, "line_end": 1377, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_best_decoding" ], "literal_get_calls": [ { "line": 1367, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._first_metadata", "path": "aggregator/static_html_crawler.py", "line_start": 825, "line_end": 829, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._identifier_from_url", "path": "aggregator/static_html_crawler.py", "line_start": 268, "line_end": 277, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._is_detail_url", "path": "aggregator/static_html_crawler.py", "line_start": 213, "line_end": 219, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._is_division_heading", "path": "aggregator/static_html_crawler.py", "line_start": 681, "line_end": 694, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._is_pitch_fragment", "path": "aggregator/static_html_crawler.py", "line_start": 669, "line_end": 678, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "ArpSchnitgerCrawler._location_parts", "path": "aggregator/static_html_crawler.py", "line_start": 1401, "line_end": 1408, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_split_title" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._looks_like_stop_line", "path": "aggregator/static_html_crawler.py", "line_start": 705, "line_end": 715, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._main_text", "path": "aggregator/static_html_crawler.py", "line_start": 526, "line_end": 536, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [ { "line": 528, "expression": "main.find_all(['script', 'style', 'nav', 'footer', 'header', 'aside'])" }, { "line": 530, "expression": "main.find_all('br')" }, { "line": 532, "expression": "main.find_all(['p', 'div', 'li', 'tr', 'h1', 'h2', 'h3', 'h4', 'section'])" }, { "line": 527, "expression": "soup.find('main')" }, { "line": 527, "expression": "soup.find('article')" }, { "line": 527, "expression": "soup.find(id='content')" }, { "line": 527, "expression": "soup.find(class_=re.compile('entry-content|post-content|content', re.I))" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._metadata_key", "path": "aggregator/static_html_crawler.py", "line_start": 555, "line_end": 567, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_label" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._parse_divisions_from_text", "path": "aggregator/static_html_crawler.py", "line_start": 596, "line_end": 666, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text", "_is_division_heading", "_is_pitch_fragment", "_looks_like_stop_line" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "ArpSchnitgerCrawler._parse_index_page", "path": "aggregator/static_html_crawler.py", "line_start": 1379, "line_end": 1390, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text", "_dedupe_refs", "_is_detail_url", "_reference_from_parts" ], "literal_get_calls": [], "html_queries": [ { "line": 1382, "expression": "soup.find_all('a', href=True)" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._preserve_reference_context", "path": "aggregator/static_html_crawler.py", "line_start": 415, "line_end": 432, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_safe_json_loads" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 420, "key": "mapped_extension", "value_expression": "native" }, { "line": 424, "key": "mapped_context", "value_expression": "context" } ], "subscript_assignments": [ { "line": 425, "value_line": 425, "key": "reference_context", "target_expression": "native['reference_context']", "value_expression": "context" }, { "line": 430, "value_line": 430, "key": "raw_data", "target_expression": "context['raw_data']", "value_expression": "self._safe_json_loads(value, value)" } ] }, { "symbol": "StaticHtmlOrganCrawler._reference_from_parts", "path": "aggregator/static_html_crawler.py", "line_start": 221, "line_end": 254, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_identifier_from_url", "_split_title" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 240, "key": "title", "value_expression": "title" }, { "line": 241, "key": "country", "value_expression": "country or self.default_country" }, { "line": 242, "key": "region", "value_expression": "region or self.default_region" }, { "line": 243, "key": "town", "value_expression": "town or parsed_town" }, { "line": 244, "key": "building", "value_expression": "building or parsed_building or title" }, { "line": 245, "key": "builder", "value_expression": "builder" }, { "line": 246, "key": "year", "value_expression": "year" }, { "line": 247, "key": "manual_count", "value_expression": "manual_count" }, { "line": 248, "key": "stop_count", "value_expression": "stop_count" }, { "line": 249, "key": "rank_count", "value_expression": "rank_count" }, { "line": 250, "key": "url", "value_expression": "url" }, { "line": 251, "key": "status", "value_expression": "'initiated'" }, { "line": 252, "key": "raw_data_json", "value_expression": "json.dumps(raw_data or {}, ensure_ascii=False)" }, { "line": 253, "key": "scraped_at", "value_expression": "datetime.now().isoformat()" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._safe_json_loads", "path": "aggregator/static_html_crawler.py", "line_start": 858, "line_end": 864, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._split_title", "path": "aggregator/static_html_crawler.py", "line_start": 813, "line_end": 822, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._title_from_url", "path": "aggregator/static_html_crawler.py", "line_start": 280, "line_end": 283, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler.crawl", "path": "aggregator/static_html_crawler.py", "line_start": 78, "line_end": 129, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_fetch_html", "_identifier_from_url", "_optional_int", "_parse_index_page", "_save_reference", "_update_scrape_status", "is_scrape_stop_requested", "mark_scrape_stopped" ], "literal_get_calls": [ { "line": 79, "receiver": "kwargs", "key": "task_id", "expression": "kwargs.get('task_id')" }, { "line": 80, "receiver": "kwargs", "key": "max_items", "expression": "kwargs.get('max_items')" }, { "line": 81, "receiver": "kwargs", "key": "start_urls", "expression": "kwargs.get('start_urls')" }, { "line": 117, "receiver": "self.config", "key": "rate_limit_delay", "expression": "self.config.get('rate_limit_delay', 0.2)" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "ArpSchnitgerCrawler.transform", "path": "aggregator/static_html_crawler.py", "line_start": 1398, "line_end": 1399, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 1399, "key": "builder", "value_expression": "'Arp Schnitger'" } ], "subscript_assignments": [] } ], "selected_rule_rows": [ { "symbol": "StaticHtmlOrganCrawler.crawl", "path": "aggregator/static_html_crawler.py", "key": "task_id", "value_expression": "kwargs.get('task_id')", "line": 79, "kind": "input read" }, { "symbol": "StaticHtmlOrganCrawler.crawl", "path": "aggregator/static_html_crawler.py", "key": "max_items", "value_expression": "kwargs.get('max_items')", "line": 80, "kind": "input read" }, { "symbol": "StaticHtmlOrganCrawler.crawl", "path": "aggregator/static_html_crawler.py", "key": "start_urls", "value_expression": "kwargs.get('start_urls')", "line": 81, "kind": "input read" }, { "symbol": "StaticHtmlOrganCrawler.crawl", "path": "aggregator/static_html_crawler.py", "key": "rate_limit_delay", "value_expression": "self.config.get('rate_limit_delay', 0.2)", "line": 117, "kind": "input read" }, { "symbol": "ArpSchnitgerCrawler._fetch_html", "path": "aggregator/static_html_crawler.py", "key": "timeout", "value_expression": "self.config.get('timeout', 30)", "line": 1367, "kind": "input read" } ], "bounded_code_passages": [ { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.crawl", "line_start": 78, "line_end": 84, "text": " def crawl(self, **kwargs) -> List[Dict[str, Any]]:\n task_id = kwargs.get(\"task_id\") or f\"{self.source_key}_crawl_{datetime.now().strftime('%Y%m%d%H%M%S')}\"\n max_items = self._optional_int(kwargs.get(\"max_items\"))\n start_urls = kwargs.get(\"start_urls\") or self.start_urls\n if isinstance(start_urls, str):\n start_urls = [item.strip() for item in start_urls.split(\",\") if item.strip()]\n" }, { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.crawl", "line_start": 78, "line_end": 85, "text": " def crawl(self, **kwargs) -> List[Dict[str, Any]]:\n task_id = kwargs.get(\"task_id\") or f\"{self.source_key}_crawl_{datetime.now().strftime('%Y%m%d%H%M%S')}\"\n max_items = self._optional_int(kwargs.get(\"max_items\"))\n start_urls = kwargs.get(\"start_urls\") or self.start_urls\n if isinstance(start_urls, str):\n start_urls = [item.strip() for item in start_urls.split(\",\") if item.strip()]\n\n self._update_scrape_status(task_id, \"INITIALIZING\", f\"Starting {self.display_name} crawl...\", 0, 0)" }, { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.crawl", "line_start": 78, "line_end": 86, "text": " def crawl(self, **kwargs) -> List[Dict[str, Any]]:\n task_id = kwargs.get(\"task_id\") or f\"{self.source_key}_crawl_{datetime.now().strftime('%Y%m%d%H%M%S')}\"\n max_items = self._optional_int(kwargs.get(\"max_items\"))\n start_urls = kwargs.get(\"start_urls\") or self.start_urls\n if isinstance(start_urls, str):\n start_urls = [item.strip() for item in start_urls.split(\",\") if item.strip()]\n\n self._update_scrape_status(task_id, \"INITIALIZING\", f\"Starting {self.display_name} crawl...\", 0, 0)\n refs: List[Dict[str, Any]] = []" }, { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.crawl", "line_start": 114, "line_end": 122, "text": " break\n if max_items and len(refs) >= max_items:\n break\n time.sleep(get_jittered_sleep_duration(self.config.get(\"rate_limit_delay\", 0.2)))\n\n self._update_scrape_status(\n task_id,\n \"COMPLETED\",\n f\"{self.display_name} crawl completed. Upserted {len(refs)} references.\"," }, { "path": "aggregator/static_html_crawler.py", "symbol": "ArpSchnitgerCrawler._fetch_html", "line_start": 1364, "line_end": 1372, "text": " \"\"\"\n response = self.session.get(\n url,\n timeout=int(self.config.get(\"timeout\", 30)),\n verify=False,\n )\n response.raise_for_status()\n hostname = (urlparse(response.url).hostname or \"\").lower()\n if hostname not in {\"arpschnitger.nl\", \"www.arpschnitger.nl\"}:" } ] } }, { "catalogue_id": "S003", "source_key": "augustine_virtual_organs_samples", "name": "Augustine's Virtual Organs Sample Set Listings", "selection_role": "registered_source", "parent_source_key": null, "attribution": "Augustine's Virtual Organs", "scope_description": "Hauptwerk products grouped by style, builder and manual count", "documentary_unit": "Original sample-set listing", "source_description": "The catalogue separates original recordings from composite sets and marks a subset as free. It also distinguishes the producer's own recordings from recordings supplied by others and subsequently made into sample sets.", "source_description_references": [ "augustine_virtual_organs_samples" ], "interpretation": "Original, composite and derived products need separate records. The free category describes distribution price; it does not supply a common licence for the audio.", "rights_observation": "Copyright is asserted in the footer; product-specific permissions remain to be checked.", "rights_observation_basis": "Report of the pages consulted on 10 September 2026; not a determination of legal entitlement or a complete licence audit.", "references": [ "augustine_virtual_organs_samples" ], "observation_date": "2026-09-10", "atlas_editorial_reading": { "evidence_kind": "code_reading_and_interpretation", "acquisition": "The source-specific parser selects links to PHP product pages and their surrounding context. The library family can enrich discovered items from linked detail pages; catalogue and detail capture are distinct operations.", "transformation": "The implemented unit is sample-set entries. parse_html produces a collection of item records; the common transform wraps them in a vmi_library_batch. Source fragments, item identity, links and product context are passed to the VMI normalizer. The exact selectors and constructed fields are enumerated in the technical evidence register. The native wording remains necessary to distinguish a producer, a product, a version and the organ represented.", "limitations": "Original, composite and derived products need separate provenance. A composite cannot stand as a measured historical organ configuration. The existence of a parser is not a fresh check of the live catalogue, and a parsed link is not evidence that its downloadable content was inspected." }, "implementation": { "class": "AugustineVirtualOrgansSamplesCrawler", "class_line": 1399, "path": "aggregator/grandorgue_library_crawler.py", "inheritance": [ "AugustineVirtualOrgansSamplesCrawler", "GrandOrgueLibraryCrawler", "BaseCrawler" ], "configuration": { "source_key": { "value": "augustine_virtual_organs_samples", "path": "aggregator/grandorgue_library_crawler.py", "line": 1400, "class": "AugustineVirtualOrgansSamplesCrawler" }, "catalog_url": { "value": "", "path": "aggregator/grandorgue_library_crawler.py", "line": 34, "class": "GrandOrgueLibraryCrawler" }, "catalog_kind": { "value": "producer_registry", "path": "aggregator/grandorgue_library_crawler.py", "line": 1402, "class": "AugustineVirtualOrgansSamplesCrawler" }, "cache_source_key_column": { "value": "source_key", "path": "aggregator/grandorgue_library_crawler.py", "line": 40, "class": "GrandOrgueLibraryCrawler" }, "final_source_key_column": { "value": "source_key", "path": "aggregator/grandorgue_library_crawler.py", "line": 41, "class": "GrandOrgueLibraryCrawler" }, "transformed_json_id_column": { "value": "item_id", "path": "aggregator/grandorgue_library_crawler.py", "line": 42, "class": "GrandOrgueLibraryCrawler" } }, "methods": [ { "symbol": "GrandOrgueLibraryCrawler._append_detail_document", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 276, "line_end": 306, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 284, "receiver": "record.get('provenance', {})", "key": "identity", "expression": "record.get('provenance', {}).get('identity', {})" }, { "line": 285, "receiver": "identity", "key": "primary_id_value", "expression": "identity.get('primary_id_value')" }, { "line": 286, "receiver": "record.get('source', {})", "key": "retrieved_at", "expression": "record.get('source', {}).get('retrieved_at')" }, { "line": 284, "receiver": "record", "key": "provenance", "expression": "record.get('provenance', {})" }, { "line": 286, "receiver": "record", "key": "source", "expression": "record.get('source', {})" }, { "line": 300, "receiver": "doc", "key": "document_id", "expression": "doc.get('document_id')" } ], "html_queries": [], "dictionary_entries": [ { "line": 288, "key": "document_id", "value_expression": "provenance.document_id(self.source_key, f'{primary_id}:detail', 'raw_html')" }, { "line": 289, "key": "document_kind", "value_expression": "'raw_html'" }, { "line": 290, "key": "content_sha256", "value_expression": "provenance.content_sha256(detail_html)" }, { "line": 291, "key": "content_size_bytes", "value_expression": "len(detail_html.encode('utf-8'))" }, { "line": 292, "key": "content_type", "value_expression": "'text/html'" }, { "line": 293, "key": "url", "value_expression": "detail_url" }, { "line": 294, "key": "retrieved_at", "value_expression": "retrieved_at" }, { "line": 295, "key": "crawl_run_id", "value_expression": "crawl_run_id or ''" }, { "line": 296, "key": "raw_content", "value_expression": "detail_html" } ], "subscript_assignments": [ { "line": 302, "value_line": 302, "key": "detail_page_crawled", "target_expression": "record.setdefault('extensions', {})['detail_page_crawled']", "value_expression": "True" }, { "line": 304, "value_line": 304, "key": "access_model_hint", "target_expression": "record.setdefault('item', {})['access_model_hint']", "value_expression": "'registration_required'" }, { "line": 305, "value_line": 305, "key": "availability_status_hint", "target_expression": "record.setdefault('item', {})['availability_status_hint']", "value_expression": "'available_with_registration'" } ] }, { "symbol": "GrandOrgueLibraryCrawler._apply_detail_html", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 308, "line_end": 309, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler._detail_url_for_record", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 259, "line_end": 274, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 261, "receiver": "record", "key": "links", "expression": "record.get('links')" }, { "line": 270, "receiver": "link", "key": "is_download_candidate", "expression": "link.get('is_download_candidate')" }, { "line": 272, "receiver": "link", "key": "is_product_homepage_candidate", "expression": "link.get('is_product_homepage_candidate')" }, { "line": 264, "receiver": "link", "key": "normalized_url", "expression": "link.get('normalized_url')" }, { "line": 264, "receiver": "link", "key": "url", "expression": "link.get('url')" }, { "line": 272, "receiver": "link", "key": "rel", "expression": "link.get('rel')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler._enrich_records_with_detail_pages", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 213, "line_end": 257, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_append_detail_document", "_apply_detail_html", "_detail_url_for_record" ], "literal_get_calls": [ { "line": 219, "receiver": "self.config", "key": "crawl_detail_pages", "expression": "self.config.get('crawl_detail_pages')" }, { "line": 225, "receiver": "self.config", "key": "max_detail_pages", "expression": "self.config.get('max_detail_pages', 0)" }, { "line": 243, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [ { "line": 222, "key": "detail_page_enrichment_enabled", "value_expression": "False" }, { "line": 222, "key": "detail_page_fetched", "value_expression": "False" } ], "subscript_assignments": [ { "line": 230, "value_line": 230, "key": "detail_page_enrichment_enabled", "target_expression": "completeness['detail_page_enrichment_enabled']", "value_expression": "True" }, { "line": 255, "value_line": 255, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "True" }, { "line": 232, "value_line": 232, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 233, "value_line": 233, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'configured_detail_page_limit'" }, { "line": 238, "value_line": 238, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 239, "value_line": 239, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'no_detail_url_discovered'" }, { "line": 247, "value_line": 247, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 248, "value_line": 248, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'fetch_failed'" } ] }, { "symbol": "GrandOrgueLibraryCrawler._record", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 311, "line_end": 341, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 326, "receiver": "payload", "key": "catalog", "expression": "payload.get('catalog')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [ { "line": 330, "value_line": 330, "key": "catalog", "target_expression": "payload['catalog']", "value_expression": "catalog" } ] }, { "symbol": "GrandOrgueLibraryCrawler.crawl", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 86, "line_end": 136, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_enrich_records_with_detail_pages", "_fail_shared_crawl_run", "_finish_shared_crawl_run", "_register_shared_crawl_target", "_upsert_scrape_status", "parse_html" ], "literal_get_calls": [ { "line": 88, "receiver": "kwargs", "key": "task_id", "expression": "kwargs.get('task_id')" }, { "line": 89, "receiver": "kwargs", "key": "run_id", "expression": "kwargs.get('run_id')" }, { "line": 87, "receiver": "kwargs", "key": "url", "expression": "kwargs.get('url')" }, { "line": 91, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" }, { "line": 121, "receiver": "record.get('item', {})", "key": "title", "expression": "record.get('item', {}).get('title')" }, { "line": 122, "receiver": "record.get('source_snapshot', {})", "key": "url", "expression": "record.get('source_snapshot', {}).get('url')" }, { "line": 124, "receiver": "record.get('extensions', {})", "key": "source_fragment_html", "expression": "record.get('extensions', {}).get('source_fragment_html')" }, { "line": 121, "receiver": "record", "key": "item", "expression": "record.get('item', {})" }, { "line": 122, "receiver": "record", "key": "source_snapshot", "expression": "record.get('source_snapshot', {})" }, { "line": 124, "receiver": "record", "key": "extensions", "expression": "record.get('extensions', {})" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "AugustineVirtualOrgansSamplesCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 1404, "line_end": 1466, "inherited": false, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_record" ], "literal_get_calls": [ { "line": 1429, "receiver": "link", "key": "href", "expression": "link.get('href')" } ], "html_queries": [ { "line": 1425, "expression": "soup.select('a[href*=\".php\"]')" } ], "dictionary_entries": [ { "line": 1438, "key": "catalog", "value_expression": "{'position': position, 'section_label': 'Sample sets'}" }, { "line": 1439, "key": "item", "value_expression": "{'title': title, 'producer_label': \"Augustine's Virtual Organs\", 'description_excerpt': f\"Public Augustine's Virtual Organs listing page for {title}.\", 'software_labels': ['Hauptwerk'], 'engine_labels': ['Hauptwerk'], 'access_model_hint': 'free_or_low_cost' if 'free' in lower else 'producer_catalog', 'availability_status_hint': 'producer_listing'}" }, { "line": 1448, "key": "package", "value_expression": "{'package_title': title, 'package_kind': 'producer_listing', 'is_odf_only': False, 'requires_sample_set': False, 'is_demo': False}" }, { "line": 1455, "key": "links", "value_expression": "[{'url': detail_url, 'link_text': title, 'is_product_homepage_candidate': True}]" }, { "line": 1456, "key": "extensions", "value_expression": "{'source_fragment_html': str(link)}" }, { "line": 1438, "key": "position", "value_expression": "position" }, { "line": 1438, "key": "section_label", "value_expression": "'Sample sets'" }, { "line": 1440, "key": "title", "value_expression": "title" }, { "line": 1441, "key": "producer_label", "value_expression": "\"Augustine's Virtual Organs\"" }, { "line": 1442, "key": "description_excerpt", "value_expression": "f\"Public Augustine's Virtual Organs listing page for {title}.\"" }, { "line": 1443, "key": "software_labels", "value_expression": "['Hauptwerk']" }, { "line": 1444, "key": "engine_labels", "value_expression": "['Hauptwerk']" }, { "line": 1445, "key": "access_model_hint", "value_expression": "'free_or_low_cost' if 'free' in lower else 'producer_catalog'" }, { "line": 1446, "key": "availability_status_hint", "value_expression": "'producer_listing'" }, { "line": 1449, "key": "package_title", "value_expression": "title" }, { "line": 1450, "key": "package_kind", "value_expression": "'producer_listing'" }, { "line": 1451, "key": "is_odf_only", "value_expression": "False" }, { "line": 1452, "key": "requires_sample_set", "value_expression": "False" }, { "line": 1453, "key": "is_demo", "value_expression": "False" }, { "line": 1456, "key": "source_fragment_html", "value_expression": "str(link)" }, { "line": 1455, "key": "url", "value_expression": "detail_url" }, { "line": 1455, "key": "link_text", "value_expression": "title" }, { "line": 1455, "key": "is_product_homepage_candidate", "value_expression": "True" } ], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler.transform", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 138, "line_end": 156, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "parse_html" ], "literal_get_calls": [ { "line": 139, "receiver": "raw_data", "key": "html", "expression": "raw_data.get('html')" }, { "line": 139, "receiver": "raw_data", "key": "raw_html", "expression": "raw_data.get('raw_html')" }, { "line": 139, "receiver": "raw_data", "key": "markdown", "expression": "raw_data.get('markdown')" }, { "line": 140, "receiver": "raw_data", "key": "url", "expression": "raw_data.get('url')" }, { "line": 140, "receiver": "raw_data", "key": "source_url", "expression": "raw_data.get('source_url')" }, { "line": 144, "receiver": "raw_data", "key": "crawl_run_id", "expression": "raw_data.get('crawl_run_id')" }, { "line": 145, "receiver": "raw_data", "key": "transform_run_id", "expression": "raw_data.get('transform_run_id')" } ], "html_queries": [], "dictionary_entries": [ { "line": 148, "key": "record_type", "value_expression": "'vmi_library_batch'" }, { "line": 149, "key": "source", "value_expression": "{'key': self.source_key, 'display_name': self.source_display_name, 'base_url': self.catalog_url, 'type': self.source_type}" }, { "line": 155, "key": "records", "value_expression": "records" }, { "line": 150, "key": "key", "value_expression": "self.source_key" }, { "line": 151, "key": "display_name", "value_expression": "self.source_display_name" }, { "line": 152, "key": "base_url", "value_expression": "self.catalog_url" }, { "line": 153, "key": "type", "value_expression": "self.source_type" } ], "subscript_assignments": [] } ], "selected_rule_rows": [ { "symbol": "GrandOrgueLibraryCrawler.transform", "path": "aggregator/grandorgue_library_crawler.py", "line": 148, "key": "record_type", "value_expression": "'vmi_library_batch'" }, { "symbol": "AugustineVirtualOrgansSamplesCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 1450, "key": "package_kind", "value_expression": "'producer_listing'" }, { "symbol": "AugustineVirtualOrgansSamplesCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 1452, "key": "requires_sample_set", "value_expression": "False" }, { "symbol": "AugustineVirtualOrgansSamplesCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 1451, "key": "is_odf_only", "value_expression": "False" }, { "symbol": "AugustineVirtualOrgansSamplesCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 1441, "key": "producer_label", "value_expression": "\"Augustine's Virtual Organs\"" } ], "bounded_code_passages": [ { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "GrandOrgueLibraryCrawler.transform", "line_start": 145, "line_end": 153, "text": " transform_run_id=raw_data.get(\"transform_run_id\"),\n )\n return {\n \"record_type\": \"vmi_library_batch\",\n \"source\": {\n \"key\": self.source_key,\n \"display_name\": self.source_display_name,\n \"base_url\": self.catalog_url,\n \"type\": self.source_type," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "AugustineVirtualOrgansSamplesCrawler.parse_html", "line_start": 1447, "line_end": 1455, "text": " },\n \"package\": {\n \"package_title\": title,\n \"package_kind\": \"producer_listing\",\n \"is_odf_only\": False,\n \"requires_sample_set\": False,\n \"is_demo\": False,\n },\n \"links\": [{\"url\": detail_url, \"link_text\": title, \"is_product_homepage_candidate\": True}]," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "AugustineVirtualOrgansSamplesCrawler.parse_html", "line_start": 1449, "line_end": 1457, "text": " \"package_title\": title,\n \"package_kind\": \"producer_listing\",\n \"is_odf_only\": False,\n \"requires_sample_set\": False,\n \"is_demo\": False,\n },\n \"links\": [{\"url\": detail_url, \"link_text\": title, \"is_product_homepage_candidate\": True}],\n \"extensions\": {\"source_fragment_html\": str(link)},\n }," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "AugustineVirtualOrgansSamplesCrawler.parse_html", "line_start": 1448, "line_end": 1456, "text": " \"package\": {\n \"package_title\": title,\n \"package_kind\": \"producer_listing\",\n \"is_odf_only\": False,\n \"requires_sample_set\": False,\n \"is_demo\": False,\n },\n \"links\": [{\"url\": detail_url, \"link_text\": title, \"is_product_homepage_candidate\": True}],\n \"extensions\": {\"source_fragment_html\": str(link)}," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "AugustineVirtualOrgansSamplesCrawler.parse_html", "line_start": 1438, "line_end": 1446, "text": " \"catalog\": {\"position\": position, \"section_label\": \"Sample sets\"},\n \"item\": {\n \"title\": title,\n \"producer_label\": \"Augustine's Virtual Organs\",\n \"description_excerpt\": f\"Public Augustine's Virtual Organs listing page for {title}.\",\n \"software_labels\": [\"Hauptwerk\"],\n \"engine_labels\": [\"Hauptwerk\"],\n \"access_model_hint\": \"free_or_low_cost\" if \"free\" in lower else \"producer_catalog\",\n \"availability_status_hint\": \"producer_listing\"," } ] } }, { "catalogue_id": "S004", "source_key": "bdo_tuning_systems", "name": "BDO Tuning Systems", "selection_role": "registered_source", "parent_source_key": null, "attribution": "Hans Eugen Frischknecht; Jakob Schmid; hosted by Bund Deutscher Orgelbaumeister", "scope_description": "Historical and theoretical temperaments", "documentary_unit": "Tuning-system definition", "source_description": "The collection groups temperaments, offers sound examples and distinguishes a more precise calculation section. Its authors page credits Frischknecht with the conception, research and graphical presentation and Schmid with the website's implementation.", "source_description_references": [ "bdo_tuning_systems", "bdo_authors" ], "interpretation": "Temperament definitions support comparison of interval structures. They provide no evidence that a particular organ used a temperament.", "rights_observation": "No general licence was identified on the consulted index or authors page.", "rights_observation_basis": "Report of the pages consulted on 10 September 2026; not a determination of legal entitlement or a complete licence audit.", "references": [ "bdo_tuning_systems", "bdo_authors" ], "observation_date": "2026-09-10", "atlas_editorial_reading": { "evidence_kind": "code_reading_and_interpretation", "acquisition": "The crawler parses tuning definitions and can obtain separate commentary pages. Source parameter values and commentary have separate document identities.", "transformation": "The normalizer preserves a cent-value vector in a declared source tone order, group memberships and a precise-variant flag. Derived intervals are calculated in a separate routine. Commentary is partitioned into description, author note, source note and literature information. Source values and calculated musical quantities are therefore explicitly distinguishable.", "limitations": "A tuning definition does not demonstrate its use on an organ. A precise-variant suffix is an implementation convention that needs source interpretation. Calculated intervals should be cited as calculations with their parameters, not as verbatim source values." }, "implementation": { "class": "BdoTuningSystemsCrawler", "class_line": 29, "path": "aggregator/bdo_tuning_systems_crawler.py", "inheritance": [ "BdoTuningSystemsCrawler", "BaseCrawler" ], "configuration": { "transformed_json_id_column": { "value": "tuning_id", "path": "aggregator/bdo_tuning_systems_crawler.py", "line": 37, "class": "BdoTuningSystemsCrawler" }, "record_label": { "value": "tuning systems", "path": "aggregator/bdo_tuning_systems_crawler.py", "line": 38, "class": "BdoTuningSystemsCrawler" } }, "methods": [ { "symbol": "BdoTuningSystemsCrawler._crawl_options", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 574, "line_end": 583, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [ "_pages_from_options" ], "literal_get_calls": [ { "line": 582, "receiver": "source", "key": "limit", "expression": "source.get('limit')" }, { "line": 582, "receiver": "source", "key": "max_items", "expression": "source.get('max_items')" } ], "html_queries": [], "dictionary_entries": [ { "line": 581, "key": "pages", "value_expression": "self._pages_from_options(source)" }, { "line": 582, "key": "limit", "value_expression": "source.get('limit') or source.get('max_items') or 0" } ], "subscript_assignments": [ { "line": 579, "value_line": 579, "key": "page", "target_expression": "source['page']", "value_expression": "str(target)" } ] }, { "symbol": "BdoTuningSystemsCrawler._fetch_html", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 134, "line_end": 138, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [], "literal_get_calls": [ { "line": 135, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "BdoTuningSystemsCrawler._fetch_optional_html", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 140, "line_end": 146, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [], "literal_get_calls": [ { "line": 141, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "BdoTuningSystemsCrawler._merge_record", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 383, "line_end": 394, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [], "literal_get_calls": [ { "line": 385, "receiver": "incoming", "key": "group_memberships", "expression": "incoming.get('group_memberships')" }, { "line": 389, "receiver": "incoming", "key": "group_key", "expression": "incoming.get('group_key')" }, { "line": 390, "receiver": "incoming", "key": "group_key", "expression": "incoming.get('group_key')" }, { "line": 391, "receiver": "incoming", "key": "group_title", "expression": "incoming.get('group_title')" }, { "line": 384, "receiver": "existing", "key": "group_memberships", "expression": "existing.get('group_memberships')" }, { "line": 389, "receiver": "existing", "key": "group_key", "expression": "existing.get('group_key')" }, { "line": 392, "receiver": "incoming", "key": "group_key", "expression": "incoming.get('group_key')" }, { "line": 393, "receiver": "incoming", "key": "group_key", "expression": "incoming.get('group_key')" }, { "line": 394, "receiver": "incoming", "key": "group_title", "expression": "incoming.get('group_title')" }, { "line": 392, "receiver": "existing", "key": "group_key", "expression": "existing.get('group_key')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [ { "line": 388, "value_line": 388, "key": "group_memberships", "target_expression": "existing['group_memberships']", "value_expression": "existing_groups" }, { "line": 390, "value_line": 390, "key": "group_key", "target_expression": "existing['group_key']", "value_expression": "incoming.get('group_key')" }, { "line": 391, "value_line": 391, "key": "group_title", "target_expression": "existing['group_title']", "value_expression": "incoming.get('group_title')" }, { "line": 393, "value_line": 393, "key": "group_key", "target_expression": "existing['group_key']", "value_expression": "incoming.get('group_key')" }, { "line": 394, "value_line": 394, "key": "group_title", "target_expression": "existing['group_title']", "value_expression": "incoming.get('group_title')" } ] }, { "symbol": "BdoTuningSystemsCrawler._record_from_href", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 326, "line_end": 358, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [ "_clean_text" ], "literal_get_calls": [ { "line": 329, "receiver": "params", "key": "label", "expression": "params.get('label')" }, { "line": 330, "receiver": "params", "key": "title", "expression": "params.get('title')" }, { "line": 331, "receiver": "params", "key": "centstr", "expression": "params.get('centstr')" } ], "html_queries": [], "dictionary_entries": [ { "line": 337, "key": "tuning_id", "value_expression": "label" }, { "line": 338, "key": "label", "value_expression": "label" }, { "line": 339, "key": "title", "value_expression": "title or label" }, { "line": 340, "key": "centstr", "value_expression": "centstr" }, { "line": 341, "key": "cent_values", "value_expression": "_parse_centstr(centstr)" }, { "line": 342, "key": "group_key", "value_expression": "group_key" }, { "line": 343, "key": "group_title", "value_expression": "group_title if group_key else ''" }, { "line": 344, "key": "group_memberships", "value_expression": "[{'group_key': group_key, 'group_title': group_title}] if group_key else []" }, { "line": 345, "key": "page_key", "value_expression": "page_key" }, { "line": 346, "key": "url", "value_expression": "source_url" }, { "line": 347, "key": "source_url", "value_expression": "source_url" }, { "line": 348, "key": "is_precise_variant", "value_expression": "label.endswith('_g')" }, { "line": 349, "key": "commentary_available", "value_expression": "0" }, { "line": 350, "key": "commentary_url", "value_expression": "''" }, { "line": 351, "key": "description", "value_expression": "''" }, { "line": 352, "key": "author_note", "value_expression": "''" }, { "line": 353, "key": "source_note", "value_expression": "''" }, { "line": 354, "key": "literature_text", "value_expression": "''" }, { "line": 355, "key": "raw_commentary_html", "value_expression": "''" }, { "line": 356, "key": "status", "value_expression": "'initiated'" }, { "line": 357, "key": "scraped_at", "value_expression": "datetime.now().isoformat(timespec='seconds')" }, { "line": 344, "key": "group_key", "value_expression": "group_key" }, { "line": 344, "key": "group_title", "value_expression": "group_title" } ], "subscript_assignments": [] }, { "symbol": "BdoTuningSystemsCrawler._record_from_link", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 315, "line_end": 324, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [ "_clean_text", "_record_from_href" ], "literal_get_calls": [ { "line": 322, "receiver": "record", "key": "title", "expression": "record.get('title')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [ { "line": 320, "value_line": 320, "key": "raw_html", "target_expression": "record['raw_html']", "value_expression": "str(row or link)" }, { "line": 323, "value_line": 323, "key": "title", "target_expression": "record['title']", "value_expression": "linked_title" } ] }, { "symbol": "BdoTuningSystemsCrawler.crawl", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 87, "line_end": 132, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [ "_attach_commentary_pages", "_crawl_options", "_fetch_html", "_merge_record", "_persist_cache_records", "_upsert_scrape_status", "is_scrape_stop_requested", "mark_scrape_stopped", "parse_catalog_page" ], "literal_get_calls": [ { "line": 89, "receiver": "kwargs", "key": "task_id", "expression": "kwargs.get('task_id')" }, { "line": 91, "receiver": "options", "key": "limit", "expression": "options.get('limit')" }, { "line": 118, "receiver": "self.config", "key": "fetch_commentary_pages", "expression": "self.config.get('fetch_commentary_pages')" }, { "line": 115, "receiver": "self.config", "key": "rate_limit_delay", "expression": "self.config.get('rate_limit_delay', 0.5)" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "BdoTuningSystemsCrawler.normalized_batch_record", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 294, "line_end": 313, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [ { "line": 307, "value_line": 307, "key": "transform_run_id", "target_expression": "identity['transform_run_id']", "value_expression": "process_id" }, { "line": 308, "value_line": 308, "key": "artifact_ids", "target_expression": "identity['artifact_ids']", "value_expression": "list(artifact_ids or [])" }, { "line": 310, "value_line": 310, "key": "url", "target_expression": "record.setdefault('source_snapshot', {})['url']", "value_expression": "source_url" }, { "line": 312, "value_line": 312, "key": "retrieved_at", "target_expression": "record.setdefault('source', {})['retrieved_at']", "value_expression": "retrieved_at" } ] }, { "symbol": "BdoTuningSystemsCrawler.parse_catalog_page", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 148, "line_end": 159, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [ "_page_context", "_record_from_link" ], "literal_get_calls": [ { "line": 153, "receiver": "link", "key": "href", "expression": "link.get('href')" } ], "html_queries": [ { "line": 152, "expression": "soup.find_all('a', href=True)" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "BdoTuningSystemsCrawler.parse_commentary_page", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 179, "line_end": 213, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [ { "line": 188, "expression": "soup.find_all('dt')" } ], "dictionary_entries": [ { "line": 181, "key": "description", "value_expression": "[]" }, { "line": 181, "key": "author_note", "value_expression": "[]" }, { "line": 181, "key": "source_note", "value_expression": "[]" }, { "line": 181, "key": "literature", "value_expression": "[]" }, { "line": 183, "key": "beschreibung", "value_expression": "'description'" }, { "line": 184, "key": "autor", "value_expression": "'author_note'" }, { "line": 185, "key": "quelle", "value_expression": "'source_note'" }, { "line": 186, "key": "literatur", "value_expression": "'literature'" }, { "line": 203, "key": "available", "value_expression": "True" }, { "line": 204, "key": "url", "value_expression": "page_url" }, { "line": 205, "key": "label", "value_expression": "label" }, { "line": 206, "key": "description", "value_expression": "' '.join(sections['description'])" }, { "line": 207, "key": "author_note", "value_expression": "' '.join(sections['author_note'])" }, { "line": 208, "key": "source_note", "value_expression": "' '.join(sections['source_note'])" }, { "line": 209, "key": "literature_text", "value_expression": "'\\n'.join(literature_entries)" }, { "line": 210, "key": "literature_entries", "value_expression": "literature_entries" }, { "line": 211, "key": "raw_text", "value_expression": "self._clean_text(soup.get_text(' ', strip=True))" } ], "subscript_assignments": [] }, { "symbol": "BdoTuningSystemsCrawler.preflight_crawl", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 83, "line_end": 85, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [ "_pages_from_options" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 85, "key": "ok", "value_expression": "bool(pages)" }, { "line": 85, "key": "pages", "value_expression": "pages" }, { "line": 85, "key": "page_count", "value_expression": "len(pages)" } ], "subscript_assignments": [] }, { "symbol": "BdoTuningSystemsCrawler.scrape_row_to_transfer_record", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 276, "line_end": 292, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [], "literal_get_calls": [ { "line": 285, "receiver": "payload", "key": "raw_data_json", "expression": "payload.get('raw_data_json')" }, { "line": 289, "receiver": "raw_payload", "key": "raw_html", "expression": "raw_payload.get('raw_html')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "BdoTuningSystemsCrawler.test_label", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 260, "line_end": 274, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [ "_attach_commentary_pages", "_fetch_html", "parse_catalog_page", "transform" ], "literal_get_calls": [ { "line": 265, "receiver": "self.config", "key": "fetch_commentary_pages", "expression": "self.config.get('fetch_commentary_pages')" }, { "line": 261, "receiver": "self.config", "key": "index_page", "expression": "self.config.get('index_page', 'contents.htm')" }, { "line": 264, "receiver": "record", "key": "tuning_id", "expression": "record.get('tuning_id')" }, { "line": 264, "receiver": "record", "key": "label", "expression": "record.get('label')" } ], "html_queries": [], "dictionary_entries": [ { "line": 269, "key": "source", "value_expression": "self.source_key" }, { "line": 270, "key": "query", "value_expression": "{'label': wanted}" }, { "line": 271, "key": "parsed_count", "value_expression": "len(records)" }, { "line": 272, "key": "first_record", "value_expression": "sample" }, { "line": 273, "key": "first_transformed_record", "value_expression": "transformed" }, { "line": 270, "key": "label", "value_expression": "wanted" } ], "subscript_assignments": [] }, { "symbol": "BdoTuningSystemsCrawler.transform", "path": "aggregator/bdo_tuning_systems_crawler.py", "line_start": 161, "line_end": 177, "inherited": false, "file_sha256": "0671e570252fa9c8722bfc606add24bb5b7e41ddd44da821e4fad49be51a1b1f", "self_calls": [], "literal_get_calls": [ { "line": 163, "receiver": "payload", "key": "raw_data_json", "expression": "payload.get('raw_data_json')" }, { "line": 175, "receiver": "payload", "key": "crawl_run_id", "expression": "payload.get('crawl_run_id')" }, { "line": 176, "receiver": "payload", "key": "transform_run_id", "expression": "payload.get('transform_run_id')" }, { "line": 174, "receiver": "payload", "key": "raw_html", "expression": "payload.get('raw_html')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] } ], "selected_rule_rows": [ { "symbol": "BdoTuningSystemsCrawler.transform", "path": "aggregator/bdo_tuning_systems_crawler.py", "key": "raw_data_json", "value_expression": "payload.get('raw_data_json')", "line": 163, "kind": "input read" }, { "symbol": "BdoTuningSystemsCrawler.transform", "path": "aggregator/bdo_tuning_systems_crawler.py", "key": "crawl_run_id", "value_expression": "payload.get('crawl_run_id')", "line": 175, "kind": "input read" }, { "symbol": "BdoTuningSystemsCrawler.transform", "path": "aggregator/bdo_tuning_systems_crawler.py", "key": "transform_run_id", "value_expression": "payload.get('transform_run_id')", "line": 176, "kind": "input read" }, { "symbol": "BdoTuningSystemsCrawler.transform", "path": "aggregator/bdo_tuning_systems_crawler.py", "key": "raw_html", "value_expression": "payload.get('raw_html')", "line": 174, "kind": "input read" }, { "symbol": "BdoTuningSystemsCrawler.crawl", "path": "aggregator/bdo_tuning_systems_crawler.py", "key": "task_id", "value_expression": "kwargs.get('task_id')", "line": 89, "kind": "input read" }, { "symbol": "BdoTuningSystemsCrawler.crawl", "path": "aggregator/bdo_tuning_systems_crawler.py", "key": "limit", "value_expression": "options.get('limit')", "line": 91, "kind": "input read" } ], "bounded_code_passages": [ { "path": "aggregator/bdo_tuning_systems_crawler.py", "symbol": "BdoTuningSystemsCrawler.transform", "line_start": 161, "line_end": 168, "text": " def transform(self, raw_data: Dict[str, Any]) -> Dict[str, Any]:\n payload = dict(raw_data or {})\n raw_json = payload.get(\"raw_data_json\")\n if isinstance(raw_json, str) and raw_json.strip():\n try:\n decoded = json.loads(raw_json)\n if isinstance(decoded, dict):\n decoded.update({key: value for key, value in payload.items() if value not in (None, \"\")})" }, { "path": "aggregator/bdo_tuning_systems_crawler.py", "symbol": "BdoTuningSystemsCrawler.transform", "line_start": 172, "line_end": 177, "text": " return normalize_tuning_system_record(\n payload,\n raw_content=payload.get(\"raw_html\") or \"\",\n crawl_run_id=payload.get(\"crawl_run_id\"),\n transform_run_id=payload.get(\"transform_run_id\"),\n )" }, { "path": "aggregator/bdo_tuning_systems_crawler.py", "symbol": "BdoTuningSystemsCrawler.transform", "line_start": 173, "line_end": 177, "text": " payload,\n raw_content=payload.get(\"raw_html\") or \"\",\n crawl_run_id=payload.get(\"crawl_run_id\"),\n transform_run_id=payload.get(\"transform_run_id\"),\n )" }, { "path": "aggregator/bdo_tuning_systems_crawler.py", "symbol": "BdoTuningSystemsCrawler.transform", "line_start": 171, "line_end": 177, "text": " pass\n return normalize_tuning_system_record(\n payload,\n raw_content=payload.get(\"raw_html\") or \"\",\n crawl_run_id=payload.get(\"crawl_run_id\"),\n transform_run_id=payload.get(\"transform_run_id\"),\n )" }, { "path": "aggregator/bdo_tuning_systems_crawler.py", "symbol": "BdoTuningSystemsCrawler.crawl", "line_start": 87, "line_end": 94, "text": " def crawl(self, target: Any = None, **kwargs) -> List[Dict[str, Any]]:\n options = self._crawl_options(target, kwargs)\n task_id = kwargs.get(\"task_id\")\n pages = options[\"pages\"]\n max_items = _safe_int(options.get(\"limit\"), default=0)\n self._upsert_scrape_status(task_id, \"RUNNING\", \"Starting BDO tuning-system crawl.\", 0, max(1, len(pages)))\n\n records_by_id: Dict[str, Dict[str, Any]] = {}" }, { "path": "aggregator/bdo_tuning_systems_crawler.py", "symbol": "BdoTuningSystemsCrawler.crawl", "line_start": 88, "line_end": 96, "text": " options = self._crawl_options(target, kwargs)\n task_id = kwargs.get(\"task_id\")\n pages = options[\"pages\"]\n max_items = _safe_int(options.get(\"limit\"), default=0)\n self._upsert_scrape_status(task_id, \"RUNNING\", \"Starting BDO tuning-system crawl.\", 0, max(1, len(pages)))\n\n records_by_id: Dict[str, Dict[str, Any]] = {}\n try:\n for index, page in enumerate(pages, start=1):" } ] } }, { "catalogue_id": "S005", "source_key": "binauralpipes_instruments", "name": "Binaural Pipes Instruments", "selection_role": "registered_source", "parent_source_key": null, "attribution": "Dietrich Wierczeyko / Binauralpipes", "scope_description": "Selected organs represented in a sampling project", "documentary_unit": "Instrument or prospective sample-set listing", "source_description": "The instruments page lists places, builders, dates and compact stop/manual counts. It includes a section for sample sets in preparation and credits Dietrich Wierczeyko in its copyright notice.", "source_description_references": [ "binauralpipes_instruments" ], "interpretation": "A listed organ is not necessarily an available download. Preparation, release and subsequent revision should be distinct states. The project's selection cannot measure the distribution of surviving organs.", "rights_observation": "Copyright is asserted; the consulted list does not establish download or redistribution terms.", "rights_observation_basis": "Report of the pages consulted on 10 September 2026; not a determination of legal entitlement or a complete licence audit.", "references": [ "binauralpipes_instruments" ], "observation_date": "2026-09-10", "atlas_editorial_reading": { "evidence_kind": "code_reading_and_interpretation", "acquisition": "The source-specific parser selects article content and links to instrument pages on the producer host. The library family can enrich discovered items from linked detail pages; catalogue and detail capture are distinct operations.", "transformation": "The implemented unit is instrument/product listings. parse_html produces a collection of item records; the common transform wraps them in a vmi_library_batch. Source fragments, item identity, links and product context are passed to the VMI normalizer. The exact selectors and constructed fields are enumerated in the technical evidence register. The native wording remains necessary to distinguish a producer, a product, a version and the organ represented.", "limitations": "A listed instrument may describe a planned product. Availability and release state must come from the individual item. The existence of a parser is not a fresh check of the live catalogue, and a parsed link is not evidence that its downloadable content was inspected." }, "implementation": { "class": "BinauralPipesInstrumentsCrawler", "class_line": 1148, "path": "aggregator/grandorgue_library_crawler.py", "inheritance": [ "BinauralPipesInstrumentsCrawler", "GrandOrgueLibraryCrawler", "BaseCrawler" ], "configuration": { "source_key": { "value": "binauralpipes_instruments", "path": "aggregator/grandorgue_library_crawler.py", "line": 1149, "class": "BinauralPipesInstrumentsCrawler" }, "catalog_url": { "value": "", "path": "aggregator/grandorgue_library_crawler.py", "line": 34, "class": "GrandOrgueLibraryCrawler" }, "catalog_kind": { "value": "producer_catalog", "path": "aggregator/grandorgue_library_crawler.py", "line": 1151, "class": "BinauralPipesInstrumentsCrawler" }, "cache_source_key_column": { "value": "source_key", "path": "aggregator/grandorgue_library_crawler.py", "line": 40, "class": "GrandOrgueLibraryCrawler" }, "final_source_key_column": { "value": "source_key", "path": "aggregator/grandorgue_library_crawler.py", "line": 41, "class": "GrandOrgueLibraryCrawler" }, "transformed_json_id_column": { "value": "item_id", "path": "aggregator/grandorgue_library_crawler.py", "line": 42, "class": "GrandOrgueLibraryCrawler" } }, "methods": [ { "symbol": "GrandOrgueLibraryCrawler._append_detail_document", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 276, "line_end": 306, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 284, "receiver": "record.get('provenance', {})", "key": "identity", "expression": "record.get('provenance', {}).get('identity', {})" }, { "line": 285, "receiver": "identity", "key": "primary_id_value", "expression": "identity.get('primary_id_value')" }, { "line": 286, "receiver": "record.get('source', {})", "key": "retrieved_at", "expression": "record.get('source', {}).get('retrieved_at')" }, { "line": 284, "receiver": "record", "key": "provenance", "expression": "record.get('provenance', {})" }, { "line": 286, "receiver": "record", "key": "source", "expression": "record.get('source', {})" }, { "line": 300, "receiver": "doc", "key": "document_id", "expression": "doc.get('document_id')" } ], "html_queries": [], "dictionary_entries": [ { "line": 288, "key": "document_id", "value_expression": "provenance.document_id(self.source_key, f'{primary_id}:detail', 'raw_html')" }, { "line": 289, "key": "document_kind", "value_expression": "'raw_html'" }, { "line": 290, "key": "content_sha256", "value_expression": "provenance.content_sha256(detail_html)" }, { "line": 291, "key": "content_size_bytes", "value_expression": "len(detail_html.encode('utf-8'))" }, { "line": 292, "key": "content_type", "value_expression": "'text/html'" }, { "line": 293, "key": "url", "value_expression": "detail_url" }, { "line": 294, "key": "retrieved_at", "value_expression": "retrieved_at" }, { "line": 295, "key": "crawl_run_id", "value_expression": "crawl_run_id or ''" }, { "line": 296, "key": "raw_content", "value_expression": "detail_html" } ], "subscript_assignments": [ { "line": 302, "value_line": 302, "key": "detail_page_crawled", "target_expression": "record.setdefault('extensions', {})['detail_page_crawled']", "value_expression": "True" }, { "line": 304, "value_line": 304, "key": "access_model_hint", "target_expression": "record.setdefault('item', {})['access_model_hint']", "value_expression": "'registration_required'" }, { "line": 305, "value_line": 305, "key": "availability_status_hint", "target_expression": "record.setdefault('item', {})['availability_status_hint']", "value_expression": "'available_with_registration'" } ] }, { "symbol": "GrandOrgueLibraryCrawler._apply_detail_html", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 308, "line_end": 309, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler._detail_url_for_record", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 259, "line_end": 274, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 261, "receiver": "record", "key": "links", "expression": "record.get('links')" }, { "line": 270, "receiver": "link", "key": "is_download_candidate", "expression": "link.get('is_download_candidate')" }, { "line": 272, "receiver": "link", "key": "is_product_homepage_candidate", "expression": "link.get('is_product_homepage_candidate')" }, { "line": 264, "receiver": "link", "key": "normalized_url", "expression": "link.get('normalized_url')" }, { "line": 264, "receiver": "link", "key": "url", "expression": "link.get('url')" }, { "line": 272, "receiver": "link", "key": "rel", "expression": "link.get('rel')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler._enrich_records_with_detail_pages", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 213, "line_end": 257, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_append_detail_document", "_apply_detail_html", "_detail_url_for_record" ], "literal_get_calls": [ { "line": 219, "receiver": "self.config", "key": "crawl_detail_pages", "expression": "self.config.get('crawl_detail_pages')" }, { "line": 225, "receiver": "self.config", "key": "max_detail_pages", "expression": "self.config.get('max_detail_pages', 0)" }, { "line": 243, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [ { "line": 222, "key": "detail_page_enrichment_enabled", "value_expression": "False" }, { "line": 222, "key": "detail_page_fetched", "value_expression": "False" } ], "subscript_assignments": [ { "line": 230, "value_line": 230, "key": "detail_page_enrichment_enabled", "target_expression": "completeness['detail_page_enrichment_enabled']", "value_expression": "True" }, { "line": 255, "value_line": 255, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "True" }, { "line": 232, "value_line": 232, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 233, "value_line": 233, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'configured_detail_page_limit'" }, { "line": 238, "value_line": 238, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 239, "value_line": 239, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'no_detail_url_discovered'" }, { "line": 247, "value_line": 247, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 248, "value_line": 248, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'fetch_failed'" } ] }, { "symbol": "GrandOrgueLibraryCrawler._record", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 311, "line_end": 341, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 326, "receiver": "payload", "key": "catalog", "expression": "payload.get('catalog')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [ { "line": 330, "value_line": 330, "key": "catalog", "target_expression": "payload['catalog']", "value_expression": "catalog" } ] }, { "symbol": "GrandOrgueLibraryCrawler.crawl", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 86, "line_end": 136, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_enrich_records_with_detail_pages", "_fail_shared_crawl_run", "_finish_shared_crawl_run", "_register_shared_crawl_target", "_upsert_scrape_status", "parse_html" ], "literal_get_calls": [ { "line": 88, "receiver": "kwargs", "key": "task_id", "expression": "kwargs.get('task_id')" }, { "line": 89, "receiver": "kwargs", "key": "run_id", "expression": "kwargs.get('run_id')" }, { "line": 87, "receiver": "kwargs", "key": "url", "expression": "kwargs.get('url')" }, { "line": 91, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" }, { "line": 121, "receiver": "record.get('item', {})", "key": "title", "expression": "record.get('item', {}).get('title')" }, { "line": 122, "receiver": "record.get('source_snapshot', {})", "key": "url", "expression": "record.get('source_snapshot', {}).get('url')" }, { "line": 124, "receiver": "record.get('extensions', {})", "key": "source_fragment_html", "expression": "record.get('extensions', {}).get('source_fragment_html')" }, { "line": 121, "receiver": "record", "key": "item", "expression": "record.get('item', {})" }, { "line": 122, "receiver": "record", "key": "source_snapshot", "expression": "record.get('source_snapshot', {})" }, { "line": 124, "receiver": "record", "key": "extensions", "expression": "record.get('extensions', {})" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "BinauralPipesInstrumentsCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 1153, "line_end": 1208, "inherited": false, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_record" ], "literal_get_calls": [ { "line": 1159, "receiver": "link", "key": "href", "expression": "link.get('href')" } ], "html_queries": [ { "line": 1155, "expression": "soup.select_one('article')" }, { "line": 1158, "expression": "article.select('a[href*=\"binauralpipes.com/\"]')" } ], "dictionary_entries": [ { "line": 1174, "key": "catalog", "value_expression": "{'position': position}" }, { "line": 1175, "key": "item", "value_expression": "{'title': title, 'producer_label': 'Binaural Pipes', 'description_excerpt': _excerpt(caption), 'access_model_hint': 'free_download_or_donation_supported', 'availability_status_hint': 'producer_catalog_entry'}" }, { "line": 1182, "key": "package", "value_expression": "{'package_title': title, 'package_kind': 'sample_set', 'is_odf_only': False, 'requires_sample_set': False}" }, { "line": 1188, "key": "organ_relation", "value_expression": "{'pipe_organ_relation_hint': 'sampled_from_real_organ', 'represented_organ_label': title, 'builder_label': builder, 'year_label': year, 'manual_count': manual_count, 'pedal_present': '/P' in caption, 'stop_count': stop_count}" }, { "line": 1197, "key": "links", "value_expression": "[{'url': detail_url, 'link_text': title, 'is_product_homepage_candidate': True}]" }, { "line": 1198, "key": "extensions", "value_expression": "{'source_fragment_html': str(container)}" }, { "line": 1174, "key": "position", "value_expression": "position" }, { "line": 1176, "key": "title", "value_expression": "title" }, { "line": 1177, "key": "producer_label", "value_expression": "'Binaural Pipes'" }, { "line": 1178, "key": "description_excerpt", "value_expression": "_excerpt(caption)" }, { "line": 1179, "key": "access_model_hint", "value_expression": "'free_download_or_donation_supported'" }, { "line": 1180, "key": "availability_status_hint", "value_expression": "'producer_catalog_entry'" }, { "line": 1183, "key": "package_title", "value_expression": "title" }, { "line": 1184, "key": "package_kind", "value_expression": "'sample_set'" }, { "line": 1185, "key": "is_odf_only", "value_expression": "False" }, { "line": 1186, "key": "requires_sample_set", "value_expression": "False" }, { "line": 1189, "key": "pipe_organ_relation_hint", "value_expression": "'sampled_from_real_organ'" }, { "line": 1190, "key": "represented_organ_label", "value_expression": "title" }, { "line": 1191, "key": "builder_label", "value_expression": "builder" }, { "line": 1192, "key": "year_label", "value_expression": "year" }, { "line": 1193, "key": "manual_count", "value_expression": "manual_count" }, { "line": 1194, "key": "pedal_present", "value_expression": "'/P' in caption" }, { "line": 1195, "key": "stop_count", "value_expression": "stop_count" }, { "line": 1198, "key": "source_fragment_html", "value_expression": "str(container)" }, { "line": 1197, "key": "url", "value_expression": "detail_url" }, { "line": 1197, "key": "link_text", "value_expression": "title" }, { "line": 1197, "key": "is_product_homepage_candidate", "value_expression": "True" } ], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler.transform", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 138, "line_end": 156, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "parse_html" ], "literal_get_calls": [ { "line": 139, "receiver": "raw_data", "key": "html", "expression": "raw_data.get('html')" }, { "line": 139, "receiver": "raw_data", "key": "raw_html", "expression": "raw_data.get('raw_html')" }, { "line": 139, "receiver": "raw_data", "key": "markdown", "expression": "raw_data.get('markdown')" }, { "line": 140, "receiver": "raw_data", "key": "url", "expression": "raw_data.get('url')" }, { "line": 140, "receiver": "raw_data", "key": "source_url", "expression": "raw_data.get('source_url')" }, { "line": 144, "receiver": "raw_data", "key": "crawl_run_id", "expression": "raw_data.get('crawl_run_id')" }, { "line": 145, "receiver": "raw_data", "key": "transform_run_id", "expression": "raw_data.get('transform_run_id')" } ], "html_queries": [], "dictionary_entries": [ { "line": 148, "key": "record_type", "value_expression": "'vmi_library_batch'" }, { "line": 149, "key": "source", "value_expression": "{'key': self.source_key, 'display_name': self.source_display_name, 'base_url': self.catalog_url, 'type': self.source_type}" }, { "line": 155, "key": "records", "value_expression": "records" }, { "line": 150, "key": "key", "value_expression": "self.source_key" }, { "line": 151, "key": "display_name", "value_expression": "self.source_display_name" }, { "line": 152, "key": "base_url", "value_expression": "self.catalog_url" }, { "line": 153, "key": "type", "value_expression": "self.source_type" } ], "subscript_assignments": [] } ], "selected_rule_rows": [ { "symbol": "BinauralPipesInstrumentsCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 1195, "key": "stop_count", "value_expression": "stop_count" }, { "symbol": "BinauralPipesInstrumentsCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 1193, "key": "manual_count", "value_expression": "manual_count" }, { "symbol": "GrandOrgueLibraryCrawler.transform", "path": "aggregator/grandorgue_library_crawler.py", "line": 148, "key": "record_type", "value_expression": "'vmi_library_batch'" }, { "symbol": "BinauralPipesInstrumentsCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 1184, "key": "package_kind", "value_expression": "'sample_set'" }, { "symbol": "BinauralPipesInstrumentsCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 1186, "key": "requires_sample_set", "value_expression": "False" }, { "symbol": "BinauralPipesInstrumentsCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 1185, "key": "is_odf_only", "value_expression": "False" } ], "bounded_code_passages": [ { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "BinauralPipesInstrumentsCrawler.parse_html", "line_start": 1192, "line_end": 1200, "text": " \"year_label\": year,\n \"manual_count\": manual_count,\n \"pedal_present\": \"/P\" in caption,\n \"stop_count\": stop_count,\n },\n \"links\": [{\"url\": detail_url, \"link_text\": title, \"is_product_homepage_candidate\": True}],\n \"extensions\": {\"source_fragment_html\": str(container)},\n },\n primary_id=slugify(path)," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "BinauralPipesInstrumentsCrawler.parse_html", "line_start": 1190, "line_end": 1198, "text": " \"represented_organ_label\": title,\n \"builder_label\": builder,\n \"year_label\": year,\n \"manual_count\": manual_count,\n \"pedal_present\": \"/P\" in caption,\n \"stop_count\": stop_count,\n },\n \"links\": [{\"url\": detail_url, \"link_text\": title, \"is_product_homepage_candidate\": True}],\n \"extensions\": {\"source_fragment_html\": str(container)}," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "GrandOrgueLibraryCrawler.transform", "line_start": 145, "line_end": 153, "text": " transform_run_id=raw_data.get(\"transform_run_id\"),\n )\n return {\n \"record_type\": \"vmi_library_batch\",\n \"source\": {\n \"key\": self.source_key,\n \"display_name\": self.source_display_name,\n \"base_url\": self.catalog_url,\n \"type\": self.source_type," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "BinauralPipesInstrumentsCrawler.parse_html", "line_start": 1181, "line_end": 1189, "text": " },\n \"package\": {\n \"package_title\": title,\n \"package_kind\": \"sample_set\",\n \"is_odf_only\": False,\n \"requires_sample_set\": False,\n },\n \"organ_relation\": {\n \"pipe_organ_relation_hint\": \"sampled_from_real_organ\"," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "BinauralPipesInstrumentsCrawler.parse_html", "line_start": 1183, "line_end": 1191, "text": " \"package_title\": title,\n \"package_kind\": \"sample_set\",\n \"is_odf_only\": False,\n \"requires_sample_set\": False,\n },\n \"organ_relation\": {\n \"pipe_organ_relation_hint\": \"sampled_from_real_organ\",\n \"represented_organ_label\": title,\n \"builder_label\": builder," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "BinauralPipesInstrumentsCrawler.parse_html", "line_start": 1182, "line_end": 1190, "text": " \"package\": {\n \"package_title\": title,\n \"package_kind\": \"sample_set\",\n \"is_odf_only\": False,\n \"requires_sample_set\": False,\n },\n \"organ_relation\": {\n \"pipe_organ_relation_hint\": \"sampled_from_real_organ\",\n \"represented_organ_label\": title," } ] } }, { "catalogue_id": "S006", "source_key": "contrebombarde_organs", "name": "Contrebombarde Sample Set Library", "selection_role": "registered_source", "parent_source_key": null, "attribution": "Contrebombarde Concert Hall", "scope_description": "Cross-producer virtual organ catalogue associated with a recording community", "documentary_unit": "Sample-set registry entry", "source_description": "The search interface distinguishes sample-set producer from physical organ builder and offers filters for style, manuals and construction period. The interface therefore distinguishes the virtual product's producer from the instrument builder.", "source_description_references": [ "contrebombarde_organs" ], "interpretation": "Use the registry for product discovery and links to performances. Availability, price and licensing should be cited to the producer's corresponding release. A recording associated with a set does not document a performance on the physical organ.", "rights_observation": "Registry access was public; no common licence for the linked products or performances was established.", "rights_observation_basis": "Report of the pages consulted on 10 September 2026; not a determination of legal entitlement or a complete licence audit.", "references": [ "contrebombarde_organs" ], "observation_date": "2026-09-10", "atlas_editorial_reading": { "evidence_kind": "code_reading_and_interpretation", "acquisition": "The source-specific parser selects organ detail/view links and organ-card, article or table containers. The library family can enrich discovered items from linked detail pages; catalogue and detail capture are distinct operations.", "transformation": "The implemented unit is registry items reached from search and detail pages. parse_html produces a collection of item records; the common transform wraps them in a vmi_library_batch. Source fragments, item identity, links and product context are passed to the VMI normalizer. The exact selectors and constructed fields are enumerated in the technical evidence register. The native wording remains necessary to distinguish a producer, a product, a version and the organ represented.", "limitations": "Registry descriptions and producer claims have different authorship; search traversal does not validate product availability. The existence of a parser is not a fresh check of the live catalogue, and a parsed link is not evidence that its downloadable content was inspected." }, "implementation": { "class": "ContrebombardeOrgansCrawler", "class_line": 649, "path": "aggregator/grandorgue_library_crawler.py", "inheritance": [ "ContrebombardeOrgansCrawler", "GrandOrgueLibraryCrawler", "BaseCrawler" ], "configuration": { "source_key": { "value": "contrebombarde_organs", "path": "aggregator/grandorgue_library_crawler.py", "line": 650, "class": "ContrebombardeOrgansCrawler" }, "catalog_url": { "value": "", "path": "aggregator/grandorgue_library_crawler.py", "line": 34, "class": "GrandOrgueLibraryCrawler" }, "catalog_kind": { "value": "catalog", "path": "aggregator/grandorgue_library_crawler.py", "line": 652, "class": "ContrebombardeOrgansCrawler" }, "cache_source_key_column": { "value": "source_key", "path": "aggregator/grandorgue_library_crawler.py", "line": 40, "class": "GrandOrgueLibraryCrawler" }, "final_source_key_column": { "value": "source_key", "path": "aggregator/grandorgue_library_crawler.py", "line": 41, "class": "GrandOrgueLibraryCrawler" }, "transformed_json_id_column": { "value": "item_id", "path": "aggregator/grandorgue_library_crawler.py", "line": 42, "class": "GrandOrgueLibraryCrawler" }, "search_url": { "value": "https://www.contrebombarde.com/concerthall/organs/search", "path": "aggregator/grandorgue_library_crawler.py", "line": 653, "class": "ContrebombardeOrgansCrawler" }, "search_results_url": { "value": "https://www.contrebombarde.com/concerthall/organs/search_results", "path": "aggregator/grandorgue_library_crawler.py", "line": 654, "class": "ContrebombardeOrgansCrawler" } }, "methods": [ { "symbol": "GrandOrgueLibraryCrawler._append_detail_document", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 276, "line_end": 306, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 284, "receiver": "record.get('provenance', {})", "key": "identity", "expression": "record.get('provenance', {}).get('identity', {})" }, { "line": 285, "receiver": "identity", "key": "primary_id_value", "expression": "identity.get('primary_id_value')" }, { "line": 286, "receiver": "record.get('source', {})", "key": "retrieved_at", "expression": "record.get('source', {}).get('retrieved_at')" }, { "line": 284, "receiver": "record", "key": "provenance", "expression": "record.get('provenance', {})" }, { "line": 286, "receiver": "record", "key": "source", "expression": "record.get('source', {})" }, { "line": 300, "receiver": "doc", "key": "document_id", "expression": "doc.get('document_id')" } ], "html_queries": [], "dictionary_entries": [ { "line": 288, "key": "document_id", "value_expression": "provenance.document_id(self.source_key, f'{primary_id}:detail', 'raw_html')" }, { "line": 289, "key": "document_kind", "value_expression": "'raw_html'" }, { "line": 290, "key": "content_sha256", "value_expression": "provenance.content_sha256(detail_html)" }, { "line": 291, "key": "content_size_bytes", "value_expression": "len(detail_html.encode('utf-8'))" }, { "line": 292, "key": "content_type", "value_expression": "'text/html'" }, { "line": 293, "key": "url", "value_expression": "detail_url" }, { "line": 294, "key": "retrieved_at", "value_expression": "retrieved_at" }, { "line": 295, "key": "crawl_run_id", "value_expression": "crawl_run_id or ''" }, { "line": 296, "key": "raw_content", "value_expression": "detail_html" } ], "subscript_assignments": [ { "line": 302, "value_line": 302, "key": "detail_page_crawled", "target_expression": "record.setdefault('extensions', {})['detail_page_crawled']", "value_expression": "True" }, { "line": 304, "value_line": 304, "key": "access_model_hint", "target_expression": "record.setdefault('item', {})['access_model_hint']", "value_expression": "'registration_required'" }, { "line": 305, "value_line": 305, "key": "availability_status_hint", "target_expression": "record.setdefault('item', {})['availability_status_hint']", "value_expression": "'available_with_registration'" } ] }, { "symbol": "GrandOrgueLibraryCrawler._apply_detail_html", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 308, "line_end": 309, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler._detail_url_for_record", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 259, "line_end": 274, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 261, "receiver": "record", "key": "links", "expression": "record.get('links')" }, { "line": 270, "receiver": "link", "key": "is_download_candidate", "expression": "link.get('is_download_candidate')" }, { "line": 272, "receiver": "link", "key": "is_product_homepage_candidate", "expression": "link.get('is_product_homepage_candidate')" }, { "line": 264, "receiver": "link", "key": "normalized_url", "expression": "link.get('normalized_url')" }, { "line": 264, "receiver": "link", "key": "url", "expression": "link.get('url')" }, { "line": 272, "receiver": "link", "key": "rel", "expression": "link.get('rel')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler._enrich_records_with_detail_pages", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 213, "line_end": 257, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_append_detail_document", "_apply_detail_html", "_detail_url_for_record" ], "literal_get_calls": [ { "line": 219, "receiver": "self.config", "key": "crawl_detail_pages", "expression": "self.config.get('crawl_detail_pages')" }, { "line": 225, "receiver": "self.config", "key": "max_detail_pages", "expression": "self.config.get('max_detail_pages', 0)" }, { "line": 243, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [ { "line": 222, "key": "detail_page_enrichment_enabled", "value_expression": "False" }, { "line": 222, "key": "detail_page_fetched", "value_expression": "False" } ], "subscript_assignments": [ { "line": 230, "value_line": 230, "key": "detail_page_enrichment_enabled", "target_expression": "completeness['detail_page_enrichment_enabled']", "value_expression": "True" }, { "line": 255, "value_line": 255, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "True" }, { "line": 232, "value_line": 232, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 233, "value_line": 233, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'configured_detail_page_limit'" }, { "line": 238, "value_line": 238, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 239, "value_line": 239, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'no_detail_url_discovered'" }, { "line": 247, "value_line": 247, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 248, "value_line": 248, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'fetch_failed'" } ] }, { "symbol": "GrandOrgueLibraryCrawler._record", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 311, "line_end": 341, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 326, "receiver": "payload", "key": "catalog", "expression": "payload.get('catalog')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [ { "line": 330, "value_line": 330, "key": "catalog", "target_expression": "payload['catalog']", "value_expression": "catalog" } ] }, { "symbol": "ContrebombardeOrgansCrawler.crawl", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 657, "line_end": 712, "inherited": false, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_enrich_records_with_detail_pages", "_fail_shared_crawl_run", "_finish_shared_crawl_run", "_register_shared_crawl_target", "_upsert_scrape_status", "parse_html" ], "literal_get_calls": [ { "line": 659, "receiver": "kwargs", "key": "task_id", "expression": "kwargs.get('task_id')" }, { "line": 660, "receiver": "kwargs", "key": "run_id", "expression": "kwargs.get('run_id')" }, { "line": 658, "receiver": "kwargs", "key": "url", "expression": "kwargs.get('url')" }, { "line": 661, "receiver": "kwargs", "key": "form_data", "expression": "kwargs.get('form_data')" }, { "line": 661, "receiver": "self.config", "key": "form_data", "expression": "self.config.get('form_data')" }, { "line": 662, "receiver": "kwargs", "key": "parse_url", "expression": "kwargs.get('parse_url')" }, { "line": 662, "receiver": "self.config", "key": "search_url", "expression": "self.config.get('search_url')" }, { "line": 665, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" }, { "line": 667, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" }, { "line": 697, "receiver": "record.get('item', {})", "key": "title", "expression": "record.get('item', {}).get('title')" }, { "line": 698, "receiver": "record.get('source_snapshot', {})", "key": "url", "expression": "record.get('source_snapshot', {}).get('url')" }, { "line": 664, "receiver": "kwargs", "key": "method", "expression": "kwargs.get('method')" }, { "line": 664, "receiver": "self.config", "key": "method", "expression": "self.config.get('method')" }, { "line": 700, "receiver": "record.get('extensions', {})", "key": "source_fragment_html", "expression": "record.get('extensions', {}).get('source_fragment_html')" }, { "line": 697, "receiver": "record", "key": "item", "expression": "record.get('item', {})" }, { "line": 698, "receiver": "record", "key": "source_snapshot", "expression": "record.get('source_snapshot', {})" }, { "line": 700, "receiver": "record", "key": "extensions", "expression": "record.get('extensions', {})" } ], "html_queries": [], "dictionary_entries": [ { "line": 661, "key": "software", "value_expression": "self.grandorgue_software_id" }, { "line": 661, "key": "name", "value_expression": "''" } ], "subscript_assignments": [] }, { "symbol": "ContrebombardeOrgansCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 714, "line_end": 785, "inherited": false, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_record" ], "literal_get_calls": [ { "line": 743, "receiver": "fields", "key": "website", "expression": "fields.get('website')" }, { "line": 743, "receiver": "fields", "key": "producer website", "expression": "fields.get('producer website')" }, { "line": 733, "receiver": "title_link", "key": "href", "expression": "title_link.get('href')" }, { "line": 733, "receiver": "title_link", "key": "href", "expression": "title_link.get('href')" }, { "line": 734, "receiver": "container", "key": "data-organ-id", "expression": "container.get('data-organ-id')" }, { "line": 737, "receiver": "fields", "key": "software", "expression": "fields.get('software')" }, { "line": 757, "receiver": "fields", "key": "producer", "expression": "fields.get('producer')" }, { "line": 767, "receiver": "fields", "key": "builder", "expression": "fields.get('builder')" }, { "line": 768, "receiver": "fields", "key": "country", "expression": "fields.get('country')" }, { "line": 772, "receiver": "fields", "key": "style", "expression": "fields.get('style')" }, { "line": 769, "receiver": "fields", "key": "manuals", "expression": "fields.get('manuals')" }, { "line": 770, "receiver": "fields", "key": "pedal", "expression": "fields.get('pedal')" }, { "line": 771, "receiver": "fields", "key": "stops", "expression": "fields.get('stops')" }, { "line": 765, "receiver": "fields", "key": "builder", "expression": "fields.get('builder')" }, { "line": 765, "receiver": "fields", "key": "country", "expression": "fields.get('country')" } ], "html_queries": [ { "line": 717, "expression": "soup.select('a[href*=\"/organs/view_organ/\"], a[href*=\"/organs/details/\"]')" }, { "line": 721, "expression": "soup.select('[data-organ-id], .organ, .organ-card, article, tr')" }, { "line": 722, "expression": "soup.select_one('h1')" }, { "line": 727, "expression": "node.select_one('a[href*=\"/organs/\"], h1 a, h2 a, h3 a')" } ], "dictionary_entries": [ { "line": 745, "key": "url", "value_expression": "website" }, { "line": 745, "key": "link_text", "value_expression": "'Website'" }, { "line": 745, "key": "is_product_homepage_candidate", "value_expression": "True" }, { "line": 749, "key": "catalog", "value_expression": "{'position': position, 'query_url': self.search_url, 'result_url': source_url, 'facet_filters': {'software': 'GrandOrgue', 'software_id': self.grandorgue_software_id}}" }, { "line": 755, "key": "item", "value_expression": "{'title': title, 'producer_label': fields.get('producer'), 'description_excerpt': _excerpt(text), 'software_labels': software, 'engine_labels': software, 'availability_status_hint': 'catalog_only'}" }, { "line": 763, "key": "package", "value_expression": "{'package_title': title, 'package_kind': 'catalog_entry'}" }, { "line": 764, "key": "organ_relation", "value_expression": "{'pipe_organ_relation_hint': 'sampled_from_real_organ' if fields.get('builder') or fields.get('country') else 'generic_pipe_organ', 'represented_organ_label': title, 'builder_label': fields.get('builder'), 'country_label': fields.get('country'), 'manual_count': _first_int(fields.get('manuals')), 'pedal_present': _bool_from_text(fields.get('pedal')), 'stop_count': _first_int(fields.get('stops')), 'style_label': fields.get('style')}" }, { "line": 774, "key": "links", "value_expression": "links" }, { "line": 775, "key": "extensions", "value_expression": "{'source_fragment_html': str(container)}" }, { "line": 750, "key": "position", "value_expression": "position" }, { "line": 751, "key": "query_url", "value_expression": "self.search_url" }, { "line": 752, "key": "result_url", "value_expression": "source_url" }, { "line": 753, "key": "facet_filters", "value_expression": "{'software': 'GrandOrgue', 'software_id': self.grandorgue_software_id}" }, { "line": 756, "key": "title", "value_expression": "title" }, { "line": 757, "key": "producer_label", "value_expression": "fields.get('producer')" }, { "line": 758, "key": "description_excerpt", "value_expression": "_excerpt(text)" }, { "line": 759, "key": "software_labels", "value_expression": "software" }, { "line": 760, "key": "engine_labels", "value_expression": "software" }, { "line": 761, "key": "availability_status_hint", "value_expression": "'catalog_only'" }, { "line": 763, "key": "package_title", "value_expression": "title" }, { "line": 763, "key": "package_kind", "value_expression": "'catalog_entry'" }, { "line": 765, "key": "pipe_organ_relation_hint", "value_expression": "'sampled_from_real_organ' if fields.get('builder') or fields.get('country') else 'generic_pipe_organ'" }, { "line": 766, "key": "represented_organ_label", "value_expression": "title" }, { "line": 767, "key": "builder_label", "value_expression": "fields.get('builder')" }, { "line": 768, "key": "country_label", "value_expression": "fields.get('country')" }, { "line": 769, "key": "manual_count", "value_expression": "_first_int(fields.get('manuals'))" }, { "line": 770, "key": "pedal_present", "value_expression": "_bool_from_text(fields.get('pedal'))" }, { "line": 771, "key": "stop_count", "value_expression": "_first_int(fields.get('stops'))" }, { "line": 772, "key": "style_label", "value_expression": "fields.get('style')" }, { "line": 775, "key": "source_fragment_html", "value_expression": "str(container)" }, { "line": 753, "key": "software", "value_expression": "'GrandOrgue'" }, { "line": 753, "key": "software_id", "value_expression": "self.grandorgue_software_id" } ], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler.transform", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 138, "line_end": 156, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "parse_html" ], "literal_get_calls": [ { "line": 139, "receiver": "raw_data", "key": "html", "expression": "raw_data.get('html')" }, { "line": 139, "receiver": "raw_data", "key": "raw_html", "expression": "raw_data.get('raw_html')" }, { "line": 139, "receiver": "raw_data", "key": "markdown", "expression": "raw_data.get('markdown')" }, { "line": 140, "receiver": "raw_data", "key": "url", "expression": "raw_data.get('url')" }, { "line": 140, "receiver": "raw_data", "key": "source_url", "expression": "raw_data.get('source_url')" }, { "line": 144, "receiver": "raw_data", "key": "crawl_run_id", "expression": "raw_data.get('crawl_run_id')" }, { "line": 145, "receiver": "raw_data", "key": "transform_run_id", "expression": "raw_data.get('transform_run_id')" } ], "html_queries": [], "dictionary_entries": [ { "line": 148, "key": "record_type", "value_expression": "'vmi_library_batch'" }, { "line": 149, "key": "source", "value_expression": "{'key': self.source_key, 'display_name': self.source_display_name, 'base_url': self.catalog_url, 'type': self.source_type}" }, { "line": 155, "key": "records", "value_expression": "records" }, { "line": 150, "key": "key", "value_expression": "self.source_key" }, { "line": 151, "key": "display_name", "value_expression": "self.source_display_name" }, { "line": 152, "key": "base_url", "value_expression": "self.catalog_url" }, { "line": 153, "key": "type", "value_expression": "self.source_type" } ], "subscript_assignments": [] } ], "selected_rule_rows": [ { "symbol": "ContrebombardeOrgansCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 771, "key": "stop_count", "value_expression": "_first_int(fields.get('stops'))" }, { "symbol": "ContrebombardeOrgansCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 769, "key": "manual_count", "value_expression": "_first_int(fields.get('manuals'))" }, { "symbol": "GrandOrgueLibraryCrawler.transform", "path": "aggregator/grandorgue_library_crawler.py", "line": 148, "key": "record_type", "value_expression": "'vmi_library_batch'" }, { "symbol": "ContrebombardeOrgansCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 763, "key": "package_kind", "value_expression": "'catalog_entry'" }, { "symbol": "ContrebombardeOrgansCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 757, "key": "producer_label", "value_expression": "fields.get('producer')" } ], "bounded_code_passages": [ { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "ContrebombardeOrgansCrawler.parse_html", "line_start": 768, "line_end": 776, "text": " \"country_label\": fields.get(\"country\"),\n \"manual_count\": _first_int(fields.get(\"manuals\")),\n \"pedal_present\": _bool_from_text(fields.get(\"pedal\")),\n \"stop_count\": _first_int(fields.get(\"stops\")),\n \"style_label\": fields.get(\"style\"),\n },\n \"links\": links,\n \"extensions\": {\"source_fragment_html\": str(container)},\n }," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "ContrebombardeOrgansCrawler.parse_html", "line_start": 766, "line_end": 774, "text": " \"represented_organ_label\": title,\n \"builder_label\": fields.get(\"builder\"),\n \"country_label\": fields.get(\"country\"),\n \"manual_count\": _first_int(fields.get(\"manuals\")),\n \"pedal_present\": _bool_from_text(fields.get(\"pedal\")),\n \"stop_count\": _first_int(fields.get(\"stops\")),\n \"style_label\": fields.get(\"style\"),\n },\n \"links\": links," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "GrandOrgueLibraryCrawler.transform", "line_start": 145, "line_end": 153, "text": " transform_run_id=raw_data.get(\"transform_run_id\"),\n )\n return {\n \"record_type\": \"vmi_library_batch\",\n \"source\": {\n \"key\": self.source_key,\n \"display_name\": self.source_display_name,\n \"base_url\": self.catalog_url,\n \"type\": self.source_type," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "ContrebombardeOrgansCrawler.parse_html", "line_start": 760, "line_end": 768, "text": " \"engine_labels\": software,\n \"availability_status_hint\": \"catalog_only\",\n },\n \"package\": {\"package_title\": title, \"package_kind\": \"catalog_entry\"},\n \"organ_relation\": {\n \"pipe_organ_relation_hint\": \"sampled_from_real_organ\" if fields.get(\"builder\") or fields.get(\"country\") else \"generic_pipe_organ\",\n \"represented_organ_label\": title,\n \"builder_label\": fields.get(\"builder\"),\n \"country_label\": fields.get(\"country\")," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "ContrebombardeOrgansCrawler.parse_html", "line_start": 754, "line_end": 762, "text": " },\n \"item\": {\n \"title\": title,\n \"producer_label\": fields.get(\"producer\"),\n \"description_excerpt\": _excerpt(text),\n \"software_labels\": software,\n \"engine_labels\": software,\n \"availability_status_hint\": \"catalog_only\",\n }," } ] } }, { "catalogue_id": "S007", "source_key": "digital_sheet_music", "name": "Digital Sheet Music Sources", "selection_role": "registered_source", "parent_source_key": null, "attribution": "MODAVIS Aggregator (composite connector)", "scope_description": "PDMX; Little Organ Book; IMSLP/WIMA; Mutopia; direct MuseScore records", "documentary_unit": "Collection-qualified score record and file assets", "source_description": "This key denotes a connector spanning five named collections. Its configured MusicXML.com address is a directory of music resources, not the publisher of all the scores. The five collection definitions are recorded separately in this package.", "source_description_references": [ "digital_sheet_music", "repo_score_collections" ], "interpretation": "Cite the score's collection, edition and file version. Neither a composition title nor the connector key identifies an edition.", "rights_observation": "Rights differ by collection, edition and file. The MusicXML directory supplies no umbrella permission.", "rights_observation_basis": "Report of the pages consulted on 10 September 2026; not a determination of legal entitlement or a complete licence audit.", "references": [ "digital_sheet_music", "repo_score_collections" ], "observation_date": "2026-09-10", "atlas_editorial_reading": { "evidence_kind": "code_reading_and_interpretation", "acquisition": "A single registered connector dispatches to five named collections. Dataset imports, web catalogues and direct score routes have different acquisition conditions; the MusicXML directory is not their common publisher.", "transformation": "The score normalizer separates work metadata from downloadable assets, formats, collection identity and licence statements. It preserves collection-specific data. In the PDMX path it suppresses a numeric instrumentation value when that value simply repeats the track count. This prevents a numeric count being relabelled as instrument names.", "limitations": "Work, arrangement, edition, encoding and downloadable file are different units. A format label does not guarantee that a file was decoded or compared musically. Collection-specific licences cannot be replaced by an umbrella connector licence." }, "implementation": { "class": "DigitalSheetMusicCrawler", "class_line": 51, "path": "aggregator/digital_sheet_music_crawler.py", "inheritance": [ "DigitalSheetMusicCrawler", "BaseCrawler" ], "configuration": { "transformed_json_id_column": { "value": "score_id", "path": "aggregator/digital_sheet_music_crawler.py", "line": 58, "class": "DigitalSheetMusicCrawler" }, "record_label": { "value": "digital scores", "path": "aggregator/digital_sheet_music_crawler.py", "line": 59, "class": "DigitalSheetMusicCrawler" } }, "methods": [ { "symbol": "DigitalSheetMusicCrawler._assets_from_html", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 857, "line_end": 905, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [], "literal_get_calls": [ { "line": 865, "receiver": "anchor", "key": "href", "expression": "anchor.get('href')" } ], "html_queries": [ { "line": 864, "expression": "soup.find_all('a', href=True)" } ], "dictionary_entries": [ { "line": 887, "key": "url", "value_expression": "href" }, { "line": 887, "key": "file_name", "value_expression": "os.path.basename(urlparse(href).path)" }, { "line": 887, "key": "format", "value_expression": "info['format']" }, { "line": 887, "key": "label", "value_expression": "text or info['format']" }, { "line": 897, "key": "url", "value_expression": "href" }, { "line": 898, "key": "alternate_urls", "value_expression": "_imslp_mirror_candidates(href, imslp_file_id)" }, { "line": 899, "key": "file_name", "value_expression": "os.path.basename(urlparse(href).path)" }, { "line": 900, "key": "format", "value_expression": "info['format']" }, { "line": 901, "key": "label", "value_expression": "text or info['format']" }, { "line": 902, "key": "source_file_id", "value_expression": "imslp_file_id" } ], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler._crawl_collection", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 318, "line_end": 329, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [ "_crawl_imslp_wima", "_crawl_musescore_direct", "_crawl_mutopia", "_crawl_orgelbuechlein", "_crawl_pdmx" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler._crawl_imslp_wima", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 457, "line_end": 484, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [ "_assets_from_html", "_raw_record", "_respectful_pause" ], "literal_get_calls": [ { "line": 459, "receiver": "options", "key": "imslp_seed_urls", "expression": "options.get('imslp_seed_urls')" }, { "line": 460, "receiver": "options", "key": "limit", "expression": "options.get('limit')" }, { "line": 461, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" }, { "line": 479, "receiver": "self.config", "key": "max_assets_per_record", "expression": "self.config.get('max_assets_per_record', 0)" } ], "html_queries": [], "dictionary_entries": [ { "line": 480, "key": "html_excerpt", "value_expression": "html[:10000]" }, { "line": 480, "key": "seed_url", "value_expression": "url" } ], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler._crawl_musescore_direct", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 513, "line_end": 563, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [ "_assets_from_html", "_raw_record", "_respectful_pause" ], "literal_get_calls": [ { "line": 514, "receiver": "options", "key": "musescore_direct_urls", "expression": "options.get('musescore_direct_urls')" }, { "line": 515, "receiver": "self.config", "key": "musescore_credentials_env", "expression": "self.config.get('musescore_credentials_env')" }, { "line": 539, "receiver": "options", "key": "limit", "expression": "options.get('limit')" }, { "line": 543, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [ { "line": 532, "key": "credential_required", "value_expression": "True" }, { "line": 533, "key": "credential_available", "value_expression": "credential_available" }, { "line": 559, "key": "credential_required", "value_expression": "True" }, { "line": 559, "key": "credential_available", "value_expression": "credential_available" }, { "line": 559, "key": "http_status", "value_expression": "response.status_code" } ], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler._crawl_mutopia", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 486, "line_end": 511, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [ "_mutopia_next_url", "_parse_mutopia_listing", "_raw_record", "_respectful_pause" ], "literal_get_calls": [ { "line": 487, "receiver": "self.config", "key": "mutopia_collection_url", "expression": "self.config.get('mutopia_collection_url')" }, { "line": 488, "receiver": "self.config", "key": "mutopia_max_pages", "expression": "self.config.get('mutopia_max_pages', 0)" }, { "line": 496, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" }, { "line": 500, "receiver": "options", "key": "limit", "expression": "options.get('limit')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler._crawl_options", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 280, "line_end": 316, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [], "literal_get_calls": [ { "line": 286, "receiver": "source", "key": "collection", "expression": "source.get('collection')" }, { "line": 286, "receiver": "source", "key": "collections", "expression": "source.get('collections')" }, { "line": 293, "receiver": "source", "key": "limit", "expression": "source.get('limit')" }, { "line": 295, "receiver": "source", "key": "organ_only", "expression": "source.get('organ_only')" }, { "line": 302, "receiver": "source", "key": "pdmx_enable_archive_streaming", "expression": "source.get('pdmx_enable_archive_streaming')" }, { "line": 288, "receiver": "self.config", "key": "default_collections", "expression": "self.config.get('default_collections')" }, { "line": 297, "receiver": "source", "key": "pdmx_csv_path", "expression": "source.get('pdmx_csv_path')" }, { "line": 297, "receiver": "self.config", "key": "pdmx_csv_path", "expression": "self.config.get('pdmx_csv_path')" }, { "line": 299, "receiver": "source", "key": "pdmx_root_dir", "expression": "source.get('pdmx_root_dir')" }, { "line": 299, "receiver": "self.config", "key": "pdmx_root_dir", "expression": "self.config.get('pdmx_root_dir')" }, { "line": 300, "receiver": "source", "key": "pdmx_zenodo_record_api_url", "expression": "source.get('pdmx_zenodo_record_api_url')" }, { "line": 300, "receiver": "self.config", "key": "pdmx_zenodo_record_api_url", "expression": "self.config.get('pdmx_zenodo_record_api_url')" }, { "line": 303, "receiver": "self.config", "key": "pdmx_enable_archive_streaming", "expression": "self.config.get('pdmx_enable_archive_streaming', False)" }, { "line": 306, "receiver": "source", "key": "pdmx_archive_stream_max_mb", "expression": "source.get('pdmx_archive_stream_max_mb')" }, { "line": 306, "receiver": "self.config", "key": "pdmx_archive_stream_max_mb", "expression": "self.config.get('pdmx_archive_stream_max_mb')" }, { "line": 314, "receiver": "source", "key": "imslp_seed_urls", "expression": "source.get('imslp_seed_urls')" }, { "line": 315, "receiver": "source", "key": "musescore_direct_urls", "expression": "source.get('musescore_direct_urls')" }, { "line": 310, "receiver": "source", "key": "pdmx_mxl_archive_url", "expression": "source.get('pdmx_mxl_archive_url')" }, { "line": 310, "receiver": "self.config", "key": "pdmx_mxl_archive_url", "expression": "self.config.get('pdmx_mxl_archive_url')" }, { "line": 311, "receiver": "source", "key": "pdmx_mid_archive_url", "expression": "source.get('pdmx_mid_archive_url')" }, { "line": 311, "receiver": "self.config", "key": "pdmx_mid_archive_url", "expression": "self.config.get('pdmx_mid_archive_url')" }, { "line": 312, "receiver": "source", "key": "pdmx_pdf_archive_url", "expression": "source.get('pdmx_pdf_archive_url')" }, { "line": 312, "receiver": "self.config", "key": "pdmx_pdf_archive_url", "expression": "self.config.get('pdmx_pdf_archive_url')" }, { "line": 314, "receiver": "self.config", "key": "imslp_seed_urls", "expression": "self.config.get('imslp_seed_urls')" }, { "line": 315, "receiver": "self.config", "key": "musescore_direct_urls", "expression": "self.config.get('musescore_direct_urls')" }, { "line": 294, "receiver": "source", "key": "query", "expression": "source.get('query')" }, { "line": 296, "receiver": "source", "key": "license_filter", "expression": "source.get('license_filter')" }, { "line": 298, "receiver": "source", "key": "pdmx_mode", "expression": "source.get('pdmx_mode')" }, { "line": 298, "receiver": "self.config", "key": "pdmx_mode", "expression": "self.config.get('pdmx_mode')" } ], "html_queries": [], "dictionary_entries": [ { "line": 292, "key": "collections", "value_expression": "[collection for collection in collections if collection in SOURCE_COLLECTIONS]" }, { "line": 293, "key": "limit", "value_expression": "_safe_int(source.get('limit'), default=0)" }, { "line": 294, "key": "query", "value_expression": "str(source.get('query') or '').strip().lower()" }, { "line": 295, "key": "organ_only", "value_expression": "_read_bool(source.get('organ_only'), True)" }, { "line": 296, "key": "license_filter", "value_expression": "str(source.get('license_filter') or '').strip().lower()" }, { "line": 297, "key": "pdmx_csv_path", "value_expression": "str(source.get('pdmx_csv_path') or self.config.get('pdmx_csv_path') or '')" }, { "line": 298, "key": "pdmx_mode", "value_expression": "str(source.get('pdmx_mode') or self.config.get('pdmx_mode') or 'rows').strip().lower()" }, { "line": 299, "key": "pdmx_root_dir", "value_expression": "str(source.get('pdmx_root_dir') or self.config.get('pdmx_root_dir') or '')" }, { "line": 300, "key": "pdmx_zenodo_record_api_url", "value_expression": "str(source.get('pdmx_zenodo_record_api_url') or self.config.get('pdmx_zenodo_record_api_url') or '')" }, { "line": 301, "key": "pdmx_enable_archive_streaming", "value_expression": "_read_bool(source.get('pdmx_enable_archive_streaming'), bool(self.config.get('pdmx_enable_archive_streaming', False)))" }, { "line": 305, "key": "pdmx_archive_stream_max_mb", "value_expression": "_safe_int(source.get('pdmx_archive_stream_max_mb') or self.config.get('pdmx_archive_stream_max_mb'), default=256)" }, { "line": 309, "key": "pdmx_archive_urls", "value_expression": "{'mxl': str(source.get('pdmx_mxl_archive_url') or self.config.get('pdmx_mxl_archive_url') or ''), 'mid': str(source.get('pdmx_mid_archive_url') or self.config.get('pdmx_mid_archive_url') or ''), 'pdf': str(source.get('pdmx_pdf_archive_url') or self.config.get('pdmx_pdf_archive_url') or '')}" }, { "line": 314, "key": "imslp_seed_urls", "value_expression": "_split_lines(source.get('imslp_seed_urls')) or list(self.config.get('imslp_seed_urls') or [])" }, { "line": 315, "key": "musescore_direct_urls", "value_expression": "_split_lines(source.get('musescore_direct_urls')) or list(self.config.get('musescore_direct_urls') or [])" }, { "line": 310, "key": "mxl", "value_expression": "str(source.get('pdmx_mxl_archive_url') or self.config.get('pdmx_mxl_archive_url') or '')" }, { "line": 311, "key": "mid", "value_expression": "str(source.get('pdmx_mid_archive_url') or self.config.get('pdmx_mid_archive_url') or '')" }, { "line": 312, "key": "pdf", "value_expression": "str(source.get('pdmx_pdf_archive_url') or self.config.get('pdmx_pdf_archive_url') or '')" } ], "subscript_assignments": [ { "line": 285, "value_line": 285, "key": "collection", "target_expression": "source['collection']", "value_expression": "str(target)" } ] }, { "symbol": "DigitalSheetMusicCrawler._crawl_orgelbuechlein", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 416, "line_end": 455, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [ "_raw_record" ], "literal_get_calls": [ { "line": 417, "receiver": "self.config", "key": "orgelbuechlein_api_url", "expression": "self.config.get('orgelbuechlein_api_url')" }, { "line": 429, "receiver": "item", "key": "download_url", "expression": "item.get('download_url')" }, { "line": 429, "receiver": "item", "key": "html_url", "expression": "item.get('html_url')" }, { "line": 418, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" }, { "line": 423, "receiver": "item", "key": "name", "expression": "item.get('name')" }, { "line": 436, "receiver": "item", "key": "html_url", "expression": "item.get('html_url')" }, { "line": 453, "receiver": "options", "key": "limit", "expression": "options.get('limit')" } ], "html_queries": [], "dictionary_entries": [ { "line": 450, "key": "github_item", "value_expression": "item" }, { "line": 442, "key": "url", "value_expression": "raw_url" }, { "line": 442, "key": "file_name", "value_expression": "name" }, { "line": 442, "key": "format", "value_expression": "asset_format_from_url(name)['format']" }, { "line": 442, "key": "label", "value_expression": "'MusicXML'" }, { "line": 444, "key": "url", "value_expression": "raw_url.replace('/little-organ-book-mxl/', '/little-organ-book-pdf/').rsplit('.', 1)[0] + '.pdf'" }, { "line": 445, "key": "file_name", "value_expression": "f'{stem}.pdf'" }, { "line": 446, "key": "format", "value_expression": "'pdf'" }, { "line": 447, "key": "label", "value_expression": "'PDF'" } ], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler._crawl_pdmx", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 331, "line_end": 364, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [ "_crawl_pdmx_zenodo_inventory", "_pdmx_assets", "_pdmx_row_matches", "_raw_record", "authorize_source_file_io" ], "literal_get_calls": [ { "line": 332, "receiver": "options", "key": "pdmx_mode", "expression": "options.get('pdmx_mode')" }, { "line": 338, "receiver": "options", "key": "limit", "expression": "options.get('limit')" }, { "line": 334, "receiver": "options", "key": "pdmx_csv_path", "expression": "options.get('pdmx_csv_path')" }, { "line": 337, "receiver": "options", "key": "pdmx_root_dir", "expression": "options.get('pdmx_root_dir')" }, { "line": 338, "receiver": "self.config", "key": "pdmx_max_rows", "expression": "self.config.get('pdmx_max_rows')" }, { "line": 348, "receiver": "row", "key": "path", "expression": "row.get('path')" }, { "line": 348, "receiver": "row", "key": "mxl", "expression": "row.get('mxl')" }, { "line": 348, "receiver": "row", "key": "title", "expression": "row.get('title')" }, { "line": 353, "receiver": "row", "key": "title", "expression": "row.get('title')" }, { "line": 353, "receiver": "row", "key": "song_name", "expression": "row.get('song_name')" }, { "line": 354, "receiver": "row", "key": "composer_name", "expression": "row.get('composer_name')" }, { "line": 354, "receiver": "row", "key": "artist_name", "expression": "row.get('artist_name')" }, { "line": 356, "receiver": "row", "key": "license", "expression": "row.get('license')" }, { "line": 357, "receiver": "row", "key": "license_url", "expression": "row.get('license_url')" }, { "line": 359, "receiver": "row", "key": "instrumentation", "expression": "row.get('instrumentation')" }, { "line": 359, "receiver": "row", "key": "instruments", "expression": "row.get('instruments')" }, { "line": 359, "receiver": "row", "key": "instrument", "expression": "row.get('instrument')" } ], "html_queries": [], "dictionary_entries": [ { "line": 361, "key": "pdmx", "value_expression": "row" } ], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler._crawl_pdmx_zenodo_inventory", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 366, "line_end": 414, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [ "_raw_record" ], "literal_get_calls": [ { "line": 373, "receiver": "payload", "key": "files", "expression": "payload.get('files')" }, { "line": 390, "receiver": "payload.get('metadata', {})", "key": "title", "expression": "payload.get('metadata', {}).get('title')" }, { "line": 367, "receiver": "options", "key": "pdmx_zenodo_record_api_url", "expression": "options.get('pdmx_zenodo_record_api_url')" }, { "line": 377, "receiver": "item.get('links', {})", "key": "content", "expression": "item.get('links', {}).get('content')" }, { "line": 377, "receiver": "item.get('links', {})", "key": "self", "expression": "item.get('links', {}).get('self')" }, { "line": 370, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" }, { "line": 376, "receiver": "item", "key": "key", "expression": "item.get('key')" }, { "line": 386, "receiver": "item", "key": "size", "expression": "item.get('size')" }, { "line": 390, "receiver": "payload", "key": "metadata", "expression": "payload.get('metadata', {})" }, { "line": 377, "receiver": "item", "key": "links", "expression": "item.get('links', {})" }, { "line": 377, "receiver": "item", "key": "links", "expression": "item.get('links', {})" }, { "line": 397, "receiver": "payload.get('links', {})", "key": "html", "expression": "payload.get('links', {}).get('html')" }, { "line": 398, "receiver": "payload.get('metadata', {}).get('license', {})", "key": "id", "expression": "payload.get('metadata', {}).get('license', {}).get('id')" }, { "line": 399, "receiver": "payload.get('metadata', {}).get('license', {})", "key": "url", "expression": "payload.get('metadata', {}).get('license', {}).get('url')" }, { "line": 406, "receiver": "payload", "key": "id", "expression": "payload.get('id')" }, { "line": 407, "receiver": "payload", "key": "doi", "expression": "payload.get('doi')" }, { "line": 393, "receiver": "payload", "key": "id", "expression": "payload.get('id')" }, { "line": 397, "receiver": "payload", "key": "links", "expression": "payload.get('links', {})" }, { "line": 398, "receiver": "payload.get('metadata', {})", "key": "license", "expression": "payload.get('metadata', {}).get('license', {})" }, { "line": 399, "receiver": "payload.get('metadata', {})", "key": "license", "expression": "payload.get('metadata', {}).get('license', {})" }, { "line": 398, "receiver": "payload", "key": "metadata", "expression": "payload.get('metadata', {})" }, { "line": 399, "receiver": "payload", "key": "metadata", "expression": "payload.get('metadata', {})" } ], "html_queries": [], "dictionary_entries": [ { "line": 382, "key": "url", "value_expression": "content_url" }, { "line": 383, "key": "file_name", "value_expression": "key" }, { "line": 384, "key": "format", "value_expression": "asset_format_from_url(key)['format']" }, { "line": 385, "key": "label", "value_expression": "'Zenodo dataset file'" }, { "line": 386, "key": "content_size_bytes", "value_expression": "item.get('size')" }, { "line": 387, "key": "download_status", "value_expression": "'dataset_snapshot_required'" }, { "line": 405, "key": "zenodo_record", "value_expression": "{'id': payload.get('id'), 'doi': payload.get('doi'), 'api_url': api_url, 'files': files}" }, { "line": 411, "key": "access_note", "value_expression": "'PDMX requires an explicit local snapshot path for score-level crawling to avoid automatic multi-GB dataset downloads.'" }, { "line": 406, "key": "id", "value_expression": "payload.get('id')" }, { "line": 407, "key": "doi", "value_expression": "payload.get('doi')" }, { "line": 408, "key": "api_url", "value_expression": "api_url" }, { "line": 409, "key": "files", "value_expression": "files" } ], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler._extract_tar_gz_member_from_url", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 780, "line_end": 812, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [], "literal_get_calls": [ { "line": 785, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler._mutopia_next_url", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 990, "line_end": 995, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [], "literal_get_calls": [ { "line": 994, "receiver": "anchor", "key": "href", "expression": "anchor.get('href')" } ], "html_queries": [ { "line": 992, "expression": "soup.find_all('a', href=True)" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler._parse_mutopia_listing", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 907, "line_end": 988, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [], "literal_get_calls": [ { "line": 939, "receiver": "anchor", "key": "href", "expression": "anchor.get('href')" }, { "line": 951, "receiver": "anchor", "key": "href", "expression": "anchor.get('href')" }, { "line": 912, "receiver": "row", "key": "class", "expression": "row.get('class')" }, { "line": 980, "receiver": "self.config", "key": "max_assets_per_record", "expression": "self.config.get('max_assets_per_record', 0)" } ], "html_queries": [ { "line": 911, "expression": "soup.select('table.result-table')" }, { "line": 915, "expression": "rows[0].find_all('td', recursive=False)" }, { "line": 937, "expression": "table.find_all('a', href=True)" }, { "line": 947, "expression": "table.find_all('a', href=True)" }, { "line": 928, "expression": "rows[1].find_all('td', recursive=False)" }, { "line": 912, "expression": "table.find_all('tr', recursive=False)" } ], "dictionary_entries": [ { "line": 972, "key": "source_collection", "value_expression": "'mutopia'" }, { "line": 973, "key": "title", "value_expression": "title" }, { "line": 974, "key": "composer", "value_expression": "composer" }, { "line": 975, "key": "source_url", "value_expression": "piece_url or identity_url" }, { "line": 976, "key": "license_name", "value_expression": "license_name" }, { "line": 977, "key": "license_url", "value_expression": "license_url" }, { "line": 978, "key": "catalog_number", "value_expression": "catalog_number or _extract_bwv(title)" }, { "line": 979, "key": "instrumentation", "value_expression": "instrumentation" }, { "line": 980, "key": "assets", "value_expression": "_limited(assets, int(self.config.get('max_assets_per_record', 0) or 0))" }, { "line": 981, "key": "raw_data", "value_expression": "{'mutopia_listing_title': title, 'mutopia_piece_url': piece_url, 'mutopia_listing_url': source_url}" }, { "line": 954, "key": "url", "value_expression": "href" }, { "line": 955, "key": "file_name", "value_expression": "os.path.basename(urlparse(href).path)" }, { "line": 956, "key": "format", "value_expression": "asset_format_from_url(href)['format']" }, { "line": 957, "key": "label", "value_expression": "label" }, { "line": 982, "key": "mutopia_listing_title", "value_expression": "title" }, { "line": 983, "key": "mutopia_piece_url", "value_expression": "piece_url" }, { "line": 984, "key": "mutopia_listing_url", "value_expression": "source_url" } ], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler._pdmx_assets", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 832, "line_end": 855, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [], "literal_get_calls": [ { "line": 834, "receiver": "options", "key": "pdmx_archive_urls", "expression": "options.get('pdmx_archive_urls')" }, { "line": 835, "receiver": "options", "key": "pdmx_enable_archive_streaming", "expression": "options.get('pdmx_enable_archive_streaming')" }, { "line": 834, "receiver": "options", "key": "pdmx_archive_urls", "expression": "options.get('pdmx_archive_urls')" }, { "line": 850, "receiver": "options", "key": "pdmx_archive_stream_max_mb", "expression": "options.get('pdmx_archive_stream_max_mb')" } ], "html_queries": [], "dictionary_entries": [ { "line": 841, "key": "file_name", "value_expression": "Path(value).name" }, { "line": 841, "key": "format", "value_expression": "asset_format_from_url(value)['format']" }, { "line": 841, "key": "label", "value_expression": "label" } ], "subscript_assignments": [ { "line": 843, "value_line": 843, "key": "local_path", "target_expression": "asset['local_path']", "value_expression": "str(local_path)" }, { "line": 845, "value_line": 845, "key": "local_path", "target_expression": "asset['local_path']", "value_expression": "str(local_path)" }, { "line": 848, "value_line": 848, "key": "archive_url", "target_expression": "asset['archive_url']", "value_expression": "archive_url" }, { "line": 849, "value_line": 849, "key": "archive_member_path", "target_expression": "asset['archive_member_path']", "value_expression": "value.replace('./', '', 1)" }, { "line": 850, "value_line": 850, "key": "archive_stream_max_mb", "target_expression": "asset['archive_stream_max_mb']", "value_expression": "options.get('pdmx_archive_stream_max_mb')" }, { "line": 851, "value_line": 851, "key": "download_status", "target_expression": "asset['download_status']", "value_expression": "'archive_stream_required'" }, { "line": 853, "value_line": 853, "key": "download_status", "target_expression": "asset['download_status']", "value_expression": "'local_snapshot_missing'" } ] }, { "symbol": "DigitalSheetMusicCrawler._pdmx_row_matches", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 814, "line_end": 830, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [], "literal_get_calls": [ { "line": 821, "receiver": "options", "key": "license_filter", "expression": "options.get('license_filter')" }, { "line": 824, "receiver": "options", "key": "query", "expression": "options.get('query')" }, { "line": 826, "receiver": "options", "key": "organ_only", "expression": "options.get('organ_only')" }, { "line": 827, "receiver": "self.config", "key": "pdmx_include_track_19", "expression": "self.config.get('pdmx_include_track_19', True)" }, { "line": 815, "receiver": "row", "key": "subset:deduplicated", "expression": "row.get('subset:deduplicated', '')" }, { "line": 817, "receiver": "row", "key": "subset:no_license_conflict", "expression": "row.get('subset:no_license_conflict', '')" }, { "line": 819, "receiver": "row", "key": "subset:all_valid", "expression": "row.get('subset:all_valid', '')" }, { "line": 821, "receiver": "row", "key": "license", "expression": "row.get('license')" }, { "line": 827, "receiver": "row", "key": "tracks", "expression": "row.get('tracks')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler._raw_record", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 565, "line_end": 599, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [], "literal_get_calls": [ { "line": 581, "receiver": "asset", "key": "format", "expression": "asset.get('format')" }, { "line": 581, "receiver": "asset", "key": "url", "expression": "asset.get('url')" }, { "line": 581, "receiver": "asset", "key": "local_path", "expression": "asset.get('local_path')" } ], "html_queries": [], "dictionary_entries": [ { "line": 583, "key": "score_id", "value_expression": "score_id" }, { "line": 584, "key": "source_collection", "value_expression": "source_collection" }, { "line": 585, "key": "title", "value_expression": "title" }, { "line": 586, "key": "composer", "value_expression": "composer" }, { "line": 587, "key": "source_url", "value_expression": "source_url" }, { "line": 588, "key": "url", "value_expression": "source_url" }, { "line": 589, "key": "license_name", "value_expression": "license_name" }, { "line": 590, "key": "license_url", "value_expression": "license_url" }, { "line": 591, "key": "catalog_number", "value_expression": "catalog_number" }, { "line": 592, "key": "instrumentation", "value_expression": "instrumentation" }, { "line": 593, "key": "formats", "value_expression": "','.join(formats)" }, { "line": 594, "key": "status", "value_expression": "status" }, { "line": 595, "key": "assets", "value_expression": "assets" }, { "line": 596, "key": "raw_data_json", "value_expression": "json.dumps({**raw_data, 'assets': assets}, ensure_ascii=False)" }, { "line": 597, "key": "raw_data", "value_expression": "raw_data" }, { "line": 598, "key": "scraped_at", "value_expression": "datetime.now().isoformat(timespec='seconds')" }, { "line": 596, "key": "assets", "value_expression": "assets" } ], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler._respectful_pause", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 1021, "line_end": 1024, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [], "literal_get_calls": [ { "line": 1022, "receiver": "self.config", "key": "rate_limit_delay", "expression": "self.config.get('rate_limit_delay', 1.5)" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler.crawl", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 145, "line_end": 164, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [ "_crawl_collection", "_crawl_options", "_persist_cache_records", "_respectful_pause", "_upsert_scrape_status", "is_scrape_stop_requested", "mark_scrape_stopped", "preflight_crawl" ], "literal_get_calls": [ { "line": 148, "receiver": "kwargs", "key": "task_id", "expression": "kwargs.get('task_id')" }, { "line": 150, "receiver": "preflight", "key": "ok", "expression": "preflight.get('ok')" }, { "line": 151, "receiver": "preflight", "key": "message", "expression": "preflight.get('message')" }, { "line": 152, "receiver": "preflight", "key": "message", "expression": "preflight.get('message')" } ], "html_queries": [], "dictionary_entries": [ { "line": 149, "key": "collection", "value_expression": "','.join(collections)" } ], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler.preflight_crawl", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 122, "line_end": 143, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [ "_crawl_options" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 143, "key": "ok", "value_expression": "True" }, { "line": 125, "key": "ok", "value_expression": "False" }, { "line": 125, "key": "message", "value_expression": "'No supported digital sheet music collections were selected'" }, { "line": 140, "key": "ok", "value_expression": "False" }, { "line": 141, "key": "message", "value_expression": "'musescore_direct requires explicit URLs; an empty credential boundary is not a completed crawl'" }, { "line": 129, "key": "ok", "value_expression": "False" }, { "line": 129, "key": "message", "value_expression": "\"pdmx_mode must be either 'rows' or 'inventory'\"" }, { "line": 132, "key": "ok", "value_expression": "False" }, { "line": 134, "key": "message", "value_expression": "'PDMX row acquisition requires an existing pdmx_csv_path; use pdmx_mode=inventory only for an explicit dataset-inventory scope'" } ], "subscript_assignments": [] }, { "symbol": "DigitalSheetMusicCrawler.transform", "path": "aggregator/digital_sheet_music_crawler.py", "line_start": 166, "line_end": 179, "inherited": false, "file_sha256": "4e8ac26682e90c7d14fce8f1d69edda9beb571f8c8bc7adce368d88183330694", "self_calls": [], "literal_get_calls": [ { "line": 167, "receiver": "raw_data", "key": "score_id", "expression": "raw_data.get('score_id')" }, { "line": 167, "receiver": "raw_data", "key": "id", "expression": "raw_data.get('id')" }, { "line": 169, "receiver": "payload", "key": "raw_data_json", "expression": "payload.get('raw_data_json')" }, { "line": 178, "receiver": "raw_data", "key": "transform_run_id", "expression": "raw_data.get('transform_run_id')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] } ], "selected_rule_rows": [ { "symbol": "DigitalSheetMusicCrawler.transform", "path": "aggregator/digital_sheet_music_crawler.py", "key": "score_id", "value_expression": "raw_data.get('score_id')", "line": 167, "kind": "input read" }, { "symbol": "DigitalSheetMusicCrawler.transform", "path": "aggregator/digital_sheet_music_crawler.py", "key": "id", "value_expression": "raw_data.get('id')", "line": 167, "kind": "input read" }, { "symbol": "DigitalSheetMusicCrawler.transform", "path": "aggregator/digital_sheet_music_crawler.py", "key": "raw_data_json", "value_expression": "payload.get('raw_data_json')", "line": 169, "kind": "input read" }, { "symbol": "DigitalSheetMusicCrawler.transform", "path": "aggregator/digital_sheet_music_crawler.py", "key": "transform_run_id", "value_expression": "raw_data.get('transform_run_id')", "line": 178, "kind": "input read" }, { "symbol": "DigitalSheetMusicCrawler.crawl", "path": "aggregator/digital_sheet_music_crawler.py", "key": "task_id", "value_expression": "kwargs.get('task_id')", "line": 148, "kind": "input read" }, { "symbol": "DigitalSheetMusicCrawler.crawl", "path": "aggregator/digital_sheet_music_crawler.py", "key": "ok", "value_expression": "preflight.get('ok')", "line": 150, "kind": "input read" } ], "bounded_code_passages": [ { "path": "aggregator/digital_sheet_music_crawler.py", "symbol": "DigitalSheetMusicCrawler.transform", "line_start": 166, "line_end": 172, "text": " def transform(self, raw_data: Dict[str, Any]) -> Dict[str, Any]:\n score_id = str(raw_data.get(\"score_id\") or raw_data.get(\"id\") or \"\")\n payload = dict(raw_data)\n if isinstance(payload.get(\"raw_data_json\"), str) and payload[\"raw_data_json\"]:\n try:\n payload.update(json.loads(payload[\"raw_data_json\"]))\n except json.JSONDecodeError:" }, { "path": "aggregator/digital_sheet_music_crawler.py", "symbol": "DigitalSheetMusicCrawler.transform", "line_start": 166, "line_end": 174, "text": " def transform(self, raw_data: Dict[str, Any]) -> Dict[str, Any]:\n score_id = str(raw_data.get(\"score_id\") or raw_data.get(\"id\") or \"\")\n payload = dict(raw_data)\n if isinstance(payload.get(\"raw_data_json\"), str) and payload[\"raw_data_json\"]:\n try:\n payload.update(json.loads(payload[\"raw_data_json\"]))\n except json.JSONDecodeError:\n pass\n return normalize_digital_sheet_music_record(" }, { "path": "aggregator/digital_sheet_music_crawler.py", "symbol": "DigitalSheetMusicCrawler.transform", "line_start": 175, "line_end": 179, "text": " payload,\n primary_id=score_id,\n raw_content=json.dumps(payload, ensure_ascii=False, sort_keys=True),\n transform_run_id=raw_data.get(\"transform_run_id\"),\n )" }, { "path": "aggregator/digital_sheet_music_crawler.py", "symbol": "DigitalSheetMusicCrawler.crawl", "line_start": 145, "line_end": 153, "text": " def crawl(self, target: Any = None, **kwargs) -> List[Dict[str, Any]]:\n options = self._crawl_options(target, kwargs)\n collections = options[\"collections\"]\n task_id = kwargs.get(\"task_id\")\n preflight = self.preflight_crawl({**kwargs, \"collection\": \",\".join(collections), **options})\n if not preflight.get(\"ok\"):\n self._upsert_scrape_status(task_id, \"FAILED\", str(preflight.get(\"message\")), 0, len(collections))\n raise RuntimeError(str(preflight.get(\"message\")))\n self._upsert_scrape_status(task_id, \"RUNNING\", \"Starting digital sheet music crawl.\", 0, max(1, len(collections)))" }, { "path": "aggregator/digital_sheet_music_crawler.py", "symbol": "DigitalSheetMusicCrawler.crawl", "line_start": 147, "line_end": 155, "text": " collections = options[\"collections\"]\n task_id = kwargs.get(\"task_id\")\n preflight = self.preflight_crawl({**kwargs, \"collection\": \",\".join(collections), **options})\n if not preflight.get(\"ok\"):\n self._upsert_scrape_status(task_id, \"FAILED\", str(preflight.get(\"message\")), 0, len(collections))\n raise RuntimeError(str(preflight.get(\"message\")))\n self._upsert_scrape_status(task_id, \"RUNNING\", \"Starting digital sheet music crawl.\", 0, max(1, len(collections)))\n records: List[Dict[str, Any]] = []\n for index, collection in enumerate(collections, start=1):" } ] } }, { "catalogue_id": "S008", "source_key": "estey", "name": "Estey Pipe Organ Archive", "selection_role": "registered_source", "parent_source_key": null, "attribution": "Matrix Associates / The Estey Organ virtual museum", "scope_description": "Estey company history, instruments and documentary material", "documentary_unit": "Opus-list entry or archival item", "source_description": "The virtual museum joins a pipe-organ opus list to catalogues, photographs, facade drawings, patents, recordings and company history. Although now served from the Pipe Organ Database archive host, the page identifies itself as a privately owned website and carries a Matrix Associates copyright notice.", "source_description_references": [ "estey", "record_estey" ], "interpretation": "Cite the original archive and individual item as well as the current host. Manufacturing totals in the introduction are historical company statements, not counts of surviving instruments or digitised records.", "rights_observation": "The page invites downloading photographs and information and requests attribution when they are reused; it does not name a standard open licence.", "rights_observation_basis": "Report of the pages consulted on 10 September 2026; not a determination of legal entitlement or a complete licence audit.", "references": [ "estey", "record_estey" ], "observation_date": "2026-09-10", "selected_document": { "reference": "record_estey", "observation_date": "2026-09-11", "selection": "Inherited dossier example; the Orgelseite list was an additional page reached from its homepage. No representative sample is claimed.", "native_form": "Static opus record combining stop table and transcribed historical notice", "repeated_information": "Manual and pedal groups followed by couplers and action details.", "date_and_state_distinctions": "The dated newspaper notice is a documentary account, not an update date for the website.", "interpretive_limit": "Keep the opus specification separate from the historical notice and its publication date.", "observations": [ "Church, town and state identify the installation.", "Estey opus identity is supplied by the record and archive context.", "The historical notice is dated to the instrument opening.", "Named stops and pitches grouped under Great, Swell and Pedal.", "Pedal compass and division labels are given.", "Tubular-pneumatic action is stated.", "Couplers and swell control are listed.", "The page incorporates a dated historical press account." ], "uninspected_or_unfilled_material": [], "narrative": "Opus 1 combines a manual-and-pedal specification with a transcribed historical press notice. Couplers and tubular-pneumatic action are described alongside the stoplist. The notice has its own documentary date; it is not a date of revision for the website. The opus record and the historical account should remain distinguishable when citing the installation." }, "atlas_editorial_reading": { "evidence_kind": "code_reading_and_interpretation", "acquisition": "The opus index and individual archive pages have separate parsers. Detail titles and specifications receive archive-specific treatment rather than relying entirely on the generic static-page routines.", "transformation": "The specialised specification extractor reads manual/pedal sections of the archive layout; the remainder of the transfer uses the shared location, metadata, media and source-text machinery. The documentary unit should remain the opus/installation account, with its press notices or other historical documents separately attributed.", "limitations": "A factory stoplist, later alteration and transcribed notice can have different dates. The adapter does not settle continuity between an opus and a surviving instrument. Archive-specific stop extraction does not justify treating all inherited generic event rules as historically validated." }, "implementation": { "class": "EsteyArchiveCrawler", "class_line": 1079, "path": "aggregator/static_html_crawler.py", "inheritance": [ "EsteyArchiveCrawler", "StaticHtmlOrganCrawler", "BaseCrawler" ], "configuration": { "source_key": { "value": "estey", "path": "aggregator/static_html_crawler.py", "line": 1080, "class": "EsteyArchiveCrawler" }, "id_column": { "value": "estey_id", "path": "aggregator/static_html_crawler.py", "line": 1081, "class": "EsteyArchiveCrawler" }, "default_country": { "value": "United States", "path": "aggregator/static_html_crawler.py", "line": 1084, "class": "EsteyArchiveCrawler" }, "default_region": { "value": "", "path": "aggregator/static_html_crawler.py", "line": 29, "class": "StaticHtmlOrganCrawler" }, "start_urls": { "value": [ "https://archive.pipeorgandatabase.org/estey/opuslist.html" ], "path": "aggregator/static_html_crawler.py", "line": 1085, "class": "EsteyArchiveCrawler" }, "detail_url_patterns": { "value": [ "/estey/opus" ], "path": "aggregator/static_html_crawler.py", "line": 1086, "class": "EsteyArchiveCrawler" }, "exclude_url_patterns": { "value": [], "path": "aggregator/static_html_crawler.py", "line": 32, "class": "StaticHtmlOrganCrawler" }, "BUILDER_LABELS": { "value": [ "builder", "organ builder", "organbuilder", "orgelbouwer", "orgelbauer", "facteur", "facteur d'orgue", "maker" ], "path": "aggregator/static_html_crawler.py", "line": 34, "class": "StaticHtmlOrganCrawler" }, "YEAR_LABELS": { "value": [ "year", "date", "built", "installed", "baujahr", "bouwjaar", "construction" ], "path": "aggregator/static_html_crawler.py", "line": 44, "class": "StaticHtmlOrganCrawler" }, "base_url": { "value": "https://archive.pipeorgandatabase.org/estey", "path": "aggregator/static_html_crawler.py", "line": 1083, "class": "EsteyArchiveCrawler" } }, "methods": [ { "symbol": "StaticHtmlOrganCrawler._build_involved", "path": "aggregator/static_html_crawler.py", "line_start": 771, "line_end": 781, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 776, "key": "name", "value_expression": "str(builder)" }, { "line": 777, "key": "activities", "value_expression": "['builder']" }, { "line": 778, "key": "dates", "value_expression": "[str(year)] if year else []" }, { "line": 779, "key": "raw_str", "value_expression": "str(builder)" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._clean_label", "path": "aggregator/static_html_crawler.py", "line_start": 850, "line_end": 851, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._division_starts_line", "path": "aggregator/static_html_crawler.py", "line_start": 697, "line_end": 702, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text", "_is_division_heading" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._extract_images", "path": "aggregator/static_html_crawler.py", "line_start": 738, "line_end": 749, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [ { "line": 741, "receiver": "img", "key": "src", "expression": "img.get('src')" }, { "line": 741, "receiver": "img", "key": "data-src", "expression": "img.get('data-src')" }, { "line": 744, "receiver": "img", "key": "alt", "expression": "img.get('alt')" }, { "line": 744, "receiver": "img", "key": "title", "expression": "img.get('title')" } ], "html_queries": [ { "line": 740, "expression": "soup.find_all('img')" } ], "dictionary_entries": [ { "line": 748, "key": "link", "value_expression": "urljoin(page_url or self.base_url, src)" }, { "line": 748, "key": "caption", "value_expression": "alt" }, { "line": 748, "key": "source", "value_expression": "self.source_key" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._extract_links", "path": "aggregator/static_html_crawler.py", "line_start": 751, "line_end": 769, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [ { "line": 755, "expression": "soup.find_all('a', href=True)" } ], "dictionary_entries": [ { "line": 764, "key": "url", "value_expression": "full" }, { "line": 765, "key": "label", "value_expression": "label" }, { "line": 766, "key": "scope", "value_expression": "'internal' if parsed.netloc == base_netloc else 'external'" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._extract_metadata", "path": "aggregator/static_html_crawler.py", "line_start": 538, "line_end": 553, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_label", "_clean_text", "_metadata_key" ], "literal_get_calls": [], "html_queries": [ { "line": 540, "expression": "soup.find_all('tr')" }, { "line": 541, "expression": "row.find_all(['th', 'td'], recursive=False)" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "EsteyArchiveCrawler._extract_raw_spec", "path": "aggregator/static_html_crawler.py", "line_start": 1088, "line_end": 1138, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_multiline", "_clean_text", "_division_starts_line", "_parse_divisions_from_text" ], "literal_get_calls": [], "html_queries": [ { "line": 1128, "expression": "soup.find_all('table')" }, { "line": 1129, "expression": "table.find('table')" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._extract_table_rows", "path": "aggregator/static_html_crawler.py", "line_start": 722, "line_end": 736, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [ { "line": 725, "expression": "soup.find_all('table')" }, { "line": 726, "expression": "table.find_all('tr')" }, { "line": 727, "expression": "row.find_all(['th', 'td'], recursive=False)" } ], "dictionary_entries": [ { "line": 731, "key": "table_index", "value_expression": "table_index" }, { "line": 732, "key": "row_index", "value_expression": "row_index" }, { "line": 733, "key": "cells", "value_expression": "cells" }, { "line": 734, "key": "raw_str", "value_expression": "' | '.join(cells)" } ], "subscript_assignments": [] }, { "symbol": "EsteyArchiveCrawler._extract_title", "path": "aggregator/static_html_crawler.py", "line_start": 1160, "line_end": 1163, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._fetch_html", "path": "aggregator/static_html_crawler.py", "line_start": 131, "line_end": 145, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_best_decoding", "_declared_html_encoding", "_repair_mojibake" ], "literal_get_calls": [ { "line": 132, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._first_metadata", "path": "aggregator/static_html_crawler.py", "line_start": 825, "line_end": 829, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._identifier_from_url", "path": "aggregator/static_html_crawler.py", "line_start": 268, "line_end": 277, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._is_detail_url", "path": "aggregator/static_html_crawler.py", "line_start": 213, "line_end": 219, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._is_division_heading", "path": "aggregator/static_html_crawler.py", "line_start": 681, "line_end": 694, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._is_pitch_fragment", "path": "aggregator/static_html_crawler.py", "line_start": 669, "line_end": 678, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "EsteyArchiveCrawler._location_parts", "path": "aggregator/static_html_crawler.py", "line_start": 1165, "line_end": 1169, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._looks_like_stop_line", "path": "aggregator/static_html_crawler.py", "line_start": 705, "line_end": 715, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._main_text", "path": "aggregator/static_html_crawler.py", "line_start": 526, "line_end": 536, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [ { "line": 528, "expression": "main.find_all(['script', 'style', 'nav', 'footer', 'header', 'aside'])" }, { "line": 530, "expression": "main.find_all('br')" }, { "line": 532, "expression": "main.find_all(['p', 'div', 'li', 'tr', 'h1', 'h2', 'h3', 'h4', 'section'])" }, { "line": 527, "expression": "soup.find('main')" }, { "line": 527, "expression": "soup.find('article')" }, { "line": 527, "expression": "soup.find(id='content')" }, { "line": 527, "expression": "soup.find(class_=re.compile('entry-content|post-content|content', re.I))" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._metadata_key", "path": "aggregator/static_html_crawler.py", "line_start": 555, "line_end": 567, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_label" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._parse_divisions_from_text", "path": "aggregator/static_html_crawler.py", "line_start": 596, "line_end": 666, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text", "_is_division_heading", "_is_pitch_fragment", "_looks_like_stop_line" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "EsteyArchiveCrawler._parse_index_page", "path": "aggregator/static_html_crawler.py", "line_start": 1140, "line_end": 1158, "inherited": false, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_clean_text", "_dedupe_refs", "_reference_from_parts" ], "literal_get_calls": [], "html_queries": [ { "line": 1143, "expression": "soup.find_all('a', href=True)" } ], "dictionary_entries": [ { "line": 1155, "key": "opus", "value_expression": "opus" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._preserve_reference_context", "path": "aggregator/static_html_crawler.py", "line_start": 415, "line_end": 432, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_safe_json_loads" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 420, "key": "mapped_extension", "value_expression": "native" }, { "line": 424, "key": "mapped_context", "value_expression": "context" } ], "subscript_assignments": [ { "line": 425, "value_line": 425, "key": "reference_context", "target_expression": "native['reference_context']", "value_expression": "context" }, { "line": 430, "value_line": 430, "key": "raw_data", "target_expression": "context['raw_data']", "value_expression": "self._safe_json_loads(value, value)" } ] }, { "symbol": "StaticHtmlOrganCrawler._reference_from_parts", "path": "aggregator/static_html_crawler.py", "line_start": 221, "line_end": 254, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_identifier_from_url", "_split_title" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 240, "key": "title", "value_expression": "title" }, { "line": 241, "key": "country", "value_expression": "country or self.default_country" }, { "line": 242, "key": "region", "value_expression": "region or self.default_region" }, { "line": 243, "key": "town", "value_expression": "town or parsed_town" }, { "line": 244, "key": "building", "value_expression": "building or parsed_building or title" }, { "line": 245, "key": "builder", "value_expression": "builder" }, { "line": 246, "key": "year", "value_expression": "year" }, { "line": 247, "key": "manual_count", "value_expression": "manual_count" }, { "line": 248, "key": "stop_count", "value_expression": "stop_count" }, { "line": 249, "key": "rank_count", "value_expression": "rank_count" }, { "line": 250, "key": "url", "value_expression": "url" }, { "line": 251, "key": "status", "value_expression": "'initiated'" }, { "line": 252, "key": "raw_data_json", "value_expression": "json.dumps(raw_data or {}, ensure_ascii=False)" }, { "line": 253, "key": "scraped_at", "value_expression": "datetime.now().isoformat()" } ], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._safe_json_loads", "path": "aggregator/static_html_crawler.py", "line_start": 858, "line_end": 864, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._split_title", "path": "aggregator/static_html_crawler.py", "line_start": 813, "line_end": 822, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler._title_from_url", "path": "aggregator/static_html_crawler.py", "line_start": 280, "line_end": 283, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler.crawl", "path": "aggregator/static_html_crawler.py", "line_start": 78, "line_end": 129, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_fetch_html", "_identifier_from_url", "_optional_int", "_parse_index_page", "_save_reference", "_update_scrape_status", "is_scrape_stop_requested", "mark_scrape_stopped" ], "literal_get_calls": [ { "line": 79, "receiver": "kwargs", "key": "task_id", "expression": "kwargs.get('task_id')" }, { "line": 80, "receiver": "kwargs", "key": "max_items", "expression": "kwargs.get('max_items')" }, { "line": 81, "receiver": "kwargs", "key": "start_urls", "expression": "kwargs.get('start_urls')" }, { "line": 117, "receiver": "self.config", "key": "rate_limit_delay", "expression": "self.config.get('rate_limit_delay', 0.2)" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line_start": 434, "line_end": 516, "inherited": true, "file_sha256": "f47fb9679d745a7731ee53a7983377a37b0092f7dea66a3500e83cd5181419aa", "self_calls": [ "_build_involved", "_extract_images", "_extract_links", "_extract_metadata", "_extract_raw_spec", "_extract_table_rows", "_extract_title", "_first_int", "_first_metadata", "_first_year", "_location_parts", "_main_text", "_safe_json_loads" ], "literal_get_calls": [ { "line": 435, "receiver": "raw_data", "key": "html", "expression": "raw_data.get('html')" }, { "line": 440, "receiver": "raw_data", "key": "builder", "expression": "raw_data.get('builder')" }, { "line": 441, "receiver": "raw_data", "key": "year", "expression": "raw_data.get('year')" }, { "line": 442, "receiver": "raw_data", "key": "manual_count", "expression": "raw_data.get('manual_count')" }, { "line": 443, "receiver": "raw_data", "key": "stop_count", "expression": "raw_data.get('stop_count')" }, { "line": 444, "receiver": "raw_data", "key": "rank_count", "expression": "raw_data.get('rank_count')" }, { "line": 513, "receiver": "raw_data", "key": "url", "expression": "raw_data.get('url')" }, { "line": 442, "receiver": "metadata", "key": "manuals", "expression": "metadata.get('manuals')" }, { "line": 442, "receiver": "metadata", "key": "manual", "expression": "metadata.get('manual')" }, { "line": 443, "receiver": "metadata", "key": "stops", "expression": "metadata.get('stops')" }, { "line": 443, "receiver": "metadata", "key": "stop", "expression": "metadata.get('stop')" }, { "line": 444, "receiver": "metadata", "key": "ranks", "expression": "metadata.get('ranks')" }, { "line": 444, "receiver": "metadata", "key": "rank", "expression": "metadata.get('rank')" }, { "line": 480, "receiver": "raw_data", "key": "url", "expression": "raw_data.get('url')" }, { "line": 453, "receiver": "raw_data", "key": "country", "expression": "raw_data.get('country')" }, { "line": 454, "receiver": "raw_data", "key": "region", "expression": "raw_data.get('region')" }, { "line": 479, "receiver": "raw_data", "key": "url", "expression": "raw_data.get('url')" }, { "line": 487, "receiver": "raw_data", "key": "raw_data_json", "expression": "raw_data.get('raw_data_json')" } ], "html_queries": [], "dictionary_entries": [ { "line": 450, "key": "locations", "value_expression": "[{'status': 'current_location', 'country': raw_data.get('country') or self.default_country, 'region': raw_data.get('region') or self.default_region, 'town': town, 'building': building, 'raw_str': title}]" }, { "line": 460, "key": "involved", "value_expression": "self._build_involved(builder, year)" }, { "line": 461, "key": "events", "value_expression": "[{'type': 'construction', 'date': str(year), 'description': builder}] if year else []" }, { "line": 462, "key": "specifications", "value_expression": "{'manual_count': manual_count, 'stop_count': stop_count, 'rank_count': rank_count, 'stops_by_division': stops_by_division, 'stops': [{'name': stop, 'division': division, 'raw_str': stop} for division, stops in stops_by_division.items() for stop in stops], 'raw_spec': raw_spec, 'technical_rows_unstructured': [{'label': key, 'value': value} for key, value in metadata.items() if value and key not in {'builder', 'year', 'manuals', 'manual', 'stops', 'stop', 'ranks', 'rank'}] + table_rows}" }, { "line": 479, "key": "media", "value_expression": "{'images': self._extract_images(soup, raw_data.get('url') or '')}" }, { "line": 480, "key": "links", "value_expression": "self._extract_links(soup, raw_data.get('url') or '')" }, { "line": 481, "key": "descriptions", "value_expression": "[{'type': 'source_text', 'text': text}] if text else []" }, { "line": 482, "key": "other_identifiers", "value_expression": "[{'type': self.id_column, 'value': raw_data.get(self.id_column)}]" }, { "line": 483, "key": "extensions", "value_expression": "{self.source_key: {'title': title, 'metadata': metadata, 'raw_data': self._safe_json_loads(raw_data.get('raw_data_json'), {}), 'reference_context': {key: raw_data.get(key) for key in (self.id_column, 'title', 'country', 'region', 'town', 'building', 'builder', 'year', 'manual_count', 'stop_count', 'rank_count', 'url') if raw_data.get(key) not in (None, '')}}}" }, { "line": 463, "key": "manual_count", "value_expression": "manual_count" }, { "line": 464, "key": "stop_count", "value_expression": "stop_count" }, { "line": 465, "key": "rank_count", "value_expression": "rank_count" }, { "line": 466, "key": "stops_by_division", "value_expression": "stops_by_division" }, { "line": 467, "key": "stops", "value_expression": "[{'name': stop, 'division': division, 'raw_str': stop} for division, stops in stops_by_division.items() for stop in stops]" }, { "line": 472, "key": "raw_spec", "value_expression": "raw_spec" }, { "line": 473, "key": "technical_rows_unstructured", "value_expression": "[{'label': key, 'value': value} for key, value in metadata.items() if value and key not in {'builder', 'year', 'manuals', 'manual', 'stops', 'stop', 'ranks', 'rank'}] + table_rows" }, { "line": 479, "key": "images", "value_expression": "self._extract_images(soup, raw_data.get('url') or '')" }, { "line": 452, "key": "status", "value_expression": "'current_location'" }, { "line": 453, "key": "country", "value_expression": "raw_data.get('country') or self.default_country" }, { "line": 454, "key": "region", "value_expression": "raw_data.get('region') or self.default_region" }, { "line": 455, "key": "town", "value_expression": "town" }, { "line": 456, "key": "building", "value_expression": "building" }, { "line": 457, "key": "raw_str", "value_expression": "title" }, { "line": 482, "key": "type", "value_expression": "self.id_column" }, { "line": 482, "key": "value", "value_expression": "raw_data.get(self.id_column)" }, { "line": 485, "key": "title", "value_expression": "title" }, { "line": 486, "key": "metadata", "value_expression": "metadata" }, { "line": 487, "key": "raw_data", "value_expression": "self._safe_json_loads(raw_data.get('raw_data_json'), {})" }, { "line": 488, "key": "reference_context", "value_expression": "{key: raw_data.get(key) for key in (self.id_column, 'title', 'country', 'region', 'town', 'building', 'builder', 'year', 'manual_count', 'stop_count', 'rank_count', 'url') if raw_data.get(key) not in (None, '')}" }, { "line": 461, "key": "type", "value_expression": "'construction'" }, { "line": 461, "key": "date", "value_expression": "str(year)" }, { "line": 461, "key": "description", "value_expression": "builder" }, { "line": 468, "key": "name", "value_expression": "stop" }, { "line": 468, "key": "division", "value_expression": "division" }, { "line": 468, "key": "raw_str", "value_expression": "stop" }, { "line": 481, "key": "type", "value_expression": "'source_text'" }, { "line": 481, "key": "text", "value_expression": "text" }, { "line": 474, "key": "label", "value_expression": "key" }, { "line": 474, "key": "value", "value_expression": "value" } ], "subscript_assignments": [] } ], "selected_rule_rows": [ { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line": 464, "key": "stop_count", "value_expression": "stop_count" }, { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line": 463, "key": "manual_count", "value_expression": "manual_count" }, { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line": 465, "key": "rank_count", "value_expression": "rank_count" }, { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line": 466, "key": "stops_by_division", "value_expression": "stops_by_division" }, { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line": 453, "key": "country", "value_expression": "raw_data.get('country') or self.default_country" }, { "symbol": "StaticHtmlOrganCrawler.transform", "path": "aggregator/static_html_crawler.py", "line": 457, "key": "raw_str", "value_expression": "title" } ], "bounded_code_passages": [ { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.transform", "line_start": 461, "line_end": 469, "text": " \"events\": [{\"type\": \"construction\", \"date\": str(year), \"description\": builder}] if year else [],\n \"specifications\": {\n \"manual_count\": manual_count,\n \"stop_count\": stop_count,\n \"rank_count\": rank_count,\n \"stops_by_division\": stops_by_division,\n \"stops\": [\n {\"name\": stop, \"division\": division, \"raw_str\": stop}\n for division, stops in stops_by_division.items()" }, { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.transform", "line_start": 460, "line_end": 468, "text": " \"involved\": self._build_involved(builder, year),\n \"events\": [{\"type\": \"construction\", \"date\": str(year), \"description\": builder}] if year else [],\n \"specifications\": {\n \"manual_count\": manual_count,\n \"stop_count\": stop_count,\n \"rank_count\": rank_count,\n \"stops_by_division\": stops_by_division,\n \"stops\": [\n {\"name\": stop, \"division\": division, \"raw_str\": stop}" }, { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.transform", "line_start": 462, "line_end": 470, "text": " \"specifications\": {\n \"manual_count\": manual_count,\n \"stop_count\": stop_count,\n \"rank_count\": rank_count,\n \"stops_by_division\": stops_by_division,\n \"stops\": [\n {\"name\": stop, \"division\": division, \"raw_str\": stop}\n for division, stops in stops_by_division.items()\n for stop in stops" }, { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.transform", "line_start": 463, "line_end": 471, "text": " \"manual_count\": manual_count,\n \"stop_count\": stop_count,\n \"rank_count\": rank_count,\n \"stops_by_division\": stops_by_division,\n \"stops\": [\n {\"name\": stop, \"division\": division, \"raw_str\": stop}\n for division, stops in stops_by_division.items()\n for stop in stops\n ]," }, { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.transform", "line_start": 450, "line_end": 458, "text": " \"locations\": [\n {\n \"status\": \"current_location\",\n \"country\": raw_data.get(\"country\") or self.default_country,\n \"region\": raw_data.get(\"region\") or self.default_region,\n \"town\": town,\n \"building\": building,\n \"raw_str\": title,\n }" }, { "path": "aggregator/static_html_crawler.py", "symbol": "StaticHtmlOrganCrawler.transform", "line_start": 454, "line_end": 462, "text": " \"region\": raw_data.get(\"region\") or self.default_region,\n \"town\": town,\n \"building\": building,\n \"raw_str\": title,\n }\n ],\n \"involved\": self._build_involved(builder, year),\n \"events\": [{\"type\": \"construction\", \"date\": str(year), \"description\": builder}] if year else [],\n \"specifications\": {" } ] } }, { "catalogue_id": "S009", "source_key": "evensong_hauptwerk_samplesets", "name": "Evensong Hauptwerk Sample Sets", "selection_role": "registered_source", "parent_source_key": null, "attribution": "Evensong LLC", "scope_description": "Selected instruments, prominently North American organs", "documentary_unit": "Hauptwerk sample-set product", "source_description": "The catalogue pairs named organs with product pages and describes the producer's sampling history. It acknowledges extensions using stops from other sources in an early product. A separate sample-set licence is linked from the catalogue.", "source_description_references": [ "evensong_hauptwerk_samplesets", "evensong_rights" ], "interpretation": "A product's virtual specification may exceed its recorded instrument. The package version and the original or extended configuration must therefore accompany comparisons of stops and manuals.", "rights_observation": "A product licence governs use. Its repurposing clause is conditional and should be read for the specific release; no blanket CC0 permission is recorded.", "rights_observation_basis": "Report of the pages consulted on 10 September 2026; not a determination of legal entitlement or a complete licence audit.", "references": [ "evensong_hauptwerk_samplesets", "evensong_rights" ], "observation_date": "2026-09-10", "atlas_editorial_reading": { "evidence_kind": "code_reading_and_interpretation", "acquisition": "The source-specific parser selects WordPress page links, captioned figures and linked images. The library family can enrich discovered items from linked detail pages; catalogue and detail capture are distinct operations.", "transformation": "The implemented unit is linked product entries with image/title context. parse_html produces a collection of item records; the common transform wraps them in a vmi_library_batch. Source fragments, item identity, links and product context are passed to the VMI normalizer. The exact selectors and constructed fields are enumerated in the technical evidence register. The native wording remains necessary to distinguish a producer, a product, a version and the organ represented.", "limitations": "A linked figure can be promotional navigation. Product identity and represented instrument identity require separate evidence. The existence of a parser is not a fresh check of the live catalogue, and a parsed link is not evidence that its downloadable content was inspected." }, "implementation": { "class": "EvensongHauptwerkSamplesetsCrawler", "class_line": 1522, "path": "aggregator/grandorgue_library_crawler.py", "inheritance": [ "EvensongHauptwerkSamplesetsCrawler", "GrandOrgueLibraryCrawler", "BaseCrawler" ], "configuration": { "source_key": { "value": "evensong_hauptwerk_samplesets", "path": "aggregator/grandorgue_library_crawler.py", "line": 1523, "class": "EvensongHauptwerkSamplesetsCrawler" }, "catalog_url": { "value": "", "path": "aggregator/grandorgue_library_crawler.py", "line": 34, "class": "GrandOrgueLibraryCrawler" }, "catalog_kind": { "value": "producer_catalog", "path": "aggregator/grandorgue_library_crawler.py", "line": 1525, "class": "EvensongHauptwerkSamplesetsCrawler" }, "cache_source_key_column": { "value": "source_key", "path": "aggregator/grandorgue_library_crawler.py", "line": 40, "class": "GrandOrgueLibraryCrawler" }, "final_source_key_column": { "value": "source_key", "path": "aggregator/grandorgue_library_crawler.py", "line": 41, "class": "GrandOrgueLibraryCrawler" }, "transformed_json_id_column": { "value": "item_id", "path": "aggregator/grandorgue_library_crawler.py", "line": 42, "class": "GrandOrgueLibraryCrawler" } }, "methods": [ { "symbol": "GrandOrgueLibraryCrawler._append_detail_document", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 276, "line_end": 306, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 284, "receiver": "record.get('provenance', {})", "key": "identity", "expression": "record.get('provenance', {}).get('identity', {})" }, { "line": 285, "receiver": "identity", "key": "primary_id_value", "expression": "identity.get('primary_id_value')" }, { "line": 286, "receiver": "record.get('source', {})", "key": "retrieved_at", "expression": "record.get('source', {}).get('retrieved_at')" }, { "line": 284, "receiver": "record", "key": "provenance", "expression": "record.get('provenance', {})" }, { "line": 286, "receiver": "record", "key": "source", "expression": "record.get('source', {})" }, { "line": 300, "receiver": "doc", "key": "document_id", "expression": "doc.get('document_id')" } ], "html_queries": [], "dictionary_entries": [ { "line": 288, "key": "document_id", "value_expression": "provenance.document_id(self.source_key, f'{primary_id}:detail', 'raw_html')" }, { "line": 289, "key": "document_kind", "value_expression": "'raw_html'" }, { "line": 290, "key": "content_sha256", "value_expression": "provenance.content_sha256(detail_html)" }, { "line": 291, "key": "content_size_bytes", "value_expression": "len(detail_html.encode('utf-8'))" }, { "line": 292, "key": "content_type", "value_expression": "'text/html'" }, { "line": 293, "key": "url", "value_expression": "detail_url" }, { "line": 294, "key": "retrieved_at", "value_expression": "retrieved_at" }, { "line": 295, "key": "crawl_run_id", "value_expression": "crawl_run_id or ''" }, { "line": 296, "key": "raw_content", "value_expression": "detail_html" } ], "subscript_assignments": [ { "line": 302, "value_line": 302, "key": "detail_page_crawled", "target_expression": "record.setdefault('extensions', {})['detail_page_crawled']", "value_expression": "True" }, { "line": 304, "value_line": 304, "key": "access_model_hint", "target_expression": "record.setdefault('item', {})['access_model_hint']", "value_expression": "'registration_required'" }, { "line": 305, "value_line": 305, "key": "availability_status_hint", "target_expression": "record.setdefault('item', {})['availability_status_hint']", "value_expression": "'available_with_registration'" } ] }, { "symbol": "GrandOrgueLibraryCrawler._apply_detail_html", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 308, "line_end": 309, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler._detail_url_for_record", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 259, "line_end": 274, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 261, "receiver": "record", "key": "links", "expression": "record.get('links')" }, { "line": 270, "receiver": "link", "key": "is_download_candidate", "expression": "link.get('is_download_candidate')" }, { "line": 272, "receiver": "link", "key": "is_product_homepage_candidate", "expression": "link.get('is_product_homepage_candidate')" }, { "line": 264, "receiver": "link", "key": "normalized_url", "expression": "link.get('normalized_url')" }, { "line": 264, "receiver": "link", "key": "url", "expression": "link.get('url')" }, { "line": 272, "receiver": "link", "key": "rel", "expression": "link.get('rel')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler._enrich_records_with_detail_pages", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 213, "line_end": 257, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_append_detail_document", "_apply_detail_html", "_detail_url_for_record" ], "literal_get_calls": [ { "line": 219, "receiver": "self.config", "key": "crawl_detail_pages", "expression": "self.config.get('crawl_detail_pages')" }, { "line": 225, "receiver": "self.config", "key": "max_detail_pages", "expression": "self.config.get('max_detail_pages', 0)" }, { "line": 243, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [ { "line": 222, "key": "detail_page_enrichment_enabled", "value_expression": "False" }, { "line": 222, "key": "detail_page_fetched", "value_expression": "False" } ], "subscript_assignments": [ { "line": 230, "value_line": 230, "key": "detail_page_enrichment_enabled", "target_expression": "completeness['detail_page_enrichment_enabled']", "value_expression": "True" }, { "line": 255, "value_line": 255, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "True" }, { "line": 232, "value_line": 232, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 233, "value_line": 233, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'configured_detail_page_limit'" }, { "line": 238, "value_line": 238, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 239, "value_line": 239, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'no_detail_url_discovered'" }, { "line": 247, "value_line": 247, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 248, "value_line": 248, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'fetch_failed'" } ] }, { "symbol": "GrandOrgueLibraryCrawler._record", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 311, "line_end": 341, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 326, "receiver": "payload", "key": "catalog", "expression": "payload.get('catalog')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [ { "line": 330, "value_line": 330, "key": "catalog", "target_expression": "payload['catalog']", "value_expression": "catalog" } ] }, { "symbol": "GrandOrgueLibraryCrawler.crawl", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 86, "line_end": 136, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_enrich_records_with_detail_pages", "_fail_shared_crawl_run", "_finish_shared_crawl_run", "_register_shared_crawl_target", "_upsert_scrape_status", "parse_html" ], "literal_get_calls": [ { "line": 88, "receiver": "kwargs", "key": "task_id", "expression": "kwargs.get('task_id')" }, { "line": 89, "receiver": "kwargs", "key": "run_id", "expression": "kwargs.get('run_id')" }, { "line": 87, "receiver": "kwargs", "key": "url", "expression": "kwargs.get('url')" }, { "line": 91, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" }, { "line": 121, "receiver": "record.get('item', {})", "key": "title", "expression": "record.get('item', {}).get('title')" }, { "line": 122, "receiver": "record.get('source_snapshot', {})", "key": "url", "expression": "record.get('source_snapshot', {}).get('url')" }, { "line": 124, "receiver": "record.get('extensions', {})", "key": "source_fragment_html", "expression": "record.get('extensions', {}).get('source_fragment_html')" }, { "line": 121, "receiver": "record", "key": "item", "expression": "record.get('item', {})" }, { "line": 122, "receiver": "record", "key": "source_snapshot", "expression": "record.get('source_snapshot', {})" }, { "line": 124, "receiver": "record", "key": "extensions", "expression": "record.get('extensions', {})" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "EvensongHauptwerkSamplesetsCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 1527, "line_end": 1651, "inherited": false, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_record" ], "literal_get_calls": [ { "line": 1537, "receiver": "title_link", "key": "href", "expression": "title_link.get('href')" }, { "line": 1584, "receiver": "link", "key": "href", "expression": "link.get('href')" }, { "line": 1578, "receiver": "img", "key": "alt", "expression": "img.get('alt')" }, { "line": 1578, "receiver": "img", "key": "title", "expression": "img.get('title')" } ], "html_queries": [ { "line": 1573, "expression": "soup.select('a[href*=\"page_id=\"]')" }, { "line": 1532, "expression": "soup.select('figure.wp-caption')" }, { "line": 1534, "expression": "figure.select_one('a[href*=\"page_id=\"]')" }, { "line": 1577, "expression": "link.select_one('img')" } ], "dictionary_entries": [ { "line": 1544, "key": "catalog", "value_expression": "{'position': position, 'section_label': 'Samplesets for Hauptwerk'}" }, { "line": 1545, "key": "item", "value_expression": "{'title': title, 'producer_label': 'Evensong', 'description_excerpt': _excerpt(_clean_text(figure.get_text(' ', strip=True))), 'software_labels': ['Hauptwerk'], 'engine_labels': ['Hauptwerk'], 'access_model_hint': 'commercial', 'availability_status_hint': 'producer_catalog_entry'}" }, { "line": 1554, "key": "package", "value_expression": "{'package_title': title, 'package_kind': 'sample_set', 'is_odf_only': False, 'requires_sample_set': False}" }, { "line": 1560, "key": "links", "value_expression": "[{'url': detail_url, 'link_text': title, 'is_product_homepage_candidate': True}]" }, { "line": 1561, "key": "extensions", "value_expression": "{'source_fragment_html': str(figure)}" }, { "line": 1594, "key": "catalog", "value_expression": "{'position': position, 'section_label': 'Samplesets for Hauptwerk'}" }, { "line": 1595, "key": "item", "value_expression": "{'title': title, 'producer_label': 'Evensong', 'description_excerpt': _excerpt(text), 'software_labels': ['Hauptwerk'], 'engine_labels': ['Hauptwerk'], 'access_model_hint': 'commercial', 'availability_status_hint': 'producer_catalog_entry'}" }, { "line": 1604, "key": "package", "value_expression": "{'package_title': title, 'package_kind': 'sample_set', 'is_odf_only': False, 'requires_sample_set': False}" }, { "line": 1610, "key": "links", "value_expression": "[{'url': detail_url, 'link_text': title, 'is_product_homepage_candidate': True}]" }, { "line": 1611, "key": "extensions", "value_expression": "{'source_fragment_html': str(link)}" }, { "line": 1629, "key": "catalog", "value_expression": "{'position': position, 'section_label': 'Samplesets for Hauptwerk'}" }, { "line": 1630, "key": "item", "value_expression": "{'title': title, 'producer_label': 'Evensong', 'description_excerpt': _excerpt(text), 'software_labels': ['Hauptwerk'], 'engine_labels': ['Hauptwerk'], 'access_model_hint': 'commercial', 'availability_status_hint': 'producer_catalog_entry'}" }, { "line": 1639, "key": "package", "value_expression": "{'package_title': title, 'package_kind': 'sample_set', 'is_odf_only': False, 'requires_sample_set': False}" }, { "line": 1640, "key": "links", "value_expression": "[{'url': source_url, 'link_text': 'Samplesets for Hauptwerk', 'is_product_homepage_candidate': True}]" }, { "line": 1641, "key": "extensions", "value_expression": "{'source_fragment_html': title}" }, { "line": 1544, "key": "position", "value_expression": "position" }, { "line": 1544, "key": "section_label", "value_expression": "'Samplesets for Hauptwerk'" }, { "line": 1546, "key": "title", "value_expression": "title" }, { "line": 1547, "key": "producer_label", "value_expression": "'Evensong'" }, { "line": 1548, "key": "description_excerpt", "value_expression": "_excerpt(_clean_text(figure.get_text(' ', strip=True)))" }, { "line": 1549, "key": "software_labels", "value_expression": "['Hauptwerk']" }, { "line": 1550, "key": "engine_labels", "value_expression": "['Hauptwerk']" }, { "line": 1551, "key": "access_model_hint", "value_expression": "'commercial'" }, { "line": 1552, "key": "availability_status_hint", "value_expression": "'producer_catalog_entry'" }, { "line": 1555, "key": "package_title", "value_expression": "title" }, { "line": 1556, "key": "package_kind", "value_expression": "'sample_set'" }, { "line": 1557, "key": "is_odf_only", "value_expression": "False" }, { "line": 1558, "key": "requires_sample_set", "value_expression": "False" }, { "line": 1561, "key": "source_fragment_html", "value_expression": "str(figure)" }, { "line": 1594, "key": "position", "value_expression": "position" }, { "line": 1594, "key": "section_label", "value_expression": "'Samplesets for Hauptwerk'" }, { "line": 1596, "key": "title", "value_expression": "title" }, { "line": 1597, "key": "producer_label", "value_expression": "'Evensong'" }, { "line": 1598, "key": "description_excerpt", "value_expression": "_excerpt(text)" }, { "line": 1599, "key": "software_labels", "value_expression": "['Hauptwerk']" }, { "line": 1600, "key": "engine_labels", "value_expression": "['Hauptwerk']" }, { "line": 1601, "key": "access_model_hint", "value_expression": "'commercial'" }, { "line": 1602, "key": "availability_status_hint", "value_expression": "'producer_catalog_entry'" }, { "line": 1605, "key": "package_title", "value_expression": "title" }, { "line": 1606, "key": "package_kind", "value_expression": "'sample_set'" }, { "line": 1607, "key": "is_odf_only", "value_expression": "False" }, { "line": 1608, "key": "requires_sample_set", "value_expression": "False" }, { "line": 1611, "key": "source_fragment_html", "value_expression": "str(link)" }, { "line": 1629, "key": "position", "value_expression": "position" }, { "line": 1629, "key": "section_label", "value_expression": "'Samplesets for Hauptwerk'" }, { "line": 1631, "key": "title", "value_expression": "title" }, { "line": 1632, "key": "producer_label", "value_expression": "'Evensong'" }, { "line": 1633, "key": "description_excerpt", "value_expression": "_excerpt(text)" }, { "line": 1634, "key": "software_labels", "value_expression": "['Hauptwerk']" }, { "line": 1635, "key": "engine_labels", "value_expression": "['Hauptwerk']" }, { "line": 1636, "key": "access_model_hint", "value_expression": "'commercial'" }, { "line": 1637, "key": "availability_status_hint", "value_expression": "'producer_catalog_entry'" }, { "line": 1639, "key": "package_title", "value_expression": "title" }, { "line": 1639, "key": "package_kind", "value_expression": "'sample_set'" }, { "line": 1639, "key": "is_odf_only", "value_expression": "False" }, { "line": 1639, "key": "requires_sample_set", "value_expression": "False" }, { "line": 1641, "key": "source_fragment_html", "value_expression": "title" }, { "line": 1560, "key": "url", "value_expression": "detail_url" }, { "line": 1560, "key": "link_text", "value_expression": "title" }, { "line": 1560, "key": "is_product_homepage_candidate", "value_expression": "True" }, { "line": 1610, "key": "url", "value_expression": "detail_url" }, { "line": 1610, "key": "link_text", "value_expression": "title" }, { "line": 1610, "key": "is_product_homepage_candidate", "value_expression": "True" }, { "line": 1640, "key": "url", "value_expression": "source_url" }, { "line": 1640, "key": "link_text", "value_expression": "'Samplesets for Hauptwerk'" }, { "line": 1640, "key": "is_product_homepage_candidate", "value_expression": "True" } ], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler.transform", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 138, "line_end": 156, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "parse_html" ], "literal_get_calls": [ { "line": 139, "receiver": "raw_data", "key": "html", "expression": "raw_data.get('html')" }, { "line": 139, "receiver": "raw_data", "key": "raw_html", "expression": "raw_data.get('raw_html')" }, { "line": 139, "receiver": "raw_data", "key": "markdown", "expression": "raw_data.get('markdown')" }, { "line": 140, "receiver": "raw_data", "key": "url", "expression": "raw_data.get('url')" }, { "line": 140, "receiver": "raw_data", "key": "source_url", "expression": "raw_data.get('source_url')" }, { "line": 144, "receiver": "raw_data", "key": "crawl_run_id", "expression": "raw_data.get('crawl_run_id')" }, { "line": 145, "receiver": "raw_data", "key": "transform_run_id", "expression": "raw_data.get('transform_run_id')" } ], "html_queries": [], "dictionary_entries": [ { "line": 148, "key": "record_type", "value_expression": "'vmi_library_batch'" }, { "line": 149, "key": "source", "value_expression": "{'key': self.source_key, 'display_name': self.source_display_name, 'base_url': self.catalog_url, 'type': self.source_type}" }, { "line": 155, "key": "records", "value_expression": "records" }, { "line": 150, "key": "key", "value_expression": "self.source_key" }, { "line": 151, "key": "display_name", "value_expression": "self.source_display_name" }, { "line": 152, "key": "base_url", "value_expression": "self.catalog_url" }, { "line": 153, "key": "type", "value_expression": "self.source_type" } ], "subscript_assignments": [] } ], "selected_rule_rows": [ { "symbol": "GrandOrgueLibraryCrawler.transform", "path": "aggregator/grandorgue_library_crawler.py", "line": 148, "key": "record_type", "value_expression": "'vmi_library_batch'" }, { "symbol": "EvensongHauptwerkSamplesetsCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 1556, "key": "package_kind", "value_expression": "'sample_set'" }, { "symbol": "EvensongHauptwerkSamplesetsCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 1558, "key": "requires_sample_set", "value_expression": "False" }, { "symbol": "EvensongHauptwerkSamplesetsCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 1557, "key": "is_odf_only", "value_expression": "False" }, { "symbol": "EvensongHauptwerkSamplesetsCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 1547, "key": "producer_label", "value_expression": "'Evensong'" } ], "bounded_code_passages": [ { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "GrandOrgueLibraryCrawler.transform", "line_start": 145, "line_end": 153, "text": " transform_run_id=raw_data.get(\"transform_run_id\"),\n )\n return {\n \"record_type\": \"vmi_library_batch\",\n \"source\": {\n \"key\": self.source_key,\n \"display_name\": self.source_display_name,\n \"base_url\": self.catalog_url,\n \"type\": self.source_type," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "EvensongHauptwerkSamplesetsCrawler.parse_html", "line_start": 1553, "line_end": 1561, "text": " },\n \"package\": {\n \"package_title\": title,\n \"package_kind\": \"sample_set\",\n \"is_odf_only\": False,\n \"requires_sample_set\": False,\n },\n \"links\": [{\"url\": detail_url, \"link_text\": title, \"is_product_homepage_candidate\": True}],\n \"extensions\": {\"source_fragment_html\": str(figure)}," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "EvensongHauptwerkSamplesetsCrawler.parse_html", "line_start": 1555, "line_end": 1563, "text": " \"package_title\": title,\n \"package_kind\": \"sample_set\",\n \"is_odf_only\": False,\n \"requires_sample_set\": False,\n },\n \"links\": [{\"url\": detail_url, \"link_text\": title, \"is_product_homepage_candidate\": True}],\n \"extensions\": {\"source_fragment_html\": str(figure)},\n },\n primary_id=slugify(detail_url)," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "EvensongHauptwerkSamplesetsCrawler.parse_html", "line_start": 1554, "line_end": 1562, "text": " \"package\": {\n \"package_title\": title,\n \"package_kind\": \"sample_set\",\n \"is_odf_only\": False,\n \"requires_sample_set\": False,\n },\n \"links\": [{\"url\": detail_url, \"link_text\": title, \"is_product_homepage_candidate\": True}],\n \"extensions\": {\"source_fragment_html\": str(figure)},\n }," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "EvensongHauptwerkSamplesetsCrawler.parse_html", "line_start": 1544, "line_end": 1552, "text": " \"catalog\": {\"position\": position, \"section_label\": \"Samplesets for Hauptwerk\"},\n \"item\": {\n \"title\": title,\n \"producer_label\": \"Evensong\",\n \"description_excerpt\": _excerpt(_clean_text(figure.get_text(\" \", strip=True))),\n \"software_labels\": [\"Hauptwerk\"],\n \"engine_labels\": [\"Hauptwerk\"],\n \"access_model_hint\": \"commercial\",\n \"availability_status_hint\": \"producer_catalog_entry\"," } ] } }, { "catalogue_id": "S010", "source_key": "gdo_literature", "name": "GDO Literaturdatenbank", "selection_role": "registered_source", "parent_source_key": null, "attribution": "Alfred Reichling; Matthias Reichling; Gesellschaft der Orgelfreunde", "scope_description": "Literature on organ building and playing; scores excluded", "documentary_unit": "Bibliographic entry", "source_description": "The society credits Alfred and Matthias Reichling with the bibliography. The introduction describes journal surveys, monographs, commemorative volumes, proceedings and articles, with author, title, publication details and annotations. The configured database endpoint returned HTTP 500 during this check; the explanatory page remained readable.", "source_description_references": [ "gdo_intro", "gdo_literature" ], "interpretation": "The bibliography is a route to publications, not evidence that their full texts were consulted.", "rights_observation": "No general licence for redistributing the complete bibliography was established.", "rights_observation_basis": "Report of the pages consulted on 10 September 2026; not a determination of legal entitlement or a complete licence audit.", "references": [ "gdo_intro", "gdo_literature" ], "observation_date": "2026-09-10", "atlas_editorial_reading": { "evidence_kind": "code_reading_and_interpretation", "acquisition": "The crawler acquires bibliographic result rows and associated query context. Cached structured payload and row fields are merged before normalization.", "transformation": "The normalizer preserves the citation text and original author label while separately splitting authors, identifying publication years and constructing title, publication-detail and annotation fields. Content-derived identifiers are used when no stable native identifier is supplied. The source page remains the provenance for a bibliographic entry, not the cited publication itself.", "limitations": "A year extracted from a citation is not necessarily a single publication date; series, volumes and cited historical dates may coexist. Content-hash identity can change with editorial spelling. A catalogue citation is not evidence that the underlying publication was consulted." }, "implementation": { "class": "GDOLiteratureCrawler", "class_line": 25, "path": "aggregator/gdo_literature_crawler.py", "inheritance": [ "GDOLiteratureCrawler", "BaseCrawler" ], "configuration": { "transformed_json_id_column": { "value": "literature_id", "path": "aggregator/gdo_literature_crawler.py", "line": 33, "class": "GDOLiteratureCrawler" }, "record_label": { "value": "literature records", "path": "aggregator/gdo_literature_crawler.py", "line": 34, "class": "GDOLiteratureCrawler" } }, "methods": [ { "symbol": "GDOLiteratureCrawler._crawl_options", "path": "aggregator/gdo_literature_crawler.py", "line_start": 440, "line_end": 452, "inherited": false, "file_sha256": "0acff63fc05fb9ebb8e24b440755431d13ecc3bc24b800875c1db0f6b30856fa", "self_calls": [ "_years_from_options" ], "literal_get_calls": [ { "line": 447, "receiver": "source", "key": "year", "expression": "source.get('year')" }, { "line": 447, "receiver": "source", "key": "years", "expression": "source.get('years')" } ], "html_queries": [], "dictionary_entries": [ { "line": 449, "key": "mode", "value_expression": "mode" }, { "line": 450, "key": "years", "value_expression": "years" }, { "line": 451, "key": "declared_total_records", "value_expression": "None" } ], "subscript_assignments": [ { "line": 445, "value_line": 445, "key": "year", "target_expression": "source['year']", "value_expression": "target" } ] }, { "symbol": "GDOLiteratureCrawler._parse_years", "path": "aggregator/gdo_literature_crawler.py", "line_start": 467, "line_end": 485, "inherited": false, "file_sha256": "0acff63fc05fb9ebb8e24b440755431d13ecc3bc24b800875c1db0f6b30856fa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GDOLiteratureCrawler._publication_details", "path": "aggregator/gdo_literature_crawler.py", "line_start": 433, "line_end": 438, "inherited": false, "file_sha256": "0acff63fc05fb9ebb8e24b440755431d13ecc3bc24b800875c1db0f6b30856fa", "self_calls": [ "_clean_text" ], "literal_get_calls": [], "html_queries": [ { "line": 435, "expression": "clone.find_all(['i', 'small'])" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GDOLiteratureCrawler._record_from_nodes", "path": "aggregator/gdo_literature_crawler.py", "line_start": 393, "line_end": 431, "inherited": false, "file_sha256": "0acff63fc05fb9ebb8e24b440755431d13ecc3bc24b800875c1db0f6b30856fa", "self_calls": [ "_clean_text", "_publication_details" ], "literal_get_calls": [ { "line": 410, "receiver": "query", "key": "suchjahr", "expression": "query.get('suchjahr')" } ], "html_queries": [ { "line": 403, "expression": "dd.find('i')" }, { "line": 405, "expression": "dd.find_all('small')" } ], "dictionary_entries": [ { "line": 413, "key": "literature_id", "value_expression": "f'gdo-lit-{content_hash[:16]}'" }, { "line": 414, "key": "content_sha256", "value_expression": "content_hash" }, { "line": 415, "key": "query_year", "value_expression": "year_query" }, { "line": 416, "key": "author", "value_expression": "author" }, { "line": 417, "key": "title", "value_expression": "title" }, { "line": 418, "key": "citation_text", "value_expression": "citation_text" }, { "line": 419, "key": "publication_details", "value_expression": "publication_details" }, { "line": 420, "key": "publication_years", "value_expression": "sorted(set(re.findall('\\\\b(?:1[5-9]\\\\d{2}|20\\\\d{2})\\\\b', citation_text)))" }, { "line": 421, "key": "notes", "value_expression": "notes" }, { "line": 422, "key": "url", "value_expression": "SOURCE_DEFINITION['base_url']" }, { "line": 423, "key": "source_url", "value_expression": "SOURCE_DEFINITION['base_url']" }, { "line": 424, "key": "status", "value_expression": "'initiated'" }, { "line": 425, "key": "raw_html", "value_expression": "raw_html" }, { "line": 426, "key": "query", "value_expression": "dict(query)" }, { "line": 427, "key": "result_index", "value_expression": "result_index" }, { "line": 428, "key": "declared_total_records", "value_expression": "declared_total" }, { "line": 429, "key": "year_result_count", "value_expression": "found_count" }, { "line": 430, "key": "scraped_at", "value_expression": "datetime.now().isoformat(timespec='seconds')" } ], "subscript_assignments": [] }, { "symbol": "GDOLiteratureCrawler.crawl", "path": "aggregator/gdo_literature_crawler.py", "line_start": 83, "line_end": 130, "inherited": false, "file_sha256": "0acff63fc05fb9ebb8e24b440755431d13ecc3bc24b800875c1db0f6b30856fa", "self_calls": [ "_crawl_options", "_persist_cache_records", "_upsert_scrape_status", "_year_query_delay", "fetch_declared_total_records", "is_scrape_stop_requested", "mark_scrape_stopped", "search_year" ], "literal_get_calls": [ { "line": 85, "receiver": "kwargs", "key": "task_id", "expression": "kwargs.get('task_id')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [ { "line": 93, "value_line": 93, "key": "declared_total_records", "target_expression": "options['declared_total_records']", "value_expression": "declared_total" }, { "line": 112, "value_line": 112, "key": "declared_total_records", "target_expression": "record['declared_total_records']", "value_expression": "declared_total" }, { "line": 113, "value_line": 113, "key": "year_result_count", "target_expression": "record['year_result_count']", "value_expression": "found_count" } ] }, { "symbol": "GDOLiteratureCrawler.fetch_declared_total_records", "path": "aggregator/gdo_literature_crawler.py", "line_start": 145, "line_end": 153, "inherited": false, "file_sha256": "0acff63fc05fb9ebb8e24b440755431d13ecc3bc24b800875c1db0f6b30856fa", "self_calls": [ "_declared_total_from_html" ], "literal_get_calls": [ { "line": 147, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GDOLiteratureCrawler.normalized_batch_record", "path": "aggregator/gdo_literature_crawler.py", "line_start": 277, "line_end": 296, "inherited": false, "file_sha256": "0acff63fc05fb9ebb8e24b440755431d13ecc3bc24b800875c1db0f6b30856fa", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [ { "line": 290, "value_line": 290, "key": "transform_run_id", "target_expression": "identity['transform_run_id']", "value_expression": "process_id" }, { "line": 291, "value_line": 291, "key": "artifact_ids", "target_expression": "identity['artifact_ids']", "value_expression": "list(artifact_ids or [])" }, { "line": 293, "value_line": 293, "key": "url", "target_expression": "record.setdefault('source_snapshot', {})['url']", "value_expression": "source_url" }, { "line": 295, "value_line": 295, "key": "retrieved_at", "target_expression": "record.setdefault('source', {})['retrieved_at']", "value_expression": "retrieved_at" } ] }, { "symbol": "GDOLiteratureCrawler.parse_results_html", "path": "aggregator/gdo_literature_crawler.py", "line_start": 155, "line_end": 185, "inherited": false, "file_sha256": "0acff63fc05fb9ebb8e24b440755431d13ecc3bc24b800875c1db0f6b30856fa", "self_calls": [ "_clean_author", "_declared_total_from_html", "_found_count_from_html", "_record_from_nodes" ], "literal_get_calls": [], "html_queries": [ { "line": 159, "expression": "soup.find('dl')" }, { "line": 166, "expression": "dl.find_all(['dt', 'dd'], recursive=False)" } ], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GDOLiteratureCrawler.preflight_crawl", "path": "aggregator/gdo_literature_crawler.py", "line_start": 77, "line_end": 81, "inherited": false, "file_sha256": "0acff63fc05fb9ebb8e24b440755431d13ecc3bc24b800875c1db0f6b30856fa", "self_calls": [ "_years_from_options" ], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 81, "key": "ok", "value_expression": "True" }, { "line": 81, "key": "years", "value_expression": "years[:5]" }, { "line": 81, "key": "year_count", "value_expression": "len(years)" }, { "line": 80, "key": "ok", "value_expression": "False" }, { "line": 80, "key": "message", "value_expression": "'No valid year query could be built.'" } ], "subscript_assignments": [] }, { "symbol": "GDOLiteratureCrawler.scrape_row_to_transfer_record", "path": "aggregator/gdo_literature_crawler.py", "line_start": 259, "line_end": 275, "inherited": false, "file_sha256": "0acff63fc05fb9ebb8e24b440755431d13ecc3bc24b800875c1db0f6b30856fa", "self_calls": [], "literal_get_calls": [ { "line": 268, "receiver": "payload", "key": "raw_data_json", "expression": "payload.get('raw_data_json')" }, { "line": 272, "receiver": "raw_payload", "key": "raw_html", "expression": "raw_payload.get('raw_html')" }, { "line": 272, "receiver": "raw_payload", "key": "citation_text", "expression": "raw_payload.get('citation_text')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GDOLiteratureCrawler.transform", "path": "aggregator/gdo_literature_crawler.py", "line_start": 187, "line_end": 203, "inherited": false, "file_sha256": "0acff63fc05fb9ebb8e24b440755431d13ecc3bc24b800875c1db0f6b30856fa", "self_calls": [], "literal_get_calls": [ { "line": 189, "receiver": "payload", "key": "raw_data_json", "expression": "payload.get('raw_data_json')" }, { "line": 201, "receiver": "payload", "key": "crawl_run_id", "expression": "payload.get('crawl_run_id')" }, { "line": 202, "receiver": "payload", "key": "transform_run_id", "expression": "payload.get('transform_run_id')" }, { "line": 200, "receiver": "payload", "key": "raw_html", "expression": "payload.get('raw_html')" }, { "line": 200, "receiver": "payload", "key": "citation_text", "expression": "payload.get('citation_text')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] } ], "selected_rule_rows": [ { "symbol": "GDOLiteratureCrawler.transform", "path": "aggregator/gdo_literature_crawler.py", "key": "raw_data_json", "value_expression": "payload.get('raw_data_json')", "line": 189, "kind": "input read" }, { "symbol": "GDOLiteratureCrawler.transform", "path": "aggregator/gdo_literature_crawler.py", "key": "crawl_run_id", "value_expression": "payload.get('crawl_run_id')", "line": 201, "kind": "input read" }, { "symbol": "GDOLiteratureCrawler.transform", "path": "aggregator/gdo_literature_crawler.py", "key": "transform_run_id", "value_expression": "payload.get('transform_run_id')", "line": 202, "kind": "input read" }, { "symbol": "GDOLiteratureCrawler.transform", "path": "aggregator/gdo_literature_crawler.py", "key": "raw_html", "value_expression": "payload.get('raw_html')", "line": 200, "kind": "input read" }, { "symbol": "GDOLiteratureCrawler.transform", "path": "aggregator/gdo_literature_crawler.py", "key": "citation_text", "value_expression": "payload.get('citation_text')", "line": 200, "kind": "input read" }, { "symbol": "GDOLiteratureCrawler.crawl", "path": "aggregator/gdo_literature_crawler.py", "key": "task_id", "value_expression": "kwargs.get('task_id')", "line": 85, "kind": "input read" } ], "bounded_code_passages": [ { "path": "aggregator/gdo_literature_crawler.py", "symbol": "GDOLiteratureCrawler.transform", "line_start": 187, "line_end": 194, "text": " def transform(self, raw_data: Dict[str, Any]) -> Dict[str, Any]:\n payload = dict(raw_data or {})\n raw_json = payload.get(\"raw_data_json\")\n if isinstance(raw_json, str) and raw_json.strip():\n try:\n decoded = json.loads(raw_json)\n if isinstance(decoded, dict):\n decoded.update({key: value for key, value in payload.items() if value not in (None, \"\")})" }, { "path": "aggregator/gdo_literature_crawler.py", "symbol": "GDOLiteratureCrawler.transform", "line_start": 198, "line_end": 203, "text": " return normalize_gdo_literature_record(\n payload,\n raw_content=payload.get(\"raw_html\") or payload.get(\"citation_text\") or \"\",\n crawl_run_id=payload.get(\"crawl_run_id\"),\n transform_run_id=payload.get(\"transform_run_id\"),\n )" }, { "path": "aggregator/gdo_literature_crawler.py", "symbol": "GDOLiteratureCrawler.transform", "line_start": 199, "line_end": 203, "text": " payload,\n raw_content=payload.get(\"raw_html\") or payload.get(\"citation_text\") or \"\",\n crawl_run_id=payload.get(\"crawl_run_id\"),\n transform_run_id=payload.get(\"transform_run_id\"),\n )" }, { "path": "aggregator/gdo_literature_crawler.py", "symbol": "GDOLiteratureCrawler.transform", "line_start": 197, "line_end": 203, "text": " pass\n return normalize_gdo_literature_record(\n payload,\n raw_content=payload.get(\"raw_html\") or payload.get(\"citation_text\") or \"\",\n crawl_run_id=payload.get(\"crawl_run_id\"),\n transform_run_id=payload.get(\"transform_run_id\"),\n )" }, { "path": "aggregator/gdo_literature_crawler.py", "symbol": "GDOLiteratureCrawler.crawl", "line_start": 83, "line_end": 90, "text": " def crawl(self, target: Any = None, **kwargs) -> List[Dict[str, Any]]:\n options = self._crawl_options(target, kwargs)\n task_id = kwargs.get(\"task_id\")\n years = options[\"years\"]\n total_steps = max(1, len(years))\n self._upsert_scrape_status(task_id, \"RUNNING\", \"Starting GDO literature crawl.\", 0, total_steps)\n\n records_by_id: Dict[str, Dict[str, Any]] = {}" } ] } }, { "catalogue_id": "S011", "source_key": "gdo_orgelbauer_links", "name": "GdO Orgelbauer Links", "selection_role": "registered_source", "parent_source_key": null, "attribution": "Gesellschaft der Orgelfreunde", "scope_description": "International organ-building directory grouped by country", "documentary_unit": "Directory link to a builder, supplier or association", "source_description": "The directory includes both individual firms and organ-building associations. Country headings organise the links. A firm's name and destination website form useful identifying evidence, while association links describe a different type of organisation.", "source_description_references": [ "gdo_orgelbauer_links" ], "interpretation": "A directory appearance does not establish current trading status, legal continuity or responsibility for a historical instrument. Those questions require the destination's own records and dated construction evidence.", "rights_observation": "The directory carries a society copyright notice; no general open licence was established.", "rights_observation_basis": "Report of the pages consulted on 10 September 2026; not a determination of legal entitlement or a complete licence audit.", "references": [ "gdo_orgelbauer_links" ], "observation_date": "2026-09-10", "atlas_editorial_reading": { "evidence_kind": "code_reading_and_interpretation", "acquisition": "The crawler treats an outbound directory link and its heading path as the acquisition unit. Link text, directory URL and target website are preserved separately.", "transformation": "Normalization constructs an institution-directory entry, retains display label, country, locality hint and heading position, and supplies a derived identifier when necessary. The linked institution site is recorded as a candidate for later enrichment. That intended later work is not already part of the directory evidence.", "limitations": "Directory grouping does not prove an institution's legal identity, foundation date or present operation. A website URL and an organisation are different entities. Default organ-builder classification follows the directory context and should not silently become an independently verified occupation." }, "implementation": { "class": "GDOOrgelbauerLinksCrawler", "class_line": 30, "path": "aggregator/gdo_orgelbauer_links_crawler.py", "inheritance": [ "GDOOrgelbauerLinksCrawler", "BaseCrawler" ], "configuration": { "transformed_json_id_column": { "value": "institution_id", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "line": 38, "class": "GDOOrgelbauerLinksCrawler" }, "record_label": { "value": "institution records", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "line": 39, "class": "GDOOrgelbauerLinksCrawler" } }, "methods": [ { "symbol": "GDOOrgelbauerLinksCrawler._fetch_html", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "line_start": 134, "line_end": 137, "inherited": false, "file_sha256": "30f4304bde50591faeaad6b6beb79421129cd4a26bef4800a299dc1810300c5d", "self_calls": [], "literal_get_calls": [ { "line": 135, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GDOOrgelbauerLinksCrawler._normalize_url", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "line_start": 501, "line_end": 507, "inherited": false, "file_sha256": "30f4304bde50591faeaad6b6beb79421129cd4a26bef4800a299dc1810300c5d", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GDOOrgelbauerLinksCrawler.crawl", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "line_start": 113, "line_end": 132, "inherited": false, "file_sha256": "30f4304bde50591faeaad6b6beb79421129cd4a26bef4800a299dc1810300c5d", "self_calls": [ "_fetch_html", "_persist_cache_records", "_upsert_scrape_status", "parse_directory_html" ], "literal_get_calls": [ { "line": 114, "receiver": "kwargs", "key": "task_id", "expression": "kwargs.get('task_id')" }, { "line": 115, "receiver": "kwargs", "key": "url", "expression": "kwargs.get('url')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GDOOrgelbauerLinksCrawler.normalized_batch_record", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "line_start": 274, "line_end": 295, "inherited": false, "file_sha256": "30f4304bde50591faeaad6b6beb79421129cd4a26bef4800a299dc1810300c5d", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [ { "line": 287, "value_line": 287, "key": "transform_run_id", "target_expression": "identity['transform_run_id']", "value_expression": "process_id" }, { "line": 288, "value_line": 288, "key": "artifact_ids", "target_expression": "identity['artifact_ids']", "value_expression": "list(artifact_ids or [])" }, { "line": 291, "value_line": 291, "key": "url", "target_expression": "source_snapshot['url']", "value_expression": "source_url" }, { "line": 292, "value_line": 292, "key": "source_url", "target_expression": "source_snapshot['source_url']", "value_expression": "source_url" }, { "line": 294, "value_line": 294, "key": "retrieved_at", "target_expression": "record.setdefault('source', {})['retrieved_at']", "value_expression": "retrieved_at" } ] }, { "symbol": "GDOOrgelbauerLinksCrawler.parse_directory_html", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "line_start": 139, "line_end": 185, "inherited": false, "file_sha256": "30f4304bde50591faeaad6b6beb79421129cd4a26bef4800a299dc1810300c5d", "self_calls": [ "_classify_institution", "_clean_text", "_context_for_link", "_is_outbound_institution_url", "_normalize_url", "_split_name_locality" ], "literal_get_calls": [ { "line": 147, "receiver": "link", "key": "href", "expression": "link.get('href')" } ], "html_queries": [ { "line": 144, "expression": "content.find_all('a', href=True)" }, { "line": 141, "expression": "soup.find(id='c3075')" }, { "line": 141, "expression": "soup.find('main')" } ], "dictionary_entries": [ { "line": 165, "key": "institution_id", "value_expression": "institution_id" }, { "line": 166, "key": "content_sha256", "value_expression": "content_hash" }, { "line": 167, "key": "name", "value_expression": "name" }, { "line": 168, "key": "link_text", "value_expression": "link_text" }, { "line": 169, "key": "institution_type", "value_expression": "self._classify_institution(link_text)" }, { "line": 170, "key": "country", "value_expression": "country" }, { "line": 171, "key": "locality_hint", "value_expression": "locality_hint" }, { "line": 172, "key": "website_url", "value_expression": "normalized_url" }, { "line": 173, "key": "website_host", "value_expression": "urlsplit(normalized_url).netloc.lower()" }, { "line": 174, "key": "directory_url", "value_expression": "page_url" }, { "line": 175, "key": "source_url", "value_expression": "page_url" }, { "line": 176, "key": "section_id", "value_expression": "section_id" }, { "line": 177, "key": "heading_path", "value_expression": "heading_path" }, { "line": 178, "key": "position", "value_expression": "len(records) + 1" }, { "line": 179, "key": "status", "value_expression": "'initiated'" }, { "line": 180, "key": "raw_html", "value_expression": "str(link)" }, { "line": 181, "key": "raw_link_html", "value_expression": "str(link)" }, { "line": 182, "key": "scraped_at", "value_expression": "datetime.now().isoformat(timespec='seconds')" } ], "subscript_assignments": [] }, { "symbol": "GDOOrgelbauerLinksCrawler.preflight_crawl", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "line_start": 110, "line_end": 111, "inherited": false, "file_sha256": "30f4304bde50591faeaad6b6beb79421129cd4a26bef4800a299dc1810300c5d", "self_calls": [], "literal_get_calls": [ { "line": 111, "receiver": "task_kwargs", "key": "url", "expression": "task_kwargs.get('url')" } ], "html_queries": [], "dictionary_entries": [ { "line": 111, "key": "ok", "value_expression": "True" }, { "line": 111, "key": "url", "value_expression": "str(task_kwargs.get('url') or SOURCE_DEFINITION['base_url'])" } ], "subscript_assignments": [] }, { "symbol": "GDOOrgelbauerLinksCrawler.scrape_row_to_transfer_record", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "line_start": 255, "line_end": 272, "inherited": false, "file_sha256": "30f4304bde50591faeaad6b6beb79421129cd4a26bef4800a299dc1810300c5d", "self_calls": [], "literal_get_calls": [ { "line": 264, "receiver": "payload", "key": "raw_data_json", "expression": "payload.get('raw_data_json')" }, { "line": 269, "receiver": "raw_payload", "key": "raw_html", "expression": "raw_payload.get('raw_html')" }, { "line": 269, "receiver": "raw_payload", "key": "raw_link_html", "expression": "raw_payload.get('raw_link_html')" }, { "line": 269, "receiver": "raw_payload", "key": "link_text", "expression": "raw_payload.get('link_text')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GDOOrgelbauerLinksCrawler.transform", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "line_start": 187, "line_end": 211, "inherited": false, "file_sha256": "30f4304bde50591faeaad6b6beb79421129cd4a26bef4800a299dc1810300c5d", "self_calls": [], "literal_get_calls": [ { "line": 189, "receiver": "payload", "key": "raw_data_json", "expression": "payload.get('raw_data_json')" }, { "line": 198, "receiver": "payload", "key": "heading_path", "expression": "payload.get('heading_path')" }, { "line": 209, "receiver": "payload", "key": "crawl_run_id", "expression": "payload.get('crawl_run_id')" }, { "line": 210, "receiver": "payload", "key": "transform_run_id", "expression": "payload.get('transform_run_id')" }, { "line": 208, "receiver": "payload", "key": "raw_html", "expression": "payload.get('raw_html')" }, { "line": 208, "receiver": "payload", "key": "raw_link_html", "expression": "payload.get('raw_link_html')" }, { "line": 208, "receiver": "payload", "key": "link_text", "expression": "payload.get('link_text')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [ { "line": 202, "value_line": 202, "key": "heading_path", "target_expression": "payload['heading_path']", "value_expression": "heading_path" }, { "line": 204, "value_line": 204, "key": "heading_path", "target_expression": "payload['heading_path']", "value_expression": "[payload['heading_path']]" } ] } ], "selected_rule_rows": [ { "symbol": "GDOOrgelbauerLinksCrawler.parse_directory_html", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "line": 170, "key": "country", "value_expression": "country" }, { "symbol": "GDOOrgelbauerLinksCrawler.transform", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "key": "raw_data_json", "value_expression": "payload.get('raw_data_json')", "line": 189, "kind": "input read" }, { "symbol": "GDOOrgelbauerLinksCrawler.transform", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "key": "heading_path", "value_expression": "payload.get('heading_path')", "line": 198, "kind": "input read" }, { "symbol": "GDOOrgelbauerLinksCrawler.transform", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "key": "crawl_run_id", "value_expression": "payload.get('crawl_run_id')", "line": 209, "kind": "input read" }, { "symbol": "GDOOrgelbauerLinksCrawler.transform", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "key": "transform_run_id", "value_expression": "payload.get('transform_run_id')", "line": 210, "kind": "input read" }, { "symbol": "GDOOrgelbauerLinksCrawler.transform", "path": "aggregator/gdo_orgelbauer_links_crawler.py", "key": "raw_html", "value_expression": "payload.get('raw_html')", "line": 208, "kind": "input read" } ], "bounded_code_passages": [ { "path": "aggregator/gdo_orgelbauer_links_crawler.py", "symbol": "GDOOrgelbauerLinksCrawler.parse_directory_html", "line_start": 167, "line_end": 175, "text": " \"name\": name,\n \"link_text\": link_text,\n \"institution_type\": self._classify_institution(link_text),\n \"country\": country,\n \"locality_hint\": locality_hint,\n \"website_url\": normalized_url,\n \"website_host\": urlsplit(normalized_url).netloc.lower(),\n \"directory_url\": page_url,\n \"source_url\": page_url," }, { "path": "aggregator/gdo_orgelbauer_links_crawler.py", "symbol": "GDOOrgelbauerLinksCrawler.transform", "line_start": 187, "line_end": 194, "text": " def transform(self, raw_data: Dict[str, Any]) -> Dict[str, Any]:\n payload = dict(raw_data or {})\n raw_json = payload.get(\"raw_data_json\")\n if isinstance(raw_json, str) and raw_json.strip():\n try:\n decoded = json.loads(raw_json)\n if isinstance(decoded, dict):\n decoded.update({key: value for key, value in payload.items() if value not in (None, \"\")})" }, { "path": "aggregator/gdo_orgelbauer_links_crawler.py", "symbol": "GDOOrgelbauerLinksCrawler.transform", "line_start": 195, "line_end": 203, "text": " payload = decoded\n except json.JSONDecodeError:\n pass\n if isinstance(payload.get(\"heading_path\"), str):\n try:\n heading_path = json.loads(payload[\"heading_path\"])\n if isinstance(heading_path, list):\n payload[\"heading_path\"] = heading_path\n except json.JSONDecodeError:" }, { "path": "aggregator/gdo_orgelbauer_links_crawler.py", "symbol": "GDOOrgelbauerLinksCrawler.transform", "line_start": 206, "line_end": 211, "text": " payload,\n source_definition=SOURCE_DEFINITION,\n raw_content=payload.get(\"raw_html\") or payload.get(\"raw_link_html\") or payload.get(\"link_text\") or \"\",\n crawl_run_id=payload.get(\"crawl_run_id\"),\n transform_run_id=payload.get(\"transform_run_id\"),\n )" }, { "path": "aggregator/gdo_orgelbauer_links_crawler.py", "symbol": "GDOOrgelbauerLinksCrawler.transform", "line_start": 207, "line_end": 211, "text": " source_definition=SOURCE_DEFINITION,\n raw_content=payload.get(\"raw_html\") or payload.get(\"raw_link_html\") or payload.get(\"link_text\") or \"\",\n crawl_run_id=payload.get(\"crawl_run_id\"),\n transform_run_id=payload.get(\"transform_run_id\"),\n )" }, { "path": "aggregator/gdo_orgelbauer_links_crawler.py", "symbol": "GDOOrgelbauerLinksCrawler.transform", "line_start": 205, "line_end": 211, "text": " return normalize_institution_directory_record(\n payload,\n source_definition=SOURCE_DEFINITION,\n raw_content=payload.get(\"raw_html\") or payload.get(\"raw_link_html\") or payload.get(\"link_text\") or \"\",\n crawl_run_id=payload.get(\"crawl_run_id\"),\n transform_run_id=payload.get(\"transform_run_id\"),\n )" } ] } }, { "catalogue_id": "S012", "source_key": "grandorgue_github_wiki", "name": "GrandOrgue GitHub Wiki: Sample Sets", "selection_role": "registered_source", "parent_source_key": null, "attribution": "GrandOrgue project contributors", "scope_description": "GrandOrgue resources across multiple producers", "documentary_unit": "Sample-set or organ-definition-file directory entry", "source_description": "The wiki separates free or demonstration sample sets from organ definition files for commercial recordings. It names external hosts, including Lars Palo, MPS Orgelseite and Virtual Pipe Organs, and tells readers to consult individual licences.", "source_description_references": [ "grandorgue_github_wiki" ], "interpretation": "Several Aggregator keys describe resources also listed here. These are multiple discovery paths, not independent sample-set populations. A wiki revision is preferable to an undated link when recording changes in availability.", "rights_observation": "Individual sample-set and ODF licences apply; the software project's licence is not evidence of the audio's licence.", "rights_observation_basis": "Report of the pages consulted on 10 September 2026; not a determination of legal entitlement or a complete licence audit.", "references": [ "grandorgue_github_wiki" ], "observation_date": "2026-09-10", "atlas_editorial_reading": { "evidence_kind": "code_reading_and_interpretation", "acquisition": "The source-specific parser selects wiki heading hierarchy and list/paragraph nodes inside the wiki or Markdown body. The library family can enrich discovered items from linked detail pages; catalogue and detail capture are distinct operations.", "transformation": "The implemented unit is heading context and individual list entries. parse_html produces a collection of item records; the common transform wraps them in a vmi_library_batch. Source fragments, item identity, links and product context are passed to the VMI normalizer. The exact selectors and constructed fields are enumerated in the technical evidence register. The native wording remains necessary to distinguish a producer, a product, a version and the organ represented.", "limitations": "Nested lists and headings can describe producers, licences or requirements rather than independent sample sets. The existence of a parser is not a fresh check of the live catalogue, and a parsed link is not evidence that its downloadable content was inspected." }, "implementation": { "class": "GrandOrgueGitHubWikiCrawler", "class_line": 512, "path": "aggregator/grandorgue_library_crawler.py", "inheritance": [ "GrandOrgueGitHubWikiCrawler", "GrandOrgueLibraryCrawler", "BaseCrawler" ], "configuration": { "source_key": { "value": "grandorgue_github_wiki", "path": "aggregator/grandorgue_library_crawler.py", "line": 513, "class": "GrandOrgueGitHubWikiCrawler" }, "catalog_url": { "value": "", "path": "aggregator/grandorgue_library_crawler.py", "line": 34, "class": "GrandOrgueLibraryCrawler" }, "catalog_kind": { "value": "registry", "path": "aggregator/grandorgue_library_crawler.py", "line": 515, "class": "GrandOrgueGitHubWikiCrawler" }, "cache_source_key_column": { "value": "source_key", "path": "aggregator/grandorgue_library_crawler.py", "line": 40, "class": "GrandOrgueLibraryCrawler" }, "final_source_key_column": { "value": "source_key", "path": "aggregator/grandorgue_library_crawler.py", "line": 41, "class": "GrandOrgueLibraryCrawler" }, "transformed_json_id_column": { "value": "item_id", "path": "aggregator/grandorgue_library_crawler.py", "line": 42, "class": "GrandOrgueLibraryCrawler" } }, "methods": [ { "symbol": "GrandOrgueLibraryCrawler._append_detail_document", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 276, "line_end": 306, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 284, "receiver": "record.get('provenance', {})", "key": "identity", "expression": "record.get('provenance', {}).get('identity', {})" }, { "line": 285, "receiver": "identity", "key": "primary_id_value", "expression": "identity.get('primary_id_value')" }, { "line": 286, "receiver": "record.get('source', {})", "key": "retrieved_at", "expression": "record.get('source', {}).get('retrieved_at')" }, { "line": 284, "receiver": "record", "key": "provenance", "expression": "record.get('provenance', {})" }, { "line": 286, "receiver": "record", "key": "source", "expression": "record.get('source', {})" }, { "line": 300, "receiver": "doc", "key": "document_id", "expression": "doc.get('document_id')" } ], "html_queries": [], "dictionary_entries": [ { "line": 288, "key": "document_id", "value_expression": "provenance.document_id(self.source_key, f'{primary_id}:detail', 'raw_html')" }, { "line": 289, "key": "document_kind", "value_expression": "'raw_html'" }, { "line": 290, "key": "content_sha256", "value_expression": "provenance.content_sha256(detail_html)" }, { "line": 291, "key": "content_size_bytes", "value_expression": "len(detail_html.encode('utf-8'))" }, { "line": 292, "key": "content_type", "value_expression": "'text/html'" }, { "line": 293, "key": "url", "value_expression": "detail_url" }, { "line": 294, "key": "retrieved_at", "value_expression": "retrieved_at" }, { "line": 295, "key": "crawl_run_id", "value_expression": "crawl_run_id or ''" }, { "line": 296, "key": "raw_content", "value_expression": "detail_html" } ], "subscript_assignments": [ { "line": 302, "value_line": 302, "key": "detail_page_crawled", "target_expression": "record.setdefault('extensions', {})['detail_page_crawled']", "value_expression": "True" }, { "line": 304, "value_line": 304, "key": "access_model_hint", "target_expression": "record.setdefault('item', {})['access_model_hint']", "value_expression": "'registration_required'" }, { "line": 305, "value_line": 305, "key": "availability_status_hint", "target_expression": "record.setdefault('item', {})['availability_status_hint']", "value_expression": "'available_with_registration'" } ] }, { "symbol": "GrandOrgueLibraryCrawler._apply_detail_html", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 308, "line_end": 309, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler._detail_url_for_record", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 259, "line_end": 274, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 261, "receiver": "record", "key": "links", "expression": "record.get('links')" }, { "line": 270, "receiver": "link", "key": "is_download_candidate", "expression": "link.get('is_download_candidate')" }, { "line": 272, "receiver": "link", "key": "is_product_homepage_candidate", "expression": "link.get('is_product_homepage_candidate')" }, { "line": 264, "receiver": "link", "key": "normalized_url", "expression": "link.get('normalized_url')" }, { "line": 264, "receiver": "link", "key": "url", "expression": "link.get('url')" }, { "line": 272, "receiver": "link", "key": "rel", "expression": "link.get('rel')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler._enrich_records_with_detail_pages", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 213, "line_end": 257, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_append_detail_document", "_apply_detail_html", "_detail_url_for_record" ], "literal_get_calls": [ { "line": 219, "receiver": "self.config", "key": "crawl_detail_pages", "expression": "self.config.get('crawl_detail_pages')" }, { "line": 225, "receiver": "self.config", "key": "max_detail_pages", "expression": "self.config.get('max_detail_pages', 0)" }, { "line": 243, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" } ], "html_queries": [], "dictionary_entries": [ { "line": 222, "key": "detail_page_enrichment_enabled", "value_expression": "False" }, { "line": 222, "key": "detail_page_fetched", "value_expression": "False" } ], "subscript_assignments": [ { "line": 230, "value_line": 230, "key": "detail_page_enrichment_enabled", "target_expression": "completeness['detail_page_enrichment_enabled']", "value_expression": "True" }, { "line": 255, "value_line": 255, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "True" }, { "line": 232, "value_line": 232, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 233, "value_line": 233, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'configured_detail_page_limit'" }, { "line": 238, "value_line": 238, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 239, "value_line": 239, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'no_detail_url_discovered'" }, { "line": 247, "value_line": 247, "key": "detail_page_fetched", "target_expression": "completeness['detail_page_fetched']", "value_expression": "False" }, { "line": 248, "value_line": 248, "key": "detail_page_omission_reason", "target_expression": "completeness['detail_page_omission_reason']", "value_expression": "'fetch_failed'" } ] }, { "symbol": "GrandOrgueLibraryCrawler._record", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 311, "line_end": 341, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [], "literal_get_calls": [ { "line": 326, "receiver": "payload", "key": "catalog", "expression": "payload.get('catalog')" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [ { "line": 330, "value_line": 330, "key": "catalog", "target_expression": "payload['catalog']", "value_expression": "catalog" } ] }, { "symbol": "GrandOrgueLibraryCrawler.crawl", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 86, "line_end": 136, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_enrich_records_with_detail_pages", "_fail_shared_crawl_run", "_finish_shared_crawl_run", "_register_shared_crawl_target", "_upsert_scrape_status", "parse_html" ], "literal_get_calls": [ { "line": 88, "receiver": "kwargs", "key": "task_id", "expression": "kwargs.get('task_id')" }, { "line": 89, "receiver": "kwargs", "key": "run_id", "expression": "kwargs.get('run_id')" }, { "line": 87, "receiver": "kwargs", "key": "url", "expression": "kwargs.get('url')" }, { "line": 91, "receiver": "self.config", "key": "timeout", "expression": "self.config.get('timeout', 30)" }, { "line": 121, "receiver": "record.get('item', {})", "key": "title", "expression": "record.get('item', {}).get('title')" }, { "line": 122, "receiver": "record.get('source_snapshot', {})", "key": "url", "expression": "record.get('source_snapshot', {}).get('url')" }, { "line": 124, "receiver": "record.get('extensions', {})", "key": "source_fragment_html", "expression": "record.get('extensions', {}).get('source_fragment_html')" }, { "line": 121, "receiver": "record", "key": "item", "expression": "record.get('item', {})" }, { "line": 122, "receiver": "record", "key": "source_snapshot", "expression": "record.get('source_snapshot', {})" }, { "line": 124, "receiver": "record", "key": "extensions", "expression": "record.get('extensions', {})" } ], "html_queries": [], "dictionary_entries": [], "subscript_assignments": [] }, { "symbol": "GrandOrgueGitHubWikiCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 517, "line_end": 573, "inherited": false, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "_record" ], "literal_get_calls": [], "html_queries": [ { "line": 523, "expression": "scope.select('h1, h2, h3, li, p')" }, { "line": 519, "expression": "soup.select_one('#wiki-body')" }, { "line": 519, "expression": "soup.select_one('.markdown-body')" }, { "line": 534, "expression": "node.find('ul')" } ], "dictionary_entries": [ { "line": 549, "key": "catalog", "value_expression": "{'section_label': current_section, 'position': position}" }, { "line": 550, "key": "item", "value_expression": "{'title': title, 'description_excerpt': text, 'access_model_hint': 'free_or_demo' if 'free' in lower or 'demo' in lower else ''}" }, { "line": 555, "key": "package", "value_expression": "{'package_title': title, 'package_kind': 'odf' if is_odf else 'registry_entry', 'requires_sample_set': is_odf, 'is_odf_only': is_odf, 'requires_commercial_sample_set': is_odf and 'commercial' in lower}" }, { "line": 562, "key": "links", "value_expression": "links" }, { "line": 563, "key": "extensions", "value_expression": "{'source_fragment_html': str(node)}" }, { "line": 549, "key": "section_label", "value_expression": "current_section" }, { "line": 549, "key": "position", "value_expression": "position" }, { "line": 551, "key": "title", "value_expression": "title" }, { "line": 552, "key": "description_excerpt", "value_expression": "text" }, { "line": 553, "key": "access_model_hint", "value_expression": "'free_or_demo' if 'free' in lower or 'demo' in lower else ''" }, { "line": 556, "key": "package_title", "value_expression": "title" }, { "line": 557, "key": "package_kind", "value_expression": "'odf' if is_odf else 'registry_entry'" }, { "line": 558, "key": "requires_sample_set", "value_expression": "is_odf" }, { "line": 559, "key": "is_odf_only", "value_expression": "is_odf" }, { "line": 560, "key": "requires_commercial_sample_set", "value_expression": "is_odf and 'commercial' in lower" }, { "line": 563, "key": "source_fragment_html", "value_expression": "str(node)" } ], "subscript_assignments": [] }, { "symbol": "GrandOrgueLibraryCrawler.transform", "path": "aggregator/grandorgue_library_crawler.py", "line_start": 138, "line_end": 156, "inherited": true, "file_sha256": "8654fc0b5874b2b520ce43cef5c43fd65c03c97307b1b39fbc1acca68adc4b65", "self_calls": [ "parse_html" ], "literal_get_calls": [ { "line": 139, "receiver": "raw_data", "key": "html", "expression": "raw_data.get('html')" }, { "line": 139, "receiver": "raw_data", "key": "raw_html", "expression": "raw_data.get('raw_html')" }, { "line": 139, "receiver": "raw_data", "key": "markdown", "expression": "raw_data.get('markdown')" }, { "line": 140, "receiver": "raw_data", "key": "url", "expression": "raw_data.get('url')" }, { "line": 140, "receiver": "raw_data", "key": "source_url", "expression": "raw_data.get('source_url')" }, { "line": 144, "receiver": "raw_data", "key": "crawl_run_id", "expression": "raw_data.get('crawl_run_id')" }, { "line": 145, "receiver": "raw_data", "key": "transform_run_id", "expression": "raw_data.get('transform_run_id')" } ], "html_queries": [], "dictionary_entries": [ { "line": 148, "key": "record_type", "value_expression": "'vmi_library_batch'" }, { "line": 149, "key": "source", "value_expression": "{'key': self.source_key, 'display_name': self.source_display_name, 'base_url': self.catalog_url, 'type': self.source_type}" }, { "line": 155, "key": "records", "value_expression": "records" }, { "line": 150, "key": "key", "value_expression": "self.source_key" }, { "line": 151, "key": "display_name", "value_expression": "self.source_display_name" }, { "line": 152, "key": "base_url", "value_expression": "self.catalog_url" }, { "line": 153, "key": "type", "value_expression": "self.source_type" } ], "subscript_assignments": [] } ], "selected_rule_rows": [ { "symbol": "GrandOrgueLibraryCrawler.transform", "path": "aggregator/grandorgue_library_crawler.py", "line": 148, "key": "record_type", "value_expression": "'vmi_library_batch'" }, { "symbol": "GrandOrgueGitHubWikiCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 557, "key": "package_kind", "value_expression": "'odf' if is_odf else 'registry_entry'" }, { "symbol": "GrandOrgueGitHubWikiCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 558, "key": "requires_sample_set", "value_expression": "is_odf" }, { "symbol": "GrandOrgueGitHubWikiCrawler.parse_html", "path": "aggregator/grandorgue_library_crawler.py", "line": 559, "key": "is_odf_only", "value_expression": "is_odf" } ], "bounded_code_passages": [ { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "GrandOrgueLibraryCrawler.transform", "line_start": 145, "line_end": 153, "text": " transform_run_id=raw_data.get(\"transform_run_id\"),\n )\n return {\n \"record_type\": \"vmi_library_batch\",\n \"source\": {\n \"key\": self.source_key,\n \"display_name\": self.source_display_name,\n \"base_url\": self.catalog_url,\n \"type\": self.source_type," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "GrandOrgueGitHubWikiCrawler.parse_html", "line_start": 554, "line_end": 562, "text": " },\n \"package\": {\n \"package_title\": title,\n \"package_kind\": \"odf\" if is_odf else \"registry_entry\",\n \"requires_sample_set\": is_odf,\n \"is_odf_only\": is_odf,\n \"requires_commercial_sample_set\": is_odf and \"commercial\" in lower,\n },\n \"links\": links," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "GrandOrgueGitHubWikiCrawler.parse_html", "line_start": 555, "line_end": 563, "text": " \"package\": {\n \"package_title\": title,\n \"package_kind\": \"odf\" if is_odf else \"registry_entry\",\n \"requires_sample_set\": is_odf,\n \"is_odf_only\": is_odf,\n \"requires_commercial_sample_set\": is_odf and \"commercial\" in lower,\n },\n \"links\": links,\n \"extensions\": {\"source_fragment_html\": str(node)}," }, { "path": "aggregator/grandorgue_library_crawler.py", "symbol": "GrandOrgueGitHubWikiCrawler.parse_html", "line_start": 556, "line_end": 564, "text": " \"package_title\": title,\n \"package_kind\": \"odf\" if is_odf else \"registry_entry\",\n \"requires_sample_set\": is_odf,\n \"is_odf_only\": is_odf,\n \"requires_commercial_sample_set\": is_odf and \"commercial\" in lower,\n },\n \"links\": links,\n \"extensions\": {\"source_fragment_html\": str(node)},\n }," } ] } }, { "catalogue_id": "S013", "source_key": "indo", "name": "INdO", "selection_role": "registered_source", "parent_source_key": null, "attribution": "Orgue en France", "scope_description": "France, including overseas departments and territories in the search interface", "documentary_unit": "Organ record with history and technical description", "source_description": "Orgue en France develops and maintains the collaborative national inventory, supported by the French Ministry of Culture since 2017. The site opened to public contributions in 2021 and describes its purpose as extending earlier departmental and regional inventories.", "source_description_references": [ "indo", "record_indo" ], "interpretation": "Existing and disappeared instruments are separate categories. Construction, rebuilding and current condition need their own dates and attributions. An inventory entry's completion state is distinct from the physical condition of the organ.", "rights_observation": "The consulted editorial page did not establish a single licence covering records, photographs and attachments.", "rights_observation_basis": "Report of the pages consulted on 10 September 2026; not a determination of legal entitlement or a complete licence audit.", "references": [ "indo", "record_indo" ], "observation_date": "2026-09-10", "selected_document": { "reference": "record_indo", "observation_date": "2026-09-11", "selection": "Inherited dossier example; the Orgelseite list was an additional page reached from its homepage. No representative sample is claimed.", "native_form": "Structured organ profile with linked authority records and contribution history", "repeated_information": "Sound divisions contain stops and compasses. Builder activities repeat with roles and dates.", "date_and_state_distinctions": "Construction and restoration dates are distinct from the page revision and contributor history.", "interpretive_limit": "Visible headings do not guarantee values. The examined barrel-organ record has no ordinary pedal division.", "observations": [ "Building, town, department and position within the building are populated.", "The organ profile links to a location map.", "Builder and restorer entries have roles and dates.", "Construction, restoration and modification activities are listed.", "Eight named stops with pitches in the selected manual division.", "Manual compass and note count are supplied.", "Key and stop actions and windchest description are populated.", "Temperament and pitch include a temperature-qualified measurement.", "The bellows/reservoir arrangement is described.", "Case and console have separate descriptions.", "Playability and ownership are stated, with heritage-protection identifiers.", "The record contains linked instrument images.", "Bibliographic sources and a linked documentary extract are identified.", "National heritage identifiers and builder-record links are present.", "Update date, named contributor and contribution history are displayed." ], "uninspected_or_unfilled_material": [], "narrative": "The Airvault barrel-organ record separates location, builder activities, technical description, sources and contribution history. It gives one manual division, a compass and note count, tuning information, a bellows description and heritage identifiers. It has no ordinary pedal division. That feature belongs to this instrument and cannot be interpreted as a missing-data rate for the national inventory." }, "atlas_editorial_reading": { "evidence_kind": "code_reading_and_interpretation", "acquisition": "The adapter acquires inventory detail pages and uses the cached town/building information as a fallback when the rendered heading does not supply it.", "transformation": "Composition cards are grouped by keyboard or pedal; their list items become source stop strings. Card headings determine the group names and a pedal-text test determines the branch. Location is read from the page heading and locality links. Timeline/history and media information are handled separately from the composition cards. Later offline attribution helpers operate on preserved evidence and are not evidence that the original crawler performed actor reconciliation.", "limitations": "A stop string can contain pitch and annotations without having those parts independently resolved. Keyboard grouping and the distinction between an instrument and successive works remain source-specific. The France value is supplied by the adapter. Neither that default nor a successful transform measures the national inventory's completeness." }, "implementation": { "class": "IndoCrawler", "class_line": 17, "path": "aggregator/indo_crawler.py", "inheritance": [ "IndoCrawler", "BaseCrawler" ], "configuration": {}, "methods": [ { "symbol": "IndoCrawler._fetch_page", "path": "aggregator/indo_crawler.py", "line_start": 216, "line_end": 234, "inherited": false, "file_sha256": "dd26703917e4a6ed86e523c05596b40727d5df9ec55e88bcf46b4430283b01d0", "self_calls": [], "literal_get_calls": [], "html_queries": [], "dictionary_entries": [ { "line": 221, "key": "query", "value_expression": "''" }, { "line": 222, "key": "pageUrl", "value_expression": "f'?page={page}&sort=completion:desc'" }, { "line": 223, "key": "page", "value_expression": "page" }, { "line": 224, "key": "departement", "value_expression": "''" }, { "line": 225, "key": "sort", "value_expression": "'completion:desc'" }, { "line": 226, "key": "init", "value_expression": "'true' if page == 1 else 'false'" }, { "line": 229, "key": "Referer", "value_expression": "f'{self.base_url}/orgues/'" }, { "line": 230, "key": "X-Requested-With", "value_expression": "'XMLHttpRequest'" } ], "subscript_assignments": [] }, { "symbol": "IndoCrawler.crawl", "path": "aggregator/indo_crawler.py", "line_start": 47, "line_end": 193, "inherited": false, "file_sha256": "dd26703917e4a6ed86e523c05596b40727d5df9ec55e88bcf46b4430283b01d0", "self_calls": [ "_fetch_page", "_get_csrf_token", "is_scrape_stop_requested", "mark_scrape_stopped" ], "literal_get_calls": [ { "line": 52, "receiver": "kwargs", "key": "task_id", "expression": "kwargs.get('task_id')" }, { "line": 86, "receiver": "first_page_data", "key": "totalHits", "expression": "first_page_data.get('totalHits', 0)" }, { "line": 125, "receiver": "page_data", "key": "hits", "expression": "page_data.get('hits', [])" }, { "line": 84, "receiver": "first_page_data", "key": "totalPages", "expression": "first_page_data.get('totalPages', 1)" }, { "line": 95, "receiver": "kwargs", "key": "max_pages", "expression": "kwargs.get('max_pages')" }, { "line": 142, "receiver": "hit", "key": "id", "expression": "hit.get('id')" }, { "line": 143, "receiver": "hit", "key": "url", "expression": "hit.get('url')" }, { "line": 126, "receiver": "page_data", "key": "totalPages", "expression": "page_data.get('totalPages', declared_total_pages)" }, { "line": 152, "receiver": "hit", "key": "commune", "expression": "hit.get('commune', '')" }, { "line": 153, "receiver": "hit", "key": "edifice", "expression": "hit.get('edifice', '')" }, { "line": 154, "receiver": "hit", "key": "facteurs", "expression": "hit.get('facteurs', '')" }, { "line": 155, "receiver": "hit", "key": "construction", "expression": "hit.get('construction', '')" } ], "html_queries": [], "dictionary_entries": [ { "line": 150, "key": "indo_id", "value_expression": "indo_id" }, { "line": 151, "key": "country", "value_expression": "'France'" }, { "line": 152, "key": "town", "value_expression": "hit.get('commune', '')" }, { "line": 153, "key": "building", "value_expression": "hit.get('edifice', '')" }, { "line": 154, "key": "builder", "value_expression": "hit.get('facteurs', '')" }, { "line": 155, "key": "year", "value_expression": "str(hit.get('construction', ''))" }, { "line": 156, "key": "url", "value_expression": "full_url" }, { "line": 157, "key": "scraped_at", "value_expression": "datetime.now()" } ], "subscript_assignments": [] }, { "symbol": "IndoCrawler.transform", "path": "aggregator/indo_crawler.py", "line_start": 236, "line_end": 393, "inherited": false, "file_sha256": "dd26703917e4a6ed86e523c05596b40727d5df9ec55e88bcf46b4430283b01d0", "self_calls": [], "literal_get_calls": [ { "line": 240, "receiver": "raw_data", "key": "html", "expression": "raw_data.get('html', '')" }, { "line": 262, "receiver": "raw_data", "key": "town", "expression": "raw_data.get('town', '')" }, { "line": 369, "receiver": "raw_data", "key": "builder", "expression": "raw_data.get('builder')" }, { "line": 259, "receiver": "raw_data", "key": "building", "expression": "raw_data.get('building', '')" }, { "line": 359, "receiver": "raw_data", "key": "builder", "expression": "raw_data.get('builder')" }, { "line": 379, "receiver": "a_tag", "key": "title", "expression": "a_tag.get('title', '')" }, { "line": 389, "receiver": "raw_data", "key": "indo_id", "expression": "raw_data.get('indo_id')" }, { "line": 390, "receiver": "raw_data", "key": "url", "expression": "raw_data.get('url')" } ], "html_queries": [ { "line": 258, "expression": "soup.find('h2', class_='mb-0')" }, { "line": 261, "expression": "soup.find('h4', class_='text-muted')" }, { "line": 284, "expression": "soup.find_all('div', class_='clavier')" }, { "line": 332, "expression": "soup.find('dt', string='Facteurs')" }, { "line": 374, "expression": "soup.find_all('div', class_='portfolio-item')" }, { "line": 266, "expression": "sub_h4.find_all('a', class_='link')" }, { "line": 292, "expression": "clavier.find('div', class_='card-header')" }, { "line": 301, "expression": "clavier.find('ul', class_='list-group')" }, { "line": 376, "expression": "item.find('a', attrs={'data-lightbox': 'gallery-image'})" }, { "line": 303, "expression": "ul.find_all('li')" }, { "line": 336, "expression": "dd.find_all('li')" }, { "line": 293, "expression": "card_header.find('h4')" } ], "dictionary_entries": [ { "line": 273, "key": "country", "value_expression": "country" }, { "line": 274, "key": "town", "value_expression": "town" }, { "line": 275, "key": "building", "value_expression": "building" }, { "line": 276, "key": "status", "value_expression": "'current_location'" }, { "line": 314, "key": "id", "value_expression": "werk_id" }, { "line": 315, "key": "name", "value_expression": "name" }, { "line": 316, "key": "stops", "value_expression": "[]" }, { "line": 323, "key": "id", "value_expression": "werk_id" }, { "line": 324, "key": "name", "value_expression": "name" }, { "line": 376, "key": "data-lightbox", "value_expression": "'gallery-image'" }, { "line": 381, "key": "link", "value_expression": "img_url" }, { "line": 382, "key": "source", "value_expression": "title" }, { "line": 383, "key": "available", "value_expression": "True" }, { "line": 307, "key": "name", "value_expression": "stop_name" }, { "line": 308, "key": "raw_str", "value_expression": "stop_name" }, { "line": 364, "key": "name", "value_expression": "builder_name" }, { "line": 365, "key": "activities", "value_expression": "['builder']" }, { "line": 366, "key": "raw_str", "value_expression": "str(raw_data['builder'])" }, { "line": 346, "key": "name", "value_expression": "name" }, { "line": 347, "key": "notes", "value_expression": "[details]" }, { "line": 348, "key": "raw_str", "value_expression": "text" }, { "line": 352, "key": "name", "value_expression": "text" }, { "line": 353, "key": "raw_str", "value_expression": "text" } ], "subscript_assignments": [ { "line": 272, "value_line": 272, "key": "locations", "target_expression": "data['locations']", "value_expression": "[{'country': country, 'town': town, 'building': building, 'status': 'current_location'}]" }, { "line": 289, "value_line": 289, "key": "stops", "target_expression": "data['specifications']['stops']", "value_expression": "{}" }, { "line": 370, "value_line": 370, "key": "builder", "target_expression": "data.setdefault('extensions', {}).setdefault('indo', {}).setdefault('reference_context', {})['builder']", "value_expression": "str(raw_data['builder'])" } ] } ], "selected_rule_rows": [ { "symbol": "IndoCrawler.transform", "path": "aggregator/indo_crawler.py", "line": 273, "key": "country", "value_expression": "country" }, { "symbol": "IndoCrawler.transform", "path": "aggregator/indo_crawler.py", "line": 308, "key": "raw_str", "value_expression": "stop_name" }, { "symbol": "IndoCrawler.transform", "path": "aggregator/indo_crawler.py", "key": "html", "value_expression": "raw_data.get('html', '')", "line": 240, "kind": "input read" }, { "symbol": "IndoCrawler.transform", "path": "aggregator/indo_crawler.py", "key": "town", "value_expression": "raw_data.get('town', '')", "line": 262, "kind": "input read" }, { "symbol": "IndoCrawler.transform", "path": "aggregator/indo_crawler.py", "key": "builder", "value_expression": "raw_data.get('builder')", "line": 369, "kind": "input read" }, { "symbol": "IndoCrawler.transform", "path": "aggregator/indo_crawler.py", "key": "building", "value_expression": "raw_data.get('building', '')", "line": 259, "kind": "input read" } ], "bounded_code_passages": [ { "path": "aggregator/indo_crawler.py", "symbol": "IndoCrawler.transform", "line_start": 270, "line_end": 278, "text": " \n # Locations\n data[\"locations\"] = [{\n \"country\": country,\n \"town\": town,\n \"building\": building,\n \"status\": \"current_location\"\n }]\n" }, { "path": "aggregator/indo_crawler.py", "symbol": "IndoCrawler.transform", "line_start": 305, "line_end": 313, "text": " stop_name = li.get_text(strip=True)\n stops_list.append({\n \"name\": stop_name,\n \"raw_str\": stop_name\n })\n \n if is_pedal:\n werk_id = f\"pedal-{ct_pedal}\"\n data[\"specifications\"][\"pedals\"].append({" }, { "path": "aggregator/indo_crawler.py", "symbol": "IndoCrawler.transform", "line_start": 237, "line_end": 245, "text": " \"\"\"\n Transforms the raw HTML into the standard JSON schema.\n \"\"\"\n html = raw_data.get('html', '')\n if not html:\n return {}\n \n soup = BeautifulSoup(html, 'html.parser')\n " }, { "path": "aggregator/indo_crawler.py", "symbol": "IndoCrawler.transform", "line_start": 259, "line_end": 267, "text": " building = title_h2.get_text(strip=True) if title_h2 else raw_data.get('building', '')\n \n sub_h4 = soup.find('h4', class_='text-muted')\n town = raw_data.get('town', '')\n country = \"France\"\n \n if sub_h4:\n links = sub_h4.find_all('a', class_='link')\n if len(links) >= 1:" }, { "path": "aggregator/indo_crawler.py", "symbol": "IndoCrawler.transform", "line_start": 366, "line_end": 374, "text": " \"raw_str\": str(raw_data[\"builder\"]),\n })\n\n if raw_data.get(\"builder\"):\n data.setdefault(\"extensions\", {}).setdefault(\"indo\", {}).setdefault(\"reference_context\", {})[\"builder\"] = str(raw_data[\"builder\"])\n\n # 4. Images\n #