diff --git a/.github/workflows/test-python.yml b/.github/workflows/test-python.yml index 96cb7c34..0bd476dc 100644 --- a/.github/workflows/test-python.yml +++ b/.github/workflows/test-python.yml @@ -26,5 +26,7 @@ jobs: run: ruff check . - name: Run tests run: | - coverage run --include='src/**/*' -m unittest + coverage run --include='src/**/*' -m pytest -m "" coverage report + env: + AWS_REGION: us-east-1 diff --git a/Makefile b/Makefile index 5fd7b13b..13aa0c51 100644 --- a/Makefile +++ b/Makefile @@ -52,15 +52,15 @@ test-node: deps-node deps-python: cd chat/src && pip install -r requirements.txt && pip install -r requirements-dev.txt cover-python: deps-python - cd chat && coverage run --source=src -m unittest -v && coverage report --skip-empty + cd chat && coverage run --source=src -m pytest -v && coverage report --skip-empty cover-html-python: deps-python - cd chat && coverage run --source=src -m unittest -v && coverage html --skip-empty + cd chat && coverage run --source=src -m pytest -v && coverage html --skip-empty style-python: deps-python cd chat && ruff check . style-python-fix: deps-python cd chat && ruff check --fix . test-python: deps-python - cd chat && __SKIP_SECRETS__=true PYTHONPATH=src:test python -m unittest discover -v + cd chat && pytest python-version: cd chat && python --version build: .aws-sam/build.toml diff --git a/chat-playground/playground.ipynb b/chat-playground/playground.ipynb index 6ee987fb..102edb30 100644 --- a/chat-playground/playground.ipynb +++ b/chat-playground/playground.ipynb @@ -19,7 +19,7 @@ " pass\n", "\n", "sys.path.insert(0, os.path.join(os.curdir, \"../chat/src\"))\n", - "import secrets # noqa" + "import helpers.secrets # noqa" ] }, { @@ -57,265 +57,19 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "on_llm_start:\n" - ] - }, - { - "data": { - "text/plain": [ - "{'serialized': {'lc': 1,\n", - " 'type': 'constructor',\n", - " 'id': ['langchain', 'chat_models', 'bedrock', 'ChatBedrock'],\n", - " 'kwargs': {'region_name': 'us-east-1',\n", - " 'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0',\n", - " 'provider_stop_sequence_key_name_map': {'anthropic': 'stop_sequences',\n", - " 'amazon': 'stopSequences',\n", - " 'ai21': 'stop_sequences',\n", - " 'cohere': 'stop_sequences',\n", - " 'mistral': 'stop_sequences'},\n", - " 'provider_stop_reason_key_map': {'anthropic': 'stop_reason',\n", - " 'amazon': 'completionReason',\n", - " 'ai21': 'finishReason',\n", - " 'cohere': 'finish_reason',\n", - " 'mistral': 'stop_reason'},\n", - " 'guardrails': {'trace': None,\n", - " 'guardrailIdentifier': None,\n", - " 'guardrailVersion': None}},\n", - " 'name': 'ChatBedrock'},\n", - " 'metadata': {'thread_id': 'abc123',\n", - " 'langgraph_step': 1,\n", - " 'langgraph_node': 'agent',\n", - " 'langgraph_triggers': ['start:agent'],\n", - " 'langgraph_path': ('__pregel_pull', 'agent'),\n", - " 'langgraph_checkpoint_ns': 'agent:7aafb38d-f828-4dfc-fee6-e60579c1d58c',\n", - " 'checkpoint_ns': 'agent:7aafb38d-f828-4dfc-fee6-e60579c1d58c',\n", - " 'ls_provider': 'amazon_bedrock',\n", - " 'ls_model_name': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0',\n", - " 'ls_model_type': 'chat'},\n", - " 'kwargs': {'run_id': UUID('e10b9de3-aeb3-4af6-b7f2-d9b0eca5df98'),\n", - " 'parent_run_id': UUID('560fe88f-8a26-4bca-8672-c75ffdb59e21'),\n", - " 'tags': ['seq:step:1'],\n", - " 'invocation_params': {'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0',\n", - " 'provider': 'anthropic',\n", - " 'stream': False,\n", - " 'trace': None,\n", - " 'guardrailIdentifier': None,\n", - " 'guardrailVersion': None,\n", - " '_type': 'amazon_bedrock_chat',\n", - " 'stop': None,\n", - " 'tools': [{'name': 'discover_fields',\n", - " 'description': 'Discover the fields available in the OpenSearch index. This tool is useful for understanding the structure of the index and the fields available for aggregation queries.',\n", - " 'input_schema': {'properties': {}, 'type': 'object'}},\n", - " {'name': 'search',\n", - " 'description': \"Perform a semantic search of Northwestern University Library digital collections. When answering a search query, ground your answer in the context of the results with references to the document's metadata.\",\n", - " 'input_schema': {'properties': {'query': {'type': 'string'}},\n", - " 'required': ['query'],\n", - " 'type': 'object'}},\n", - " {'name': 'aggregate',\n", - " 'description': 'Perform a quantitative aggregation on the OpenSearch index. Use this tool for quantitative questions like \"How many...?\" or \"What are the most common...?\"\\n\\nArgs:\\n agg_field (str): The field to aggregate on.\\n term_field (str): The field to filter on.\\n term (str): The term to filter on.\\n\\nLeave term_field and term empty to aggregate across the entire index.\\n\\nAvailable fields:\\nYou must use the discover_fields tool first to obtain the list of appropriate fields for aggregration in the index.\\n\\nDo not use any fields that do not exist in the list returned by discover_fields!\\n\\nSee sum_other_doc_count to get the total count of documents, even if the aggregation is limited by size.',\n", - " 'input_schema': {'properties': {'agg_field': {'type': 'string'},\n", - " 'term_field': {'type': 'string'},\n", - " 'term': {'type': 'string'}},\n", - " 'required': ['agg_field', 'term_field', 'term'],\n", - " 'type': 'object'}}]},\n", - " 'options': {'stop': None},\n", - " 'name': None,\n", - " 'batch_size': 1}}" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "on_llm_end:\n" - ] - }, - { - "data": { - "text/plain": [ - "{'response': LLMResult(generations=[[ChatGeneration(message=AIMessage(content='', additional_kwargs={'usage': {'prompt_tokens': 810, 'completion_tokens': 55, 'total_tokens': 865}, 'stop_reason': 'tool_use', 'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0'}, response_metadata={'usage': {'prompt_tokens': 810, 'completion_tokens': 55, 'total_tokens': 865}, 'stop_reason': 'tool_use', 'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0'}, id='run-e10b9de3-aeb3-4af6-b7f2-d9b0eca5df98-0', tool_calls=[{'name': 'search', 'args': {'query': 'Iranian film cinema Iran movies'}, 'id': 'toolu_bdrk_01KsPVqeMQif2FEJLpeLSBmA', 'type': 'tool_call'}], usage_metadata={'input_tokens': 810, 'output_tokens': 55, 'total_tokens': 865}))]], llm_output={'usage': {'prompt_tokens': 810, 'completion_tokens': 55, 'total_tokens': 865}, 'stop_reason': 'tool_use', 'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0'}, run=None, type='LLMResult'),\n", - " 'kwargs': {'run_id': UUID('e10b9de3-aeb3-4af6-b7f2-d9b0eca5df98'),\n", - " 'parent_run_id': UUID('560fe88f-8a26-4bca-8672-c75ffdb59e21'),\n", - " 'tags': ['seq:step:1']}}" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "on_tool_start:\n" - ] - }, - { - "data": { - "text/plain": [ - "{'serialized': {'name': 'search',\n", - " 'description': \"Perform a semantic search of Northwestern University Library digital collections. When answering a search query, ground your answer in the context of the results with references to the document's metadata.\"},\n", - " 'kwargs': {'run_id': UUID('21a91917-1d98-478e-bbfc-0b861cab3117'),\n", - " 'parent_run_id': UUID('f01f327d-6b2e-4e60-94f0-b2087e94ade4'),\n", - " 'tags': ['seq:step:1'],\n", - " 'metadata': {'thread_id': 'abc123',\n", - " 'langgraph_step': 2,\n", - " 'langgraph_node': 'tools',\n", - " 'langgraph_triggers': ['branch:agent:should_continue:tools'],\n", - " 'langgraph_path': ('__pregel_pull', 'tools'),\n", - " 'langgraph_checkpoint_ns': 'tools:5f52a571-76d4-8a8f-3331-edfa894f4baf',\n", - " 'checkpoint_ns': 'tools:5f52a571-76d4-8a8f-3331-edfa894f4baf'},\n", - " 'inputs': {'query': 'Iranian film cinema Iran movies'},\n", - " 'color': 'green',\n", - " 'name': None}}" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "on_tool_end:\n" - ] - }, - { - "data": { - "text/plain": [ - "{'output': ToolMessage(content='[\"page_content=\\'81c87592-c8ff-4aaa-aea4-26d5e912e529\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46\\', \\'label\\': \\'Pre-revolution: Film Farsi (Tough Guy/Luti Film)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46|TOPICAL|Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)\\', \\'label_with_role\\': \\'Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Manuchehr Vosuq, Shirandami, Lida Daneshvar, Suzy Yashar, Kahnamu\\\\u2019ie, Atefeh, Anik, Hushang Salim, Khosravi, Mahmud Tatar, Shoja\\\\u2019oddin, Mehrang nad Hasan Raziani; Cinematographer: Ali Sadeqi\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Navvab.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/d3a44e31-15f5-4203-a39c-9d78cb80aefb\\', \\'label\\': \\'The Advertising House of Iran (Khane-ye Agahi-e Iran)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/d3a44e31-15f5-4203-a39c-9d78cb80aefb|ctb|The Advertising House of Iran (Khane-ye Agahi-e Iran) (Contributor)\\', \\'label_with_role\\': \\'The Advertising House of Iran (Khane-ye Agahi-e Iran) (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/81c87592-c8ff-4aaa-aea4-26d5e912e529\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'81c87592-c8ff-4aaa-aea4-26d5e912e529\\', \\'ark\\': \\'ark:/81985/n2cr5qd48\\', \\'alternate_title\\': [], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/81c87592-c8ff-4aaa-aea4-26d5e912e529/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/81c87592-c8ff-4aaa-aea4-26d5e912e529?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-196\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1972\\'], \\'physical_description_size\\': [\\'35 (height) x 23.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/81c87592-c8ff-4aaa-aea4-26d5e912e529\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'8791c450-b61a-4001-94ff-8ec9e9f014d7\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/e2153581-ace4-4a95-8770-e15dd8cee502\\', \\'label\\': \\'Hamid Naficy Iranian Cinema Talks\\', \\'variants\\': [], \\'facet\\': \\'info:nul/e2153581-ace4-4a95-8770-e15dd8cee502|TOPICAL|Hamid Naficy Iranian Cinema Talks (Topical)\\', \\'label_with_role\\': \\'Hamid Naficy Iranian Cinema Talks (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.loc.gov/authorities/subjects/sh85046366\\', \\'label\\': \\'Exiles\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/subjects/sh85046366|TOPICAL|Exiles (Topical)\\', \\'label_with_role\\': \\'Exiles (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.loc.gov/authorities/subjects/sh2009010588\\', \\'label\\': \\'Iranian diaspora\\', \\'variants\\': [\\'Diaspora, Iranian\\'], \\'facet\\': \\'http://id.loc.gov/authorities/subjects/sh2009010588|TOPICAL|Iranian diaspora (Topical)\\', \\'label_with_role\\': \\'Iranian diaspora (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Crossing Borders Convocation : World Cinemas and Transnational Cultures.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Sponsor\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n79046198\\', \\'label\\': \\'University of Iowa\\', \\'variants\\': [\\'Iowa. University\\', \\'Ai-ho-hua ta hs\\\\u00fceh\\', \\'Universidad de Iowa\\', \\'State University of Iowa\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n79046198|spn|University of Iowa (Sponsor)\\', \\'label_with_role\\': \\'University of Iowa (Sponsor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8791c450-b61a-4001-94ff-8ec9e9f014d7\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'8791c450-b61a-4001-94ff-8ec9e9f014d7\\', \\'ark\\': \\'ark:/81985/n22f7ms6s\\', \\'alternate_title\\': [], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8791c450-b61a-4001-94ff-8ec9e9f014d7/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8791c450-b61a-4001-94ff-8ec9e9f014d7?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-146\\', \\'license\\': None, \\'date_created_edtf\\': [\\'2004\\'], \\'physical_description_size\\': [\\'17 (height) x 11 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/8791c450-b61a-4001-94ff-8ec9e9f014d7\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'73d920bc-0483-40fa-a63a-9eaa6ed4d5c1\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea\\', \\'label\\': \\'Post-revolution: Art House (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Jamileh Sheikhi, Mozhdeh Shamsai, Homa Rusta, Majid Mozaffari; Cinematographer: Mehrdad Fakhimi; Music: Babak Bayat\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Travelers.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2005052531\\', \\'label\\': \\'Abedini, Reza\\', \\'variants\\': [\\'\\\\u0639\\\\u0627\\\\u0628\\\\u062f\\\\u0649\\\\u0646\\\\u0649\\\\u060c \\\\u0631\\\\u0636\\\\u0627\\', \\'\\\\u02bb\\\\u0100bid\\\\u012bn\\\\u012b, Riz\\\\u0324\\\\u0101\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2005052531|art|Abedini, Reza (Artist)\\', \\'label_with_role\\': \\'Abedini, Reza (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n85091733\\', \\'label\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m\\', \\'variants\\': [\\'Beyza\\\\u02bci, Bahram\\', \\'Bayz\\\\u0324\\\\u0101y\\\\u012b, Bahr\\\\u0101m\\', \\\\\"Beiza\\'i, Bahram\\\\\", \\'Beizaee, Bahram\\', \\'Beizaie, Bahram\\', \\'Beyza\\\\u02beie, Bahram\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u06d3\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'Beyzaie, Bahram, 1938-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n85091733|drt|Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Director)\\', \\'label_with_role\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Director)\\'}, {\\'role\\': \\'Editor\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n85091733\\', \\'label\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m\\', \\'variants\\': [\\'Beyza\\\\u02bci, Bahram\\', \\'Bayz\\\\u0324\\\\u0101y\\\\u012b, Bahr\\\\u0101m\\', \\\\\"Beiza\\'i, Bahram\\\\\", \\'Beizaee, Bahram\\', \\'Beizaie, Bahram\\', \\'Beyza\\\\u02beie, Bahram\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u06d3\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'Beyzaie, Bahram, 1938-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n85091733|edt|Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Editor)\\', \\'label_with_role\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Editor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/35b44114-a400-4ef6-b8f4-23ad28a4d97d\\', \\'label\\': \\'Khosravi, Khosro\\', \\'variants\\': [], \\'facet\\': \\'info:nul/35b44114-a400-4ef6-b8f4-23ad28a4d97d|ctb|Khosravi, Khosro (Contributor)\\', \\'label_with_role\\': \\'Khosravi, Khosro (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/baff4e87-d19b-4878-8c7c-e09c3da7f7b5\\', \\'label\\': \\'Rudiani, Majid\\', \\'variants\\': [], \\'facet\\': \\'info:nul/baff4e87-d19b-4878-8c7c-e09c3da7f7b5|ctb|Rudiani, Majid (Contributor)\\', \\'label_with_role\\': \\'Rudiani, Majid (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/c1170eb5-b11c-4f61-a6f8-aed08534056e\\', \\'label\\': \\'Shaykh\\\\u02b9z\\\\u0101dah, \\\\u02bbAbb\\\\u0101s\\', \\'variants\\': [], \\'facet\\': \\'info:nul/c1170eb5-b11c-4f61-a6f8-aed08534056e|ctb|Shaykh\\\\u02b9z\\\\u0101dah, \\\\u02bbAbb\\\\u0101s (Contributor)\\', \\'label_with_role\\': \\'Shaykh\\\\u02b9z\\\\u0101dah, \\\\u02bbAbb\\\\u0101s (Contributor)\\'}, {\\'role\\': \\'Producer\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2004062865\\', \\'label\\': \\'Shaykh\\\\u02b9z\\\\u0101dah, \\\\u02bbAbb\\\\u0101s\\', \\'variants\\': [\\'Sheikhzadeh, Abbas\\', \\'\\\\u0634\\\\u064a\\\\u062e \\\\u0632\\\\u0627\\\\u062f\\\\u0647\\\\u060c \\\\u0639\\\\u0644\\\\u0649\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2004062865|pro|Shaykh\\\\u02b9z\\\\u0101dah, \\\\u02bbAbb\\\\u0101s (Producer)\\', \\'label_with_role\\': \\'Shaykh\\\\u02b9z\\\\u0101dah, \\\\u02bbAbb\\\\u0101s (Producer)\\'}, {\\'role\\': \\'Producer\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n85091733\\', \\'label\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m\\', \\'variants\\': [\\'Beyza\\\\u02bci, Bahram\\', \\'Bayz\\\\u0324\\\\u0101y\\\\u012b, Bahr\\\\u0101m\\', \\\\\"Beiza\\'i, Bahram\\\\\", \\'Beizaee, Bahram\\', \\'Beizaie, Bahram\\', \\'Beyza\\\\u02beie, Bahram\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u06d3\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'Beyzaie, Bahram, 1938-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n85091733|pro|Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Producer)\\', \\'label_with_role\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Producer)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'73d920bc-0483-40fa-a63a-9eaa6ed4d5c1\\', \\'ark\\': \\'ark:/81985/n2n29r751\\', \\'alternate_title\\': [\\'Mosaferan\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-220\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1992\\'], \\'physical_description_size\\': [\\'8 (height) x 12 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e\\', \\'label\\': \\'Pre-revolution: Film Farsi (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e|TOPICAL|Pre-revolution: Film Farsi (Drama) (Topical)\\', \\'label_with_role\\': \\'Pre-revolution: Film Farsi (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Behrouz Vossoughi, Faramarz Qaribian, Parviz Fannizadeh, Garsha Ra\\\\u2019ufi, Enayat Bakhshi, Mahbubeh Bayat, Mastaneh Jazayeri, Manuchehr Naderi, Parvin Soleimani, Ardeshir Pahlavan, Nezamoddin Shafa\\\\u2019ie, Sa\\\\u2019ied Pirdoost, Jahangir Foruhar, Varshochi, Mahdavifar, Safuri, Fahimeh Amuzandeh, Shadi Afarin, karmen, Jannati Shirazi, Hamid Sa\\\\u2019iedpur, Amrollah Saberi, Gorji and introducing Nosrat Partovi; Cinematographer: Ne\\\\u2019mat Haghighi; Music: Esfandiar Monfaredzadeh\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Gavaznha\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2007086535\\', \\'label\\': \\'Mumayyiz, Murtaz\\\\u0324\\\\u00e1, 1936 or 1937-\\', \\'variants\\': [\\'Mumayyaz, Murtaz\\\\u0324\\\\u00e1, 1936 or 1937-\\', \\'Momayez, Morteza, 1936 or 1937-\\', \\'\\\\u0645\\\\u0645\\\\u064a\\\\u0632\\\\u060c \\\\u0645\\\\u0631\\\\u062a\\\\u0636\\\\u0649, 1936 or 1937-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2007086535|art|Mumayyiz, Murtaz\\\\u0324\\\\u00e1, 1936 or 1937- (Artist)\\', \\'label_with_role\\': \\'Mumayyiz, Murtaz\\\\u0324\\\\u00e1, 1936 or 1937- (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no99026966\\', \\'label\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'variants\\': [\\'K\\\\u012bmiy\\\\u0101y\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'Kimiai, Masoud\\', \\'Kimiayi, Massoud\\', \\'Kimiai, Masud\\', \\'Kimiaei, Masoud\\', \\'\\\\u06a9\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'\\\\u0643\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'Kimiyayi, Masoud\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no99026966|drt|K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Director)\\', \\'label_with_role\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Director)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e\\', \\'ark\\': \\'ark:/81985/n26q1vh8s\\', \\'alternate_title\\': [\\'The Deer\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-112\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1974\\'], \\'physical_description_size\\': [\\'35.5 (height) x 20 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'8166726c-2b7e-4384-9760-742d962fc2ed\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/6ffcda5d-ffc9-4f86-ae0f-09c28d5fa5d1\\', \\'label\\': \\'Post-revolution: Art House (War)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/6ffcda5d-ffc9-4f86-ae0f-09c28d5fa5d1|TOPICAL|Post-revolution: Art House (War) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (War) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1710402\\', \\'label\\': \\'War films\\', \\'variants\\': [\\'Anti-war films\\', \\'Antiwar films\\', \\'Combat films\\', \\'Pacifist films\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1710402|TOPICAL|War films (Topical)\\', \\'label_with_role\\': \\'War films (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Golchehreh Sajjadieh, Ahmad Najafi, Shahed Ahmadloo; Cinematographer: Mahmud Kalari; Music: Giti Pashai\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'The Sergeant\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no99026966\\', \\'label\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'variants\\': [\\'K\\\\u012bmiy\\\\u0101y\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'Kimiai, Masoud\\', \\'Kimiayi, Massoud\\', \\'Kimiai, Masud\\', \\'Kimiaei, Masoud\\', \\'\\\\u06a9\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'\\\\u0643\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'Kimiyayi, Masoud\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no99026966|drt|K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Director)\\', \\'label_with_role\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Director)\\'}, {\\'role\\': \\'Editor\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no99026966\\', \\'label\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'variants\\': [\\'K\\\\u012bmiy\\\\u0101y\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'Kimiai, Masoud\\', \\'Kimiayi, Massoud\\', \\'Kimiai, Masud\\', \\'Kimiaei, Masoud\\', \\'\\\\u06a9\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'\\\\u0643\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'Kimiyayi, Masoud\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no99026966|edt|K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Editor)\\', \\'label_with_role\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Editor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/033bead5-258c-48fc-adbe-3a266c458275\\', \\'label\\': \\'Abdollahzadeh, Manouchehr\\', \\'variants\\': [], \\'facet\\': \\'info:nul/033bead5-258c-48fc-adbe-3a266c458275|ctb|Abdollahzadeh, Manouchehr (Contributor)\\', \\'label_with_role\\': \\'Abdollahzadeh, Manouchehr (Contributor)\\'}, {\\'role\\': \\'Screenwriter\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no99026966\\', \\'label\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'variants\\': [\\'K\\\\u012bmiy\\\\u0101y\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'Kimiai, Masoud\\', \\'Kimiayi, Massoud\\', \\'Kimiai, Masud\\', \\'Kimiaei, Masoud\\', \\'\\\\u06a9\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'\\\\u0643\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'Kimiyayi, Masoud\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no99026966|aus|K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Screenwriter)\\', \\'label_with_role\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Screenwriter)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8166726c-2b7e-4384-9760-742d962fc2ed\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'8166726c-2b7e-4384-9760-742d962fc2ed\\', \\'ark\\': \\'ark:/81985/n24b3060w\\', \\'alternate_title\\': [\\'Goruhban\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8166726c-2b7e-4384-9760-742d962fc2ed/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8166726c-2b7e-4384-9760-742d962fc2ed?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-102\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1992\\'], \\'physical_description_size\\': [\\'39 (height) x 27.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/8166726c-2b7e-4384-9760-742d962fc2ed\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'046b5567-87fd-49bb-8d44-dda31931f6ad\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46\\', \\'label\\': \\'Pre-revolution: Film Farsi (Tough Guy/Luti Film)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46|TOPICAL|Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)\\', \\'label_with_role\\': \\'Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Behrouz Vossoughi, Jamshid Mashayekhi, Aram, Ali Sabet, Enayat Bakhshi, Morteza Ahmadi, Nazeri, Parvin Soleimani, Hassan Rezai, Jannati Shirazi, Ramin and Jalal; Cinematographer: Hamid Mojtahedi; Music: Varoujan; Distributor: Hesam Film\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Zabih.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/7811124a-5777-48b4-92c8-cb77167539db\\', \\'label\\': \\'Sierra Film\\', \\'variants\\': [], \\'facet\\': \\'info:nul/7811124a-5777-48b4-92c8-cb77167539db|ctb|Sierra Film (Contributor)\\', \\'label_with_role\\': \\'Sierra Film (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/c7dabc10-ae46-4a79-ae41-e71ef4edb2bf\\', \\'label\\': \\'Motevaselani, Mohammad\\', \\'variants\\': [], \\'facet\\': \\'info:nul/c7dabc10-ae46-4a79-ae41-e71ef4edb2bf|ctb|Motevaselani, Mohammad (Contributor)\\', \\'label_with_role\\': \\'Motevaselani, Mohammad (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e\\', \\'label\\': \\'Heddat, Mohammad-Ali\\', \\'variants\\': [], \\'facet\\': \\'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e|ctb|Heddat, Mohammad-Ali (Contributor)\\', \\'label_with_role\\': \\'Heddat, Mohammad-Ali (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/046b5567-87fd-49bb-8d44-dda31931f6ad\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'046b5567-87fd-49bb-8d44-dda31931f6ad\\', \\'ark\\': \\'ark:/81985/n20r9p47t\\', \\'alternate_title\\': [], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/046b5567-87fd-49bb-8d44-dda31931f6ad/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/046b5567-87fd-49bb-8d44-dda31931f6ad?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-193\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1975\\'], \\'physical_description_size\\': [\\'39 (height) x 27.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/046b5567-87fd-49bb-8d44-dda31931f6ad\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'f70bf21f-a1f9-4eaf-80ce-0071536d10d5\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea\\', \\'label\\': \\'Post-revolution: Art House (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/924266\\', \\'label\\': \\'Film festivals\\', \\'variants\\': [\\'Film and video festivals\\', \\'Motion picture festivals\\', \\'Moving-picture festivals\\', \\'Video and film festivals\\'], \\'facet\\': \\'http://id.worldcat.org/fast/924266|TOPICAL|Film festivals (Topical)\\', \\'label_with_role\\': \\'Film festivals (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Farhad Bahremand, Tayebeh Soori, Farzaneh Halili; Cinematographer: Farzad Jadat; Director Assistant: Afshin Liaghat, Milad Jalili; Sound: Hassam Zarfam; Executive Manager: Maryam Afshari\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Don.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/nr94007947\\', \\'label\\': \\'Jal\\\\u012bl\\\\u012b, Ab\\\\u016b al-Faz\\\\u0324l\\', \\'variants\\': [\\'Jalili, Abolfazl\\', \\'\\\\u062c\\\\u0644\\\\u064a\\\\u0644\\\\u0649\\\\u060c \\\\u0627\\\\u0628\\\\u0648 \\\\u0627\\\\u0644\\\\u0641\\\\u0636\\\\u0644\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/nr94007947|drt|Jal\\\\u012bl\\\\u012b, Ab\\\\u016b al-Faz\\\\u0324l (Director)\\', \\'label_with_role\\': \\'Jal\\\\u012bl\\\\u012b, Ab\\\\u016b al-Faz\\\\u0324l (Director)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/1d7672d9-1125-4c75-9807-48a09fcbc2ea\\', \\'label\\': \\'IRIB Channel Two\\', \\'variants\\': [], \\'facet\\': \\'info:nul/1d7672d9-1125-4c75-9807-48a09fcbc2ea|ctb|IRIB Channel Two (Contributor)\\', \\'label_with_role\\': \\'IRIB Channel Two (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f70bf21f-a1f9-4eaf-80ce-0071536d10d5\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'f70bf21f-a1f9-4eaf-80ce-0071536d10d5\\', \\'ark\\': \\'ark:/81985/n22b8xd20\\', \\'alternate_title\\': [\\'D\\\\u0101n\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f70bf21f-a1f9-4eaf-80ce-0071536d10d5/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f70bf21f-a1f9-4eaf-80ce-0071536d10d5?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-021\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1998\\'], \\'physical_description_size\\': [\\'12 (height) x 8 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/f70bf21f-a1f9-4eaf-80ce-0071536d10d5\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'05b38c0a-1cee-4475-a57e-af5a71f34589\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/ed842aa6-ab39-4e91-9514-1954decb8604\\', \\'label\\': \\'Post-revolution: Documentary\\', \\'variants\\': [], \\'facet\\': \\'info:nul/ed842aa6-ab39-4e91-9514-1954decb8604|TOPICAL|Post-revolution: Documentary (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Documentary (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Students and Instructors at the Shahid Masumi School; Music: Mohammad Reza Aligholi; Cinematographer: Iraj Safavi\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Homework.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2008219379\\', \\'label\\': \\'\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949-\\', \\'variants\\': [\\'\\\\u062d\\\\u0642\\\\u064a\\\\u0642\\\\u0649\\\\u060c \\\\u0627\\\\u0628\\\\u0631\\\\u0627\\\\u0647\\\\u064a\\\\u0645, 1949-\\', \\'Haghighi, Ebrahim, 1949-\\', \\'AGI, 1949-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2008219379|art|\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949- (Artist)\\', \\'label_with_role\\': \\'\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949- (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no98065081\\', \\'label\\': \\'Kiarostami, Abbas\\', \\'variants\\': [\\'Kiy\\\\u0101rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Kiy\\\\u0101 Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s Kiy\\\\u0101\\', \\'\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u064a\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633 \\\\u0643\\\\u064a\\\\u0627\\', \\'\\\\u0643\\\\u064a\\\\u0627\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u0649\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no98065081|drt|Kiarostami, Abbas (Director)\\', \\'label_with_role\\': \\'Kiarostami, Abbas (Director)\\'}, {\\'role\\': \\'Editor\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no98065081\\', \\'label\\': \\'Kiarostami, Abbas\\', \\'variants\\': [\\'Kiy\\\\u0101rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Kiy\\\\u0101 Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s Kiy\\\\u0101\\', \\'\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u064a\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633 \\\\u0643\\\\u064a\\\\u0627\\', \\'\\\\u0643\\\\u064a\\\\u0627\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u0649\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no98065081|edt|Kiarostami, Abbas (Editor)\\', \\'label_with_role\\': \\'Kiarostami, Abbas (Editor)\\'}, {\\'role\\': \\'Producer\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n92098057\\', \\'label\\': \\'K\\\\u0101n\\\\u016bn-i Parvarish-i Fikr\\\\u012b-i K\\\\u016bdak\\\\u0101n va Nawjav\\\\u0101n\\\\u0101n (Iran)\\', \\'variants\\': [\\'Institute for the Intellectual Development of Children and Young Adults (Iran)\\', \\'Institute for the Intellectual Development of Children & Young Adults (Iran)\\', \\'\\\\u0643\\\\u0627\\\\u0646\\\\u0648\\\\u0646 \\\\u067e\\\\u0631\\\\u0648\\\\u0631\\\\u0634 \\\\u0641\\\\u0643\\\\u0631\\\\u0649 \\\\u0643\\\\u0648\\\\u062f\\\\u0643\\\\u0627\\\\u0646 \\\\u0648 \\\\u0646\\\\u0648\\\\u062c\\\\u0648\\\\u0627\\\\u0646\\\\u0627\\\\u0646 (Iran)\\', \\'\\\\\\\\u200f\\\\u06a9\\\\u0627\\\\u0646\\\\u0648\\\\u0646 \\\\u067e\\\\u0631\\\\u0648\\\\u0631\\\\u0634 \\\\u0641\\\\u06a9\\\\u0631\\\\u0649 \\\\u06a9\\\\u0648\\\\u062f\\\\u06a9\\\\u0627\\\\u0646 \\\\u0648 \\\\u0646\\\\u0648\\\\u062c\\\\u0648\\\\u0627\\\\u0646\\\\u0627\\\\u0646 (\\\\u0627\\\\u064a\\\\u0631\\\\u0627\\\\u0646)\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n92098057|pro|K\\\\u0101n\\\\u016bn-i Parvarish-i Fikr\\\\u012b-i K\\\\u016bdak\\\\u0101n va Nawjav\\\\u0101n\\\\u0101n (Iran) (Producer)\\', \\'label_with_role\\': \\'K\\\\u0101n\\\\u016bn-i Parvarish-i Fikr\\\\u012b-i K\\\\u016bdak\\\\u0101n va Nawjav\\\\u0101n\\\\u0101n (Iran) (Producer)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/05b38c0a-1cee-4475-a57e-af5a71f34589\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'05b38c0a-1cee-4475-a57e-af5a71f34589\\', \\'ark\\': \\'ark:/81985/n2v40n05s\\', \\'alternate_title\\': [\\'Mashqe Shab\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/05b38c0a-1cee-4475-a57e-af5a71f34589/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/05b38c0a-1cee-4475-a57e-af5a71f34589?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-055\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1989\\'], \\'physical_description_size\\': [\\'12 (height) x 8 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/05b38c0a-1cee-4475-a57e-af5a71f34589\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'19298a6e-39b9-4dae-a491-1e990d91fa1b\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/94d5916b-8ac0-4cf0-a65a-271b35c16536\\', \\'label\\': \\'Iranian Cinema Talk/Symposia\\', \\'variants\\': [], \\'facet\\': \\'info:nul/94d5916b-8ac0-4cf0-a65a-271b35c16536|TOPICAL|Iranian Cinema Talk/Symposia (Topical)\\', \\'label_with_role\\': \\'Iranian Cinema Talk/Symposia (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Bahman Mofid, Puri Banayi, Shahruz Ramtin, Mahmud Tehrani, Parvin Soleimani; The Starring Girl: Shohreh; Cinematographer: Shokrullah Rafi\\\\u2019i\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Talafi\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2008068153\\', \\'label\\': \\'Mu\\\\u1e25ammad\\\\u012b, N\\\\u0101\\\\u1e63ir\\', \\'variants\\': [\\'\\\\\\\\u200f\\\\u0645\\\\u062d\\\\u0645\\\\u062f\\\\u0649\\\\u060c \\\\u0646\\\\u0627\\\\u0635\\\\u0631\\', \\'Mohammadi, Naser-e\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2008068153|drt|Mu\\\\u1e25ammad\\\\u012b, N\\\\u0101\\\\u1e63ir (Director)\\', \\'label_with_role\\': \\'Mu\\\\u1e25ammad\\\\u012b, N\\\\u0101\\\\u1e63ir (Director)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/24c9962e-f8b6-423b-9aeb-00153513366b\\', \\'label\\': \\'Sheibani, Jamshid\\', \\'variants\\': [], \\'facet\\': \\'info:nul/24c9962e-f8b6-423b-9aeb-00153513366b|ctb|Sheibani, Jamshid (Contributor)\\', \\'label_with_role\\': \\'Sheibani, Jamshid (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/3ce29ef5-dd14-49c5-b5e3-530ca2b4ccc3\\', \\'label\\': \\'Tasavir Cinematic Co.\\', \\'variants\\': [], \\'facet\\': \\'info:nul/3ce29ef5-dd14-49c5-b5e3-530ca2b4ccc3|ctb|Tasavir Cinematic Co. (Contributor)\\', \\'label_with_role\\': \\'Tasavir Cinematic Co. (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/1ed920d3-9c70-4eeb-ac48-6cb149e281de\\', \\'label\\': \\'Bateni\\', \\'variants\\': [], \\'facet\\': \\'info:nul/1ed920d3-9c70-4eeb-ac48-6cb149e281de|ctb|Bateni (Contributor)\\', \\'label_with_role\\': \\'Bateni (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/19298a6e-39b9-4dae-a491-1e990d91fa1b\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'19298a6e-39b9-4dae-a491-1e990d91fa1b\\', \\'ark\\': \\'ark:/81985/n2qf8mk5w\\', \\'alternate_title\\': [\\'Vendetta.\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/19298a6e-39b9-4dae-a491-1e990d91fa1b/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/19298a6e-39b9-4dae-a491-1e990d91fa1b?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-123\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1978\\'], \\'physical_description_size\\': [\\'35.5 (height) x 23.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/19298a6e-39b9-4dae-a491-1e990d91fa1b\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'20f4c078-c534-4b59-9114-bd436048f51a\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/924266\\', \\'label\\': \\'Film festivals\\', \\'variants\\': [\\'Film and video festivals\\', \\'Motion picture festivals\\', \\'Moving-picture festivals\\', \\'Video and film festivals\\'], \\'facet\\': \\'http://id.worldcat.org/fast/924266|TOPICAL|Film festivals (Topical)\\', \\'label_with_role\\': \\'Film festivals (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Purple poster, white text\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Wanted: People Who Love Film.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/7c6cfbba-31e6-4792-9ef2-80428faff2e9\\', \\'label\\': \\'Doha Tribeca Film Festival\\', \\'variants\\': [], \\'facet\\': \\'info:nul/7c6cfbba-31e6-4792-9ef2-80428faff2e9|ctb|Doha Tribeca Film Festival (Contributor)\\', \\'label_with_role\\': \\'Doha Tribeca Film Festival (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/20f4c078-c534-4b59-9114-bd436048f51a\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'20f4c078-c534-4b59-9114-bd436048f51a\\', \\'ark\\': \\'ark:/81985/n2gm83p7j\\', \\'alternate_title\\': [], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/20f4c078-c534-4b59-9114-bd436048f51a/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/20f4c078-c534-4b59-9114-bd436048f51a?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-141\\', \\'license\\': None, \\'date_created_edtf\\': [\\'2010\\'], \\'physical_description_size\\': [\\'26 (height) x 18 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/20f4c078-c534-4b59-9114-bd436048f51a\\', \\'publisher\\': [], \\'location\\': [{\\'id\\': \\'http://id.worldcat.org/fast/1214170\\', \\'label\\': \\'Qatar--Daw\\\\u1e25ah\\', \\'variants\\': [\\'Daw\\\\u1e25ah (Qatar). Wiz\\\\u0101rat al-Shu\\\\u02bc\\\\u016bn al-Balad\\\\u012byah. Balad\\\\u012byat al-Daw\\\\u1e25ah\\', \\'Qatar--Ad Daw\\\\u1e25a\\', \\'Qatar--Ad Daw\\\\u1e25ah\\', \\'Qatar--Ad Doha\\', \\'Qatar--Ad Dowhah\\', \\'Qatar--al-Daw\\\\u1e25ah\\', \\'Qatar--Balad\\\\u012byat al-Daw\\\\u1e25ah\\', \\'Qatar--Dauh\\\\u00e1\\', \\'Qatar--Daw\\\\u1e25a\\', \\'Qatar--Daw\\\\u1e25at al Qa\\\\u1e6dar\\', \\'Qatar--D\\\\u0332ocha\\', \\'Qatar--Doh\\', \\'Qatar--Doha\\', \\'Qatar--Do\\\\u1e25ah\\', \\'Qatar--Doho\\', \\'Qatar--Dokha\\', \\'Qatar--Dokh\\\\u00e6\\', \\'Qatar--Dokho\\', \\'Qatar--Duoha\\', \\'Qatar--Horad Dokha\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1214170||Qatar--Daw\\\\u1e25ah\\'}], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'4a121abf-83a6-4f9a-9671-0efb30561aaa\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/1fb0036a-da9f-4e76-a5aa-c7a38c5c03c8\\', \\'label\\': \\'Post-revolution: Art House (Comedy)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/1fb0036a-da9f-4e76-a5aa-c7a38c5c03c8|TOPICAL|Post-revolution: Art House (Comedy) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (Comedy) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Akbar Abdi, Fatemeh Motamedaria, Mahaya Petrossian; Cinematographer: Aziz Sa\\\\u2019ati; Music: Ahmad Pezhman\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'The Actor.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2005052531\\', \\'label\\': \\'Abedini, Reza\\', \\'variants\\': [\\'\\\\u0639\\\\u0627\\\\u0628\\\\u062f\\\\u0649\\\\u0646\\\\u0649\\\\u060c \\\\u0631\\\\u0636\\\\u0627\\', \\'\\\\u02bb\\\\u0100bid\\\\u012bn\\\\u012b, Riz\\\\u0324\\\\u0101\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2005052531|art|Abedini, Reza (Artist)\\', \\'label_with_role\\': \\'Abedini, Reza (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n88664107\\', \\'label\\': \\'Makhmalb\\\\u0101f, Mu\\\\u1e25sin\\', \\'variants\\': [\\'Makhmalbaf, Mohsen\\', \\'\\\\u0645\\\\u062d\\\\u0633\\\\u0646 \\\\u0645\\\\u062e\\\\u0645\\\\u0644\\\\u0628\\\\u0627\\\\u0641\\', \\'\\\\u0645\\\\u062e\\\\u0645\\\\u0644\\\\u0628\\\\u0627\\\\u0641\\\\u060c \\\\u0645\\\\u062d\\\\u0633\\\\u0646\\', \\'\\\\u041c\\\\u0430\\\\u0445\\\\u043c\\\\u0430\\\\u043b\\\\u044c\\\\u0431\\\\u0430\\\\u0444, \\\\u041c\\\\u043e\\\\u0445\\\\u0441\\\\u0435\\\\u043d\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n88664107|drt|Makhmalb\\\\u0101f, Mu\\\\u1e25sin (Director)\\', \\'label_with_role\\': \\'Makhmalb\\\\u0101f, Mu\\\\u1e25sin (Director)\\'}, {\\'role\\': \\'Editor\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n88664107\\', \\'label\\': \\'Makhmalb\\\\u0101f, Mu\\\\u1e25sin\\', \\'variants\\': [\\'Makhmalbaf, Mohsen\\', \\'\\\\u0645\\\\u062d\\\\u0633\\\\u0646 \\\\u0645\\\\u062e\\\\u0645\\\\u0644\\\\u0628\\\\u0627\\\\u0641\\', \\'\\\\u0645\\\\u062e\\\\u0645\\\\u0644\\\\u0628\\\\u0627\\\\u0641\\\\u060c \\\\u0645\\\\u062d\\\\u0633\\\\u0646\\', \\'\\\\u041c\\\\u0430\\\\u0445\\\\u043c\\\\u0430\\\\u043b\\\\u044c\\\\u0431\\\\u0430\\\\u0444, \\\\u041c\\\\u043e\\\\u0445\\\\u0441\\\\u0435\\\\u043d\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n88664107|edt|Makhmalb\\\\u0101f, Mu\\\\u1e25sin (Editor)\\', \\'label_with_role\\': \\'Makhmalb\\\\u0101f, Mu\\\\u1e25sin (Editor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/4a121abf-83a6-4f9a-9671-0efb30561aaa\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'4a121abf-83a6-4f9a-9671-0efb30561aaa\\', \\'ark\\': \\'ark:/81985/n2nz82r33\\', \\'alternate_title\\': [\\'Honarpisheh\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/4a121abf-83a6-4f9a-9671-0efb30561aaa/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/4a121abf-83a6-4f9a-9671-0efb30561aaa?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-027\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1993\\'], \\'physical_description_size\\': [\\'12 (height) x 8 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/4a121abf-83a6-4f9a-9671-0efb30561aaa\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'2c455274-0bb9-4c35-8128-7cedbd1f01e8\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/f98feaba-d2b3-4723-8ed2-fff08dd6ed84\\', \\'label\\': \\'Pre-revolution: Film Farsi (Romance)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/f98feaba-d2b3-4723-8ed2-fff08dd6ed84|TOPICAL|Pre-revolution: Film Farsi (Romance) (Topical)\\', \\'label_with_role\\': \\'Pre-revolution: Film Farsi (Romance) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Iraj Rostami, Googoosh, Natasha, Asadollah Yekta, Rimik, Marutian, Hike, Loreta and Jaleh; Full-Color, Techni Scope, Stereophonic\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Ehsas Dagh\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/121d09d7-67fd-447a-8da1-3e5187ef9206\\', \\'label\\': \\'Shahab Studio\\', \\'variants\\': [], \\'facet\\': \\'info:nul/121d09d7-67fd-447a-8da1-3e5187ef9206|ctb|Shahab Studio (Contributor)\\', \\'label_with_role\\': \\'Shahab Studio (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/c7f7c483-82f1-46cd-8a57-1e4f5b95703a\\', \\'label\\': \\'Zadurian, Rubik\\', \\'variants\\': [], \\'facet\\': \\'info:nul/c7f7c483-82f1-46cd-8a57-1e4f5b95703a|ctb|Zadurian, Rubik (Contributor)\\', \\'label_with_role\\': \\'Zadurian, Rubik (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2c455274-0bb9-4c35-8128-7cedbd1f01e8\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'2c455274-0bb9-4c35-8128-7cedbd1f01e8\\', \\'ark\\': \\'ark:/81985/n2qn61c3h\\', \\'alternate_title\\': [\\'Hot Feelings.\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2c455274-0bb9-4c35-8128-7cedbd1f01e8/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2c455274-0bb9-4c35-8128-7cedbd1f01e8?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-210\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1972\\'], \\'physical_description_size\\': [\\'14.5 (height) x 11 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/2c455274-0bb9-4c35-8128-7cedbd1f01e8\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'d5cdb032-736d-4422-9eb0-5ac418d232dc\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea\\', \\'label\\': \\'Post-revolution: Art House (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Mahmoud Khosravi, Limua Rahi\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Dance of Dust.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2008219379\\', \\'label\\': \\'\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949-\\', \\'variants\\': [\\'\\\\u062d\\\\u0642\\\\u064a\\\\u0642\\\\u0649\\\\u060c \\\\u0627\\\\u0628\\\\u0631\\\\u0627\\\\u0647\\\\u064a\\\\u0645, 1949-\\', \\'Haghighi, Ebrahim, 1949-\\', \\'AGI, 1949-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2008219379|art|\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949- (Artist)\\', \\'label_with_role\\': \\'\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949- (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/nr94007947\\', \\'label\\': \\'Jal\\\\u012bl\\\\u012b, Ab\\\\u016b al-Faz\\\\u0324l\\', \\'variants\\': [\\'Jalili, Abolfazl\\', \\'\\\\u062c\\\\u0644\\\\u064a\\\\u0644\\\\u0649\\\\u060c \\\\u0627\\\\u0628\\\\u0648 \\\\u0627\\\\u0644\\\\u0641\\\\u0636\\\\u0644\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/nr94007947|drt|Jal\\\\u012bl\\\\u012b, Ab\\\\u016b al-Faz\\\\u0324l (Director)\\', \\'label_with_role\\': \\'Jal\\\\u012bl\\\\u012b, Ab\\\\u016b al-Faz\\\\u0324l (Director)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/d5cdb032-736d-4422-9eb0-5ac418d232dc\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'d5cdb032-736d-4422-9eb0-5ac418d232dc\\', \\'ark\\': \\'ark:/81985/n2w08zh0s\\', \\'alternate_title\\': [\\'Raghs-e Khak\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/d5cdb032-736d-4422-9eb0-5ac418d232dc/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/d5cdb032-736d-4422-9eb0-5ac418d232dc?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-020a\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1998\\'], \\'physical_description_size\\': [\\'12 (height) x 8 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/d5cdb032-736d-4422-9eb0-5ac418d232dc\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'fbb2c5c4-d33e-4a19-bf63-aa5299291887\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea\\', \\'label\\': \\'Post-revolution: Art House (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Faramarz Sadighi, Golchehre Sajadieh, Ahmad Najafi; Cinematographer: Iraj Sadeghpour; Music: Fariborz Lachini\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Taste of Cherry.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no98065081\\', \\'label\\': \\'Kiarostami, Abbas\\', \\'variants\\': [\\'Kiy\\\\u0101rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Kiy\\\\u0101 Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s Kiy\\\\u0101\\', \\'\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u064a\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633 \\\\u0643\\\\u064a\\\\u0627\\', \\'\\\\u0643\\\\u064a\\\\u0627\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u0649\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no98065081|drt|Kiarostami, Abbas (Director)\\', \\'label_with_role\\': \\'Kiarostami, Abbas (Director)\\'}, {\\'role\\': \\'Producer\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no98065081\\', \\'label\\': \\'Kiarostami, Abbas\\', \\'variants\\': [\\'Kiy\\\\u0101rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Kiy\\\\u0101 Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s Kiy\\\\u0101\\', \\'\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u064a\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633 \\\\u0643\\\\u064a\\\\u0627\\', \\'\\\\u0643\\\\u064a\\\\u0627\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u0649\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no98065081|pro|Kiarostami, Abbas (Producer)\\', \\'label_with_role\\': \\'Kiarostami, Abbas (Producer)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/fbb2c5c4-d33e-4a19-bf63-aa5299291887\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'fbb2c5c4-d33e-4a19-bf63-aa5299291887\\', \\'ark\\': \\'ark:/81985/n2sx66b5g\\', \\'alternate_title\\': [], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/fbb2c5c4-d33e-4a19-bf63-aa5299291887/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/fbb2c5c4-d33e-4a19-bf63-aa5299291887?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-002a\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1990\\'], \\'physical_description_size\\': [\\'6 (height) x 4 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/fbb2c5c4-d33e-4a19-bf63-aa5299291887\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'860ec76f-a767-49bf-ba2f-43bcf4d988d3\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/fcdb295d-b9e8-4b87-83ad-a4ad2cff2385\\', \\'label\\': \\'Pre-revolution: Film Farsi (Comedy)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/fcdb295d-b9e8-4b87-83ad-a4ad2cff2385|TOPICAL|Pre-revolution: Film Farsi (Comedy) (Topical)\\', \\'label_with_role\\': \\'Pre-revolution: Film Farsi (Comedy) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Behrouz Vossoughi, Googoosh, Semsarzadeh, Nadereh, Nazeri, Nasiri, Gorji, Asadzadeh and Arman; Cinematographer: Ne\\\\u2019mat Haghighi; Music: Varoujan; Singer: Googoosh; Distributor: Sierra Film\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Mamal-e Emrikai\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/5b84947b-a5ad-43d7-ad5e-1ad0d3967208\\', \\'label\\': \\'Qarib, Shapur\\', \\'variants\\': [], \\'facet\\': \\'info:nul/5b84947b-a5ad-43d7-ad5e-1ad0d3967208|ctb|Qarib, Shapur (Contributor)\\', \\'label_with_role\\': \\'Qarib, Shapur (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e\\', \\'label\\': \\'Heddat, Mohammad-Ali\\', \\'variants\\': [], \\'facet\\': \\'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e|ctb|Heddat, Mohammad-Ali (Contributor)\\', \\'label_with_role\\': \\'Heddat, Mohammad-Ali (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/860ec76f-a767-49bf-ba2f-43bcf4d988d3\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'860ec76f-a767-49bf-ba2f-43bcf4d988d3\\', \\'ark\\': \\'ark:/81985/n20c4vk90\\', \\'alternate_title\\': [\\'American Mamal\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/860ec76f-a767-49bf-ba2f-43bcf4d988d3/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/860ec76f-a767-49bf-ba2f-43bcf4d988d3?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-126a\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1974\\'], \\'physical_description_size\\': [\\'35.5 (height) x 23.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/860ec76f-a767-49bf-ba2f-43bcf4d988d3\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217\\', \\'label\\': \\\\\"Post-revolution: Art House (Women\\'s Film)\\\\\", \\'variants\\': [], \\'facet\\': \\\\\"info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217|TOPICAL|Post-revolution: Art House (Women\\'s Film) (Topical)\\\\\", \\'label_with_role\\': \\\\\"Post-revolution: Art House (Women\\'s Film) (Topical)\\\\\"}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Ezzatollah Entezami, Fatemeh Motamed-Aria, Golab Adineh, Afsar Asadi, Jamshid Esmailkhani; Cinematographer: Aziz Sa\\\\u2019ati; Music: Ahmad Pezhman\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'The Blue-Veiled.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2008219379\\', \\'label\\': \\'\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949-\\', \\'variants\\': [\\'\\\\u062d\\\\u0642\\\\u064a\\\\u0642\\\\u0649\\\\u060c \\\\u0627\\\\u0628\\\\u0631\\\\u0627\\\\u0647\\\\u064a\\\\u0645, 1949-\\', \\'Haghighi, Ebrahim, 1949-\\', \\'AGI, 1949-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2008219379|art|\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949- (Artist)\\', \\'label_with_role\\': \\'\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949- (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no2002003849\\', \\'label\\': \\'Ban\\\\u012b I\\\\u02bbtim\\\\u0101d, Rakhsh\\\\u0101n, 1954-\\', \\'variants\\': [\\'I\\\\u02bbtim\\\\u0101d, Rakhsh\\\\u0101n Ban\\\\u012b, 1954-\\', \\'Bani-Etemad, Rakhashan, 1954-\\', \\'Etemad, Rakhashan Bani-, 1954-\\', \\'Etemad, R. B. (Rakhashan Bani), 1954-\\', \\'\\\\u0628\\\\u0646\\\\u0649 \\\\u0639\\\\u062a\\\\u0645\\\\u0627\\\\u062f\\\\u060c \\\\u0631\\\\u062e\\\\u0634\\\\u0627\\\\u0646\\', \\'\\\\u0628\\\\u0646\\\\u064a \\\\u0627\\\\u0639\\\\u062a\\\\u0645\\\\u0627\\\\u062f\\\\u060c \\\\u0631\\\\u062e\\\\u0634\\\\u0627\\\\u0646\\\\u060c 1954-\\', \\'Banietemad, Rakhshan, 1954-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no2002003849|drt|Ban\\\\u012b I\\\\u02bbtim\\\\u0101d, Rakhsh\\\\u0101n, 1954- (Director)\\', \\'label_with_role\\': \\'Ban\\\\u012b I\\\\u02bbtim\\\\u0101d, Rakhsh\\\\u0101n, 1954- (Director)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/09b17567-6e2f-4643-8b58-d57d474f953f\\', \\'label\\': \\'Ganjavi, Abbas\\', \\'variants\\': [], \\'facet\\': \\'info:nul/09b17567-6e2f-4643-8b58-d57d474f953f|ctb|Ganjavi, Abbas (Contributor)\\', \\'label_with_role\\': \\'Ganjavi, Abbas (Contributor)\\'}, {\\'role\\': \\'Producer\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2004048315\\', \\'label\\': \\'Mudarris\\\\u012b, Maj\\\\u012bd\\', \\'variants\\': [\\'Modarresi, M.\\', \\'Modaresi, M. (Majid)\\', \\'Modaresi, Majid\\', \\'\\\\u0645\\\\u062f\\\\u0631\\\\u0633\\\\u0649\\\\u060c \\\\u0645\\\\u062c\\\\u064a\\\\u062f\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2004048315|pro|Mudarris\\\\u012b, Maj\\\\u012bd (Producer)\\', \\'label_with_role\\': \\'Mudarris\\\\u012b, Maj\\\\u012bd (Producer)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0\\', \\'ark\\': \\'ark:/81985/n25t3j15t\\', \\'alternate_title\\': [\\'Rusari-e Abi\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-011a\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1995\\'], \\'physical_description_size\\': [\\'8 (height) x 6 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'f889063c-c283-4482-a89b-83f1fcff93e8\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/ad7466d4-a7a5-496d-ac37-c400a320f898\\', \\'label\\': \\\\\"Post-revolution: Documentary (Women\\'s Film)\\\\\", \\'variants\\': [], \\'facet\\': \\\\\"info:nul/ad7466d4-a7a5-496d-ac37-c400a320f898|TOPICAL|Post-revolution: Documentary (Women\\'s Film) (Topical)\\\\\", \\'label_with_role\\': \\\\\"Post-revolution: Documentary (Women\\'s Film) (Topical)\\\\\"}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Divorce Iranian Style.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/nb98080505\\', \\'label\\': \\'Dark, Andy\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/nb98080505|art|Dark, Andy (Artist)\\', \\'label_with_role\\': \\'Dark, Andy (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n94018265\\', \\'label\\': \\'Mir-Hosseini, Ziba\\', \\'variants\\': [\\'Hosseini, Ziba Mir-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n94018265|drt|Mir-Hosseini, Ziba (Director)\\', \\'label_with_role\\': \\'Mir-Hosseini, Ziba (Director)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no94039925\\', \\'label\\': \\'Longinotto, Kim\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/no94039925|drt|Longinotto, Kim (Director)\\', \\'label_with_role\\': \\'Longinotto, Kim (Director)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f889063c-c283-4482-a89b-83f1fcff93e8\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'f889063c-c283-4482-a89b-83f1fcff93e8\\', \\'ark\\': \\'ark:/81985/n2bk18q89\\', \\'alternate_title\\': [], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f889063c-c283-4482-a89b-83f1fcff93e8/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f889063c-c283-4482-a89b-83f1fcff93e8?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-079\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1998\\'], \\'physical_description_size\\': [\\'23 (height) x 16.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/f889063c-c283-4482-a89b-83f1fcff93e8\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'e5c65968-bdfa-43f4-be43-da0277579292\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea\\', \\'label\\': \\'Post-revolution: Art House (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Susan Taslimi, Dariush Farhang, Alireza Mojallal; Cinematographer: Asghar Rafijam; Music: Babak Bayat ; Director: Bahram Beyzai; Cast: Susan Taslimi, Dariush Farhang, Alireza Mojallal; Editor: Varooj Karim Massihi; Cinematographer: Asghar Rafijam; Music: Babak Bayat; Producer: Novin Film\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Maybe Some Other Time.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n85091733\\', \\'label\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m\\', \\'variants\\': [\\'Beyza\\\\u02bci, Bahram\\', \\'Bayz\\\\u0324\\\\u0101y\\\\u012b, Bahr\\\\u0101m\\', \\\\\"Beiza\\'i, Bahram\\\\\", \\'Beizaee, Bahram\\', \\'Beizaie, Bahram\\', \\'Beyza\\\\u02beie, Bahram\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u06d3\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'Beyzaie, Bahram, 1938-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n85091733|drt|Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Director)\\', \\'label_with_role\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Director)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/99b6e3cf-aac7-421e-ad4a-2d41cf34fdc6\\', \\'label\\': \\'Novin Film\\', \\'variants\\': [], \\'facet\\': \\'info:nul/99b6e3cf-aac7-421e-ad4a-2d41cf34fdc6|ctb|Novin Film (Contributor)\\', \\'label_with_role\\': \\'Novin Film (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/e704790a-b8d9-420f-8701-41c84bb7134b\\', \\'label\\': \\'Karim-Masihi, Varuzh\\', \\'variants\\': [], \\'facet\\': \\'info:nul/e704790a-b8d9-420f-8701-41c84bb7134b|ctb|Karim-Masihi, Varuzh (Contributor)\\', \\'label_with_role\\': \\'Karim-Masihi, Varuzh (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e5c65968-bdfa-43f4-be43-da0277579292\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'e5c65968-bdfa-43f4-be43-da0277579292\\', \\'ark\\': \\'ark:/81985/n22n51j8w\\', \\'alternate_title\\': [\\'Shayad Vaghti Digar\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e5c65968-bdfa-43f4-be43-da0277579292/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e5c65968-bdfa-43f4-be43-da0277579292?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-048\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1988\\'], \\'physical_description_size\\': [\\'12 (height) x 8 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/e5c65968-bdfa-43f4-be43-da0277579292\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'e10f7d30-ac3f-4e71-aed0-9e28fe27f691\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e\\', \\'label\\': \\'Pre-revolution: Film Farsi (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e|TOPICAL|Pre-revolution: Film Farsi (Drama) (Topical)\\', \\'label_with_role\\': \\'Pre-revolution: Film Farsi (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Iraj Qaderi, Natasha, Arman, Bahmanyar, Narsi, Shandarmani, Ashraf Kashani, Mohammad Farzin, Saber Atashin, Karmen, Hamidi and Abbas Maqfurian; Dancer: Shahrzad; Cinematographer: Qasemivand\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Khashm-e Oqabha\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2006058872\\', \\'label\\': \\'Q\\\\u0101dir\\\\u012b, \\\\u012araj, 1935-2012\\', \\'variants\\': [\\'Qaderi, Iraj, 1935-2012\\', \\'Ghaderi, Iraj, 1935-2012\\', \\'\\\\u0642\\\\u0627\\\\u062f\\\\u0631\\\\u0649\\\\u060c \\\\u0627\\\\u064a\\\\u0631\\\\u062c\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2006058872|drt|Q\\\\u0101dir\\\\u012b, \\\\u012araj, 1935-2012 (Director)\\', \\'label_with_role\\': \\'Q\\\\u0101dir\\\\u012b, \\\\u012araj, 1935-2012 (Director)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e10f7d30-ac3f-4e71-aed0-9e28fe27f691\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'e10f7d30-ac3f-4e71-aed0-9e28fe27f691\\', \\'ark\\': \\'ark:/81985/n2jw88n62\\', \\'alternate_title\\': [\\'The Wrath of Eagles.\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e10f7d30-ac3f-4e71-aed0-9e28fe27f691/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e10f7d30-ac3f-4e71-aed0-9e28fe27f691?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-189\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1971\\'], \\'physical_description_size\\': [\\'27.5 (height) x 19.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/e10f7d30-ac3f-4e71-aed0-9e28fe27f691\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'f55c3aa2-86df-426b-9c75-39393dd2bb50\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217\\', \\'label\\': \\\\\"Post-revolution: Art House (Women\\'s Film)\\\\\", \\'variants\\': [], \\'facet\\': \\\\\"info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217|TOPICAL|Post-revolution: Art House (Women\\'s Film) (Topical)\\\\\", \\'label_with_role\\': \\\\\"Post-revolution: Art House (Women\\'s Film) (Topical)\\\\\"}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Faramarz Sedighi, Sanaz Sehat, Tania Johari, Shahla Riahi, Afsar Asadi, Jaleh Olov, Ali-Asghar Garmsiri, Dariush Assadzadeh, Jahangir Foruhar, Behzad Rahimkhani, Parvin Soleimani, Mehri Mehrina, Purandokht Moheiman, Solmaz Asgharnejad; Cinematographer: Hossein Jafarian; Music: Kambiz Roshanravan\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Lost Time\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2005200469\\', \\'label\\': \\'Dirakhshandah, P\\\\u016br\\\\u0101n\\', \\'variants\\': [\\'\\\\\\\\u200f\\\\u062f\\\\u0631\\\\u062e\\\\u0634\\\\u0646\\\\u062f\\\\u0647\\\\u060c \\\\u067e\\\\u0648\\\\u0631\\\\u0627\\\\u0646\\', \\'P\\\\u016br\\\\u0101n Darakhshandah\\', \\'Derakhshandeh, Pouran\\', \\'Darakhshandah, P\\\\u016br\\\\u0101n\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2005200469|drt|Dirakhshandah, P\\\\u016br\\\\u0101n (Director)\\', \\'label_with_role\\': \\'Dirakhshandah, P\\\\u016br\\\\u0101n (Director)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/abff363b-fd10-415d-a49e-eb69515ee0a2\\', \\'label\\': \\'Emami, Ruhollah\\', \\'variants\\': [], \\'facet\\': \\'info:nul/abff363b-fd10-415d-a49e-eb69515ee0a2|ctb|Emami, Ruhollah (Contributor)\\', \\'label_with_role\\': \\'Emami, Ruhollah (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/d4e1e551-72dc-4c80-8ecf-7fbcc88eb7b1\\', \\'label\\': \\'H\\\\u0307a\\\\u0306ghighi, Ebrahim\\', \\'variants\\': [], \\'facet\\': \\'info:nul/d4e1e551-72dc-4c80-8ecf-7fbcc88eb7b1|ctb|H\\\\u0307a\\\\u0306ghighi, Ebrahim (Contributor)\\', \\'label_with_role\\': \\'H\\\\u0307a\\\\u0306ghighi, Ebrahim (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/ca37649f-f23f-4773-91c8-58c996288fc6\\', \\'label\\': \\'Farajollahi, Mohammad-Ali\\', \\'variants\\': [], \\'facet\\': \\'info:nul/ca37649f-f23f-4773-91c8-58c996288fc6|ctb|Farajollahi, Mohammad-Ali (Contributor)\\', \\'label_with_role\\': \\'Farajollahi, Mohammad-Ali (Contributor)\\'}, {\\'role\\': \\'Producer\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2005200469\\', \\'label\\': \\'Dirakhshandah, P\\\\u016br\\\\u0101n\\', \\'variants\\': [\\'\\\\\\\\u200f\\\\u062f\\\\u0631\\\\u062e\\\\u0634\\\\u0646\\\\u062f\\\\u0647\\\\u060c \\\\u067e\\\\u0648\\\\u0631\\\\u0627\\\\u0646\\', \\'P\\\\u016br\\\\u0101n Darakhshandah\\', \\'Derakhshandeh, Pouran\\', \\'Darakhshandah, P\\\\u016br\\\\u0101n\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2005200469|pro|Dirakhshandah, P\\\\u016br\\\\u0101n (Producer)\\', \\'label_with_role\\': \\'Dirakhshandah, P\\\\u016br\\\\u0101n (Producer)\\'}, {\\'role\\': \\'Screenwriter\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2005200469\\', \\'label\\': \\'Dirakhshandah, P\\\\u016br\\\\u0101n\\', \\'variants\\': [\\'\\\\\\\\u200f\\\\u062f\\\\u0631\\\\u062e\\\\u0634\\\\u0646\\\\u062f\\\\u0647\\\\u060c \\\\u067e\\\\u0648\\\\u0631\\\\u0627\\\\u0646\\', \\'P\\\\u016br\\\\u0101n Darakhshandah\\', \\'Derakhshandeh, Pouran\\', \\'Darakhshandah, P\\\\u016br\\\\u0101n\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2005200469|aus|Dirakhshandah, P\\\\u016br\\\\u0101n (Screenwriter)\\', \\'label_with_role\\': \\'Dirakhshandah, P\\\\u016br\\\\u0101n (Screenwriter)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f55c3aa2-86df-426b-9c75-39393dd2bb50\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'f55c3aa2-86df-426b-9c75-39393dd2bb50\\', \\'ark\\': \\'ark:/81985/n2br8ph60\\', \\'alternate_title\\': [\\'Zaman-e Az Dast Rafteh\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f55c3aa2-86df-426b-9c75-39393dd2bb50/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f55c3aa2-86df-426b-9c75-39393dd2bb50?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-028\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1990\\'], \\'physical_description_size\\': [\\'12 (height) x 8 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/f55c3aa2-86df-426b-9c75-39393dd2bb50\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\"]', name='search', tool_call_id='toolu_bdrk_01KsPVqeMQif2FEJLpeLSBmA', artifact=[Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46', 'label': 'Pre-revolution: Film Farsi (Tough Guy/Luti Film)', 'variants': [], 'facet': 'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46|TOPICAL|Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)', 'label_with_role': 'Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Manuchehr Vosuq, Shirandami, Lida Daneshvar, Suzy Yashar, Kahnamu’ie, Atefeh, Anik, Hushang Salim, Khosravi, Mahmud Tatar, Shoja’oddin, Mehrang nad Hasan Raziani; Cinematographer: Ali Sadeqi'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Navvab.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Contributor', 'id': 'info:nul/d3a44e31-15f5-4203-a39c-9d78cb80aefb', 'label': 'The Advertising House of Iran (Khane-ye Agahi-e Iran)', 'variants': [], 'facet': 'info:nul/d3a44e31-15f5-4203-a39c-9d78cb80aefb|ctb|The Advertising House of Iran (Khane-ye Agahi-e Iran) (Contributor)', 'label_with_role': 'The Advertising House of Iran (Khane-ye Agahi-e Iran) (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/81c87592-c8ff-4aaa-aea4-26d5e912e529', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '81c87592-c8ff-4aaa-aea4-26d5e912e529', 'ark': 'ark:/81985/n2cr5qd48', 'alternate_title': [], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/81c87592-c8ff-4aaa-aea4-26d5e912e529/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/81c87592-c8ff-4aaa-aea4-26d5e912e529?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-196', 'license': None, 'date_created_edtf': ['1972'], 'physical_description_size': ['35 (height) x 23.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/81c87592-c8ff-4aaa-aea4-26d5e912e529', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='81c87592-c8ff-4aaa-aea4-26d5e912e529'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/e2153581-ace4-4a95-8770-e15dd8cee502', 'label': 'Hamid Naficy Iranian Cinema Talks', 'variants': [], 'facet': 'info:nul/e2153581-ace4-4a95-8770-e15dd8cee502|TOPICAL|Hamid Naficy Iranian Cinema Talks (Topical)', 'label_with_role': 'Hamid Naficy Iranian Cinema Talks (Topical)'}, {'role': 'Topical', 'id': 'http://id.loc.gov/authorities/subjects/sh85046366', 'label': 'Exiles', 'variants': [], 'facet': 'http://id.loc.gov/authorities/subjects/sh85046366|TOPICAL|Exiles (Topical)', 'label_with_role': 'Exiles (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.loc.gov/authorities/subjects/sh2009010588', 'label': 'Iranian diaspora', 'variants': ['Diaspora, Iranian'], 'facet': 'http://id.loc.gov/authorities/subjects/sh2009010588|TOPICAL|Iranian diaspora (Topical)', 'label_with_role': 'Iranian diaspora (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': [], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Crossing Borders Convocation : World Cinemas and Transnational Cultures.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Sponsor', 'id': 'http://id.loc.gov/authorities/names/n79046198', 'label': 'University of Iowa', 'variants': ['Iowa. University', 'Ai-ho-hua ta hsüeh', 'Universidad de Iowa', 'State University of Iowa'], 'facet': 'http://id.loc.gov/authorities/names/n79046198|spn|University of Iowa (Sponsor)', 'label_with_role': 'University of Iowa (Sponsor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8791c450-b61a-4001-94ff-8ec9e9f014d7', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '8791c450-b61a-4001-94ff-8ec9e9f014d7', 'ark': 'ark:/81985/n22f7ms6s', 'alternate_title': [], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8791c450-b61a-4001-94ff-8ec9e9f014d7/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8791c450-b61a-4001-94ff-8ec9e9f014d7?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-146', 'license': None, 'date_created_edtf': ['2004'], 'physical_description_size': ['17 (height) x 11 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/8791c450-b61a-4001-94ff-8ec9e9f014d7', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='8791c450-b61a-4001-94ff-8ec9e9f014d7'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea', 'label': 'Post-revolution: Art House (Drama)', 'variants': [], 'facet': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)', 'label_with_role': 'Post-revolution: Art House (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}], 'technique': [], 'description': ['Cast: Jamileh Sheikhi, Mozhdeh Shamsai, Homa Rusta, Majid Mozaffari; Cinematographer: Mehrdad Fakhimi; Music: Babak Bayat'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Travelers.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/n2005052531', 'label': 'Abedini, Reza', 'variants': ['عابدىنى، رضا', 'ʻĀbidīnī, Riz̤ā'], 'facet': 'http://id.loc.gov/authorities/names/n2005052531|art|Abedini, Reza (Artist)', 'label_with_role': 'Abedini, Reza (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n85091733', 'label': 'Bayz̤āʼī, Bahrām', 'variants': ['Beyzaʼi, Bahram', 'Bayz̤āyī, Bahrām', \"Beiza'i, Bahram\", 'Beizaee, Bahram', 'Beizaie, Bahram', 'Beyzaʾie, Bahram', 'بيضايى، بهرام', 'بيضائى، بهرام', 'بيضاۓ، بهرام', 'Beyzaie, Bahram, 1938-'], 'facet': 'http://id.loc.gov/authorities/names/n85091733|drt|Bayz̤āʼī, Bahrām (Director)', 'label_with_role': 'Bayz̤āʼī, Bahrām (Director)'}, {'role': 'Editor', 'id': 'http://id.loc.gov/authorities/names/n85091733', 'label': 'Bayz̤āʼī, Bahrām', 'variants': ['Beyzaʼi, Bahram', 'Bayz̤āyī, Bahrām', \"Beiza'i, Bahram\", 'Beizaee, Bahram', 'Beizaie, Bahram', 'Beyzaʾie, Bahram', 'بيضايى، بهرام', 'بيضائى، بهرام', 'بيضاۓ، بهرام', 'Beyzaie, Bahram, 1938-'], 'facet': 'http://id.loc.gov/authorities/names/n85091733|edt|Bayz̤āʼī, Bahrām (Editor)', 'label_with_role': 'Bayz̤āʼī, Bahrām (Editor)'}, {'role': 'Contributor', 'id': 'info:nul/35b44114-a400-4ef6-b8f4-23ad28a4d97d', 'label': 'Khosravi, Khosro', 'variants': [], 'facet': 'info:nul/35b44114-a400-4ef6-b8f4-23ad28a4d97d|ctb|Khosravi, Khosro (Contributor)', 'label_with_role': 'Khosravi, Khosro (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/baff4e87-d19b-4878-8c7c-e09c3da7f7b5', 'label': 'Rudiani, Majid', 'variants': [], 'facet': 'info:nul/baff4e87-d19b-4878-8c7c-e09c3da7f7b5|ctb|Rudiani, Majid (Contributor)', 'label_with_role': 'Rudiani, Majid (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/c1170eb5-b11c-4f61-a6f8-aed08534056e', 'label': 'Shaykhʹzādah, ʻAbbās', 'variants': [], 'facet': 'info:nul/c1170eb5-b11c-4f61-a6f8-aed08534056e|ctb|Shaykhʹzādah, ʻAbbās (Contributor)', 'label_with_role': 'Shaykhʹzādah, ʻAbbās (Contributor)'}, {'role': 'Producer', 'id': 'http://id.loc.gov/authorities/names/n2004062865', 'label': 'Shaykhʹzādah, ʻAbbās', 'variants': ['Sheikhzadeh, Abbas', 'شيخ زاده، على'], 'facet': 'http://id.loc.gov/authorities/names/n2004062865|pro|Shaykhʹzādah, ʻAbbās (Producer)', 'label_with_role': 'Shaykhʹzādah, ʻAbbās (Producer)'}, {'role': 'Producer', 'id': 'http://id.loc.gov/authorities/names/n85091733', 'label': 'Bayz̤āʼī, Bahrām', 'variants': ['Beyzaʼi, Bahram', 'Bayz̤āyī, Bahrām', \"Beiza'i, Bahram\", 'Beizaee, Bahram', 'Beizaie, Bahram', 'Beyzaʾie, Bahram', 'بيضايى، بهرام', 'بيضائى، بهرام', 'بيضاۓ، بهرام', 'Beyzaie, Bahram, 1938-'], 'facet': 'http://id.loc.gov/authorities/names/n85091733|pro|Bayz̤āʼī, Bahrām (Producer)', 'label_with_role': 'Bayz̤āʼī, Bahrām (Producer)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '73d920bc-0483-40fa-a63a-9eaa6ed4d5c1', 'ark': 'ark:/81985/n2n29r751', 'alternate_title': ['Mosaferan'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-220', 'license': None, 'date_created_edtf': ['1992'], 'physical_description_size': ['8 (height) x 12 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='73d920bc-0483-40fa-a63a-9eaa6ed4d5c1'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e', 'label': 'Pre-revolution: Film Farsi (Drama)', 'variants': [], 'facet': 'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e|TOPICAL|Pre-revolution: Film Farsi (Drama) (Topical)', 'label_with_role': 'Pre-revolution: Film Farsi (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Behrouz Vossoughi, Faramarz Qaribian, Parviz Fannizadeh, Garsha Ra’ufi, Enayat Bakhshi, Mahbubeh Bayat, Mastaneh Jazayeri, Manuchehr Naderi, Parvin Soleimani, Ardeshir Pahlavan, Nezamoddin Shafa’ie, Sa’ied Pirdoost, Jahangir Foruhar, Varshochi, Mahdavifar, Safuri, Fahimeh Amuzandeh, Shadi Afarin, karmen, Jannati Shirazi, Hamid Sa’iedpur, Amrollah Saberi, Gorji and introducing Nosrat Partovi; Cinematographer: Ne’mat Haghighi; Music: Esfandiar Monfaredzadeh'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Gavaznha', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/n2007086535', 'label': 'Mumayyiz, Murtaz̤á, 1936 or 1937-', 'variants': ['Mumayyaz, Murtaz̤á, 1936 or 1937-', 'Momayez, Morteza, 1936 or 1937-', 'مميز، مرتضى, 1936 or 1937-'], 'facet': 'http://id.loc.gov/authorities/names/n2007086535|art|Mumayyiz, Murtaz̤á, 1936 or 1937- (Artist)', 'label_with_role': 'Mumayyiz, Murtaz̤á, 1936 or 1937- (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/no99026966', 'label': 'Kīmiyāʼī, Masʻūd', 'variants': ['Kīmiyāyī, Masʻūd', 'Kimiai, Masoud', 'Kimiayi, Massoud', 'Kimiai, Masud', 'Kimiaei, Masoud', 'کيميائى، مسعود', 'كيميايى، مسعود', 'Kimiyayi, Masoud'], 'facet': 'http://id.loc.gov/authorities/names/no99026966|drt|Kīmiyāʼī, Masʻūd (Director)', 'label_with_role': 'Kīmiyāʼī, Masʻūd (Director)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e', 'ark': 'ark:/81985/n26q1vh8s', 'alternate_title': ['The Deer'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-112', 'license': None, 'date_created_edtf': ['1974'], 'physical_description_size': ['35.5 (height) x 20 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/6ffcda5d-ffc9-4f86-ae0f-09c28d5fa5d1', 'label': 'Post-revolution: Art House (War)', 'variants': [], 'facet': 'info:nul/6ffcda5d-ffc9-4f86-ae0f-09c28d5fa5d1|TOPICAL|Post-revolution: Art House (War) (Topical)', 'label_with_role': 'Post-revolution: Art House (War) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1710402', 'label': 'War films', 'variants': ['Anti-war films', 'Antiwar films', 'Combat films', 'Pacifist films'], 'facet': 'http://id.worldcat.org/fast/1710402|TOPICAL|War films (Topical)', 'label_with_role': 'War films (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Golchehreh Sajjadieh, Ahmad Najafi, Shahed Ahmadloo; Cinematographer: Mahmud Kalari; Music: Giti Pashai'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'The Sergeant', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/no99026966', 'label': 'Kīmiyāʼī, Masʻūd', 'variants': ['Kīmiyāyī, Masʻūd', 'Kimiai, Masoud', 'Kimiayi, Massoud', 'Kimiai, Masud', 'Kimiaei, Masoud', 'کيميائى، مسعود', 'كيميايى، مسعود', 'Kimiyayi, Masoud'], 'facet': 'http://id.loc.gov/authorities/names/no99026966|drt|Kīmiyāʼī, Masʻūd (Director)', 'label_with_role': 'Kīmiyāʼī, Masʻūd (Director)'}, {'role': 'Editor', 'id': 'http://id.loc.gov/authorities/names/no99026966', 'label': 'Kīmiyāʼī, Masʻūd', 'variants': ['Kīmiyāyī, Masʻūd', 'Kimiai, Masoud', 'Kimiayi, Massoud', 'Kimiai, Masud', 'Kimiaei, Masoud', 'کيميائى، مسعود', 'كيميايى، مسعود', 'Kimiyayi, Masoud'], 'facet': 'http://id.loc.gov/authorities/names/no99026966|edt|Kīmiyāʼī, Masʻūd (Editor)', 'label_with_role': 'Kīmiyāʼī, Masʻūd (Editor)'}, {'role': 'Contributor', 'id': 'info:nul/033bead5-258c-48fc-adbe-3a266c458275', 'label': 'Abdollahzadeh, Manouchehr', 'variants': [], 'facet': 'info:nul/033bead5-258c-48fc-adbe-3a266c458275|ctb|Abdollahzadeh, Manouchehr (Contributor)', 'label_with_role': 'Abdollahzadeh, Manouchehr (Contributor)'}, {'role': 'Screenwriter', 'id': 'http://id.loc.gov/authorities/names/no99026966', 'label': 'Kīmiyāʼī, Masʻūd', 'variants': ['Kīmiyāyī, Masʻūd', 'Kimiai, Masoud', 'Kimiayi, Massoud', 'Kimiai, Masud', 'Kimiaei, Masoud', 'کيميائى، مسعود', 'كيميايى، مسعود', 'Kimiyayi, Masoud'], 'facet': 'http://id.loc.gov/authorities/names/no99026966|aus|Kīmiyāʼī, Masʻūd (Screenwriter)', 'label_with_role': 'Kīmiyāʼī, Masʻūd (Screenwriter)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8166726c-2b7e-4384-9760-742d962fc2ed', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '8166726c-2b7e-4384-9760-742d962fc2ed', 'ark': 'ark:/81985/n24b3060w', 'alternate_title': ['Goruhban'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8166726c-2b7e-4384-9760-742d962fc2ed/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8166726c-2b7e-4384-9760-742d962fc2ed?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-102', 'license': None, 'date_created_edtf': ['1992'], 'physical_description_size': ['39 (height) x 27.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/8166726c-2b7e-4384-9760-742d962fc2ed', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='8166726c-2b7e-4384-9760-742d962fc2ed'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46', 'label': 'Pre-revolution: Film Farsi (Tough Guy/Luti Film)', 'variants': [], 'facet': 'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46|TOPICAL|Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)', 'label_with_role': 'Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Behrouz Vossoughi, Jamshid Mashayekhi, Aram, Ali Sabet, Enayat Bakhshi, Morteza Ahmadi, Nazeri, Parvin Soleimani, Hassan Rezai, Jannati Shirazi, Ramin and Jalal; Cinematographer: Hamid Mojtahedi; Music: Varoujan; Distributor: Hesam Film'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Zabih.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Contributor', 'id': 'info:nul/7811124a-5777-48b4-92c8-cb77167539db', 'label': 'Sierra Film', 'variants': [], 'facet': 'info:nul/7811124a-5777-48b4-92c8-cb77167539db|ctb|Sierra Film (Contributor)', 'label_with_role': 'Sierra Film (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/c7dabc10-ae46-4a79-ae41-e71ef4edb2bf', 'label': 'Motevaselani, Mohammad', 'variants': [], 'facet': 'info:nul/c7dabc10-ae46-4a79-ae41-e71ef4edb2bf|ctb|Motevaselani, Mohammad (Contributor)', 'label_with_role': 'Motevaselani, Mohammad (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e', 'label': 'Heddat, Mohammad-Ali', 'variants': [], 'facet': 'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e|ctb|Heddat, Mohammad-Ali (Contributor)', 'label_with_role': 'Heddat, Mohammad-Ali (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/046b5567-87fd-49bb-8d44-dda31931f6ad', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '046b5567-87fd-49bb-8d44-dda31931f6ad', 'ark': 'ark:/81985/n20r9p47t', 'alternate_title': [], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/046b5567-87fd-49bb-8d44-dda31931f6ad/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/046b5567-87fd-49bb-8d44-dda31931f6ad?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-193', 'license': None, 'date_created_edtf': ['1975'], 'physical_description_size': ['39 (height) x 27.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/046b5567-87fd-49bb-8d44-dda31931f6ad', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='046b5567-87fd-49bb-8d44-dda31931f6ad'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea', 'label': 'Post-revolution: Art House (Drama)', 'variants': [], 'facet': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)', 'label_with_role': 'Post-revolution: Art House (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/924266', 'label': 'Film festivals', 'variants': ['Film and video festivals', 'Motion picture festivals', 'Moving-picture festivals', 'Video and film festivals'], 'facet': 'http://id.worldcat.org/fast/924266|TOPICAL|Film festivals (Topical)', 'label_with_role': 'Film festivals (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Farhad Bahremand, Tayebeh Soori, Farzaneh Halili; Cinematographer: Farzad Jadat; Director Assistant: Afshin Liaghat, Milad Jalili; Sound: Hassam Zarfam; Executive Manager: Maryam Afshari'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Don.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/nr94007947', 'label': 'Jalīlī, Abū al-Faz̤l', 'variants': ['Jalili, Abolfazl', 'جليلى، ابو الفضل'], 'facet': 'http://id.loc.gov/authorities/names/nr94007947|drt|Jalīlī, Abū al-Faz̤l (Director)', 'label_with_role': 'Jalīlī, Abū al-Faz̤l (Director)'}, {'role': 'Contributor', 'id': 'info:nul/1d7672d9-1125-4c75-9807-48a09fcbc2ea', 'label': 'IRIB Channel Two', 'variants': [], 'facet': 'info:nul/1d7672d9-1125-4c75-9807-48a09fcbc2ea|ctb|IRIB Channel Two (Contributor)', 'label_with_role': 'IRIB Channel Two (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f70bf21f-a1f9-4eaf-80ce-0071536d10d5', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'f70bf21f-a1f9-4eaf-80ce-0071536d10d5', 'ark': 'ark:/81985/n22b8xd20', 'alternate_title': ['Dān'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f70bf21f-a1f9-4eaf-80ce-0071536d10d5/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f70bf21f-a1f9-4eaf-80ce-0071536d10d5?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-021', 'license': None, 'date_created_edtf': ['1998'], 'physical_description_size': ['12 (height) x 8 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/f70bf21f-a1f9-4eaf-80ce-0071536d10d5', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='f70bf21f-a1f9-4eaf-80ce-0071536d10d5'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/ed842aa6-ab39-4e91-9514-1954decb8604', 'label': 'Post-revolution: Documentary', 'variants': [], 'facet': 'info:nul/ed842aa6-ab39-4e91-9514-1954decb8604|TOPICAL|Post-revolution: Documentary (Topical)', 'label_with_role': 'Post-revolution: Documentary (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}], 'technique': [], 'description': ['Cast: Students and Instructors at the Shahid Masumi School; Music: Mohammad Reza Aligholi; Cinematographer: Iraj Safavi'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Homework.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/n2008219379', 'label': 'Ḥaqīqī, Ibrāhīm, 1949-', 'variants': ['حقيقى، ابراهيم, 1949-', 'Haghighi, Ebrahim, 1949-', 'AGI, 1949-'], 'facet': 'http://id.loc.gov/authorities/names/n2008219379|art|Ḥaqīqī, Ibrāhīm, 1949- (Artist)', 'label_with_role': 'Ḥaqīqī, Ibrāhīm, 1949- (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/no98065081', 'label': 'Kiarostami, Abbas', 'variants': ['Kiyārustamī, ʻAbbās', 'Kiyā Rustamī, ʻAbbās', 'Rustamī, ʻAbbās Kiyā', 'رستمي، عباس كيا', 'كيارستمى، عباس'], 'facet': 'http://id.loc.gov/authorities/names/no98065081|drt|Kiarostami, Abbas (Director)', 'label_with_role': 'Kiarostami, Abbas (Director)'}, {'role': 'Editor', 'id': 'http://id.loc.gov/authorities/names/no98065081', 'label': 'Kiarostami, Abbas', 'variants': ['Kiyārustamī, ʻAbbās', 'Kiyā Rustamī, ʻAbbās', 'Rustamī, ʻAbbās Kiyā', 'رستمي، عباس كيا', 'كيارستمى، عباس'], 'facet': 'http://id.loc.gov/authorities/names/no98065081|edt|Kiarostami, Abbas (Editor)', 'label_with_role': 'Kiarostami, Abbas (Editor)'}, {'role': 'Producer', 'id': 'http://id.loc.gov/authorities/names/n92098057', 'label': 'Kānūn-i Parvarish-i Fikrī-i Kūdakān va Nawjavānān (Iran)', 'variants': ['Institute for the Intellectual Development of Children and Young Adults (Iran)', 'Institute for the Intellectual Development of Children & Young Adults (Iran)', 'كانون پرورش فكرى كودكان و نوجوانان (Iran)', '\\u200fکانون پرورش فکرى کودکان و نوجوانان (ايران)'], 'facet': 'http://id.loc.gov/authorities/names/n92098057|pro|Kānūn-i Parvarish-i Fikrī-i Kūdakān va Nawjavānān (Iran) (Producer)', 'label_with_role': 'Kānūn-i Parvarish-i Fikrī-i Kūdakān va Nawjavānān (Iran) (Producer)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/05b38c0a-1cee-4475-a57e-af5a71f34589', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '05b38c0a-1cee-4475-a57e-af5a71f34589', 'ark': 'ark:/81985/n2v40n05s', 'alternate_title': ['Mashqe Shab'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/05b38c0a-1cee-4475-a57e-af5a71f34589/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/05b38c0a-1cee-4475-a57e-af5a71f34589?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-055', 'license': None, 'date_created_edtf': ['1989'], 'physical_description_size': ['12 (height) x 8 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/05b38c0a-1cee-4475-a57e-af5a71f34589', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='05b38c0a-1cee-4475-a57e-af5a71f34589'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/94d5916b-8ac0-4cf0-a65a-271b35c16536', 'label': 'Iranian Cinema Talk/Symposia', 'variants': [], 'facet': 'info:nul/94d5916b-8ac0-4cf0-a65a-271b35c16536|TOPICAL|Iranian Cinema Talk/Symposia (Topical)', 'label_with_role': 'Iranian Cinema Talk/Symposia (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Bahman Mofid, Puri Banayi, Shahruz Ramtin, Mahmud Tehrani, Parvin Soleimani; The Starring Girl: Shohreh; Cinematographer: Shokrullah Rafi’i'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Talafi', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n2008068153', 'label': 'Muḥammadī, Nāṣir', 'variants': ['\\u200fمحمدى، ناصر', 'Mohammadi, Naser-e'], 'facet': 'http://id.loc.gov/authorities/names/n2008068153|drt|Muḥammadī, Nāṣir (Director)', 'label_with_role': 'Muḥammadī, Nāṣir (Director)'}, {'role': 'Contributor', 'id': 'info:nul/24c9962e-f8b6-423b-9aeb-00153513366b', 'label': 'Sheibani, Jamshid', 'variants': [], 'facet': 'info:nul/24c9962e-f8b6-423b-9aeb-00153513366b|ctb|Sheibani, Jamshid (Contributor)', 'label_with_role': 'Sheibani, Jamshid (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/3ce29ef5-dd14-49c5-b5e3-530ca2b4ccc3', 'label': 'Tasavir Cinematic Co.', 'variants': [], 'facet': 'info:nul/3ce29ef5-dd14-49c5-b5e3-530ca2b4ccc3|ctb|Tasavir Cinematic Co. (Contributor)', 'label_with_role': 'Tasavir Cinematic Co. (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/1ed920d3-9c70-4eeb-ac48-6cb149e281de', 'label': 'Bateni', 'variants': [], 'facet': 'info:nul/1ed920d3-9c70-4eeb-ac48-6cb149e281de|ctb|Bateni (Contributor)', 'label_with_role': 'Bateni (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/19298a6e-39b9-4dae-a491-1e990d91fa1b', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '19298a6e-39b9-4dae-a491-1e990d91fa1b', 'ark': 'ark:/81985/n2qf8mk5w', 'alternate_title': ['Vendetta.'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/19298a6e-39b9-4dae-a491-1e990d91fa1b/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/19298a6e-39b9-4dae-a491-1e990d91fa1b?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-123', 'license': None, 'date_created_edtf': ['1978'], 'physical_description_size': ['35.5 (height) x 23.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/19298a6e-39b9-4dae-a491-1e990d91fa1b', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='19298a6e-39b9-4dae-a491-1e990d91fa1b'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/924266', 'label': 'Film festivals', 'variants': ['Film and video festivals', 'Motion picture festivals', 'Moving-picture festivals', 'Video and film festivals'], 'facet': 'http://id.worldcat.org/fast/924266|TOPICAL|Film festivals (Topical)', 'label_with_role': 'Film festivals (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Purple poster, white text'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Wanted: People Who Love Film.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Contributor', 'id': 'info:nul/7c6cfbba-31e6-4792-9ef2-80428faff2e9', 'label': 'Doha Tribeca Film Festival', 'variants': [], 'facet': 'info:nul/7c6cfbba-31e6-4792-9ef2-80428faff2e9|ctb|Doha Tribeca Film Festival (Contributor)', 'label_with_role': 'Doha Tribeca Film Festival (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/20f4c078-c534-4b59-9114-bd436048f51a', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '20f4c078-c534-4b59-9114-bd436048f51a', 'ark': 'ark:/81985/n2gm83p7j', 'alternate_title': [], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/20f4c078-c534-4b59-9114-bd436048f51a/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/20f4c078-c534-4b59-9114-bd436048f51a?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-141', 'license': None, 'date_created_edtf': ['2010'], 'physical_description_size': ['26 (height) x 18 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/20f4c078-c534-4b59-9114-bd436048f51a', 'publisher': [], 'location': [{'id': 'http://id.worldcat.org/fast/1214170', 'label': 'Qatar--Dawḥah', 'variants': ['Dawḥah (Qatar). Wizārat al-Shuʼūn al-Baladīyah. Baladīyat al-Dawḥah', 'Qatar--Ad Dawḥa', 'Qatar--Ad Dawḥah', 'Qatar--Ad Doha', 'Qatar--Ad Dowhah', 'Qatar--al-Dawḥah', 'Qatar--Baladīyat al-Dawḥah', 'Qatar--Dauhá', 'Qatar--Dawḥa', 'Qatar--Dawḥat al Qaṭar', 'Qatar--D̲ocha', 'Qatar--Doh', 'Qatar--Doha', 'Qatar--Doḥah', 'Qatar--Doho', 'Qatar--Dokha', 'Qatar--Dokhæ', 'Qatar--Dokho', 'Qatar--Duoha', 'Qatar--Horad Dokha'], 'facet': 'http://id.worldcat.org/fast/1214170||Qatar--Dawḥah'}], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='20f4c078-c534-4b59-9114-bd436048f51a'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/1fb0036a-da9f-4e76-a5aa-c7a38c5c03c8', 'label': 'Post-revolution: Art House (Comedy)', 'variants': [], 'facet': 'info:nul/1fb0036a-da9f-4e76-a5aa-c7a38c5c03c8|TOPICAL|Post-revolution: Art House (Comedy) (Topical)', 'label_with_role': 'Post-revolution: Art House (Comedy) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}], 'technique': [], 'description': ['Cast: Akbar Abdi, Fatemeh Motamedaria, Mahaya Petrossian; Cinematographer: Aziz Sa’ati; Music: Ahmad Pezhman'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'The Actor.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/n2005052531', 'label': 'Abedini, Reza', 'variants': ['عابدىنى، رضا', 'ʻĀbidīnī, Riz̤ā'], 'facet': 'http://id.loc.gov/authorities/names/n2005052531|art|Abedini, Reza (Artist)', 'label_with_role': 'Abedini, Reza (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n88664107', 'label': 'Makhmalbāf, Muḥsin', 'variants': ['Makhmalbaf, Mohsen', 'محسن مخملباف', 'مخملباف، محسن', 'Махмальбаф, Мохсен'], 'facet': 'http://id.loc.gov/authorities/names/n88664107|drt|Makhmalbāf, Muḥsin (Director)', 'label_with_role': 'Makhmalbāf, Muḥsin (Director)'}, {'role': 'Editor', 'id': 'http://id.loc.gov/authorities/names/n88664107', 'label': 'Makhmalbāf, Muḥsin', 'variants': ['Makhmalbaf, Mohsen', 'محسن مخملباف', 'مخملباف، محسن', 'Махмальбаф, Мохсен'], 'facet': 'http://id.loc.gov/authorities/names/n88664107|edt|Makhmalbāf, Muḥsin (Editor)', 'label_with_role': 'Makhmalbāf, Muḥsin (Editor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/4a121abf-83a6-4f9a-9671-0efb30561aaa', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '4a121abf-83a6-4f9a-9671-0efb30561aaa', 'ark': 'ark:/81985/n2nz82r33', 'alternate_title': ['Honarpisheh'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/4a121abf-83a6-4f9a-9671-0efb30561aaa/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/4a121abf-83a6-4f9a-9671-0efb30561aaa?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-027', 'license': None, 'date_created_edtf': ['1993'], 'physical_description_size': ['12 (height) x 8 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/4a121abf-83a6-4f9a-9671-0efb30561aaa', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='4a121abf-83a6-4f9a-9671-0efb30561aaa'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/f98feaba-d2b3-4723-8ed2-fff08dd6ed84', 'label': 'Pre-revolution: Film Farsi (Romance)', 'variants': [], 'facet': 'info:nul/f98feaba-d2b3-4723-8ed2-fff08dd6ed84|TOPICAL|Pre-revolution: Film Farsi (Romance) (Topical)', 'label_with_role': 'Pre-revolution: Film Farsi (Romance) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Iraj Rostami, Googoosh, Natasha, Asadollah Yekta, Rimik, Marutian, Hike, Loreta and Jaleh; Full-Color, Techni Scope, Stereophonic'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Ehsas Dagh', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Contributor', 'id': 'info:nul/121d09d7-67fd-447a-8da1-3e5187ef9206', 'label': 'Shahab Studio', 'variants': [], 'facet': 'info:nul/121d09d7-67fd-447a-8da1-3e5187ef9206|ctb|Shahab Studio (Contributor)', 'label_with_role': 'Shahab Studio (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/c7f7c483-82f1-46cd-8a57-1e4f5b95703a', 'label': 'Zadurian, Rubik', 'variants': [], 'facet': 'info:nul/c7f7c483-82f1-46cd-8a57-1e4f5b95703a|ctb|Zadurian, Rubik (Contributor)', 'label_with_role': 'Zadurian, Rubik (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2c455274-0bb9-4c35-8128-7cedbd1f01e8', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '2c455274-0bb9-4c35-8128-7cedbd1f01e8', 'ark': 'ark:/81985/n2qn61c3h', 'alternate_title': ['Hot Feelings.'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2c455274-0bb9-4c35-8128-7cedbd1f01e8/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2c455274-0bb9-4c35-8128-7cedbd1f01e8?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-210', 'license': None, 'date_created_edtf': ['1972'], 'physical_description_size': ['14.5 (height) x 11 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/2c455274-0bb9-4c35-8128-7cedbd1f01e8', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='2c455274-0bb9-4c35-8128-7cedbd1f01e8'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea', 'label': 'Post-revolution: Art House (Drama)', 'variants': [], 'facet': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)', 'label_with_role': 'Post-revolution: Art House (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Mahmoud Khosravi, Limua Rahi'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Dance of Dust.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/n2008219379', 'label': 'Ḥaqīqī, Ibrāhīm, 1949-', 'variants': ['حقيقى، ابراهيم, 1949-', 'Haghighi, Ebrahim, 1949-', 'AGI, 1949-'], 'facet': 'http://id.loc.gov/authorities/names/n2008219379|art|Ḥaqīqī, Ibrāhīm, 1949- (Artist)', 'label_with_role': 'Ḥaqīqī, Ibrāhīm, 1949- (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/nr94007947', 'label': 'Jalīlī, Abū al-Faz̤l', 'variants': ['Jalili, Abolfazl', 'جليلى، ابو الفضل'], 'facet': 'http://id.loc.gov/authorities/names/nr94007947|drt|Jalīlī, Abū al-Faz̤l (Director)', 'label_with_role': 'Jalīlī, Abū al-Faz̤l (Director)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/d5cdb032-736d-4422-9eb0-5ac418d232dc', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'd5cdb032-736d-4422-9eb0-5ac418d232dc', 'ark': 'ark:/81985/n2w08zh0s', 'alternate_title': ['Raghs-e Khak'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/d5cdb032-736d-4422-9eb0-5ac418d232dc/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/d5cdb032-736d-4422-9eb0-5ac418d232dc?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-020a', 'license': None, 'date_created_edtf': ['1998'], 'physical_description_size': ['12 (height) x 8 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/d5cdb032-736d-4422-9eb0-5ac418d232dc', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='d5cdb032-736d-4422-9eb0-5ac418d232dc'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea', 'label': 'Post-revolution: Art House (Drama)', 'variants': [], 'facet': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)', 'label_with_role': 'Post-revolution: Art House (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Faramarz Sadighi, Golchehre Sajadieh, Ahmad Najafi; Cinematographer: Iraj Sadeghpour; Music: Fariborz Lachini'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Taste of Cherry.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/no98065081', 'label': 'Kiarostami, Abbas', 'variants': ['Kiyārustamī, ʻAbbās', 'Kiyā Rustamī, ʻAbbās', 'Rustamī, ʻAbbās Kiyā', 'رستمي، عباس كيا', 'كيارستمى، عباس'], 'facet': 'http://id.loc.gov/authorities/names/no98065081|drt|Kiarostami, Abbas (Director)', 'label_with_role': 'Kiarostami, Abbas (Director)'}, {'role': 'Producer', 'id': 'http://id.loc.gov/authorities/names/no98065081', 'label': 'Kiarostami, Abbas', 'variants': ['Kiyārustamī, ʻAbbās', 'Kiyā Rustamī, ʻAbbās', 'Rustamī, ʻAbbās Kiyā', 'رستمي، عباس كيا', 'كيارستمى، عباس'], 'facet': 'http://id.loc.gov/authorities/names/no98065081|pro|Kiarostami, Abbas (Producer)', 'label_with_role': 'Kiarostami, Abbas (Producer)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/fbb2c5c4-d33e-4a19-bf63-aa5299291887', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'fbb2c5c4-d33e-4a19-bf63-aa5299291887', 'ark': 'ark:/81985/n2sx66b5g', 'alternate_title': [], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/fbb2c5c4-d33e-4a19-bf63-aa5299291887/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/fbb2c5c4-d33e-4a19-bf63-aa5299291887?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-002a', 'license': None, 'date_created_edtf': ['1990'], 'physical_description_size': ['6 (height) x 4 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/fbb2c5c4-d33e-4a19-bf63-aa5299291887', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='fbb2c5c4-d33e-4a19-bf63-aa5299291887'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/fcdb295d-b9e8-4b87-83ad-a4ad2cff2385', 'label': 'Pre-revolution: Film Farsi (Comedy)', 'variants': [], 'facet': 'info:nul/fcdb295d-b9e8-4b87-83ad-a4ad2cff2385|TOPICAL|Pre-revolution: Film Farsi (Comedy) (Topical)', 'label_with_role': 'Pre-revolution: Film Farsi (Comedy) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Behrouz Vossoughi, Googoosh, Semsarzadeh, Nadereh, Nazeri, Nasiri, Gorji, Asadzadeh and Arman; Cinematographer: Ne’mat Haghighi; Music: Varoujan; Singer: Googoosh; Distributor: Sierra Film'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Mamal-e Emrikai', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Contributor', 'id': 'info:nul/5b84947b-a5ad-43d7-ad5e-1ad0d3967208', 'label': 'Qarib, Shapur', 'variants': [], 'facet': 'info:nul/5b84947b-a5ad-43d7-ad5e-1ad0d3967208|ctb|Qarib, Shapur (Contributor)', 'label_with_role': 'Qarib, Shapur (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e', 'label': 'Heddat, Mohammad-Ali', 'variants': [], 'facet': 'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e|ctb|Heddat, Mohammad-Ali (Contributor)', 'label_with_role': 'Heddat, Mohammad-Ali (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/860ec76f-a767-49bf-ba2f-43bcf4d988d3', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '860ec76f-a767-49bf-ba2f-43bcf4d988d3', 'ark': 'ark:/81985/n20c4vk90', 'alternate_title': ['American Mamal'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/860ec76f-a767-49bf-ba2f-43bcf4d988d3/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/860ec76f-a767-49bf-ba2f-43bcf4d988d3?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-126a', 'license': None, 'date_created_edtf': ['1974'], 'physical_description_size': ['35.5 (height) x 23.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/860ec76f-a767-49bf-ba2f-43bcf4d988d3', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='860ec76f-a767-49bf-ba2f-43bcf4d988d3'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217', 'label': \"Post-revolution: Art House (Women's Film)\", 'variants': [], 'facet': \"info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217|TOPICAL|Post-revolution: Art House (Women's Film) (Topical)\", 'label_with_role': \"Post-revolution: Art House (Women's Film) (Topical)\"}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Ezzatollah Entezami, Fatemeh Motamed-Aria, Golab Adineh, Afsar Asadi, Jamshid Esmailkhani; Cinematographer: Aziz Sa’ati; Music: Ahmad Pezhman'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'The Blue-Veiled.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/n2008219379', 'label': 'Ḥaqīqī, Ibrāhīm, 1949-', 'variants': ['حقيقى، ابراهيم, 1949-', 'Haghighi, Ebrahim, 1949-', 'AGI, 1949-'], 'facet': 'http://id.loc.gov/authorities/names/n2008219379|art|Ḥaqīqī, Ibrāhīm, 1949- (Artist)', 'label_with_role': 'Ḥaqīqī, Ibrāhīm, 1949- (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/no2002003849', 'label': 'Banī Iʻtimād, Rakhshān, 1954-', 'variants': ['Iʻtimād, Rakhshān Banī, 1954-', 'Bani-Etemad, Rakhashan, 1954-', 'Etemad, Rakhashan Bani-, 1954-', 'Etemad, R. B. (Rakhashan Bani), 1954-', 'بنى عتماد، رخشان', 'بني اعتماد، رخشان، 1954-', 'Banietemad, Rakhshan, 1954-'], 'facet': 'http://id.loc.gov/authorities/names/no2002003849|drt|Banī Iʻtimād, Rakhshān, 1954- (Director)', 'label_with_role': 'Banī Iʻtimād, Rakhshān, 1954- (Director)'}, {'role': 'Contributor', 'id': 'info:nul/09b17567-6e2f-4643-8b58-d57d474f953f', 'label': 'Ganjavi, Abbas', 'variants': [], 'facet': 'info:nul/09b17567-6e2f-4643-8b58-d57d474f953f|ctb|Ganjavi, Abbas (Contributor)', 'label_with_role': 'Ganjavi, Abbas (Contributor)'}, {'role': 'Producer', 'id': 'http://id.loc.gov/authorities/names/n2004048315', 'label': 'Mudarrisī, Majīd', 'variants': ['Modarresi, M.', 'Modaresi, M. (Majid)', 'Modaresi, Majid', 'مدرسى، مجيد'], 'facet': 'http://id.loc.gov/authorities/names/n2004048315|pro|Mudarrisī, Majīd (Producer)', 'label_with_role': 'Mudarrisī, Majīd (Producer)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0', 'ark': 'ark:/81985/n25t3j15t', 'alternate_title': ['Rusari-e Abi'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-011a', 'license': None, 'date_created_edtf': ['1995'], 'physical_description_size': ['8 (height) x 6 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/ad7466d4-a7a5-496d-ac37-c400a320f898', 'label': \"Post-revolution: Documentary (Women's Film)\", 'variants': [], 'facet': \"info:nul/ad7466d4-a7a5-496d-ac37-c400a320f898|TOPICAL|Post-revolution: Documentary (Women's Film) (Topical)\", 'label_with_role': \"Post-revolution: Documentary (Women's Film) (Topical)\"}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': [], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Divorce Iranian Style.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/nb98080505', 'label': 'Dark, Andy', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/nb98080505|art|Dark, Andy (Artist)', 'label_with_role': 'Dark, Andy (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n94018265', 'label': 'Mir-Hosseini, Ziba', 'variants': ['Hosseini, Ziba Mir-'], 'facet': 'http://id.loc.gov/authorities/names/n94018265|drt|Mir-Hosseini, Ziba (Director)', 'label_with_role': 'Mir-Hosseini, Ziba (Director)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/no94039925', 'label': 'Longinotto, Kim', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/no94039925|drt|Longinotto, Kim (Director)', 'label_with_role': 'Longinotto, Kim (Director)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f889063c-c283-4482-a89b-83f1fcff93e8', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'f889063c-c283-4482-a89b-83f1fcff93e8', 'ark': 'ark:/81985/n2bk18q89', 'alternate_title': [], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f889063c-c283-4482-a89b-83f1fcff93e8/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f889063c-c283-4482-a89b-83f1fcff93e8?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-079', 'license': None, 'date_created_edtf': ['1998'], 'physical_description_size': ['23 (height) x 16.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/f889063c-c283-4482-a89b-83f1fcff93e8', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='f889063c-c283-4482-a89b-83f1fcff93e8'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea', 'label': 'Post-revolution: Art House (Drama)', 'variants': [], 'facet': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)', 'label_with_role': 'Post-revolution: Art House (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}], 'technique': [], 'description': ['Cast: Susan Taslimi, Dariush Farhang, Alireza Mojallal; Cinematographer: Asghar Rafijam; Music: Babak Bayat ; Director: Bahram Beyzai; Cast: Susan Taslimi, Dariush Farhang, Alireza Mojallal; Editor: Varooj Karim Massihi; Cinematographer: Asghar Rafijam; Music: Babak Bayat; Producer: Novin Film'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Maybe Some Other Time.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n85091733', 'label': 'Bayz̤āʼī, Bahrām', 'variants': ['Beyzaʼi, Bahram', 'Bayz̤āyī, Bahrām', \"Beiza'i, Bahram\", 'Beizaee, Bahram', 'Beizaie, Bahram', 'Beyzaʾie, Bahram', 'بيضايى، بهرام', 'بيضائى، بهرام', 'بيضاۓ، بهرام', 'Beyzaie, Bahram, 1938-'], 'facet': 'http://id.loc.gov/authorities/names/n85091733|drt|Bayz̤āʼī, Bahrām (Director)', 'label_with_role': 'Bayz̤āʼī, Bahrām (Director)'}, {'role': 'Contributor', 'id': 'info:nul/99b6e3cf-aac7-421e-ad4a-2d41cf34fdc6', 'label': 'Novin Film', 'variants': [], 'facet': 'info:nul/99b6e3cf-aac7-421e-ad4a-2d41cf34fdc6|ctb|Novin Film (Contributor)', 'label_with_role': 'Novin Film (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/e704790a-b8d9-420f-8701-41c84bb7134b', 'label': 'Karim-Masihi, Varuzh', 'variants': [], 'facet': 'info:nul/e704790a-b8d9-420f-8701-41c84bb7134b|ctb|Karim-Masihi, Varuzh (Contributor)', 'label_with_role': 'Karim-Masihi, Varuzh (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e5c65968-bdfa-43f4-be43-da0277579292', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'e5c65968-bdfa-43f4-be43-da0277579292', 'ark': 'ark:/81985/n22n51j8w', 'alternate_title': ['Shayad Vaghti Digar'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e5c65968-bdfa-43f4-be43-da0277579292/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e5c65968-bdfa-43f4-be43-da0277579292?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-048', 'license': None, 'date_created_edtf': ['1988'], 'physical_description_size': ['12 (height) x 8 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/e5c65968-bdfa-43f4-be43-da0277579292', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='e5c65968-bdfa-43f4-be43-da0277579292'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e', 'label': 'Pre-revolution: Film Farsi (Drama)', 'variants': [], 'facet': 'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e|TOPICAL|Pre-revolution: Film Farsi (Drama) (Topical)', 'label_with_role': 'Pre-revolution: Film Farsi (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}], 'technique': [], 'description': ['Cast: Iraj Qaderi, Natasha, Arman, Bahmanyar, Narsi, Shandarmani, Ashraf Kashani, Mohammad Farzin, Saber Atashin, Karmen, Hamidi and Abbas Maqfurian; Dancer: Shahrzad; Cinematographer: Qasemivand'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Khashm-e Oqabha', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n2006058872', 'label': 'Qādirī, Īraj, 1935-2012', 'variants': ['Qaderi, Iraj, 1935-2012', 'Ghaderi, Iraj, 1935-2012', 'قادرى، ايرج'], 'facet': 'http://id.loc.gov/authorities/names/n2006058872|drt|Qādirī, Īraj, 1935-2012 (Director)', 'label_with_role': 'Qādirī, Īraj, 1935-2012 (Director)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e10f7d30-ac3f-4e71-aed0-9e28fe27f691', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'e10f7d30-ac3f-4e71-aed0-9e28fe27f691', 'ark': 'ark:/81985/n2jw88n62', 'alternate_title': ['The Wrath of Eagles.'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e10f7d30-ac3f-4e71-aed0-9e28fe27f691/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e10f7d30-ac3f-4e71-aed0-9e28fe27f691?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-189', 'license': None, 'date_created_edtf': ['1971'], 'physical_description_size': ['27.5 (height) x 19.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/e10f7d30-ac3f-4e71-aed0-9e28fe27f691', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='e10f7d30-ac3f-4e71-aed0-9e28fe27f691'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217', 'label': \"Post-revolution: Art House (Women's Film)\", 'variants': [], 'facet': \"info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217|TOPICAL|Post-revolution: Art House (Women's Film) (Topical)\", 'label_with_role': \"Post-revolution: Art House (Women's Film) (Topical)\"}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}], 'technique': [], 'description': ['Cast: Faramarz Sedighi, Sanaz Sehat, Tania Johari, Shahla Riahi, Afsar Asadi, Jaleh Olov, Ali-Asghar Garmsiri, Dariush Assadzadeh, Jahangir Foruhar, Behzad Rahimkhani, Parvin Soleimani, Mehri Mehrina, Purandokht Moheiman, Solmaz Asgharnejad; Cinematographer: Hossein Jafarian; Music: Kambiz Roshanravan'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Lost Time', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n2005200469', 'label': 'Dirakhshandah, Pūrān', 'variants': ['\\u200fدرخشنده، پوران', 'Pūrān Darakhshandah', 'Derakhshandeh, Pouran', 'Darakhshandah, Pūrān'], 'facet': 'http://id.loc.gov/authorities/names/n2005200469|drt|Dirakhshandah, Pūrān (Director)', 'label_with_role': 'Dirakhshandah, Pūrān (Director)'}, {'role': 'Contributor', 'id': 'info:nul/abff363b-fd10-415d-a49e-eb69515ee0a2', 'label': 'Emami, Ruhollah', 'variants': [], 'facet': 'info:nul/abff363b-fd10-415d-a49e-eb69515ee0a2|ctb|Emami, Ruhollah (Contributor)', 'label_with_role': 'Emami, Ruhollah (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/d4e1e551-72dc-4c80-8ecf-7fbcc88eb7b1', 'label': 'Ḣăghighi, Ebrahim', 'variants': [], 'facet': 'info:nul/d4e1e551-72dc-4c80-8ecf-7fbcc88eb7b1|ctb|Ḣăghighi, Ebrahim (Contributor)', 'label_with_role': 'Ḣăghighi, Ebrahim (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/ca37649f-f23f-4773-91c8-58c996288fc6', 'label': 'Farajollahi, Mohammad-Ali', 'variants': [], 'facet': 'info:nul/ca37649f-f23f-4773-91c8-58c996288fc6|ctb|Farajollahi, Mohammad-Ali (Contributor)', 'label_with_role': 'Farajollahi, Mohammad-Ali (Contributor)'}, {'role': 'Producer', 'id': 'http://id.loc.gov/authorities/names/n2005200469', 'label': 'Dirakhshandah, Pūrān', 'variants': ['\\u200fدرخشنده، پوران', 'Pūrān Darakhshandah', 'Derakhshandeh, Pouran', 'Darakhshandah, Pūrān'], 'facet': 'http://id.loc.gov/authorities/names/n2005200469|pro|Dirakhshandah, Pūrān (Producer)', 'label_with_role': 'Dirakhshandah, Pūrān (Producer)'}, {'role': 'Screenwriter', 'id': 'http://id.loc.gov/authorities/names/n2005200469', 'label': 'Dirakhshandah, Pūrān', 'variants': ['\\u200fدرخشنده، پوران', 'Pūrān Darakhshandah', 'Derakhshandeh, Pouran', 'Darakhshandah, Pūrān'], 'facet': 'http://id.loc.gov/authorities/names/n2005200469|aus|Dirakhshandah, Pūrān (Screenwriter)', 'label_with_role': 'Dirakhshandah, Pūrān (Screenwriter)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f55c3aa2-86df-426b-9c75-39393dd2bb50', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'f55c3aa2-86df-426b-9c75-39393dd2bb50', 'ark': 'ark:/81985/n2br8ph60', 'alternate_title': ['Zaman-e Az Dast Rafteh'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f55c3aa2-86df-426b-9c75-39393dd2bb50/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f55c3aa2-86df-426b-9c75-39393dd2bb50?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-028', 'license': None, 'date_created_edtf': ['1990'], 'physical_description_size': ['12 (height) x 8 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/f55c3aa2-86df-426b-9c75-39393dd2bb50', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='f55c3aa2-86df-426b-9c75-39393dd2bb50')]),\n", - " 'kwargs': {'run_id': UUID('21a91917-1d98-478e-bbfc-0b861cab3117'),\n", - " 'parent_run_id': UUID('f01f327d-6b2e-4e60-94f0-b2087e94ade4'),\n", - " 'tags': ['seq:step:1'],\n", - " 'color': 'green',\n", - " 'name': 'search'}}" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "on_llm_start:\n" - ] - }, - { - "data": { - "text/plain": [ - "{'serialized': {'lc': 1,\n", - " 'type': 'constructor',\n", - " 'id': ['langchain', 'chat_models', 'bedrock', 'ChatBedrock'],\n", - " 'kwargs': {'region_name': 'us-east-1',\n", - " 'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0',\n", - " 'provider_stop_sequence_key_name_map': {'anthropic': 'stop_sequences',\n", - " 'amazon': 'stopSequences',\n", - " 'ai21': 'stop_sequences',\n", - " 'cohere': 'stop_sequences',\n", - " 'mistral': 'stop_sequences'},\n", - " 'provider_stop_reason_key_map': {'anthropic': 'stop_reason',\n", - " 'amazon': 'completionReason',\n", - " 'ai21': 'finishReason',\n", - " 'cohere': 'finish_reason',\n", - " 'mistral': 'stop_reason'},\n", - " 'guardrails': {'trace': None,\n", - " 'guardrailIdentifier': None,\n", - " 'guardrailVersion': None}},\n", - " 'name': 'ChatBedrock'},\n", - " 'metadata': {'thread_id': 'abc123',\n", - " 'langgraph_step': 3,\n", - " 'langgraph_node': 'agent',\n", - " 'langgraph_triggers': ['tools'],\n", - " 'langgraph_path': ('__pregel_pull', 'agent'),\n", - " 'langgraph_checkpoint_ns': 'agent:d0c7dacc-327f-8ff3-9063-b5c2ee67757c',\n", - " 'checkpoint_ns': 'agent:d0c7dacc-327f-8ff3-9063-b5c2ee67757c',\n", - " 'ls_provider': 'amazon_bedrock',\n", - " 'ls_model_name': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0',\n", - " 'ls_model_type': 'chat'},\n", - " 'kwargs': {'run_id': UUID('755ee14a-d869-4813-88c6-bf629e49d7cc'),\n", - " 'parent_run_id': UUID('2747fdf8-b950-465b-aa82-d82ff43b1b74'),\n", - " 'tags': ['seq:step:1'],\n", - " 'invocation_params': {'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0',\n", - " 'provider': 'anthropic',\n", - " 'stream': False,\n", - " 'trace': None,\n", - " 'guardrailIdentifier': None,\n", - " 'guardrailVersion': None,\n", - " '_type': 'amazon_bedrock_chat',\n", - " 'stop': None,\n", - " 'tools': [{'name': 'discover_fields',\n", - " 'description': 'Discover the fields available in the OpenSearch index. This tool is useful for understanding the structure of the index and the fields available for aggregation queries.',\n", - " 'input_schema': {'properties': {}, 'type': 'object'}},\n", - " {'name': 'search',\n", - " 'description': \"Perform a semantic search of Northwestern University Library digital collections. When answering a search query, ground your answer in the context of the results with references to the document's metadata.\",\n", - " 'input_schema': {'properties': {'query': {'type': 'string'}},\n", - " 'required': ['query'],\n", - " 'type': 'object'}},\n", - " {'name': 'aggregate',\n", - " 'description': 'Perform a quantitative aggregation on the OpenSearch index. Use this tool for quantitative questions like \"How many...?\" or \"What are the most common...?\"\\n\\nArgs:\\n agg_field (str): The field to aggregate on.\\n term_field (str): The field to filter on.\\n term (str): The term to filter on.\\n\\nLeave term_field and term empty to aggregate across the entire index.\\n\\nAvailable fields:\\nYou must use the discover_fields tool first to obtain the list of appropriate fields for aggregration in the index.\\n\\nDo not use any fields that do not exist in the list returned by discover_fields!\\n\\nSee sum_other_doc_count to get the total count of documents, even if the aggregation is limited by size.',\n", - " 'input_schema': {'properties': {'agg_field': {'type': 'string'},\n", - " 'term_field': {'type': 'string'},\n", - " 'term': {'type': 'string'}},\n", - " 'required': ['agg_field', 'term_field', 'term'],\n", - " 'type': 'object'}}]},\n", - " 'options': {'stop': None},\n", - " 'name': None,\n", - " 'batch_size': 1}}" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "on_llm_end:\n" - ] - }, - { - "data": { - "text/plain": [ - "{'response': LLMResult(generations=[[ChatGeneration(text=\"The collection includes a diverse range of Iranian films spanning both pre- and post-revolution periods. Notable examples include:\\n\\nPre-revolution films:\\n- [The Deer (Gavaznha)](https://dc.rdc-staging.library.northwestern.edu/items/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e) (1974) - A drama directed by Masoud Kimiai starring Behrouz Vossoughi\\n- [Hot Feelings (Ehsas Dagh)](https://dc.rdc-staging.library.northwestern.edu/items/2c455274-0bb9-4c35-8128-7cedbd1f01e8) (1972) - A romance starring Googoosh\\n\\nPost-revolution films:\\n- [Taste of Cherry](https://dc.rdc-staging.library.northwestern.edu/items/fbb2c5c4-d33e-4a19-bf63-aa5299291887) (1990) - A drama directed by acclaimed filmmaker Abbas Kiarostami\\n- [The Blue-Veiled (Rusari-e Abi)](https://dc.rdc-staging.library.northwestern.edu/items/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0) (1995) - Directed by Rakhshan Bani-Etemad, starring Ezzatollah Entezami\\n- [Dance of Dust](https://dc.rdc-staging.library.northwestern.edu/items/d5cdb032-736d-4422-9eb0-5ac418d232dc) (1998) - Directed by Abolfazl Jalili\\n\\nThe collection includes documentaries like [Homework](https://dc.rdc-staging.library.northwestern.edu/items/05b38c0a-1cee-4475-a57e-af5a71f34589) (1989) by Abbas Kiarostami and [Divorce Iranian Style](https://dc.rdc-staging.library.northwestern.edu/items/f889063c-c283-4482-a89b-83f1fcff93e8) (1998), representing different genres including dramas, comedies, and women's films from both commercial and art house traditions.\", message=AIMessage(content=\"The collection includes a diverse range of Iranian films spanning both pre- and post-revolution periods. Notable examples include:\\n\\nPre-revolution films:\\n- [The Deer (Gavaznha)](https://dc.rdc-staging.library.northwestern.edu/items/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e) (1974) - A drama directed by Masoud Kimiai starring Behrouz Vossoughi\\n- [Hot Feelings (Ehsas Dagh)](https://dc.rdc-staging.library.northwestern.edu/items/2c455274-0bb9-4c35-8128-7cedbd1f01e8) (1972) - A romance starring Googoosh\\n\\nPost-revolution films:\\n- [Taste of Cherry](https://dc.rdc-staging.library.northwestern.edu/items/fbb2c5c4-d33e-4a19-bf63-aa5299291887) (1990) - A drama directed by acclaimed filmmaker Abbas Kiarostami\\n- [The Blue-Veiled (Rusari-e Abi)](https://dc.rdc-staging.library.northwestern.edu/items/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0) (1995) - Directed by Rakhshan Bani-Etemad, starring Ezzatollah Entezami\\n- [Dance of Dust](https://dc.rdc-staging.library.northwestern.edu/items/d5cdb032-736d-4422-9eb0-5ac418d232dc) (1998) - Directed by Abolfazl Jalili\\n\\nThe collection includes documentaries like [Homework](https://dc.rdc-staging.library.northwestern.edu/items/05b38c0a-1cee-4475-a57e-af5a71f34589) (1989) by Abbas Kiarostami and [Divorce Iranian Style](https://dc.rdc-staging.library.northwestern.edu/items/f889063c-c283-4482-a89b-83f1fcff93e8) (1998), representing different genres including dramas, comedies, and women's films from both commercial and art house traditions.\", additional_kwargs={'usage': {'prompt_tokens': 49331, 'completion_tokens': 556, 'total_tokens': 49887}, 'stop_reason': 'end_turn', 'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0'}, response_metadata={'usage': {'prompt_tokens': 49331, 'completion_tokens': 556, 'total_tokens': 49887}, 'stop_reason': 'end_turn', 'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0'}, id='run-755ee14a-d869-4813-88c6-bf629e49d7cc-0', usage_metadata={'input_tokens': 49331, 'output_tokens': 556, 'total_tokens': 49887}))]], llm_output={'usage': {'prompt_tokens': 49331, 'completion_tokens': 556, 'total_tokens': 49887}, 'stop_reason': 'end_turn', 'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0'}, run=None, type='LLMResult'),\n", - " 'kwargs': {'run_id': UUID('755ee14a-d869-4813-88c6-bf629e49d7cc'),\n", - " 'parent_run_id': UUID('2747fdf8-b950-465b-aa82-d82ff43b1b74'),\n", - " 'tags': ['seq:step:1']}}" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "{'messages': [HumanMessage(content='What works in the collection pertain to Iranian film?', additional_kwargs={}, response_metadata={}, id='e3767c56-27cd-476a-88e5-8b1621456596'),\n", - " AIMessage(content='', additional_kwargs={'usage': {'prompt_tokens': 810, 'completion_tokens': 55, 'total_tokens': 865}, 'stop_reason': 'tool_use', 'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0'}, response_metadata={'usage': {'prompt_tokens': 810, 'completion_tokens': 55, 'total_tokens': 865}, 'stop_reason': 'tool_use', 'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0'}, id='run-e10b9de3-aeb3-4af6-b7f2-d9b0eca5df98-0', tool_calls=[{'name': 'search', 'args': {'query': 'Iranian film cinema Iran movies'}, 'id': 'toolu_bdrk_01KsPVqeMQif2FEJLpeLSBmA', 'type': 'tool_call'}], usage_metadata={'input_tokens': 810, 'output_tokens': 55, 'total_tokens': 865}),\n", - " ToolMessage(content='[\"page_content=\\'81c87592-c8ff-4aaa-aea4-26d5e912e529\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46\\', \\'label\\': \\'Pre-revolution: Film Farsi (Tough Guy/Luti Film)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46|TOPICAL|Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)\\', \\'label_with_role\\': \\'Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Manuchehr Vosuq, Shirandami, Lida Daneshvar, Suzy Yashar, Kahnamu\\\\u2019ie, Atefeh, Anik, Hushang Salim, Khosravi, Mahmud Tatar, Shoja\\\\u2019oddin, Mehrang nad Hasan Raziani; Cinematographer: Ali Sadeqi\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Navvab.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/d3a44e31-15f5-4203-a39c-9d78cb80aefb\\', \\'label\\': \\'The Advertising House of Iran (Khane-ye Agahi-e Iran)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/d3a44e31-15f5-4203-a39c-9d78cb80aefb|ctb|The Advertising House of Iran (Khane-ye Agahi-e Iran) (Contributor)\\', \\'label_with_role\\': \\'The Advertising House of Iran (Khane-ye Agahi-e Iran) (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/81c87592-c8ff-4aaa-aea4-26d5e912e529\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'81c87592-c8ff-4aaa-aea4-26d5e912e529\\', \\'ark\\': \\'ark:/81985/n2cr5qd48\\', \\'alternate_title\\': [], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/81c87592-c8ff-4aaa-aea4-26d5e912e529/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/81c87592-c8ff-4aaa-aea4-26d5e912e529?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-196\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1972\\'], \\'physical_description_size\\': [\\'35 (height) x 23.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/81c87592-c8ff-4aaa-aea4-26d5e912e529\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'8791c450-b61a-4001-94ff-8ec9e9f014d7\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/e2153581-ace4-4a95-8770-e15dd8cee502\\', \\'label\\': \\'Hamid Naficy Iranian Cinema Talks\\', \\'variants\\': [], \\'facet\\': \\'info:nul/e2153581-ace4-4a95-8770-e15dd8cee502|TOPICAL|Hamid Naficy Iranian Cinema Talks (Topical)\\', \\'label_with_role\\': \\'Hamid Naficy Iranian Cinema Talks (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.loc.gov/authorities/subjects/sh85046366\\', \\'label\\': \\'Exiles\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/subjects/sh85046366|TOPICAL|Exiles (Topical)\\', \\'label_with_role\\': \\'Exiles (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.loc.gov/authorities/subjects/sh2009010588\\', \\'label\\': \\'Iranian diaspora\\', \\'variants\\': [\\'Diaspora, Iranian\\'], \\'facet\\': \\'http://id.loc.gov/authorities/subjects/sh2009010588|TOPICAL|Iranian diaspora (Topical)\\', \\'label_with_role\\': \\'Iranian diaspora (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Crossing Borders Convocation : World Cinemas and Transnational Cultures.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Sponsor\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n79046198\\', \\'label\\': \\'University of Iowa\\', \\'variants\\': [\\'Iowa. University\\', \\'Ai-ho-hua ta hs\\\\u00fceh\\', \\'Universidad de Iowa\\', \\'State University of Iowa\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n79046198|spn|University of Iowa (Sponsor)\\', \\'label_with_role\\': \\'University of Iowa (Sponsor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8791c450-b61a-4001-94ff-8ec9e9f014d7\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'8791c450-b61a-4001-94ff-8ec9e9f014d7\\', \\'ark\\': \\'ark:/81985/n22f7ms6s\\', \\'alternate_title\\': [], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8791c450-b61a-4001-94ff-8ec9e9f014d7/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8791c450-b61a-4001-94ff-8ec9e9f014d7?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-146\\', \\'license\\': None, \\'date_created_edtf\\': [\\'2004\\'], \\'physical_description_size\\': [\\'17 (height) x 11 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/8791c450-b61a-4001-94ff-8ec9e9f014d7\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'73d920bc-0483-40fa-a63a-9eaa6ed4d5c1\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea\\', \\'label\\': \\'Post-revolution: Art House (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Jamileh Sheikhi, Mozhdeh Shamsai, Homa Rusta, Majid Mozaffari; Cinematographer: Mehrdad Fakhimi; Music: Babak Bayat\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Travelers.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2005052531\\', \\'label\\': \\'Abedini, Reza\\', \\'variants\\': [\\'\\\\u0639\\\\u0627\\\\u0628\\\\u062f\\\\u0649\\\\u0646\\\\u0649\\\\u060c \\\\u0631\\\\u0636\\\\u0627\\', \\'\\\\u02bb\\\\u0100bid\\\\u012bn\\\\u012b, Riz\\\\u0324\\\\u0101\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2005052531|art|Abedini, Reza (Artist)\\', \\'label_with_role\\': \\'Abedini, Reza (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n85091733\\', \\'label\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m\\', \\'variants\\': [\\'Beyza\\\\u02bci, Bahram\\', \\'Bayz\\\\u0324\\\\u0101y\\\\u012b, Bahr\\\\u0101m\\', \\\\\"Beiza\\'i, Bahram\\\\\", \\'Beizaee, Bahram\\', \\'Beizaie, Bahram\\', \\'Beyza\\\\u02beie, Bahram\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u06d3\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'Beyzaie, Bahram, 1938-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n85091733|drt|Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Director)\\', \\'label_with_role\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Director)\\'}, {\\'role\\': \\'Editor\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n85091733\\', \\'label\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m\\', \\'variants\\': [\\'Beyza\\\\u02bci, Bahram\\', \\'Bayz\\\\u0324\\\\u0101y\\\\u012b, Bahr\\\\u0101m\\', \\\\\"Beiza\\'i, Bahram\\\\\", \\'Beizaee, Bahram\\', \\'Beizaie, Bahram\\', \\'Beyza\\\\u02beie, Bahram\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u06d3\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'Beyzaie, Bahram, 1938-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n85091733|edt|Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Editor)\\', \\'label_with_role\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Editor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/35b44114-a400-4ef6-b8f4-23ad28a4d97d\\', \\'label\\': \\'Khosravi, Khosro\\', \\'variants\\': [], \\'facet\\': \\'info:nul/35b44114-a400-4ef6-b8f4-23ad28a4d97d|ctb|Khosravi, Khosro (Contributor)\\', \\'label_with_role\\': \\'Khosravi, Khosro (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/baff4e87-d19b-4878-8c7c-e09c3da7f7b5\\', \\'label\\': \\'Rudiani, Majid\\', \\'variants\\': [], \\'facet\\': \\'info:nul/baff4e87-d19b-4878-8c7c-e09c3da7f7b5|ctb|Rudiani, Majid (Contributor)\\', \\'label_with_role\\': \\'Rudiani, Majid (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/c1170eb5-b11c-4f61-a6f8-aed08534056e\\', \\'label\\': \\'Shaykh\\\\u02b9z\\\\u0101dah, \\\\u02bbAbb\\\\u0101s\\', \\'variants\\': [], \\'facet\\': \\'info:nul/c1170eb5-b11c-4f61-a6f8-aed08534056e|ctb|Shaykh\\\\u02b9z\\\\u0101dah, \\\\u02bbAbb\\\\u0101s (Contributor)\\', \\'label_with_role\\': \\'Shaykh\\\\u02b9z\\\\u0101dah, \\\\u02bbAbb\\\\u0101s (Contributor)\\'}, {\\'role\\': \\'Producer\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2004062865\\', \\'label\\': \\'Shaykh\\\\u02b9z\\\\u0101dah, \\\\u02bbAbb\\\\u0101s\\', \\'variants\\': [\\'Sheikhzadeh, Abbas\\', \\'\\\\u0634\\\\u064a\\\\u062e \\\\u0632\\\\u0627\\\\u062f\\\\u0647\\\\u060c \\\\u0639\\\\u0644\\\\u0649\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2004062865|pro|Shaykh\\\\u02b9z\\\\u0101dah, \\\\u02bbAbb\\\\u0101s (Producer)\\', \\'label_with_role\\': \\'Shaykh\\\\u02b9z\\\\u0101dah, \\\\u02bbAbb\\\\u0101s (Producer)\\'}, {\\'role\\': \\'Producer\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n85091733\\', \\'label\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m\\', \\'variants\\': [\\'Beyza\\\\u02bci, Bahram\\', \\'Bayz\\\\u0324\\\\u0101y\\\\u012b, Bahr\\\\u0101m\\', \\\\\"Beiza\\'i, Bahram\\\\\", \\'Beizaee, Bahram\\', \\'Beizaie, Bahram\\', \\'Beyza\\\\u02beie, Bahram\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u06d3\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'Beyzaie, Bahram, 1938-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n85091733|pro|Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Producer)\\', \\'label_with_role\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Producer)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'73d920bc-0483-40fa-a63a-9eaa6ed4d5c1\\', \\'ark\\': \\'ark:/81985/n2n29r751\\', \\'alternate_title\\': [\\'Mosaferan\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-220\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1992\\'], \\'physical_description_size\\': [\\'8 (height) x 12 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e\\', \\'label\\': \\'Pre-revolution: Film Farsi (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e|TOPICAL|Pre-revolution: Film Farsi (Drama) (Topical)\\', \\'label_with_role\\': \\'Pre-revolution: Film Farsi (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Behrouz Vossoughi, Faramarz Qaribian, Parviz Fannizadeh, Garsha Ra\\\\u2019ufi, Enayat Bakhshi, Mahbubeh Bayat, Mastaneh Jazayeri, Manuchehr Naderi, Parvin Soleimani, Ardeshir Pahlavan, Nezamoddin Shafa\\\\u2019ie, Sa\\\\u2019ied Pirdoost, Jahangir Foruhar, Varshochi, Mahdavifar, Safuri, Fahimeh Amuzandeh, Shadi Afarin, karmen, Jannati Shirazi, Hamid Sa\\\\u2019iedpur, Amrollah Saberi, Gorji and introducing Nosrat Partovi; Cinematographer: Ne\\\\u2019mat Haghighi; Music: Esfandiar Monfaredzadeh\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Gavaznha\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2007086535\\', \\'label\\': \\'Mumayyiz, Murtaz\\\\u0324\\\\u00e1, 1936 or 1937-\\', \\'variants\\': [\\'Mumayyaz, Murtaz\\\\u0324\\\\u00e1, 1936 or 1937-\\', \\'Momayez, Morteza, 1936 or 1937-\\', \\'\\\\u0645\\\\u0645\\\\u064a\\\\u0632\\\\u060c \\\\u0645\\\\u0631\\\\u062a\\\\u0636\\\\u0649, 1936 or 1937-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2007086535|art|Mumayyiz, Murtaz\\\\u0324\\\\u00e1, 1936 or 1937- (Artist)\\', \\'label_with_role\\': \\'Mumayyiz, Murtaz\\\\u0324\\\\u00e1, 1936 or 1937- (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no99026966\\', \\'label\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'variants\\': [\\'K\\\\u012bmiy\\\\u0101y\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'Kimiai, Masoud\\', \\'Kimiayi, Massoud\\', \\'Kimiai, Masud\\', \\'Kimiaei, Masoud\\', \\'\\\\u06a9\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'\\\\u0643\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'Kimiyayi, Masoud\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no99026966|drt|K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Director)\\', \\'label_with_role\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Director)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e\\', \\'ark\\': \\'ark:/81985/n26q1vh8s\\', \\'alternate_title\\': [\\'The Deer\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-112\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1974\\'], \\'physical_description_size\\': [\\'35.5 (height) x 20 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'8166726c-2b7e-4384-9760-742d962fc2ed\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/6ffcda5d-ffc9-4f86-ae0f-09c28d5fa5d1\\', \\'label\\': \\'Post-revolution: Art House (War)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/6ffcda5d-ffc9-4f86-ae0f-09c28d5fa5d1|TOPICAL|Post-revolution: Art House (War) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (War) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1710402\\', \\'label\\': \\'War films\\', \\'variants\\': [\\'Anti-war films\\', \\'Antiwar films\\', \\'Combat films\\', \\'Pacifist films\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1710402|TOPICAL|War films (Topical)\\', \\'label_with_role\\': \\'War films (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Golchehreh Sajjadieh, Ahmad Najafi, Shahed Ahmadloo; Cinematographer: Mahmud Kalari; Music: Giti Pashai\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'The Sergeant\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no99026966\\', \\'label\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'variants\\': [\\'K\\\\u012bmiy\\\\u0101y\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'Kimiai, Masoud\\', \\'Kimiayi, Massoud\\', \\'Kimiai, Masud\\', \\'Kimiaei, Masoud\\', \\'\\\\u06a9\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'\\\\u0643\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'Kimiyayi, Masoud\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no99026966|drt|K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Director)\\', \\'label_with_role\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Director)\\'}, {\\'role\\': \\'Editor\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no99026966\\', \\'label\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'variants\\': [\\'K\\\\u012bmiy\\\\u0101y\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'Kimiai, Masoud\\', \\'Kimiayi, Massoud\\', \\'Kimiai, Masud\\', \\'Kimiaei, Masoud\\', \\'\\\\u06a9\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'\\\\u0643\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'Kimiyayi, Masoud\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no99026966|edt|K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Editor)\\', \\'label_with_role\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Editor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/033bead5-258c-48fc-adbe-3a266c458275\\', \\'label\\': \\'Abdollahzadeh, Manouchehr\\', \\'variants\\': [], \\'facet\\': \\'info:nul/033bead5-258c-48fc-adbe-3a266c458275|ctb|Abdollahzadeh, Manouchehr (Contributor)\\', \\'label_with_role\\': \\'Abdollahzadeh, Manouchehr (Contributor)\\'}, {\\'role\\': \\'Screenwriter\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no99026966\\', \\'label\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'variants\\': [\\'K\\\\u012bmiy\\\\u0101y\\\\u012b, Mas\\\\u02bb\\\\u016bd\\', \\'Kimiai, Masoud\\', \\'Kimiayi, Massoud\\', \\'Kimiai, Masud\\', \\'Kimiaei, Masoud\\', \\'\\\\u06a9\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'\\\\u0643\\\\u064a\\\\u0645\\\\u064a\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0645\\\\u0633\\\\u0639\\\\u0648\\\\u062f\\', \\'Kimiyayi, Masoud\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no99026966|aus|K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Screenwriter)\\', \\'label_with_role\\': \\'K\\\\u012bmiy\\\\u0101\\\\u02bc\\\\u012b, Mas\\\\u02bb\\\\u016bd (Screenwriter)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8166726c-2b7e-4384-9760-742d962fc2ed\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'8166726c-2b7e-4384-9760-742d962fc2ed\\', \\'ark\\': \\'ark:/81985/n24b3060w\\', \\'alternate_title\\': [\\'Goruhban\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8166726c-2b7e-4384-9760-742d962fc2ed/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8166726c-2b7e-4384-9760-742d962fc2ed?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-102\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1992\\'], \\'physical_description_size\\': [\\'39 (height) x 27.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/8166726c-2b7e-4384-9760-742d962fc2ed\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'046b5567-87fd-49bb-8d44-dda31931f6ad\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46\\', \\'label\\': \\'Pre-revolution: Film Farsi (Tough Guy/Luti Film)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46|TOPICAL|Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)\\', \\'label_with_role\\': \\'Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Behrouz Vossoughi, Jamshid Mashayekhi, Aram, Ali Sabet, Enayat Bakhshi, Morteza Ahmadi, Nazeri, Parvin Soleimani, Hassan Rezai, Jannati Shirazi, Ramin and Jalal; Cinematographer: Hamid Mojtahedi; Music: Varoujan; Distributor: Hesam Film\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Zabih.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/7811124a-5777-48b4-92c8-cb77167539db\\', \\'label\\': \\'Sierra Film\\', \\'variants\\': [], \\'facet\\': \\'info:nul/7811124a-5777-48b4-92c8-cb77167539db|ctb|Sierra Film (Contributor)\\', \\'label_with_role\\': \\'Sierra Film (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/c7dabc10-ae46-4a79-ae41-e71ef4edb2bf\\', \\'label\\': \\'Motevaselani, Mohammad\\', \\'variants\\': [], \\'facet\\': \\'info:nul/c7dabc10-ae46-4a79-ae41-e71ef4edb2bf|ctb|Motevaselani, Mohammad (Contributor)\\', \\'label_with_role\\': \\'Motevaselani, Mohammad (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e\\', \\'label\\': \\'Heddat, Mohammad-Ali\\', \\'variants\\': [], \\'facet\\': \\'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e|ctb|Heddat, Mohammad-Ali (Contributor)\\', \\'label_with_role\\': \\'Heddat, Mohammad-Ali (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/046b5567-87fd-49bb-8d44-dda31931f6ad\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'046b5567-87fd-49bb-8d44-dda31931f6ad\\', \\'ark\\': \\'ark:/81985/n20r9p47t\\', \\'alternate_title\\': [], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/046b5567-87fd-49bb-8d44-dda31931f6ad/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/046b5567-87fd-49bb-8d44-dda31931f6ad?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-193\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1975\\'], \\'physical_description_size\\': [\\'39 (height) x 27.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/046b5567-87fd-49bb-8d44-dda31931f6ad\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'f70bf21f-a1f9-4eaf-80ce-0071536d10d5\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea\\', \\'label\\': \\'Post-revolution: Art House (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/924266\\', \\'label\\': \\'Film festivals\\', \\'variants\\': [\\'Film and video festivals\\', \\'Motion picture festivals\\', \\'Moving-picture festivals\\', \\'Video and film festivals\\'], \\'facet\\': \\'http://id.worldcat.org/fast/924266|TOPICAL|Film festivals (Topical)\\', \\'label_with_role\\': \\'Film festivals (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Farhad Bahremand, Tayebeh Soori, Farzaneh Halili; Cinematographer: Farzad Jadat; Director Assistant: Afshin Liaghat, Milad Jalili; Sound: Hassam Zarfam; Executive Manager: Maryam Afshari\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Don.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/nr94007947\\', \\'label\\': \\'Jal\\\\u012bl\\\\u012b, Ab\\\\u016b al-Faz\\\\u0324l\\', \\'variants\\': [\\'Jalili, Abolfazl\\', \\'\\\\u062c\\\\u0644\\\\u064a\\\\u0644\\\\u0649\\\\u060c \\\\u0627\\\\u0628\\\\u0648 \\\\u0627\\\\u0644\\\\u0641\\\\u0636\\\\u0644\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/nr94007947|drt|Jal\\\\u012bl\\\\u012b, Ab\\\\u016b al-Faz\\\\u0324l (Director)\\', \\'label_with_role\\': \\'Jal\\\\u012bl\\\\u012b, Ab\\\\u016b al-Faz\\\\u0324l (Director)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/1d7672d9-1125-4c75-9807-48a09fcbc2ea\\', \\'label\\': \\'IRIB Channel Two\\', \\'variants\\': [], \\'facet\\': \\'info:nul/1d7672d9-1125-4c75-9807-48a09fcbc2ea|ctb|IRIB Channel Two (Contributor)\\', \\'label_with_role\\': \\'IRIB Channel Two (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f70bf21f-a1f9-4eaf-80ce-0071536d10d5\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'f70bf21f-a1f9-4eaf-80ce-0071536d10d5\\', \\'ark\\': \\'ark:/81985/n22b8xd20\\', \\'alternate_title\\': [\\'D\\\\u0101n\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f70bf21f-a1f9-4eaf-80ce-0071536d10d5/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f70bf21f-a1f9-4eaf-80ce-0071536d10d5?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-021\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1998\\'], \\'physical_description_size\\': [\\'12 (height) x 8 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/f70bf21f-a1f9-4eaf-80ce-0071536d10d5\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'05b38c0a-1cee-4475-a57e-af5a71f34589\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/ed842aa6-ab39-4e91-9514-1954decb8604\\', \\'label\\': \\'Post-revolution: Documentary\\', \\'variants\\': [], \\'facet\\': \\'info:nul/ed842aa6-ab39-4e91-9514-1954decb8604|TOPICAL|Post-revolution: Documentary (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Documentary (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Students and Instructors at the Shahid Masumi School; Music: Mohammad Reza Aligholi; Cinematographer: Iraj Safavi\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Homework.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2008219379\\', \\'label\\': \\'\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949-\\', \\'variants\\': [\\'\\\\u062d\\\\u0642\\\\u064a\\\\u0642\\\\u0649\\\\u060c \\\\u0627\\\\u0628\\\\u0631\\\\u0627\\\\u0647\\\\u064a\\\\u0645, 1949-\\', \\'Haghighi, Ebrahim, 1949-\\', \\'AGI, 1949-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2008219379|art|\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949- (Artist)\\', \\'label_with_role\\': \\'\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949- (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no98065081\\', \\'label\\': \\'Kiarostami, Abbas\\', \\'variants\\': [\\'Kiy\\\\u0101rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Kiy\\\\u0101 Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s Kiy\\\\u0101\\', \\'\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u064a\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633 \\\\u0643\\\\u064a\\\\u0627\\', \\'\\\\u0643\\\\u064a\\\\u0627\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u0649\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no98065081|drt|Kiarostami, Abbas (Director)\\', \\'label_with_role\\': \\'Kiarostami, Abbas (Director)\\'}, {\\'role\\': \\'Editor\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no98065081\\', \\'label\\': \\'Kiarostami, Abbas\\', \\'variants\\': [\\'Kiy\\\\u0101rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Kiy\\\\u0101 Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s Kiy\\\\u0101\\', \\'\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u064a\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633 \\\\u0643\\\\u064a\\\\u0627\\', \\'\\\\u0643\\\\u064a\\\\u0627\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u0649\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no98065081|edt|Kiarostami, Abbas (Editor)\\', \\'label_with_role\\': \\'Kiarostami, Abbas (Editor)\\'}, {\\'role\\': \\'Producer\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n92098057\\', \\'label\\': \\'K\\\\u0101n\\\\u016bn-i Parvarish-i Fikr\\\\u012b-i K\\\\u016bdak\\\\u0101n va Nawjav\\\\u0101n\\\\u0101n (Iran)\\', \\'variants\\': [\\'Institute for the Intellectual Development of Children and Young Adults (Iran)\\', \\'Institute for the Intellectual Development of Children & Young Adults (Iran)\\', \\'\\\\u0643\\\\u0627\\\\u0646\\\\u0648\\\\u0646 \\\\u067e\\\\u0631\\\\u0648\\\\u0631\\\\u0634 \\\\u0641\\\\u0643\\\\u0631\\\\u0649 \\\\u0643\\\\u0648\\\\u062f\\\\u0643\\\\u0627\\\\u0646 \\\\u0648 \\\\u0646\\\\u0648\\\\u062c\\\\u0648\\\\u0627\\\\u0646\\\\u0627\\\\u0646 (Iran)\\', \\'\\\\\\\\u200f\\\\u06a9\\\\u0627\\\\u0646\\\\u0648\\\\u0646 \\\\u067e\\\\u0631\\\\u0648\\\\u0631\\\\u0634 \\\\u0641\\\\u06a9\\\\u0631\\\\u0649 \\\\u06a9\\\\u0648\\\\u062f\\\\u06a9\\\\u0627\\\\u0646 \\\\u0648 \\\\u0646\\\\u0648\\\\u062c\\\\u0648\\\\u0627\\\\u0646\\\\u0627\\\\u0646 (\\\\u0627\\\\u064a\\\\u0631\\\\u0627\\\\u0646)\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n92098057|pro|K\\\\u0101n\\\\u016bn-i Parvarish-i Fikr\\\\u012b-i K\\\\u016bdak\\\\u0101n va Nawjav\\\\u0101n\\\\u0101n (Iran) (Producer)\\', \\'label_with_role\\': \\'K\\\\u0101n\\\\u016bn-i Parvarish-i Fikr\\\\u012b-i K\\\\u016bdak\\\\u0101n va Nawjav\\\\u0101n\\\\u0101n (Iran) (Producer)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/05b38c0a-1cee-4475-a57e-af5a71f34589\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'05b38c0a-1cee-4475-a57e-af5a71f34589\\', \\'ark\\': \\'ark:/81985/n2v40n05s\\', \\'alternate_title\\': [\\'Mashqe Shab\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/05b38c0a-1cee-4475-a57e-af5a71f34589/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/05b38c0a-1cee-4475-a57e-af5a71f34589?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-055\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1989\\'], \\'physical_description_size\\': [\\'12 (height) x 8 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/05b38c0a-1cee-4475-a57e-af5a71f34589\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'19298a6e-39b9-4dae-a491-1e990d91fa1b\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/94d5916b-8ac0-4cf0-a65a-271b35c16536\\', \\'label\\': \\'Iranian Cinema Talk/Symposia\\', \\'variants\\': [], \\'facet\\': \\'info:nul/94d5916b-8ac0-4cf0-a65a-271b35c16536|TOPICAL|Iranian Cinema Talk/Symposia (Topical)\\', \\'label_with_role\\': \\'Iranian Cinema Talk/Symposia (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Bahman Mofid, Puri Banayi, Shahruz Ramtin, Mahmud Tehrani, Parvin Soleimani; The Starring Girl: Shohreh; Cinematographer: Shokrullah Rafi\\\\u2019i\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Talafi\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2008068153\\', \\'label\\': \\'Mu\\\\u1e25ammad\\\\u012b, N\\\\u0101\\\\u1e63ir\\', \\'variants\\': [\\'\\\\\\\\u200f\\\\u0645\\\\u062d\\\\u0645\\\\u062f\\\\u0649\\\\u060c \\\\u0646\\\\u0627\\\\u0635\\\\u0631\\', \\'Mohammadi, Naser-e\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2008068153|drt|Mu\\\\u1e25ammad\\\\u012b, N\\\\u0101\\\\u1e63ir (Director)\\', \\'label_with_role\\': \\'Mu\\\\u1e25ammad\\\\u012b, N\\\\u0101\\\\u1e63ir (Director)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/24c9962e-f8b6-423b-9aeb-00153513366b\\', \\'label\\': \\'Sheibani, Jamshid\\', \\'variants\\': [], \\'facet\\': \\'info:nul/24c9962e-f8b6-423b-9aeb-00153513366b|ctb|Sheibani, Jamshid (Contributor)\\', \\'label_with_role\\': \\'Sheibani, Jamshid (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/3ce29ef5-dd14-49c5-b5e3-530ca2b4ccc3\\', \\'label\\': \\'Tasavir Cinematic Co.\\', \\'variants\\': [], \\'facet\\': \\'info:nul/3ce29ef5-dd14-49c5-b5e3-530ca2b4ccc3|ctb|Tasavir Cinematic Co. (Contributor)\\', \\'label_with_role\\': \\'Tasavir Cinematic Co. (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/1ed920d3-9c70-4eeb-ac48-6cb149e281de\\', \\'label\\': \\'Bateni\\', \\'variants\\': [], \\'facet\\': \\'info:nul/1ed920d3-9c70-4eeb-ac48-6cb149e281de|ctb|Bateni (Contributor)\\', \\'label_with_role\\': \\'Bateni (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/19298a6e-39b9-4dae-a491-1e990d91fa1b\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'19298a6e-39b9-4dae-a491-1e990d91fa1b\\', \\'ark\\': \\'ark:/81985/n2qf8mk5w\\', \\'alternate_title\\': [\\'Vendetta.\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/19298a6e-39b9-4dae-a491-1e990d91fa1b/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/19298a6e-39b9-4dae-a491-1e990d91fa1b?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-123\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1978\\'], \\'physical_description_size\\': [\\'35.5 (height) x 23.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/19298a6e-39b9-4dae-a491-1e990d91fa1b\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'20f4c078-c534-4b59-9114-bd436048f51a\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/924266\\', \\'label\\': \\'Film festivals\\', \\'variants\\': [\\'Film and video festivals\\', \\'Motion picture festivals\\', \\'Moving-picture festivals\\', \\'Video and film festivals\\'], \\'facet\\': \\'http://id.worldcat.org/fast/924266|TOPICAL|Film festivals (Topical)\\', \\'label_with_role\\': \\'Film festivals (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Purple poster, white text\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Wanted: People Who Love Film.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/7c6cfbba-31e6-4792-9ef2-80428faff2e9\\', \\'label\\': \\'Doha Tribeca Film Festival\\', \\'variants\\': [], \\'facet\\': \\'info:nul/7c6cfbba-31e6-4792-9ef2-80428faff2e9|ctb|Doha Tribeca Film Festival (Contributor)\\', \\'label_with_role\\': \\'Doha Tribeca Film Festival (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/20f4c078-c534-4b59-9114-bd436048f51a\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'20f4c078-c534-4b59-9114-bd436048f51a\\', \\'ark\\': \\'ark:/81985/n2gm83p7j\\', \\'alternate_title\\': [], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/20f4c078-c534-4b59-9114-bd436048f51a/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/20f4c078-c534-4b59-9114-bd436048f51a?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-141\\', \\'license\\': None, \\'date_created_edtf\\': [\\'2010\\'], \\'physical_description_size\\': [\\'26 (height) x 18 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/20f4c078-c534-4b59-9114-bd436048f51a\\', \\'publisher\\': [], \\'location\\': [{\\'id\\': \\'http://id.worldcat.org/fast/1214170\\', \\'label\\': \\'Qatar--Daw\\\\u1e25ah\\', \\'variants\\': [\\'Daw\\\\u1e25ah (Qatar). Wiz\\\\u0101rat al-Shu\\\\u02bc\\\\u016bn al-Balad\\\\u012byah. Balad\\\\u012byat al-Daw\\\\u1e25ah\\', \\'Qatar--Ad Daw\\\\u1e25a\\', \\'Qatar--Ad Daw\\\\u1e25ah\\', \\'Qatar--Ad Doha\\', \\'Qatar--Ad Dowhah\\', \\'Qatar--al-Daw\\\\u1e25ah\\', \\'Qatar--Balad\\\\u012byat al-Daw\\\\u1e25ah\\', \\'Qatar--Dauh\\\\u00e1\\', \\'Qatar--Daw\\\\u1e25a\\', \\'Qatar--Daw\\\\u1e25at al Qa\\\\u1e6dar\\', \\'Qatar--D\\\\u0332ocha\\', \\'Qatar--Doh\\', \\'Qatar--Doha\\', \\'Qatar--Do\\\\u1e25ah\\', \\'Qatar--Doho\\', \\'Qatar--Dokha\\', \\'Qatar--Dokh\\\\u00e6\\', \\'Qatar--Dokho\\', \\'Qatar--Duoha\\', \\'Qatar--Horad Dokha\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1214170||Qatar--Daw\\\\u1e25ah\\'}], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'4a121abf-83a6-4f9a-9671-0efb30561aaa\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/1fb0036a-da9f-4e76-a5aa-c7a38c5c03c8\\', \\'label\\': \\'Post-revolution: Art House (Comedy)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/1fb0036a-da9f-4e76-a5aa-c7a38c5c03c8|TOPICAL|Post-revolution: Art House (Comedy) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (Comedy) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Akbar Abdi, Fatemeh Motamedaria, Mahaya Petrossian; Cinematographer: Aziz Sa\\\\u2019ati; Music: Ahmad Pezhman\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'The Actor.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2005052531\\', \\'label\\': \\'Abedini, Reza\\', \\'variants\\': [\\'\\\\u0639\\\\u0627\\\\u0628\\\\u062f\\\\u0649\\\\u0646\\\\u0649\\\\u060c \\\\u0631\\\\u0636\\\\u0627\\', \\'\\\\u02bb\\\\u0100bid\\\\u012bn\\\\u012b, Riz\\\\u0324\\\\u0101\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2005052531|art|Abedini, Reza (Artist)\\', \\'label_with_role\\': \\'Abedini, Reza (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n88664107\\', \\'label\\': \\'Makhmalb\\\\u0101f, Mu\\\\u1e25sin\\', \\'variants\\': [\\'Makhmalbaf, Mohsen\\', \\'\\\\u0645\\\\u062d\\\\u0633\\\\u0646 \\\\u0645\\\\u062e\\\\u0645\\\\u0644\\\\u0628\\\\u0627\\\\u0641\\', \\'\\\\u0645\\\\u062e\\\\u0645\\\\u0644\\\\u0628\\\\u0627\\\\u0641\\\\u060c \\\\u0645\\\\u062d\\\\u0633\\\\u0646\\', \\'\\\\u041c\\\\u0430\\\\u0445\\\\u043c\\\\u0430\\\\u043b\\\\u044c\\\\u0431\\\\u0430\\\\u0444, \\\\u041c\\\\u043e\\\\u0445\\\\u0441\\\\u0435\\\\u043d\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n88664107|drt|Makhmalb\\\\u0101f, Mu\\\\u1e25sin (Director)\\', \\'label_with_role\\': \\'Makhmalb\\\\u0101f, Mu\\\\u1e25sin (Director)\\'}, {\\'role\\': \\'Editor\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n88664107\\', \\'label\\': \\'Makhmalb\\\\u0101f, Mu\\\\u1e25sin\\', \\'variants\\': [\\'Makhmalbaf, Mohsen\\', \\'\\\\u0645\\\\u062d\\\\u0633\\\\u0646 \\\\u0645\\\\u062e\\\\u0645\\\\u0644\\\\u0628\\\\u0627\\\\u0641\\', \\'\\\\u0645\\\\u062e\\\\u0645\\\\u0644\\\\u0628\\\\u0627\\\\u0641\\\\u060c \\\\u0645\\\\u062d\\\\u0633\\\\u0646\\', \\'\\\\u041c\\\\u0430\\\\u0445\\\\u043c\\\\u0430\\\\u043b\\\\u044c\\\\u0431\\\\u0430\\\\u0444, \\\\u041c\\\\u043e\\\\u0445\\\\u0441\\\\u0435\\\\u043d\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n88664107|edt|Makhmalb\\\\u0101f, Mu\\\\u1e25sin (Editor)\\', \\'label_with_role\\': \\'Makhmalb\\\\u0101f, Mu\\\\u1e25sin (Editor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/4a121abf-83a6-4f9a-9671-0efb30561aaa\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'4a121abf-83a6-4f9a-9671-0efb30561aaa\\', \\'ark\\': \\'ark:/81985/n2nz82r33\\', \\'alternate_title\\': [\\'Honarpisheh\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/4a121abf-83a6-4f9a-9671-0efb30561aaa/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/4a121abf-83a6-4f9a-9671-0efb30561aaa?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-027\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1993\\'], \\'physical_description_size\\': [\\'12 (height) x 8 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/4a121abf-83a6-4f9a-9671-0efb30561aaa\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'2c455274-0bb9-4c35-8128-7cedbd1f01e8\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/f98feaba-d2b3-4723-8ed2-fff08dd6ed84\\', \\'label\\': \\'Pre-revolution: Film Farsi (Romance)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/f98feaba-d2b3-4723-8ed2-fff08dd6ed84|TOPICAL|Pre-revolution: Film Farsi (Romance) (Topical)\\', \\'label_with_role\\': \\'Pre-revolution: Film Farsi (Romance) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Iraj Rostami, Googoosh, Natasha, Asadollah Yekta, Rimik, Marutian, Hike, Loreta and Jaleh; Full-Color, Techni Scope, Stereophonic\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Ehsas Dagh\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/121d09d7-67fd-447a-8da1-3e5187ef9206\\', \\'label\\': \\'Shahab Studio\\', \\'variants\\': [], \\'facet\\': \\'info:nul/121d09d7-67fd-447a-8da1-3e5187ef9206|ctb|Shahab Studio (Contributor)\\', \\'label_with_role\\': \\'Shahab Studio (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/c7f7c483-82f1-46cd-8a57-1e4f5b95703a\\', \\'label\\': \\'Zadurian, Rubik\\', \\'variants\\': [], \\'facet\\': \\'info:nul/c7f7c483-82f1-46cd-8a57-1e4f5b95703a|ctb|Zadurian, Rubik (Contributor)\\', \\'label_with_role\\': \\'Zadurian, Rubik (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2c455274-0bb9-4c35-8128-7cedbd1f01e8\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'2c455274-0bb9-4c35-8128-7cedbd1f01e8\\', \\'ark\\': \\'ark:/81985/n2qn61c3h\\', \\'alternate_title\\': [\\'Hot Feelings.\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2c455274-0bb9-4c35-8128-7cedbd1f01e8/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2c455274-0bb9-4c35-8128-7cedbd1f01e8?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-210\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1972\\'], \\'physical_description_size\\': [\\'14.5 (height) x 11 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/2c455274-0bb9-4c35-8128-7cedbd1f01e8\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'d5cdb032-736d-4422-9eb0-5ac418d232dc\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea\\', \\'label\\': \\'Post-revolution: Art House (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Mahmoud Khosravi, Limua Rahi\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Dance of Dust.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2008219379\\', \\'label\\': \\'\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949-\\', \\'variants\\': [\\'\\\\u062d\\\\u0642\\\\u064a\\\\u0642\\\\u0649\\\\u060c \\\\u0627\\\\u0628\\\\u0631\\\\u0627\\\\u0647\\\\u064a\\\\u0645, 1949-\\', \\'Haghighi, Ebrahim, 1949-\\', \\'AGI, 1949-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2008219379|art|\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949- (Artist)\\', \\'label_with_role\\': \\'\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949- (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/nr94007947\\', \\'label\\': \\'Jal\\\\u012bl\\\\u012b, Ab\\\\u016b al-Faz\\\\u0324l\\', \\'variants\\': [\\'Jalili, Abolfazl\\', \\'\\\\u062c\\\\u0644\\\\u064a\\\\u0644\\\\u0649\\\\u060c \\\\u0627\\\\u0628\\\\u0648 \\\\u0627\\\\u0644\\\\u0641\\\\u0636\\\\u0644\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/nr94007947|drt|Jal\\\\u012bl\\\\u012b, Ab\\\\u016b al-Faz\\\\u0324l (Director)\\', \\'label_with_role\\': \\'Jal\\\\u012bl\\\\u012b, Ab\\\\u016b al-Faz\\\\u0324l (Director)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/d5cdb032-736d-4422-9eb0-5ac418d232dc\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'d5cdb032-736d-4422-9eb0-5ac418d232dc\\', \\'ark\\': \\'ark:/81985/n2w08zh0s\\', \\'alternate_title\\': [\\'Raghs-e Khak\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/d5cdb032-736d-4422-9eb0-5ac418d232dc/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/d5cdb032-736d-4422-9eb0-5ac418d232dc?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-020a\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1998\\'], \\'physical_description_size\\': [\\'12 (height) x 8 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/d5cdb032-736d-4422-9eb0-5ac418d232dc\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'fbb2c5c4-d33e-4a19-bf63-aa5299291887\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea\\', \\'label\\': \\'Post-revolution: Art House (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Faramarz Sadighi, Golchehre Sajadieh, Ahmad Najafi; Cinematographer: Iraj Sadeghpour; Music: Fariborz Lachini\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Taste of Cherry.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no98065081\\', \\'label\\': \\'Kiarostami, Abbas\\', \\'variants\\': [\\'Kiy\\\\u0101rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Kiy\\\\u0101 Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s Kiy\\\\u0101\\', \\'\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u064a\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633 \\\\u0643\\\\u064a\\\\u0627\\', \\'\\\\u0643\\\\u064a\\\\u0627\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u0649\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no98065081|drt|Kiarostami, Abbas (Director)\\', \\'label_with_role\\': \\'Kiarostami, Abbas (Director)\\'}, {\\'role\\': \\'Producer\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no98065081\\', \\'label\\': \\'Kiarostami, Abbas\\', \\'variants\\': [\\'Kiy\\\\u0101rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Kiy\\\\u0101 Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s\\', \\'Rustam\\\\u012b, \\\\u02bbAbb\\\\u0101s Kiy\\\\u0101\\', \\'\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u064a\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633 \\\\u0643\\\\u064a\\\\u0627\\', \\'\\\\u0643\\\\u064a\\\\u0627\\\\u0631\\\\u0633\\\\u062a\\\\u0645\\\\u0649\\\\u060c \\\\u0639\\\\u0628\\\\u0627\\\\u0633\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no98065081|pro|Kiarostami, Abbas (Producer)\\', \\'label_with_role\\': \\'Kiarostami, Abbas (Producer)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/fbb2c5c4-d33e-4a19-bf63-aa5299291887\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'fbb2c5c4-d33e-4a19-bf63-aa5299291887\\', \\'ark\\': \\'ark:/81985/n2sx66b5g\\', \\'alternate_title\\': [], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/fbb2c5c4-d33e-4a19-bf63-aa5299291887/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/fbb2c5c4-d33e-4a19-bf63-aa5299291887?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-002a\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1990\\'], \\'physical_description_size\\': [\\'6 (height) x 4 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/fbb2c5c4-d33e-4a19-bf63-aa5299291887\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'860ec76f-a767-49bf-ba2f-43bcf4d988d3\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/fcdb295d-b9e8-4b87-83ad-a4ad2cff2385\\', \\'label\\': \\'Pre-revolution: Film Farsi (Comedy)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/fcdb295d-b9e8-4b87-83ad-a4ad2cff2385|TOPICAL|Pre-revolution: Film Farsi (Comedy) (Topical)\\', \\'label_with_role\\': \\'Pre-revolution: Film Farsi (Comedy) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Behrouz Vossoughi, Googoosh, Semsarzadeh, Nadereh, Nazeri, Nasiri, Gorji, Asadzadeh and Arman; Cinematographer: Ne\\\\u2019mat Haghighi; Music: Varoujan; Singer: Googoosh; Distributor: Sierra Film\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Mamal-e Emrikai\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/5b84947b-a5ad-43d7-ad5e-1ad0d3967208\\', \\'label\\': \\'Qarib, Shapur\\', \\'variants\\': [], \\'facet\\': \\'info:nul/5b84947b-a5ad-43d7-ad5e-1ad0d3967208|ctb|Qarib, Shapur (Contributor)\\', \\'label_with_role\\': \\'Qarib, Shapur (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e\\', \\'label\\': \\'Heddat, Mohammad-Ali\\', \\'variants\\': [], \\'facet\\': \\'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e|ctb|Heddat, Mohammad-Ali (Contributor)\\', \\'label_with_role\\': \\'Heddat, Mohammad-Ali (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/860ec76f-a767-49bf-ba2f-43bcf4d988d3\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'860ec76f-a767-49bf-ba2f-43bcf4d988d3\\', \\'ark\\': \\'ark:/81985/n20c4vk90\\', \\'alternate_title\\': [\\'American Mamal\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/860ec76f-a767-49bf-ba2f-43bcf4d988d3/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/860ec76f-a767-49bf-ba2f-43bcf4d988d3?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-126a\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1974\\'], \\'physical_description_size\\': [\\'35.5 (height) x 23.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/860ec76f-a767-49bf-ba2f-43bcf4d988d3\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217\\', \\'label\\': \\\\\"Post-revolution: Art House (Women\\'s Film)\\\\\", \\'variants\\': [], \\'facet\\': \\\\\"info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217|TOPICAL|Post-revolution: Art House (Women\\'s Film) (Topical)\\\\\", \\'label_with_role\\': \\\\\"Post-revolution: Art House (Women\\'s Film) (Topical)\\\\\"}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Ezzatollah Entezami, Fatemeh Motamed-Aria, Golab Adineh, Afsar Asadi, Jamshid Esmailkhani; Cinematographer: Aziz Sa\\\\u2019ati; Music: Ahmad Pezhman\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'The Blue-Veiled.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2008219379\\', \\'label\\': \\'\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949-\\', \\'variants\\': [\\'\\\\u062d\\\\u0642\\\\u064a\\\\u0642\\\\u0649\\\\u060c \\\\u0627\\\\u0628\\\\u0631\\\\u0627\\\\u0647\\\\u064a\\\\u0645, 1949-\\', \\'Haghighi, Ebrahim, 1949-\\', \\'AGI, 1949-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2008219379|art|\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949- (Artist)\\', \\'label_with_role\\': \\'\\\\u1e24aq\\\\u012bq\\\\u012b, Ibr\\\\u0101h\\\\u012bm, 1949- (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no2002003849\\', \\'label\\': \\'Ban\\\\u012b I\\\\u02bbtim\\\\u0101d, Rakhsh\\\\u0101n, 1954-\\', \\'variants\\': [\\'I\\\\u02bbtim\\\\u0101d, Rakhsh\\\\u0101n Ban\\\\u012b, 1954-\\', \\'Bani-Etemad, Rakhashan, 1954-\\', \\'Etemad, Rakhashan Bani-, 1954-\\', \\'Etemad, R. B. (Rakhashan Bani), 1954-\\', \\'\\\\u0628\\\\u0646\\\\u0649 \\\\u0639\\\\u062a\\\\u0645\\\\u0627\\\\u062f\\\\u060c \\\\u0631\\\\u062e\\\\u0634\\\\u0627\\\\u0646\\', \\'\\\\u0628\\\\u0646\\\\u064a \\\\u0627\\\\u0639\\\\u062a\\\\u0645\\\\u0627\\\\u062f\\\\u060c \\\\u0631\\\\u062e\\\\u0634\\\\u0627\\\\u0646\\\\u060c 1954-\\', \\'Banietemad, Rakhshan, 1954-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/no2002003849|drt|Ban\\\\u012b I\\\\u02bbtim\\\\u0101d, Rakhsh\\\\u0101n, 1954- (Director)\\', \\'label_with_role\\': \\'Ban\\\\u012b I\\\\u02bbtim\\\\u0101d, Rakhsh\\\\u0101n, 1954- (Director)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/09b17567-6e2f-4643-8b58-d57d474f953f\\', \\'label\\': \\'Ganjavi, Abbas\\', \\'variants\\': [], \\'facet\\': \\'info:nul/09b17567-6e2f-4643-8b58-d57d474f953f|ctb|Ganjavi, Abbas (Contributor)\\', \\'label_with_role\\': \\'Ganjavi, Abbas (Contributor)\\'}, {\\'role\\': \\'Producer\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2004048315\\', \\'label\\': \\'Mudarris\\\\u012b, Maj\\\\u012bd\\', \\'variants\\': [\\'Modarresi, M.\\', \\'Modaresi, M. (Majid)\\', \\'Modaresi, Majid\\', \\'\\\\u0645\\\\u062f\\\\u0631\\\\u0633\\\\u0649\\\\u060c \\\\u0645\\\\u062c\\\\u064a\\\\u062f\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2004048315|pro|Mudarris\\\\u012b, Maj\\\\u012bd (Producer)\\', \\'label_with_role\\': \\'Mudarris\\\\u012b, Maj\\\\u012bd (Producer)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0\\', \\'ark\\': \\'ark:/81985/n25t3j15t\\', \\'alternate_title\\': [\\'Rusari-e Abi\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-011a\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1995\\'], \\'physical_description_size\\': [\\'8 (height) x 6 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'f889063c-c283-4482-a89b-83f1fcff93e8\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/ad7466d4-a7a5-496d-ac37-c400a320f898\\', \\'label\\': \\\\\"Post-revolution: Documentary (Women\\'s Film)\\\\\", \\'variants\\': [], \\'facet\\': \\\\\"info:nul/ad7466d4-a7a5-496d-ac37-c400a320f898|TOPICAL|Post-revolution: Documentary (Women\\'s Film) (Topical)\\\\\", \\'label_with_role\\': \\\\\"Post-revolution: Documentary (Women\\'s Film) (Topical)\\\\\"}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}], \\'technique\\': [], \\'description\\': [], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Divorce Iranian Style.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Artist\\', \\'id\\': \\'http://id.loc.gov/authorities/names/nb98080505\\', \\'label\\': \\'Dark, Andy\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/nb98080505|art|Dark, Andy (Artist)\\', \\'label_with_role\\': \\'Dark, Andy (Artist)\\'}, {\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n94018265\\', \\'label\\': \\'Mir-Hosseini, Ziba\\', \\'variants\\': [\\'Hosseini, Ziba Mir-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n94018265|drt|Mir-Hosseini, Ziba (Director)\\', \\'label_with_role\\': \\'Mir-Hosseini, Ziba (Director)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/no94039925\\', \\'label\\': \\'Longinotto, Kim\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/no94039925|drt|Longinotto, Kim (Director)\\', \\'label_with_role\\': \\'Longinotto, Kim (Director)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f889063c-c283-4482-a89b-83f1fcff93e8\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'f889063c-c283-4482-a89b-83f1fcff93e8\\', \\'ark\\': \\'ark:/81985/n2bk18q89\\', \\'alternate_title\\': [], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f889063c-c283-4482-a89b-83f1fcff93e8/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f889063c-c283-4482-a89b-83f1fcff93e8?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-079\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1998\\'], \\'physical_description_size\\': [\\'23 (height) x 16.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/f889063c-c283-4482-a89b-83f1fcff93e8\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'e5c65968-bdfa-43f4-be43-da0277579292\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea\\', \\'label\\': \\'Post-revolution: Art House (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)\\', \\'label_with_role\\': \\'Post-revolution: Art House (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Susan Taslimi, Dariush Farhang, Alireza Mojallal; Cinematographer: Asghar Rafijam; Music: Babak Bayat ; Director: Bahram Beyzai; Cast: Susan Taslimi, Dariush Farhang, Alireza Mojallal; Editor: Varooj Karim Massihi; Cinematographer: Asghar Rafijam; Music: Babak Bayat; Producer: Novin Film\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Maybe Some Other Time.\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n85091733\\', \\'label\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m\\', \\'variants\\': [\\'Beyza\\\\u02bci, Bahram\\', \\'Bayz\\\\u0324\\\\u0101y\\\\u012b, Bahr\\\\u0101m\\', \\\\\"Beiza\\'i, Bahram\\\\\", \\'Beizaee, Bahram\\', \\'Beizaie, Bahram\\', \\'Beyza\\\\u02beie, Bahram\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u064a\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u0626\\\\u0649\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'\\\\u0628\\\\u064a\\\\u0636\\\\u0627\\\\u06d3\\\\u060c \\\\u0628\\\\u0647\\\\u0631\\\\u0627\\\\u0645\\', \\'Beyzaie, Bahram, 1938-\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n85091733|drt|Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Director)\\', \\'label_with_role\\': \\'Bayz\\\\u0324\\\\u0101\\\\u02bc\\\\u012b, Bahr\\\\u0101m (Director)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/99b6e3cf-aac7-421e-ad4a-2d41cf34fdc6\\', \\'label\\': \\'Novin Film\\', \\'variants\\': [], \\'facet\\': \\'info:nul/99b6e3cf-aac7-421e-ad4a-2d41cf34fdc6|ctb|Novin Film (Contributor)\\', \\'label_with_role\\': \\'Novin Film (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/e704790a-b8d9-420f-8701-41c84bb7134b\\', \\'label\\': \\'Karim-Masihi, Varuzh\\', \\'variants\\': [], \\'facet\\': \\'info:nul/e704790a-b8d9-420f-8701-41c84bb7134b|ctb|Karim-Masihi, Varuzh (Contributor)\\', \\'label_with_role\\': \\'Karim-Masihi, Varuzh (Contributor)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e5c65968-bdfa-43f4-be43-da0277579292\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'e5c65968-bdfa-43f4-be43-da0277579292\\', \\'ark\\': \\'ark:/81985/n22n51j8w\\', \\'alternate_title\\': [\\'Shayad Vaghti Digar\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e5c65968-bdfa-43f4-be43-da0277579292/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e5c65968-bdfa-43f4-be43-da0277579292?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-048\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1988\\'], \\'physical_description_size\\': [\\'12 (height) x 8 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/e5c65968-bdfa-43f4-be43-da0277579292\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'e10f7d30-ac3f-4e71-aed0-9e28fe27f691\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e\\', \\'label\\': \\'Pre-revolution: Film Farsi (Drama)\\', \\'variants\\': [], \\'facet\\': \\'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e|TOPICAL|Pre-revolution: Film Farsi (Drama) (Topical)\\', \\'label_with_role\\': \\'Pre-revolution: Film Farsi (Drama) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Iraj Qaderi, Natasha, Arman, Bahmanyar, Narsi, Shandarmani, Ashraf Kashani, Mohammad Farzin, Saber Atashin, Karmen, Hamidi and Abbas Maqfurian; Dancer: Shahrzad; Cinematographer: Qasemivand\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Khashm-e Oqabha\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2006058872\\', \\'label\\': \\'Q\\\\u0101dir\\\\u012b, \\\\u012araj, 1935-2012\\', \\'variants\\': [\\'Qaderi, Iraj, 1935-2012\\', \\'Ghaderi, Iraj, 1935-2012\\', \\'\\\\u0642\\\\u0627\\\\u062f\\\\u0631\\\\u0649\\\\u060c \\\\u0627\\\\u064a\\\\u0631\\\\u062c\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2006058872|drt|Q\\\\u0101dir\\\\u012b, \\\\u012araj, 1935-2012 (Director)\\', \\'label_with_role\\': \\'Q\\\\u0101dir\\\\u012b, \\\\u012araj, 1935-2012 (Director)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e10f7d30-ac3f-4e71-aed0-9e28fe27f691\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'e10f7d30-ac3f-4e71-aed0-9e28fe27f691\\', \\'ark\\': \\'ark:/81985/n2jw88n62\\', \\'alternate_title\\': [\\'The Wrath of Eagles.\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e10f7d30-ac3f-4e71-aed0-9e28fe27f691/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e10f7d30-ac3f-4e71-aed0-9e28fe27f691?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-189\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1971\\'], \\'physical_description_size\\': [\\'27.5 (height) x 19.5 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/e10f7d30-ac3f-4e71-aed0-9e28fe27f691\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\", \"page_content=\\'f55c3aa2-86df-426b-9c75-39393dd2bb50\\' metadata={\\'subject\\': [{\\'role\\': \\'Topical\\', \\'id\\': \\'info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217\\', \\'label\\': \\\\\"Post-revolution: Art House (Women\\'s Film)\\\\\", \\'variants\\': [], \\'facet\\': \\\\\"info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217|TOPICAL|Post-revolution: Art House (Women\\'s Film) (Topical)\\\\\", \\'label_with_role\\': \\\\\"Post-revolution: Art House (Women\\'s Film) (Topical)\\\\\"}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/978818\\', \\'label\\': \\'Iranians\\', \\'variants\\': [\\'Iranis\\', \\'Persians\\'], \\'facet\\': \\'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)\\', \\'label_with_role\\': \\'Iranians (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1354530\\', \\'label\\': \\'Revolution (Iran : 1979)\\', \\'variants\\': [\\'Revolution (Iran : 1979)\\', \\'Iranian Revolution (Iran : 1979)\\', \\'Islamic Revolution (Iran : 1979)\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)\\', \\'label_with_role\\': \\'Revolution (Iran : 1979) (Topical)\\'}, {\\'role\\': \\'Topical\\', \\'id\\': \\'http://id.worldcat.org/fast/1985358\\', \\'label\\': \\'Film posters\\', \\'variants\\': [\\'Cinema posters\\', \\'Motion picture posters\\', \\'Movie posters\\'], \\'facet\\': \\'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)\\', \\'label_with_role\\': \\'Film posters (Topical)\\'}], \\'technique\\': [], \\'description\\': [\\'Cast: Faramarz Sedighi, Sanaz Sehat, Tania Johari, Shahla Riahi, Afsar Asadi, Jaleh Olov, Ali-Asghar Garmsiri, Dariush Assadzadeh, Jahangir Foruhar, Behzad Rahimkhani, Parvin Soleimani, Mehri Mehrina, Purandokht Moheiman, Solmaz Asgharnejad; Cinematographer: Hossein Jafarian; Music: Kambiz Roshanravan\\'], \\'language\\': [{\\'id\\': \\'http://id.loc.gov/vocabulary/languages/per\\', \\'label\\': \\'Persian\\', \\'variants\\': [\\'Kabuli\\', \\'Kabuli-Persian\\', \\'Khorasani\\'], \\'facet\\': \\'http://id.loc.gov/vocabulary/languages/per||Persian\\'}], \\'title\\': \\'Lost Time\\', \\'library_unit\\': \\'University Archives\\', \\'provenance\\': [], \\'contributor\\': [{\\'role\\': \\'Collector\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n82268290\\', \\'label\\': \\'Naficy, Hamid\\', \\'variants\\': [], \\'facet\\': \\'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)\\', \\'label_with_role\\': \\'Naficy, Hamid (Collector)\\'}, {\\'role\\': \\'Director\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2005200469\\', \\'label\\': \\'Dirakhshandah, P\\\\u016br\\\\u0101n\\', \\'variants\\': [\\'\\\\\\\\u200f\\\\u062f\\\\u0631\\\\u062e\\\\u0634\\\\u0646\\\\u062f\\\\u0647\\\\u060c \\\\u067e\\\\u0648\\\\u0631\\\\u0627\\\\u0646\\', \\'P\\\\u016br\\\\u0101n Darakhshandah\\', \\'Derakhshandeh, Pouran\\', \\'Darakhshandah, P\\\\u016br\\\\u0101n\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2005200469|drt|Dirakhshandah, P\\\\u016br\\\\u0101n (Director)\\', \\'label_with_role\\': \\'Dirakhshandah, P\\\\u016br\\\\u0101n (Director)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/abff363b-fd10-415d-a49e-eb69515ee0a2\\', \\'label\\': \\'Emami, Ruhollah\\', \\'variants\\': [], \\'facet\\': \\'info:nul/abff363b-fd10-415d-a49e-eb69515ee0a2|ctb|Emami, Ruhollah (Contributor)\\', \\'label_with_role\\': \\'Emami, Ruhollah (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/d4e1e551-72dc-4c80-8ecf-7fbcc88eb7b1\\', \\'label\\': \\'H\\\\u0307a\\\\u0306ghighi, Ebrahim\\', \\'variants\\': [], \\'facet\\': \\'info:nul/d4e1e551-72dc-4c80-8ecf-7fbcc88eb7b1|ctb|H\\\\u0307a\\\\u0306ghighi, Ebrahim (Contributor)\\', \\'label_with_role\\': \\'H\\\\u0307a\\\\u0306ghighi, Ebrahim (Contributor)\\'}, {\\'role\\': \\'Contributor\\', \\'id\\': \\'info:nul/ca37649f-f23f-4773-91c8-58c996288fc6\\', \\'label\\': \\'Farajollahi, Mohammad-Ali\\', \\'variants\\': [], \\'facet\\': \\'info:nul/ca37649f-f23f-4773-91c8-58c996288fc6|ctb|Farajollahi, Mohammad-Ali (Contributor)\\', \\'label_with_role\\': \\'Farajollahi, Mohammad-Ali (Contributor)\\'}, {\\'role\\': \\'Producer\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2005200469\\', \\'label\\': \\'Dirakhshandah, P\\\\u016br\\\\u0101n\\', \\'variants\\': [\\'\\\\\\\\u200f\\\\u062f\\\\u0631\\\\u062e\\\\u0634\\\\u0646\\\\u062f\\\\u0647\\\\u060c \\\\u067e\\\\u0648\\\\u0631\\\\u0627\\\\u0646\\', \\'P\\\\u016br\\\\u0101n Darakhshandah\\', \\'Derakhshandeh, Pouran\\', \\'Darakhshandah, P\\\\u016br\\\\u0101n\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2005200469|pro|Dirakhshandah, P\\\\u016br\\\\u0101n (Producer)\\', \\'label_with_role\\': \\'Dirakhshandah, P\\\\u016br\\\\u0101n (Producer)\\'}, {\\'role\\': \\'Screenwriter\\', \\'id\\': \\'http://id.loc.gov/authorities/names/n2005200469\\', \\'label\\': \\'Dirakhshandah, P\\\\u016br\\\\u0101n\\', \\'variants\\': [\\'\\\\\\\\u200f\\\\u062f\\\\u0631\\\\u062e\\\\u0634\\\\u0646\\\\u062f\\\\u0647\\\\u060c \\\\u067e\\\\u0648\\\\u0631\\\\u0627\\\\u0646\\', \\'P\\\\u016br\\\\u0101n Darakhshandah\\', \\'Derakhshandeh, Pouran\\', \\'Darakhshandah, P\\\\u016br\\\\u0101n\\'], \\'facet\\': \\'http://id.loc.gov/authorities/names/n2005200469|aus|Dirakhshandah, P\\\\u016br\\\\u0101n (Screenwriter)\\', \\'label_with_role\\': \\'Dirakhshandah, P\\\\u016br\\\\u0101n (Screenwriter)\\'}], \\'genre\\': [{\\'id\\': \\'http://vocab.getty.edu/aat/300027221\\', \\'label\\': \\'posters\\', \\'variants\\': [\\'posters\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'poster\\', \\'bills (posters)\\', \\'\\\\u6d77\\\\u5831\\', \\'affiche\\', \\'affiche\\', \\'affiche\\', \\'aanplakbiljetten\\', \\'plakbrief\\', \\'plakbrieven\\', \\'plakkaat\\', \\'plakkaten\\', \\'Plakat\\', \\'Anschlag (poster)\\', \\'\\\\u05db\\\\u05e8\\\\u05d6\\\\u05d4\\', \\'cartellone\\', \\'affisso\\', \\'cartaz\\', \\'cartel (letrero)\\', \\'afiche\\', \\'anuncio publicitario\\', \\'p\\\\u00f3ster\\', \\'affisch\\'], \\'facet\\': \\'http://vocab.getty.edu/aat/300027221||posters\\'}], \\'api_link\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f55c3aa2-86df-426b-9c75-39393dd2bb50\\', \\'rights_statement\\': {\\'id\\': \\'http://rightsstatements.org/vocab/NoC-US/1.0/\\', \\'label\\': \\'No Copyright - United States\\'}, \\'id\\': \\'f55c3aa2-86df-426b-9c75-39393dd2bb50\\', \\'ark\\': \\'ark:/81985/n2br8ph60\\', \\'alternate_title\\': [\\'Zaman-e Az Dast Rafteh\\'], \\'style_period\\': [], \\'thumbnail\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f55c3aa2-86df-426b-9c75-39393dd2bb50/thumbnail\\', \\'creator\\': [], \\'visibility\\': \\'Public\\', \\'work_type\\': \\'Image\\', \\'iiif_manifest\\': \\'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f55c3aa2-86df-426b-9c75-39393dd2bb50?as=iiif\\', \\'collection\\': {\\'description\\': \\'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.\\', \\'id\\': \\'4ed2338d-c715-4a86-8ac6-6b4030a42be5\\', \\'title\\': \\'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection\\'}, \\'abstract\\': [], \\'accession_number\\': \\'Voyager:14-193-028\\', \\'license\\': None, \\'date_created_edtf\\': [\\'1990\\'], \\'physical_description_size\\': [\\'12 (height) x 8 in (width)\\'], \\'series\\': [], \\'physical_description_material\\': [\\'Offset lithograph on paper\\'], \\'canonical_link\\': \\'https://dc.rdc-staging.library.northwestern.edu/items/f55c3aa2-86df-426b-9c75-39393dd2bb50\\', \\'publisher\\': [], \\'location\\': [], \\'rights_holder\\': [], \\'scope_and_contents\\': [], \\'table_of_contents\\': []}\"]', name='search', id='899ce97a-2b1b-4082-b3ab-74977c990b52', tool_call_id='toolu_bdrk_01KsPVqeMQif2FEJLpeLSBmA', artifact=[Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46', 'label': 'Pre-revolution: Film Farsi (Tough Guy/Luti Film)', 'variants': [], 'facet': 'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46|TOPICAL|Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)', 'label_with_role': 'Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Manuchehr Vosuq, Shirandami, Lida Daneshvar, Suzy Yashar, Kahnamu’ie, Atefeh, Anik, Hushang Salim, Khosravi, Mahmud Tatar, Shoja’oddin, Mehrang nad Hasan Raziani; Cinematographer: Ali Sadeqi'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Navvab.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Contributor', 'id': 'info:nul/d3a44e31-15f5-4203-a39c-9d78cb80aefb', 'label': 'The Advertising House of Iran (Khane-ye Agahi-e Iran)', 'variants': [], 'facet': 'info:nul/d3a44e31-15f5-4203-a39c-9d78cb80aefb|ctb|The Advertising House of Iran (Khane-ye Agahi-e Iran) (Contributor)', 'label_with_role': 'The Advertising House of Iran (Khane-ye Agahi-e Iran) (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/81c87592-c8ff-4aaa-aea4-26d5e912e529', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '81c87592-c8ff-4aaa-aea4-26d5e912e529', 'ark': 'ark:/81985/n2cr5qd48', 'alternate_title': [], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/81c87592-c8ff-4aaa-aea4-26d5e912e529/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/81c87592-c8ff-4aaa-aea4-26d5e912e529?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-196', 'license': None, 'date_created_edtf': ['1972'], 'physical_description_size': ['35 (height) x 23.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/81c87592-c8ff-4aaa-aea4-26d5e912e529', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='81c87592-c8ff-4aaa-aea4-26d5e912e529'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/e2153581-ace4-4a95-8770-e15dd8cee502', 'label': 'Hamid Naficy Iranian Cinema Talks', 'variants': [], 'facet': 'info:nul/e2153581-ace4-4a95-8770-e15dd8cee502|TOPICAL|Hamid Naficy Iranian Cinema Talks (Topical)', 'label_with_role': 'Hamid Naficy Iranian Cinema Talks (Topical)'}, {'role': 'Topical', 'id': 'http://id.loc.gov/authorities/subjects/sh85046366', 'label': 'Exiles', 'variants': [], 'facet': 'http://id.loc.gov/authorities/subjects/sh85046366|TOPICAL|Exiles (Topical)', 'label_with_role': 'Exiles (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.loc.gov/authorities/subjects/sh2009010588', 'label': 'Iranian diaspora', 'variants': ['Diaspora, Iranian'], 'facet': 'http://id.loc.gov/authorities/subjects/sh2009010588|TOPICAL|Iranian diaspora (Topical)', 'label_with_role': 'Iranian diaspora (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': [], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Crossing Borders Convocation : World Cinemas and Transnational Cultures.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Sponsor', 'id': 'http://id.loc.gov/authorities/names/n79046198', 'label': 'University of Iowa', 'variants': ['Iowa. University', 'Ai-ho-hua ta hsüeh', 'Universidad de Iowa', 'State University of Iowa'], 'facet': 'http://id.loc.gov/authorities/names/n79046198|spn|University of Iowa (Sponsor)', 'label_with_role': 'University of Iowa (Sponsor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8791c450-b61a-4001-94ff-8ec9e9f014d7', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '8791c450-b61a-4001-94ff-8ec9e9f014d7', 'ark': 'ark:/81985/n22f7ms6s', 'alternate_title': [], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8791c450-b61a-4001-94ff-8ec9e9f014d7/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8791c450-b61a-4001-94ff-8ec9e9f014d7?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-146', 'license': None, 'date_created_edtf': ['2004'], 'physical_description_size': ['17 (height) x 11 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/8791c450-b61a-4001-94ff-8ec9e9f014d7', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='8791c450-b61a-4001-94ff-8ec9e9f014d7'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea', 'label': 'Post-revolution: Art House (Drama)', 'variants': [], 'facet': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)', 'label_with_role': 'Post-revolution: Art House (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}], 'technique': [], 'description': ['Cast: Jamileh Sheikhi, Mozhdeh Shamsai, Homa Rusta, Majid Mozaffari; Cinematographer: Mehrdad Fakhimi; Music: Babak Bayat'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Travelers.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/n2005052531', 'label': 'Abedini, Reza', 'variants': ['عابدىنى، رضا', 'ʻĀbidīnī, Riz̤ā'], 'facet': 'http://id.loc.gov/authorities/names/n2005052531|art|Abedini, Reza (Artist)', 'label_with_role': 'Abedini, Reza (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n85091733', 'label': 'Bayz̤āʼī, Bahrām', 'variants': ['Beyzaʼi, Bahram', 'Bayz̤āyī, Bahrām', \"Beiza'i, Bahram\", 'Beizaee, Bahram', 'Beizaie, Bahram', 'Beyzaʾie, Bahram', 'بيضايى، بهرام', 'بيضائى، بهرام', 'بيضاۓ، بهرام', 'Beyzaie, Bahram, 1938-'], 'facet': 'http://id.loc.gov/authorities/names/n85091733|drt|Bayz̤āʼī, Bahrām (Director)', 'label_with_role': 'Bayz̤āʼī, Bahrām (Director)'}, {'role': 'Editor', 'id': 'http://id.loc.gov/authorities/names/n85091733', 'label': 'Bayz̤āʼī, Bahrām', 'variants': ['Beyzaʼi, Bahram', 'Bayz̤āyī, Bahrām', \"Beiza'i, Bahram\", 'Beizaee, Bahram', 'Beizaie, Bahram', 'Beyzaʾie, Bahram', 'بيضايى، بهرام', 'بيضائى، بهرام', 'بيضاۓ، بهرام', 'Beyzaie, Bahram, 1938-'], 'facet': 'http://id.loc.gov/authorities/names/n85091733|edt|Bayz̤āʼī, Bahrām (Editor)', 'label_with_role': 'Bayz̤āʼī, Bahrām (Editor)'}, {'role': 'Contributor', 'id': 'info:nul/35b44114-a400-4ef6-b8f4-23ad28a4d97d', 'label': 'Khosravi, Khosro', 'variants': [], 'facet': 'info:nul/35b44114-a400-4ef6-b8f4-23ad28a4d97d|ctb|Khosravi, Khosro (Contributor)', 'label_with_role': 'Khosravi, Khosro (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/baff4e87-d19b-4878-8c7c-e09c3da7f7b5', 'label': 'Rudiani, Majid', 'variants': [], 'facet': 'info:nul/baff4e87-d19b-4878-8c7c-e09c3da7f7b5|ctb|Rudiani, Majid (Contributor)', 'label_with_role': 'Rudiani, Majid (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/c1170eb5-b11c-4f61-a6f8-aed08534056e', 'label': 'Shaykhʹzādah, ʻAbbās', 'variants': [], 'facet': 'info:nul/c1170eb5-b11c-4f61-a6f8-aed08534056e|ctb|Shaykhʹzādah, ʻAbbās (Contributor)', 'label_with_role': 'Shaykhʹzādah, ʻAbbās (Contributor)'}, {'role': 'Producer', 'id': 'http://id.loc.gov/authorities/names/n2004062865', 'label': 'Shaykhʹzādah, ʻAbbās', 'variants': ['Sheikhzadeh, Abbas', 'شيخ زاده، على'], 'facet': 'http://id.loc.gov/authorities/names/n2004062865|pro|Shaykhʹzādah, ʻAbbās (Producer)', 'label_with_role': 'Shaykhʹzādah, ʻAbbās (Producer)'}, {'role': 'Producer', 'id': 'http://id.loc.gov/authorities/names/n85091733', 'label': 'Bayz̤āʼī, Bahrām', 'variants': ['Beyzaʼi, Bahram', 'Bayz̤āyī, Bahrām', \"Beiza'i, Bahram\", 'Beizaee, Bahram', 'Beizaie, Bahram', 'Beyzaʾie, Bahram', 'بيضايى، بهرام', 'بيضائى، بهرام', 'بيضاۓ، بهرام', 'Beyzaie, Bahram, 1938-'], 'facet': 'http://id.loc.gov/authorities/names/n85091733|pro|Bayz̤āʼī, Bahrām (Producer)', 'label_with_role': 'Bayz̤āʼī, Bahrām (Producer)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '73d920bc-0483-40fa-a63a-9eaa6ed4d5c1', 'ark': 'ark:/81985/n2n29r751', 'alternate_title': ['Mosaferan'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-220', 'license': None, 'date_created_edtf': ['1992'], 'physical_description_size': ['8 (height) x 12 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/73d920bc-0483-40fa-a63a-9eaa6ed4d5c1', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='73d920bc-0483-40fa-a63a-9eaa6ed4d5c1'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e', 'label': 'Pre-revolution: Film Farsi (Drama)', 'variants': [], 'facet': 'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e|TOPICAL|Pre-revolution: Film Farsi (Drama) (Topical)', 'label_with_role': 'Pre-revolution: Film Farsi (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Behrouz Vossoughi, Faramarz Qaribian, Parviz Fannizadeh, Garsha Ra’ufi, Enayat Bakhshi, Mahbubeh Bayat, Mastaneh Jazayeri, Manuchehr Naderi, Parvin Soleimani, Ardeshir Pahlavan, Nezamoddin Shafa’ie, Sa’ied Pirdoost, Jahangir Foruhar, Varshochi, Mahdavifar, Safuri, Fahimeh Amuzandeh, Shadi Afarin, karmen, Jannati Shirazi, Hamid Sa’iedpur, Amrollah Saberi, Gorji and introducing Nosrat Partovi; Cinematographer: Ne’mat Haghighi; Music: Esfandiar Monfaredzadeh'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Gavaznha', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/n2007086535', 'label': 'Mumayyiz, Murtaz̤á, 1936 or 1937-', 'variants': ['Mumayyaz, Murtaz̤á, 1936 or 1937-', 'Momayez, Morteza, 1936 or 1937-', 'مميز، مرتضى, 1936 or 1937-'], 'facet': 'http://id.loc.gov/authorities/names/n2007086535|art|Mumayyiz, Murtaz̤á, 1936 or 1937- (Artist)', 'label_with_role': 'Mumayyiz, Murtaz̤á, 1936 or 1937- (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/no99026966', 'label': 'Kīmiyāʼī, Masʻūd', 'variants': ['Kīmiyāyī, Masʻūd', 'Kimiai, Masoud', 'Kimiayi, Massoud', 'Kimiai, Masud', 'Kimiaei, Masoud', 'کيميائى، مسعود', 'كيميايى، مسعود', 'Kimiyayi, Masoud'], 'facet': 'http://id.loc.gov/authorities/names/no99026966|drt|Kīmiyāʼī, Masʻūd (Director)', 'label_with_role': 'Kīmiyāʼī, Masʻūd (Director)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e', 'ark': 'ark:/81985/n26q1vh8s', 'alternate_title': ['The Deer'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-112', 'license': None, 'date_created_edtf': ['1974'], 'physical_description_size': ['35.5 (height) x 20 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/6ffcda5d-ffc9-4f86-ae0f-09c28d5fa5d1', 'label': 'Post-revolution: Art House (War)', 'variants': [], 'facet': 'info:nul/6ffcda5d-ffc9-4f86-ae0f-09c28d5fa5d1|TOPICAL|Post-revolution: Art House (War) (Topical)', 'label_with_role': 'Post-revolution: Art House (War) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1710402', 'label': 'War films', 'variants': ['Anti-war films', 'Antiwar films', 'Combat films', 'Pacifist films'], 'facet': 'http://id.worldcat.org/fast/1710402|TOPICAL|War films (Topical)', 'label_with_role': 'War films (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Golchehreh Sajjadieh, Ahmad Najafi, Shahed Ahmadloo; Cinematographer: Mahmud Kalari; Music: Giti Pashai'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'The Sergeant', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/no99026966', 'label': 'Kīmiyāʼī, Masʻūd', 'variants': ['Kīmiyāyī, Masʻūd', 'Kimiai, Masoud', 'Kimiayi, Massoud', 'Kimiai, Masud', 'Kimiaei, Masoud', 'کيميائى، مسعود', 'كيميايى، مسعود', 'Kimiyayi, Masoud'], 'facet': 'http://id.loc.gov/authorities/names/no99026966|drt|Kīmiyāʼī, Masʻūd (Director)', 'label_with_role': 'Kīmiyāʼī, Masʻūd (Director)'}, {'role': 'Editor', 'id': 'http://id.loc.gov/authorities/names/no99026966', 'label': 'Kīmiyāʼī, Masʻūd', 'variants': ['Kīmiyāyī, Masʻūd', 'Kimiai, Masoud', 'Kimiayi, Massoud', 'Kimiai, Masud', 'Kimiaei, Masoud', 'کيميائى، مسعود', 'كيميايى، مسعود', 'Kimiyayi, Masoud'], 'facet': 'http://id.loc.gov/authorities/names/no99026966|edt|Kīmiyāʼī, Masʻūd (Editor)', 'label_with_role': 'Kīmiyāʼī, Masʻūd (Editor)'}, {'role': 'Contributor', 'id': 'info:nul/033bead5-258c-48fc-adbe-3a266c458275', 'label': 'Abdollahzadeh, Manouchehr', 'variants': [], 'facet': 'info:nul/033bead5-258c-48fc-adbe-3a266c458275|ctb|Abdollahzadeh, Manouchehr (Contributor)', 'label_with_role': 'Abdollahzadeh, Manouchehr (Contributor)'}, {'role': 'Screenwriter', 'id': 'http://id.loc.gov/authorities/names/no99026966', 'label': 'Kīmiyāʼī, Masʻūd', 'variants': ['Kīmiyāyī, Masʻūd', 'Kimiai, Masoud', 'Kimiayi, Massoud', 'Kimiai, Masud', 'Kimiaei, Masoud', 'کيميائى، مسعود', 'كيميايى، مسعود', 'Kimiyayi, Masoud'], 'facet': 'http://id.loc.gov/authorities/names/no99026966|aus|Kīmiyāʼī, Masʻūd (Screenwriter)', 'label_with_role': 'Kīmiyāʼī, Masʻūd (Screenwriter)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8166726c-2b7e-4384-9760-742d962fc2ed', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '8166726c-2b7e-4384-9760-742d962fc2ed', 'ark': 'ark:/81985/n24b3060w', 'alternate_title': ['Goruhban'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8166726c-2b7e-4384-9760-742d962fc2ed/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/8166726c-2b7e-4384-9760-742d962fc2ed?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-102', 'license': None, 'date_created_edtf': ['1992'], 'physical_description_size': ['39 (height) x 27.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/8166726c-2b7e-4384-9760-742d962fc2ed', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='8166726c-2b7e-4384-9760-742d962fc2ed'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46', 'label': 'Pre-revolution: Film Farsi (Tough Guy/Luti Film)', 'variants': [], 'facet': 'info:nul/d17cfe70-5385-4eed-9fa8-69ee5596bd46|TOPICAL|Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)', 'label_with_role': 'Pre-revolution: Film Farsi (Tough Guy/Luti Film) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Behrouz Vossoughi, Jamshid Mashayekhi, Aram, Ali Sabet, Enayat Bakhshi, Morteza Ahmadi, Nazeri, Parvin Soleimani, Hassan Rezai, Jannati Shirazi, Ramin and Jalal; Cinematographer: Hamid Mojtahedi; Music: Varoujan; Distributor: Hesam Film'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Zabih.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Contributor', 'id': 'info:nul/7811124a-5777-48b4-92c8-cb77167539db', 'label': 'Sierra Film', 'variants': [], 'facet': 'info:nul/7811124a-5777-48b4-92c8-cb77167539db|ctb|Sierra Film (Contributor)', 'label_with_role': 'Sierra Film (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/c7dabc10-ae46-4a79-ae41-e71ef4edb2bf', 'label': 'Motevaselani, Mohammad', 'variants': [], 'facet': 'info:nul/c7dabc10-ae46-4a79-ae41-e71ef4edb2bf|ctb|Motevaselani, Mohammad (Contributor)', 'label_with_role': 'Motevaselani, Mohammad (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e', 'label': 'Heddat, Mohammad-Ali', 'variants': [], 'facet': 'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e|ctb|Heddat, Mohammad-Ali (Contributor)', 'label_with_role': 'Heddat, Mohammad-Ali (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/046b5567-87fd-49bb-8d44-dda31931f6ad', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '046b5567-87fd-49bb-8d44-dda31931f6ad', 'ark': 'ark:/81985/n20r9p47t', 'alternate_title': [], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/046b5567-87fd-49bb-8d44-dda31931f6ad/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/046b5567-87fd-49bb-8d44-dda31931f6ad?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-193', 'license': None, 'date_created_edtf': ['1975'], 'physical_description_size': ['39 (height) x 27.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/046b5567-87fd-49bb-8d44-dda31931f6ad', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='046b5567-87fd-49bb-8d44-dda31931f6ad'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea', 'label': 'Post-revolution: Art House (Drama)', 'variants': [], 'facet': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)', 'label_with_role': 'Post-revolution: Art House (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/924266', 'label': 'Film festivals', 'variants': ['Film and video festivals', 'Motion picture festivals', 'Moving-picture festivals', 'Video and film festivals'], 'facet': 'http://id.worldcat.org/fast/924266|TOPICAL|Film festivals (Topical)', 'label_with_role': 'Film festivals (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Farhad Bahremand, Tayebeh Soori, Farzaneh Halili; Cinematographer: Farzad Jadat; Director Assistant: Afshin Liaghat, Milad Jalili; Sound: Hassam Zarfam; Executive Manager: Maryam Afshari'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Don.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/nr94007947', 'label': 'Jalīlī, Abū al-Faz̤l', 'variants': ['Jalili, Abolfazl', 'جليلى، ابو الفضل'], 'facet': 'http://id.loc.gov/authorities/names/nr94007947|drt|Jalīlī, Abū al-Faz̤l (Director)', 'label_with_role': 'Jalīlī, Abū al-Faz̤l (Director)'}, {'role': 'Contributor', 'id': 'info:nul/1d7672d9-1125-4c75-9807-48a09fcbc2ea', 'label': 'IRIB Channel Two', 'variants': [], 'facet': 'info:nul/1d7672d9-1125-4c75-9807-48a09fcbc2ea|ctb|IRIB Channel Two (Contributor)', 'label_with_role': 'IRIB Channel Two (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f70bf21f-a1f9-4eaf-80ce-0071536d10d5', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'f70bf21f-a1f9-4eaf-80ce-0071536d10d5', 'ark': 'ark:/81985/n22b8xd20', 'alternate_title': ['Dān'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f70bf21f-a1f9-4eaf-80ce-0071536d10d5/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f70bf21f-a1f9-4eaf-80ce-0071536d10d5?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-021', 'license': None, 'date_created_edtf': ['1998'], 'physical_description_size': ['12 (height) x 8 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/f70bf21f-a1f9-4eaf-80ce-0071536d10d5', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='f70bf21f-a1f9-4eaf-80ce-0071536d10d5'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/ed842aa6-ab39-4e91-9514-1954decb8604', 'label': 'Post-revolution: Documentary', 'variants': [], 'facet': 'info:nul/ed842aa6-ab39-4e91-9514-1954decb8604|TOPICAL|Post-revolution: Documentary (Topical)', 'label_with_role': 'Post-revolution: Documentary (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}], 'technique': [], 'description': ['Cast: Students and Instructors at the Shahid Masumi School; Music: Mohammad Reza Aligholi; Cinematographer: Iraj Safavi'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Homework.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/n2008219379', 'label': 'Ḥaqīqī, Ibrāhīm, 1949-', 'variants': ['حقيقى، ابراهيم, 1949-', 'Haghighi, Ebrahim, 1949-', 'AGI, 1949-'], 'facet': 'http://id.loc.gov/authorities/names/n2008219379|art|Ḥaqīqī, Ibrāhīm, 1949- (Artist)', 'label_with_role': 'Ḥaqīqī, Ibrāhīm, 1949- (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/no98065081', 'label': 'Kiarostami, Abbas', 'variants': ['Kiyārustamī, ʻAbbās', 'Kiyā Rustamī, ʻAbbās', 'Rustamī, ʻAbbās Kiyā', 'رستمي، عباس كيا', 'كيارستمى، عباس'], 'facet': 'http://id.loc.gov/authorities/names/no98065081|drt|Kiarostami, Abbas (Director)', 'label_with_role': 'Kiarostami, Abbas (Director)'}, {'role': 'Editor', 'id': 'http://id.loc.gov/authorities/names/no98065081', 'label': 'Kiarostami, Abbas', 'variants': ['Kiyārustamī, ʻAbbās', 'Kiyā Rustamī, ʻAbbās', 'Rustamī, ʻAbbās Kiyā', 'رستمي، عباس كيا', 'كيارستمى، عباس'], 'facet': 'http://id.loc.gov/authorities/names/no98065081|edt|Kiarostami, Abbas (Editor)', 'label_with_role': 'Kiarostami, Abbas (Editor)'}, {'role': 'Producer', 'id': 'http://id.loc.gov/authorities/names/n92098057', 'label': 'Kānūn-i Parvarish-i Fikrī-i Kūdakān va Nawjavānān (Iran)', 'variants': ['Institute for the Intellectual Development of Children and Young Adults (Iran)', 'Institute for the Intellectual Development of Children & Young Adults (Iran)', 'كانون پرورش فكرى كودكان و نوجوانان (Iran)', '\\u200fکانون پرورش فکرى کودکان و نوجوانان (ايران)'], 'facet': 'http://id.loc.gov/authorities/names/n92098057|pro|Kānūn-i Parvarish-i Fikrī-i Kūdakān va Nawjavānān (Iran) (Producer)', 'label_with_role': 'Kānūn-i Parvarish-i Fikrī-i Kūdakān va Nawjavānān (Iran) (Producer)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/05b38c0a-1cee-4475-a57e-af5a71f34589', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '05b38c0a-1cee-4475-a57e-af5a71f34589', 'ark': 'ark:/81985/n2v40n05s', 'alternate_title': ['Mashqe Shab'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/05b38c0a-1cee-4475-a57e-af5a71f34589/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/05b38c0a-1cee-4475-a57e-af5a71f34589?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-055', 'license': None, 'date_created_edtf': ['1989'], 'physical_description_size': ['12 (height) x 8 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/05b38c0a-1cee-4475-a57e-af5a71f34589', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='05b38c0a-1cee-4475-a57e-af5a71f34589'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/94d5916b-8ac0-4cf0-a65a-271b35c16536', 'label': 'Iranian Cinema Talk/Symposia', 'variants': [], 'facet': 'info:nul/94d5916b-8ac0-4cf0-a65a-271b35c16536|TOPICAL|Iranian Cinema Talk/Symposia (Topical)', 'label_with_role': 'Iranian Cinema Talk/Symposia (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Bahman Mofid, Puri Banayi, Shahruz Ramtin, Mahmud Tehrani, Parvin Soleimani; The Starring Girl: Shohreh; Cinematographer: Shokrullah Rafi’i'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Talafi', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n2008068153', 'label': 'Muḥammadī, Nāṣir', 'variants': ['\\u200fمحمدى، ناصر', 'Mohammadi, Naser-e'], 'facet': 'http://id.loc.gov/authorities/names/n2008068153|drt|Muḥammadī, Nāṣir (Director)', 'label_with_role': 'Muḥammadī, Nāṣir (Director)'}, {'role': 'Contributor', 'id': 'info:nul/24c9962e-f8b6-423b-9aeb-00153513366b', 'label': 'Sheibani, Jamshid', 'variants': [], 'facet': 'info:nul/24c9962e-f8b6-423b-9aeb-00153513366b|ctb|Sheibani, Jamshid (Contributor)', 'label_with_role': 'Sheibani, Jamshid (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/3ce29ef5-dd14-49c5-b5e3-530ca2b4ccc3', 'label': 'Tasavir Cinematic Co.', 'variants': [], 'facet': 'info:nul/3ce29ef5-dd14-49c5-b5e3-530ca2b4ccc3|ctb|Tasavir Cinematic Co. (Contributor)', 'label_with_role': 'Tasavir Cinematic Co. (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/1ed920d3-9c70-4eeb-ac48-6cb149e281de', 'label': 'Bateni', 'variants': [], 'facet': 'info:nul/1ed920d3-9c70-4eeb-ac48-6cb149e281de|ctb|Bateni (Contributor)', 'label_with_role': 'Bateni (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/19298a6e-39b9-4dae-a491-1e990d91fa1b', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '19298a6e-39b9-4dae-a491-1e990d91fa1b', 'ark': 'ark:/81985/n2qf8mk5w', 'alternate_title': ['Vendetta.'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/19298a6e-39b9-4dae-a491-1e990d91fa1b/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/19298a6e-39b9-4dae-a491-1e990d91fa1b?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-123', 'license': None, 'date_created_edtf': ['1978'], 'physical_description_size': ['35.5 (height) x 23.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/19298a6e-39b9-4dae-a491-1e990d91fa1b', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='19298a6e-39b9-4dae-a491-1e990d91fa1b'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/924266', 'label': 'Film festivals', 'variants': ['Film and video festivals', 'Motion picture festivals', 'Moving-picture festivals', 'Video and film festivals'], 'facet': 'http://id.worldcat.org/fast/924266|TOPICAL|Film festivals (Topical)', 'label_with_role': 'Film festivals (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Purple poster, white text'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Wanted: People Who Love Film.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Contributor', 'id': 'info:nul/7c6cfbba-31e6-4792-9ef2-80428faff2e9', 'label': 'Doha Tribeca Film Festival', 'variants': [], 'facet': 'info:nul/7c6cfbba-31e6-4792-9ef2-80428faff2e9|ctb|Doha Tribeca Film Festival (Contributor)', 'label_with_role': 'Doha Tribeca Film Festival (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/20f4c078-c534-4b59-9114-bd436048f51a', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '20f4c078-c534-4b59-9114-bd436048f51a', 'ark': 'ark:/81985/n2gm83p7j', 'alternate_title': [], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/20f4c078-c534-4b59-9114-bd436048f51a/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/20f4c078-c534-4b59-9114-bd436048f51a?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-141', 'license': None, 'date_created_edtf': ['2010'], 'physical_description_size': ['26 (height) x 18 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/20f4c078-c534-4b59-9114-bd436048f51a', 'publisher': [], 'location': [{'id': 'http://id.worldcat.org/fast/1214170', 'label': 'Qatar--Dawḥah', 'variants': ['Dawḥah (Qatar). Wizārat al-Shuʼūn al-Baladīyah. Baladīyat al-Dawḥah', 'Qatar--Ad Dawḥa', 'Qatar--Ad Dawḥah', 'Qatar--Ad Doha', 'Qatar--Ad Dowhah', 'Qatar--al-Dawḥah', 'Qatar--Baladīyat al-Dawḥah', 'Qatar--Dauhá', 'Qatar--Dawḥa', 'Qatar--Dawḥat al Qaṭar', 'Qatar--D̲ocha', 'Qatar--Doh', 'Qatar--Doha', 'Qatar--Doḥah', 'Qatar--Doho', 'Qatar--Dokha', 'Qatar--Dokhæ', 'Qatar--Dokho', 'Qatar--Duoha', 'Qatar--Horad Dokha'], 'facet': 'http://id.worldcat.org/fast/1214170||Qatar--Dawḥah'}], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='20f4c078-c534-4b59-9114-bd436048f51a'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/1fb0036a-da9f-4e76-a5aa-c7a38c5c03c8', 'label': 'Post-revolution: Art House (Comedy)', 'variants': [], 'facet': 'info:nul/1fb0036a-da9f-4e76-a5aa-c7a38c5c03c8|TOPICAL|Post-revolution: Art House (Comedy) (Topical)', 'label_with_role': 'Post-revolution: Art House (Comedy) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}], 'technique': [], 'description': ['Cast: Akbar Abdi, Fatemeh Motamedaria, Mahaya Petrossian; Cinematographer: Aziz Sa’ati; Music: Ahmad Pezhman'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'The Actor.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/n2005052531', 'label': 'Abedini, Reza', 'variants': ['عابدىنى، رضا', 'ʻĀbidīnī, Riz̤ā'], 'facet': 'http://id.loc.gov/authorities/names/n2005052531|art|Abedini, Reza (Artist)', 'label_with_role': 'Abedini, Reza (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n88664107', 'label': 'Makhmalbāf, Muḥsin', 'variants': ['Makhmalbaf, Mohsen', 'محسن مخملباف', 'مخملباف، محسن', 'Махмальбаф, Мохсен'], 'facet': 'http://id.loc.gov/authorities/names/n88664107|drt|Makhmalbāf, Muḥsin (Director)', 'label_with_role': 'Makhmalbāf, Muḥsin (Director)'}, {'role': 'Editor', 'id': 'http://id.loc.gov/authorities/names/n88664107', 'label': 'Makhmalbāf, Muḥsin', 'variants': ['Makhmalbaf, Mohsen', 'محسن مخملباف', 'مخملباف، محسن', 'Махмальбаф, Мохсен'], 'facet': 'http://id.loc.gov/authorities/names/n88664107|edt|Makhmalbāf, Muḥsin (Editor)', 'label_with_role': 'Makhmalbāf, Muḥsin (Editor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/4a121abf-83a6-4f9a-9671-0efb30561aaa', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '4a121abf-83a6-4f9a-9671-0efb30561aaa', 'ark': 'ark:/81985/n2nz82r33', 'alternate_title': ['Honarpisheh'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/4a121abf-83a6-4f9a-9671-0efb30561aaa/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/4a121abf-83a6-4f9a-9671-0efb30561aaa?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-027', 'license': None, 'date_created_edtf': ['1993'], 'physical_description_size': ['12 (height) x 8 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/4a121abf-83a6-4f9a-9671-0efb30561aaa', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='4a121abf-83a6-4f9a-9671-0efb30561aaa'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/f98feaba-d2b3-4723-8ed2-fff08dd6ed84', 'label': 'Pre-revolution: Film Farsi (Romance)', 'variants': [], 'facet': 'info:nul/f98feaba-d2b3-4723-8ed2-fff08dd6ed84|TOPICAL|Pre-revolution: Film Farsi (Romance) (Topical)', 'label_with_role': 'Pre-revolution: Film Farsi (Romance) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Iraj Rostami, Googoosh, Natasha, Asadollah Yekta, Rimik, Marutian, Hike, Loreta and Jaleh; Full-Color, Techni Scope, Stereophonic'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Ehsas Dagh', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Contributor', 'id': 'info:nul/121d09d7-67fd-447a-8da1-3e5187ef9206', 'label': 'Shahab Studio', 'variants': [], 'facet': 'info:nul/121d09d7-67fd-447a-8da1-3e5187ef9206|ctb|Shahab Studio (Contributor)', 'label_with_role': 'Shahab Studio (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/c7f7c483-82f1-46cd-8a57-1e4f5b95703a', 'label': 'Zadurian, Rubik', 'variants': [], 'facet': 'info:nul/c7f7c483-82f1-46cd-8a57-1e4f5b95703a|ctb|Zadurian, Rubik (Contributor)', 'label_with_role': 'Zadurian, Rubik (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2c455274-0bb9-4c35-8128-7cedbd1f01e8', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '2c455274-0bb9-4c35-8128-7cedbd1f01e8', 'ark': 'ark:/81985/n2qn61c3h', 'alternate_title': ['Hot Feelings.'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2c455274-0bb9-4c35-8128-7cedbd1f01e8/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/2c455274-0bb9-4c35-8128-7cedbd1f01e8?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-210', 'license': None, 'date_created_edtf': ['1972'], 'physical_description_size': ['14.5 (height) x 11 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/2c455274-0bb9-4c35-8128-7cedbd1f01e8', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='2c455274-0bb9-4c35-8128-7cedbd1f01e8'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea', 'label': 'Post-revolution: Art House (Drama)', 'variants': [], 'facet': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)', 'label_with_role': 'Post-revolution: Art House (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Mahmoud Khosravi, Limua Rahi'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Dance of Dust.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/n2008219379', 'label': 'Ḥaqīqī, Ibrāhīm, 1949-', 'variants': ['حقيقى، ابراهيم, 1949-', 'Haghighi, Ebrahim, 1949-', 'AGI, 1949-'], 'facet': 'http://id.loc.gov/authorities/names/n2008219379|art|Ḥaqīqī, Ibrāhīm, 1949- (Artist)', 'label_with_role': 'Ḥaqīqī, Ibrāhīm, 1949- (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/nr94007947', 'label': 'Jalīlī, Abū al-Faz̤l', 'variants': ['Jalili, Abolfazl', 'جليلى، ابو الفضل'], 'facet': 'http://id.loc.gov/authorities/names/nr94007947|drt|Jalīlī, Abū al-Faz̤l (Director)', 'label_with_role': 'Jalīlī, Abū al-Faz̤l (Director)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/d5cdb032-736d-4422-9eb0-5ac418d232dc', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'd5cdb032-736d-4422-9eb0-5ac418d232dc', 'ark': 'ark:/81985/n2w08zh0s', 'alternate_title': ['Raghs-e Khak'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/d5cdb032-736d-4422-9eb0-5ac418d232dc/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/d5cdb032-736d-4422-9eb0-5ac418d232dc?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-020a', 'license': None, 'date_created_edtf': ['1998'], 'physical_description_size': ['12 (height) x 8 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/d5cdb032-736d-4422-9eb0-5ac418d232dc', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='d5cdb032-736d-4422-9eb0-5ac418d232dc'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea', 'label': 'Post-revolution: Art House (Drama)', 'variants': [], 'facet': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)', 'label_with_role': 'Post-revolution: Art House (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Faramarz Sadighi, Golchehre Sajadieh, Ahmad Najafi; Cinematographer: Iraj Sadeghpour; Music: Fariborz Lachini'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Taste of Cherry.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/no98065081', 'label': 'Kiarostami, Abbas', 'variants': ['Kiyārustamī, ʻAbbās', 'Kiyā Rustamī, ʻAbbās', 'Rustamī, ʻAbbās Kiyā', 'رستمي، عباس كيا', 'كيارستمى، عباس'], 'facet': 'http://id.loc.gov/authorities/names/no98065081|drt|Kiarostami, Abbas (Director)', 'label_with_role': 'Kiarostami, Abbas (Director)'}, {'role': 'Producer', 'id': 'http://id.loc.gov/authorities/names/no98065081', 'label': 'Kiarostami, Abbas', 'variants': ['Kiyārustamī, ʻAbbās', 'Kiyā Rustamī, ʻAbbās', 'Rustamī, ʻAbbās Kiyā', 'رستمي، عباس كيا', 'كيارستمى، عباس'], 'facet': 'http://id.loc.gov/authorities/names/no98065081|pro|Kiarostami, Abbas (Producer)', 'label_with_role': 'Kiarostami, Abbas (Producer)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/fbb2c5c4-d33e-4a19-bf63-aa5299291887', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'fbb2c5c4-d33e-4a19-bf63-aa5299291887', 'ark': 'ark:/81985/n2sx66b5g', 'alternate_title': [], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/fbb2c5c4-d33e-4a19-bf63-aa5299291887/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/fbb2c5c4-d33e-4a19-bf63-aa5299291887?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-002a', 'license': None, 'date_created_edtf': ['1990'], 'physical_description_size': ['6 (height) x 4 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/fbb2c5c4-d33e-4a19-bf63-aa5299291887', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='fbb2c5c4-d33e-4a19-bf63-aa5299291887'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/fcdb295d-b9e8-4b87-83ad-a4ad2cff2385', 'label': 'Pre-revolution: Film Farsi (Comedy)', 'variants': [], 'facet': 'info:nul/fcdb295d-b9e8-4b87-83ad-a4ad2cff2385|TOPICAL|Pre-revolution: Film Farsi (Comedy) (Topical)', 'label_with_role': 'Pre-revolution: Film Farsi (Comedy) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Behrouz Vossoughi, Googoosh, Semsarzadeh, Nadereh, Nazeri, Nasiri, Gorji, Asadzadeh and Arman; Cinematographer: Ne’mat Haghighi; Music: Varoujan; Singer: Googoosh; Distributor: Sierra Film'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Mamal-e Emrikai', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Contributor', 'id': 'info:nul/5b84947b-a5ad-43d7-ad5e-1ad0d3967208', 'label': 'Qarib, Shapur', 'variants': [], 'facet': 'info:nul/5b84947b-a5ad-43d7-ad5e-1ad0d3967208|ctb|Qarib, Shapur (Contributor)', 'label_with_role': 'Qarib, Shapur (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e', 'label': 'Heddat, Mohammad-Ali', 'variants': [], 'facet': 'info:nul/ce075a66-f3c0-4297-b070-9227abafff5e|ctb|Heddat, Mohammad-Ali (Contributor)', 'label_with_role': 'Heddat, Mohammad-Ali (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/860ec76f-a767-49bf-ba2f-43bcf4d988d3', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': '860ec76f-a767-49bf-ba2f-43bcf4d988d3', 'ark': 'ark:/81985/n20c4vk90', 'alternate_title': ['American Mamal'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/860ec76f-a767-49bf-ba2f-43bcf4d988d3/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/860ec76f-a767-49bf-ba2f-43bcf4d988d3?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-126a', 'license': None, 'date_created_edtf': ['1974'], 'physical_description_size': ['35.5 (height) x 23.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/860ec76f-a767-49bf-ba2f-43bcf4d988d3', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='860ec76f-a767-49bf-ba2f-43bcf4d988d3'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217', 'label': \"Post-revolution: Art House (Women's Film)\", 'variants': [], 'facet': \"info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217|TOPICAL|Post-revolution: Art House (Women's Film) (Topical)\", 'label_with_role': \"Post-revolution: Art House (Women's Film) (Topical)\"}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': ['Cast: Ezzatollah Entezami, Fatemeh Motamed-Aria, Golab Adineh, Afsar Asadi, Jamshid Esmailkhani; Cinematographer: Aziz Sa’ati; Music: Ahmad Pezhman'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'The Blue-Veiled.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/n2008219379', 'label': 'Ḥaqīqī, Ibrāhīm, 1949-', 'variants': ['حقيقى، ابراهيم, 1949-', 'Haghighi, Ebrahim, 1949-', 'AGI, 1949-'], 'facet': 'http://id.loc.gov/authorities/names/n2008219379|art|Ḥaqīqī, Ibrāhīm, 1949- (Artist)', 'label_with_role': 'Ḥaqīqī, Ibrāhīm, 1949- (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/no2002003849', 'label': 'Banī Iʻtimād, Rakhshān, 1954-', 'variants': ['Iʻtimād, Rakhshān Banī, 1954-', 'Bani-Etemad, Rakhashan, 1954-', 'Etemad, Rakhashan Bani-, 1954-', 'Etemad, R. B. (Rakhashan Bani), 1954-', 'بنى عتماد، رخشان', 'بني اعتماد، رخشان، 1954-', 'Banietemad, Rakhshan, 1954-'], 'facet': 'http://id.loc.gov/authorities/names/no2002003849|drt|Banī Iʻtimād, Rakhshān, 1954- (Director)', 'label_with_role': 'Banī Iʻtimād, Rakhshān, 1954- (Director)'}, {'role': 'Contributor', 'id': 'info:nul/09b17567-6e2f-4643-8b58-d57d474f953f', 'label': 'Ganjavi, Abbas', 'variants': [], 'facet': 'info:nul/09b17567-6e2f-4643-8b58-d57d474f953f|ctb|Ganjavi, Abbas (Contributor)', 'label_with_role': 'Ganjavi, Abbas (Contributor)'}, {'role': 'Producer', 'id': 'http://id.loc.gov/authorities/names/n2004048315', 'label': 'Mudarrisī, Majīd', 'variants': ['Modarresi, M.', 'Modaresi, M. (Majid)', 'Modaresi, Majid', 'مدرسى، مجيد'], 'facet': 'http://id.loc.gov/authorities/names/n2004048315|pro|Mudarrisī, Majīd (Producer)', 'label_with_role': 'Mudarrisī, Majīd (Producer)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0', 'ark': 'ark:/81985/n25t3j15t', 'alternate_title': ['Rusari-e Abi'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-011a', 'license': None, 'date_created_edtf': ['1995'], 'physical_description_size': ['8 (height) x 6 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/ad7466d4-a7a5-496d-ac37-c400a320f898', 'label': \"Post-revolution: Documentary (Women's Film)\", 'variants': [], 'facet': \"info:nul/ad7466d4-a7a5-496d-ac37-c400a320f898|TOPICAL|Post-revolution: Documentary (Women's Film) (Topical)\", 'label_with_role': \"Post-revolution: Documentary (Women's Film) (Topical)\"}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}], 'technique': [], 'description': [], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Divorce Iranian Style.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Artist', 'id': 'http://id.loc.gov/authorities/names/nb98080505', 'label': 'Dark, Andy', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/nb98080505|art|Dark, Andy (Artist)', 'label_with_role': 'Dark, Andy (Artist)'}, {'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n94018265', 'label': 'Mir-Hosseini, Ziba', 'variants': ['Hosseini, Ziba Mir-'], 'facet': 'http://id.loc.gov/authorities/names/n94018265|drt|Mir-Hosseini, Ziba (Director)', 'label_with_role': 'Mir-Hosseini, Ziba (Director)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/no94039925', 'label': 'Longinotto, Kim', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/no94039925|drt|Longinotto, Kim (Director)', 'label_with_role': 'Longinotto, Kim (Director)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f889063c-c283-4482-a89b-83f1fcff93e8', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'f889063c-c283-4482-a89b-83f1fcff93e8', 'ark': 'ark:/81985/n2bk18q89', 'alternate_title': [], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f889063c-c283-4482-a89b-83f1fcff93e8/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f889063c-c283-4482-a89b-83f1fcff93e8?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-079', 'license': None, 'date_created_edtf': ['1998'], 'physical_description_size': ['23 (height) x 16.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/f889063c-c283-4482-a89b-83f1fcff93e8', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='f889063c-c283-4482-a89b-83f1fcff93e8'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea', 'label': 'Post-revolution: Art House (Drama)', 'variants': [], 'facet': 'info:nul/817096f5-5f2a-4ae8-b956-a70af1b7c2ea|TOPICAL|Post-revolution: Art House (Drama) (Topical)', 'label_with_role': 'Post-revolution: Art House (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}], 'technique': [], 'description': ['Cast: Susan Taslimi, Dariush Farhang, Alireza Mojallal; Cinematographer: Asghar Rafijam; Music: Babak Bayat ; Director: Bahram Beyzai; Cast: Susan Taslimi, Dariush Farhang, Alireza Mojallal; Editor: Varooj Karim Massihi; Cinematographer: Asghar Rafijam; Music: Babak Bayat; Producer: Novin Film'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Maybe Some Other Time.', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n85091733', 'label': 'Bayz̤āʼī, Bahrām', 'variants': ['Beyzaʼi, Bahram', 'Bayz̤āyī, Bahrām', \"Beiza'i, Bahram\", 'Beizaee, Bahram', 'Beizaie, Bahram', 'Beyzaʾie, Bahram', 'بيضايى، بهرام', 'بيضائى، بهرام', 'بيضاۓ، بهرام', 'Beyzaie, Bahram, 1938-'], 'facet': 'http://id.loc.gov/authorities/names/n85091733|drt|Bayz̤āʼī, Bahrām (Director)', 'label_with_role': 'Bayz̤āʼī, Bahrām (Director)'}, {'role': 'Contributor', 'id': 'info:nul/99b6e3cf-aac7-421e-ad4a-2d41cf34fdc6', 'label': 'Novin Film', 'variants': [], 'facet': 'info:nul/99b6e3cf-aac7-421e-ad4a-2d41cf34fdc6|ctb|Novin Film (Contributor)', 'label_with_role': 'Novin Film (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/e704790a-b8d9-420f-8701-41c84bb7134b', 'label': 'Karim-Masihi, Varuzh', 'variants': [], 'facet': 'info:nul/e704790a-b8d9-420f-8701-41c84bb7134b|ctb|Karim-Masihi, Varuzh (Contributor)', 'label_with_role': 'Karim-Masihi, Varuzh (Contributor)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e5c65968-bdfa-43f4-be43-da0277579292', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'e5c65968-bdfa-43f4-be43-da0277579292', 'ark': 'ark:/81985/n22n51j8w', 'alternate_title': ['Shayad Vaghti Digar'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e5c65968-bdfa-43f4-be43-da0277579292/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e5c65968-bdfa-43f4-be43-da0277579292?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-048', 'license': None, 'date_created_edtf': ['1988'], 'physical_description_size': ['12 (height) x 8 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/e5c65968-bdfa-43f4-be43-da0277579292', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='e5c65968-bdfa-43f4-be43-da0277579292'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e', 'label': 'Pre-revolution: Film Farsi (Drama)', 'variants': [], 'facet': 'info:nul/e29deaa9-d6bd-4c29-8f97-cf5c15a89f9e|TOPICAL|Pre-revolution: Film Farsi (Drama) (Topical)', 'label_with_role': 'Pre-revolution: Film Farsi (Drama) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}], 'technique': [], 'description': ['Cast: Iraj Qaderi, Natasha, Arman, Bahmanyar, Narsi, Shandarmani, Ashraf Kashani, Mohammad Farzin, Saber Atashin, Karmen, Hamidi and Abbas Maqfurian; Dancer: Shahrzad; Cinematographer: Qasemivand'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Khashm-e Oqabha', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n2006058872', 'label': 'Qādirī, Īraj, 1935-2012', 'variants': ['Qaderi, Iraj, 1935-2012', 'Ghaderi, Iraj, 1935-2012', 'قادرى، ايرج'], 'facet': 'http://id.loc.gov/authorities/names/n2006058872|drt|Qādirī, Īraj, 1935-2012 (Director)', 'label_with_role': 'Qādirī, Īraj, 1935-2012 (Director)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e10f7d30-ac3f-4e71-aed0-9e28fe27f691', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'e10f7d30-ac3f-4e71-aed0-9e28fe27f691', 'ark': 'ark:/81985/n2jw88n62', 'alternate_title': ['The Wrath of Eagles.'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e10f7d30-ac3f-4e71-aed0-9e28fe27f691/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/e10f7d30-ac3f-4e71-aed0-9e28fe27f691?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-189', 'license': None, 'date_created_edtf': ['1971'], 'physical_description_size': ['27.5 (height) x 19.5 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/e10f7d30-ac3f-4e71-aed0-9e28fe27f691', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='e10f7d30-ac3f-4e71-aed0-9e28fe27f691'), Document(metadata={'subject': [{'role': 'Topical', 'id': 'info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217', 'label': \"Post-revolution: Art House (Women's Film)\", 'variants': [], 'facet': \"info:nul/dad44f0c-a843-4886-8de8-228ed0a6c217|TOPICAL|Post-revolution: Art House (Women's Film) (Topical)\", 'label_with_role': \"Post-revolution: Art House (Women's Film) (Topical)\"}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/978818', 'label': 'Iranians', 'variants': ['Iranis', 'Persians'], 'facet': 'http://id.worldcat.org/fast/978818|TOPICAL|Iranians (Topical)', 'label_with_role': 'Iranians (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1354530', 'label': 'Revolution (Iran : 1979)', 'variants': ['Revolution (Iran : 1979)', 'Iranian Revolution (Iran : 1979)', 'Islamic Revolution (Iran : 1979)'], 'facet': 'http://id.worldcat.org/fast/1354530|TOPICAL|Revolution (Iran : 1979) (Topical)', 'label_with_role': 'Revolution (Iran : 1979) (Topical)'}, {'role': 'Topical', 'id': 'http://id.worldcat.org/fast/1985358', 'label': 'Film posters', 'variants': ['Cinema posters', 'Motion picture posters', 'Movie posters'], 'facet': 'http://id.worldcat.org/fast/1985358|TOPICAL|Film posters (Topical)', 'label_with_role': 'Film posters (Topical)'}], 'technique': [], 'description': ['Cast: Faramarz Sedighi, Sanaz Sehat, Tania Johari, Shahla Riahi, Afsar Asadi, Jaleh Olov, Ali-Asghar Garmsiri, Dariush Assadzadeh, Jahangir Foruhar, Behzad Rahimkhani, Parvin Soleimani, Mehri Mehrina, Purandokht Moheiman, Solmaz Asgharnejad; Cinematographer: Hossein Jafarian; Music: Kambiz Roshanravan'], 'language': [{'id': 'http://id.loc.gov/vocabulary/languages/per', 'label': 'Persian', 'variants': ['Kabuli', 'Kabuli-Persian', 'Khorasani'], 'facet': 'http://id.loc.gov/vocabulary/languages/per||Persian'}], 'title': 'Lost Time', 'library_unit': 'University Archives', 'provenance': [], 'contributor': [{'role': 'Collector', 'id': 'http://id.loc.gov/authorities/names/n82268290', 'label': 'Naficy, Hamid', 'variants': [], 'facet': 'http://id.loc.gov/authorities/names/n82268290|col|Naficy, Hamid (Collector)', 'label_with_role': 'Naficy, Hamid (Collector)'}, {'role': 'Director', 'id': 'http://id.loc.gov/authorities/names/n2005200469', 'label': 'Dirakhshandah, Pūrān', 'variants': ['\\u200fدرخشنده، پوران', 'Pūrān Darakhshandah', 'Derakhshandeh, Pouran', 'Darakhshandah, Pūrān'], 'facet': 'http://id.loc.gov/authorities/names/n2005200469|drt|Dirakhshandah, Pūrān (Director)', 'label_with_role': 'Dirakhshandah, Pūrān (Director)'}, {'role': 'Contributor', 'id': 'info:nul/abff363b-fd10-415d-a49e-eb69515ee0a2', 'label': 'Emami, Ruhollah', 'variants': [], 'facet': 'info:nul/abff363b-fd10-415d-a49e-eb69515ee0a2|ctb|Emami, Ruhollah (Contributor)', 'label_with_role': 'Emami, Ruhollah (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/d4e1e551-72dc-4c80-8ecf-7fbcc88eb7b1', 'label': 'Ḣăghighi, Ebrahim', 'variants': [], 'facet': 'info:nul/d4e1e551-72dc-4c80-8ecf-7fbcc88eb7b1|ctb|Ḣăghighi, Ebrahim (Contributor)', 'label_with_role': 'Ḣăghighi, Ebrahim (Contributor)'}, {'role': 'Contributor', 'id': 'info:nul/ca37649f-f23f-4773-91c8-58c996288fc6', 'label': 'Farajollahi, Mohammad-Ali', 'variants': [], 'facet': 'info:nul/ca37649f-f23f-4773-91c8-58c996288fc6|ctb|Farajollahi, Mohammad-Ali (Contributor)', 'label_with_role': 'Farajollahi, Mohammad-Ali (Contributor)'}, {'role': 'Producer', 'id': 'http://id.loc.gov/authorities/names/n2005200469', 'label': 'Dirakhshandah, Pūrān', 'variants': ['\\u200fدرخشنده، پوران', 'Pūrān Darakhshandah', 'Derakhshandeh, Pouran', 'Darakhshandah, Pūrān'], 'facet': 'http://id.loc.gov/authorities/names/n2005200469|pro|Dirakhshandah, Pūrān (Producer)', 'label_with_role': 'Dirakhshandah, Pūrān (Producer)'}, {'role': 'Screenwriter', 'id': 'http://id.loc.gov/authorities/names/n2005200469', 'label': 'Dirakhshandah, Pūrān', 'variants': ['\\u200fدرخشنده، پوران', 'Pūrān Darakhshandah', 'Derakhshandeh, Pouran', 'Darakhshandah, Pūrān'], 'facet': 'http://id.loc.gov/authorities/names/n2005200469|aus|Dirakhshandah, Pūrān (Screenwriter)', 'label_with_role': 'Dirakhshandah, Pūrān (Screenwriter)'}], 'genre': [{'id': 'http://vocab.getty.edu/aat/300027221', 'label': 'posters', 'variants': ['posters', 'poster', 'poster', 'poster', 'poster', 'poster', 'bills (posters)', '海報', 'affiche', 'affiche', 'affiche', 'aanplakbiljetten', 'plakbrief', 'plakbrieven', 'plakkaat', 'plakkaten', 'Plakat', 'Anschlag (poster)', 'כרזה', 'cartellone', 'affisso', 'cartaz', 'cartel (letrero)', 'afiche', 'anuncio publicitario', 'póster', 'affisch'], 'facet': 'http://vocab.getty.edu/aat/300027221||posters'}], 'api_link': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f55c3aa2-86df-426b-9c75-39393dd2bb50', 'rights_statement': {'id': 'http://rightsstatements.org/vocab/NoC-US/1.0/', 'label': 'No Copyright - United States'}, 'id': 'f55c3aa2-86df-426b-9c75-39393dd2bb50', 'ark': 'ark:/81985/n2br8ph60', 'alternate_title': ['Zaman-e Az Dast Rafteh'], 'style_period': [], 'thumbnail': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f55c3aa2-86df-426b-9c75-39393dd2bb50/thumbnail', 'creator': [], 'visibility': 'Public', 'work_type': 'Image', 'iiif_manifest': 'https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/f55c3aa2-86df-426b-9c75-39393dd2bb50?as=iiif', 'collection': {'description': 'Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.', 'id': '4ed2338d-c715-4a86-8ac6-6b4030a42be5', 'title': 'Hamid Naficy Iranian and Middle Eastern Movie Posters Collection'}, 'abstract': [], 'accession_number': 'Voyager:14-193-028', 'license': None, 'date_created_edtf': ['1990'], 'physical_description_size': ['12 (height) x 8 in (width)'], 'series': [], 'physical_description_material': ['Offset lithograph on paper'], 'canonical_link': 'https://dc.rdc-staging.library.northwestern.edu/items/f55c3aa2-86df-426b-9c75-39393dd2bb50', 'publisher': [], 'location': [], 'rights_holder': [], 'scope_and_contents': [], 'table_of_contents': []}, page_content='f55c3aa2-86df-426b-9c75-39393dd2bb50')]),\n", - " AIMessage(content=\"The collection includes a diverse range of Iranian films spanning both pre- and post-revolution periods. Notable examples include:\\n\\nPre-revolution films:\\n- [The Deer (Gavaznha)](https://dc.rdc-staging.library.northwestern.edu/items/2cd0d633-3d2e-4dd0-90f1-8ee7562ddf8e) (1974) - A drama directed by Masoud Kimiai starring Behrouz Vossoughi\\n- [Hot Feelings (Ehsas Dagh)](https://dc.rdc-staging.library.northwestern.edu/items/2c455274-0bb9-4c35-8128-7cedbd1f01e8) (1972) - A romance starring Googoosh\\n\\nPost-revolution films:\\n- [Taste of Cherry](https://dc.rdc-staging.library.northwestern.edu/items/fbb2c5c4-d33e-4a19-bf63-aa5299291887) (1990) - A drama directed by acclaimed filmmaker Abbas Kiarostami\\n- [The Blue-Veiled (Rusari-e Abi)](https://dc.rdc-staging.library.northwestern.edu/items/dfac8fa6-a4a6-4e4e-8695-ad5fadd74ea0) (1995) - Directed by Rakhshan Bani-Etemad, starring Ezzatollah Entezami\\n- [Dance of Dust](https://dc.rdc-staging.library.northwestern.edu/items/d5cdb032-736d-4422-9eb0-5ac418d232dc) (1998) - Directed by Abolfazl Jalili\\n\\nThe collection includes documentaries like [Homework](https://dc.rdc-staging.library.northwestern.edu/items/05b38c0a-1cee-4475-a57e-af5a71f34589) (1989) by Abbas Kiarostami and [Divorce Iranian Style](https://dc.rdc-staging.library.northwestern.edu/items/f889063c-c283-4482-a89b-83f1fcff93e8) (1998), representing different genres including dramas, comedies, and women's films from both commercial and art house traditions.\", additional_kwargs={'usage': {'prompt_tokens': 49331, 'completion_tokens': 556, 'total_tokens': 49887}, 'stop_reason': 'end_turn', 'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0'}, response_metadata={'usage': {'prompt_tokens': 49331, 'completion_tokens': 556, 'total_tokens': 49887}, 'stop_reason': 'end_turn', 'model_id': 'us.anthropic.claude-3-5-sonnet-20241022-v2:0'}, id='run-755ee14a-d869-4813-88c6-bf629e49d7cc-0', usage_metadata={'input_tokens': 49331, 'output_tokens': 556, 'total_tokens': 49887})]}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ + "import agent.search_agent\n", "from agent.search_agent import SearchAgent\n", + "from core.setup import chat_model\n", "\n", - "agent = SearchAgent(model=\"us.anthropic.claude-3-5-sonnet-20241022-v2:0\", streaming=False)\n", + "model = chat_model(model=\"us.anthropic.claude-3-5-sonnet-20241022-v2:0\", streaming=False)\n", + "agent = SearchAgent(model=model)\n", "agent.invoke(\n", - " \"What works in the collection pertain to Iranian film?\",\n", - " ref=\"abc123\",\n", - " callbacks=[DebugHandler()],\n", - " forget=True\n", + " \"What works in the collection pertain to Iranian film?\",\n", + " ref=\"abc123\",\n", + " callbacks=[DebugHandler()],\n", + " forget=True,\n", ")" ] } diff --git a/chat/pytest.ini b/chat/pytest.ini new file mode 100644 index 00000000..1ca84343 --- /dev/null +++ b/chat/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +addopts = -m "not slow" +markers = + slow: marks tests as slow (deselect with '-m "not slow"') \ No newline at end of file diff --git a/chat/src/handlers/__init__.py b/chat/src/agent/callbacks/__init__.py similarity index 100% rename from chat/src/handlers/__init__.py rename to chat/src/agent/callbacks/__init__.py diff --git a/chat/src/agent/metrics_handler.py b/chat/src/agent/callbacks/metrics.py similarity index 65% rename from chat/src/agent/metrics_handler.py rename to chat/src/agent/callbacks/metrics.py index 2c0060e5..e4d292f7 100644 --- a/chat/src/agent/metrics_handler.py +++ b/chat/src/agent/callbacks/metrics.py @@ -4,21 +4,33 @@ from langchain_core.messages.tool import ToolMessage import json -class MetricsHandler(BaseCallbackHandler): +class MetricsCallbackHandler(BaseCallbackHandler): def __init__(self, *args, **kwargs): self.accumulator = {} self.answers = [] self.artifacts = [] super().__init__(*args, **kwargs) - + def on_llm_end(self, response: LLMResult, **kwargs: Dict[str, Any]): + if response is None: + return + + if not response.generations or not response.generations[0]: + return + for generation in response.generations[0]: - self.answers.append(generation.text) - for k, v in generation.message.usage_metadata.items(): - if k not in self.accumulator: - self.accumulator[k] = v - else: - self.accumulator[k] += v + if generation.text != "": + self.answers.append(generation.text) + + if not hasattr(generation, 'message') or generation.message is None: + continue + + metadata = getattr(generation.message, 'usage_metadata', None) + if metadata is None: + continue + + for k, v in metadata.items(): + self.accumulator[k] = self.accumulator.get(k, 0) + v def on_tool_end(self, output: ToolMessage, **kwargs: Dict[str, Any]): match output.name: diff --git a/chat/src/agent/agent_handler.py b/chat/src/agent/callbacks/socket.py similarity index 82% rename from chat/src/agent/agent_handler.py rename to chat/src/agent/callbacks/socket.py index df1717aa..7843c25f 100644 --- a/chat/src/agent/agent_handler.py +++ b/chat/src/agent/callbacks/socket.py @@ -1,6 +1,6 @@ from typing import Any, Dict, List, Optional -from websocket import Websocket +from core.websocket import Websocket from json.decoder import JSONDecodeError from langchain_core.callbacks import BaseCallbackHandler @@ -19,7 +19,7 @@ def deserialize_input(input_str): except JSONDecodeError: return input_str -class AgentHandler(BaseCallbackHandler): +class SocketCallbackHandler(BaseCallbackHandler): def __init__(self, socket: Websocket, ref: str, *args: List[Any], **kwargs: Dict[str, Any]): if socket is None: raise ValueError("Socket not provided to agent callback handler") @@ -56,12 +56,9 @@ def on_tool_end(self, output: ToolMessage, **kwargs: Dict[str, Any]): case "discover_fields": pass case "search": - try: - result_fields = ("id", "title", "visibility", "work_type", "thumbnail") - docs: List[Dict[str, Any]] = [{k: doc.metadata.get(k) for k in result_fields} for doc in output.artifact] - self.socket.send({"type": "search_result", "ref": self.ref, "message": docs}) - except json.decoder.JSONDecodeError as e: - print(f"Invalid json ({e}) returned from {output.name} tool: {output.content}") + result_fields = ("id", "title", "visibility", "work_type", "thumbnail") + docs: List[Dict[str, Any]] = [{k: doc.metadata.get(k) for k in result_fields} for doc in output.artifact] + self.socket.send({"type": "search_result", "ref": self.ref, "message": docs}) case _: print(f"Unhandled tool_end message: {output}") diff --git a/chat/src/agent/search_agent.py b/chat/src/agent/search_agent.py index 6ee3996d..9ef3fb28 100644 --- a/chat/src/agent/search_agent.py +++ b/chat/src/agent/search_agent.py @@ -1,16 +1,14 @@ -import os - from typing import Literal, List -from agent.s3_saver import S3Saver, delete_checkpoints from agent.tools import aggregate, discover_fields, search -from langchain_aws import ChatBedrock from langchain_core.messages import HumanMessage from langchain_core.messages.base import BaseMessage +from langchain_core.language_models.chat_models import BaseModel from langchain_core.callbacks import BaseCallbackHandler from langchain_core.messages.system import SystemMessage from langgraph.graph import END, START, StateGraph, MessagesState from langgraph.prebuilt import ToolNode +from core.setup import checkpoint_saver DEFAULT_SYSTEM_MESSAGE = """ Please provide a brief answer to the question using the tools provided. Include specific details from multiple documents that @@ -18,64 +16,70 @@ links using the document's canonical_link field. Do not include intermediate messages explaining your process. """ +class SearchWorkflow: + def __init__(self, model: BaseModel, system_message: str): + self.model = model + self.system_message = system_message + + def should_continue(self, state: MessagesState) -> Literal["tools", END]: + messages = state["messages"] + last_message = messages[-1] + # If the LLM makes a tool call, then we route to the "tools" node + if last_message.tool_calls: + return "tools" + # Otherwise, we stop (reply to the user) + return END + + def call_model(self, state: MessagesState): + messages = [SystemMessage(content=self.system_message)] + state["messages"] + response: BaseMessage = self.model.invoke(messages) + # We return a list, because this will get added to the existing list + return {"messages": [response]} + + class SearchAgent: def __init__( self, + model: BaseModel, *, - checkpoint_bucket: str = os.getenv("CHECKPOINT_BUCKET_NAME"), system_message: str = DEFAULT_SYSTEM_MESSAGE, - **kwargs): - - self.checkpoint_bucket = checkpoint_bucket - + **kwargs + ): tools = [discover_fields, search, aggregate] tool_node = ToolNode(tools) - model = ChatBedrock(**kwargs).bind_tools(tools) - # Define the function that determines whether to continue or not - def should_continue(state: MessagesState) -> Literal["tools", END]: - messages = state["messages"] - last_message = messages[-1] - # If the LLM makes a tool call, then we route to the "tools" node - if last_message.tool_calls: - return "tools" - # Otherwise, we stop (reply to the user) - return END + try: + model = model.bind_tools(tools) + except NotImplementedError: + pass - - # Define the function that calls the model - def call_model(state: MessagesState): - messages = [SystemMessage(content=system_message)] + state["messages"] - response: BaseMessage = model.invoke(messages) # , model=os.getenv("AZURE_OPENAI_LLM_DEPLOYMENT_ID") - # We return a list, because this will get added to the existing list - # if socket is not none and the response content is not an empty string - return {"messages": [response]} + self.workflow_logic = SearchWorkflow(model=model, system_message=system_message) # Define a new graph workflow = StateGraph(MessagesState) # Define the two nodes we will cycle between - workflow.add_node("agent", call_model) + workflow.add_node("agent", self.workflow_logic.call_model) workflow.add_node("tools", tool_node) # Set the entrypoint as `agent` workflow.add_edge(START, "agent") # Add a conditional edge - workflow.add_conditional_edges("agent", should_continue) + workflow.add_conditional_edges("agent", self.workflow_logic.should_continue) # Add a normal edge from `tools` to `agent` workflow.add_edge("tools", "agent") - checkpointer = S3Saver(bucket_name=checkpoint_bucket, compression="gzip") - self.search_agent = workflow.compile(checkpointer=checkpointer) + self.checkpointer = checkpoint_saver() + self.search_agent = workflow.compile(checkpointer=self.checkpointer) def invoke(self, question: str, ref: str, *, callbacks: List[BaseCallbackHandler] = [], forget: bool = False, **kwargs): if forget: - delete_checkpoints(self.checkpoint_bucket, ref) - + self.checkpointer.delete_checkpoints(ref) + return self.search_agent.invoke( {"messages": [HumanMessage(content=question)]}, config={"configurable": {"thread_id": ref}, "callbacks": callbacks}, **kwargs - ) + ) \ No newline at end of file diff --git a/chat/src/agent/tools.py b/chat/src/agent/tools.py index 55688e68..4f78d66c 100644 --- a/chat/src/agent/tools.py +++ b/chat/src/agent/tools.py @@ -1,7 +1,7 @@ import json from langchain_core.tools import tool -from setup import opensearch_vector_store +from core.setup import opensearch_vector_store def get_keyword_fields(properties, prefix=''): """ diff --git a/chat/src/content_handler.py b/chat/src/content_handler.py deleted file mode 100644 index b75f98b9..00000000 --- a/chat/src/content_handler.py +++ /dev/null @@ -1,36 +0,0 @@ -import json -from typing import Dict, List -from langchain_community.embeddings.sagemaker_endpoint import EmbeddingsContentHandler - -class ContentHandler(EmbeddingsContentHandler): - content_type = "application/json" - accepts = "application/json" - - def transform_input(self, inputs: list[str], model_kwargs: Dict) -> bytes: - """ - Transforms the input into bytes that can be consumed by SageMaker endpoint. - Args: - inputs: List of input strings. - model_kwargs: Additional keyword arguments to be passed to the endpoint. - Returns: - The transformed bytes input. - """ - # Example: inference.py expects a JSON string with a "inputs" key: - input_str = json.dumps({"inputs": inputs, **model_kwargs}) - return input_str.encode("utf-8") - - def transform_output(self, output: bytes) -> List[List[float]]: - """ - Transforms the bytes output from the endpoint into a list of embeddings. - Args: - output: The bytes output from SageMaker endpoint. - Returns: - The transformed output - list of embeddings - Note: - The length of the outer list is the number of input strings. - The length of the inner lists is the embedding dimension. - """ - # Example: inference.py returns a JSON string with the list of - # embeddings in a "vectors" key: - response_json = json.loads(output.read().decode("utf-8")) - return [response_json["embedding"]] \ No newline at end of file diff --git a/chat/src/helpers/__init__.py b/chat/src/core/__init__.py similarity index 100% rename from chat/src/helpers/__init__.py rename to chat/src/core/__init__.py diff --git a/chat/src/helpers/apitoken.py b/chat/src/core/apitoken.py similarity index 100% rename from chat/src/helpers/apitoken.py rename to chat/src/core/apitoken.py diff --git a/chat/src/event_config.py b/chat/src/core/event_config.py similarity index 82% rename from chat/src/event_config.py rename to chat/src/core/event_config.py index ece5f2a5..c3bc45d4 100644 --- a/chat/src/event_config.py +++ b/chat/src/core/event_config.py @@ -4,9 +4,9 @@ from langchain_core.prompts import ChatPromptTemplate -from helpers.apitoken import ApiToken -from helpers.prompts import prompt_template -from websocket import Websocket +from core.apitoken import ApiToken +from core.prompts import prompt_template +from core.websocket import Websocket from uuid import uuid4 CHAIN_TYPE = "stuff" @@ -92,20 +92,6 @@ def _get_temperature(self): def _get_text_key(self): return self._get_payload_value_with_superuser_check("text_key", TEXT_KEY) - def debug_message(self): - return { - "type": "debug", - "message": { - "k": self.k, - "prompt": self.prompt_text, - "question": self.question, - "ref": self.ref, - "size": self.ref, - "temperature": self.temperature, - "text_key": self.text_key, - }, - } - def setup_websocket(self, socket=None): if socket is None: connection_id = self.request_context.get("connectionId") @@ -120,11 +106,3 @@ def setup_websocket(self, socket=None): def _is_debug_mode_enabled(self): debug = self.payload.get("debug", False) return debug and self.api_token.is_superuser() - - def _to_bool(self, val): - """Converts a value to boolean. If the value is a string, it considers - "", "no", "false", "0" as False. Otherwise, it returns the boolean of the value. - """ - if isinstance(val, str): - return val.lower() not in ["", "no", "false", "0"] - return bool(val) diff --git a/chat/src/helpers/prompts.py b/chat/src/core/prompts.py similarity index 100% rename from chat/src/helpers/prompts.py rename to chat/src/core/prompts.py diff --git a/chat/src/secrets.py b/chat/src/core/secrets.py similarity index 69% rename from chat/src/secrets.py rename to chat/src/core/secrets.py index d2230e55..c0dae92e 100644 --- a/chat/src/secrets.py +++ b/chat/src/core/secrets.py @@ -2,19 +2,17 @@ import json import os -def load_secrets(): - SecretsPath = os.getenv('SECRETS_PATH') +def load_secrets(SecretsPath=os.getenv('SECRETS_PATH')): EnvironmentMap = [ ['API_TOKEN_SECRET', 'dcapi', 'api_token_secret'], ['OPENSEARCH_ENDPOINT', 'index', 'endpoint'], ['OPENSEARCH_MODEL_ID', 'index', 'embedding_model'] ] - client = boto3.client("secretsmanager") + client = boto3.client("secretsmanager", region_name=os.getenv('AWS_REGION', 'us-east-1')) response = client.batch_get_secret_value(SecretIdList=[ f'{SecretsPath}/config/dcapi', - f'{SecretsPath}/infrastructure/index', - f'{SecretsPath}/config/dcapi' + f'{SecretsPath}/infrastructure/index' ]) secrets = { @@ -29,7 +27,3 @@ def load_secrets(): if var not in os.environ and value is not None: os.environ[var] = value - os.environ['__SKIP_SECRETS__'] = 'true' - -if not os.getenv('__SKIP_SECRETS__'): - load_secrets() diff --git a/chat/src/setup.py b/chat/src/core/setup.py similarity index 68% rename from chat/src/setup.py rename to chat/src/core/setup.py index 8245be66..76bd5338 100644 --- a/chat/src/setup.py +++ b/chat/src/core/setup.py @@ -1,10 +1,20 @@ -from handlers.opensearch_neural_search import OpenSearchNeuralSearch +from persistence.s3_checkpointer import S3Checkpointer +from search.opensearch_neural_search import OpenSearchNeuralSearch +from langchain_aws import ChatBedrock +from langchain_core.language_models.base import BaseModel +from langgraph.checkpoint.base import BaseCheckpointSaver from opensearchpy import OpenSearch, RequestsHttpConnection from requests_aws4auth import AWS4Auth from urllib.parse import urlparse import os import boto3 +def chat_model(**kwargs) -> BaseModel: + return ChatBedrock(**kwargs) + +def checkpoint_saver(**kwargs) -> BaseCheckpointSaver: + checkpoint_bucket: str = os.getenv("CHECKPOINT_BUCKET_NAME") + return S3Checkpointer(bucket_name=checkpoint_bucket, **kwargs) def prefix(value): env_prefix = os.getenv("ENV_PREFIX") @@ -21,7 +31,8 @@ def opensearch_endpoint(): return endpoint -def opensearch_client(region_name=os.getenv("AWS_REGION")): +def opensearch_client(region_name=None): + region_name = region_name or os.getenv("AWS_REGION") # Evaluate at runtime session = boto3.Session(region_name=region_name) awsauth = AWS4Auth( region=region_name, @@ -38,7 +49,8 @@ def opensearch_client(region_name=os.getenv("AWS_REGION")): ) -def opensearch_vector_store(region_name=os.getenv("AWS_REGION")): +def opensearch_vector_store(region_name=None): + region_name = region_name or os.getenv("AWS_REGION") # Evaluate at runtime session = boto3.Session(region_name=region_name) awsauth = AWS4Auth( region=region_name, diff --git a/chat/src/websocket.py b/chat/src/core/websocket.py similarity index 82% rename from chat/src/websocket.py rename to chat/src/core/websocket.py index 9d437df1..3864d2f8 100644 --- a/chat/src/websocket.py +++ b/chat/src/core/websocket.py @@ -1,5 +1,5 @@ import json -from setup import websocket_client +from core.setup import websocket_client class Websocket: def __init__(self, client=None, endpoint_url=None, connection_id=None, ref=None): @@ -8,9 +8,9 @@ def __init__(self, client=None, endpoint_url=None, connection_id=None, ref=None) self.ref = ref if ref else {} def send(self, data): - # if isinstance(data, str): - # data = {"message": data} - # data["ref"] = self.ref + if isinstance(data, str): + data = {"message": data} + data["ref"] = self.ref data_as_bytes = bytes(json.dumps(data), "utf-8") if self.connection_id == "debug": diff --git a/chat/src/handlers/chat.py b/chat/src/handlers.py similarity index 50% rename from chat/src/handlers/chat.py rename to chat/src/handlers.py index 07aea7cc..38a1ef34 100644 --- a/chat/src/handlers/chat.py +++ b/chat/src/handlers.py @@ -1,19 +1,56 @@ -import secrets # noqa import boto3 import json +import logging import os -import traceback +from core.secrets import load_secrets from datetime import datetime -from event_config import EventConfig -# from honeybadger import honeybadger +from core.event_config import EventConfig +from honeybadger import honeybadger from agent.search_agent import SearchAgent -from agent.agent_handler import AgentHandler -from agent.metrics_handler import MetricsHandler +from agent.callbacks.socket import SocketCallbackHandler +from agent.callbacks.metrics import MetricsCallbackHandler +from core.setup import chat_model -# honeybadger.configure() -# logging.getLogger("honeybadger").addHandler(logging.StreamHandler()) +honeybadger.configure() +logging.getLogger("honeybadger").addHandler(logging.StreamHandler()) -def handler(event, context): +def chat_sync(event, context): + load_secrets() + config = EventConfig(event) + + if not config.is_logged_in: + return {"statusCode": 401, "body": "Unauthorized"} + + if config.question is None or config.question == "": + return {"statusCode": 400, "body": "Question cannot be blank"} + + model = chat_model(model=config.model, streaming=False) + search_agent = SearchAgent(model=model) + result = MetricsCallbackHandler() + search_agent.invoke( + config.question, config.ref, forget=config.forget, callbacks=[result] + ) + + return { + "statusCode": 200, + "headers": {"Content-Type": "application/json"}, + "body": json.dumps( + { + "answer": result.answers, + "is_dev_team": config.api_token.is_dev_team(), + "is_superuser": config.api_token.is_superuser(), + "k": config.k, + "model": config.model, + "question": config.question, + "ref": config.ref, + "artifacts": result.artifacts, + "token_counts": result.accumulator, + } + ), + } + +def chat(event, context): + load_secrets() config = EventConfig(event) socket = event.get("socket", None) config.setup_websocket(socket) @@ -26,19 +63,19 @@ def handler(event, context): config.socket.send({"type": "error", "message": "Question cannot be blank"}) return {"statusCode": 400, "body": "Question cannot be blank"} - metrics = MetricsHandler() - callbacks = [AgentHandler(config.socket, config.ref), metrics] - search_agent = SearchAgent(model=config.model, streaming=True) + metrics = MetricsCallbackHandler() + callbacks = [SocketCallbackHandler(config.socket, config.ref), metrics] + model = chat_model(model=config.model, streaming=config.stream_response) + search_agent = SearchAgent(model=model) + try: search_agent.invoke(config.question, config.ref, forget=config.forget, callbacks=callbacks) log_metrics(context, metrics, config) except Exception as e: - print(f"Error: {e}") - print(traceback.format_exc()) error_response = {"type": "error", "message": "An unexpected error occurred. Please try again later."} if config.socket: config.socket.send(error_response) - return {"statusCode": 500, "body": json.dumps(error_response)} + raise e return {"statusCode": 200} @@ -47,7 +84,7 @@ def log_metrics(context, metrics, config): log_group = os.getenv("METRICS_LOG_GROUP") log_stream = context.log_stream_name if log_group and ensure_log_stream_exists(log_group, log_stream): - log_client = boto3.client("logs") + client = log_client() log_events = [{ "timestamp": timestamp(), "message": json.dumps({ @@ -62,21 +99,23 @@ def log_metrics(context, metrics, config): "token_counts": metrics.accumulator, }) }] - log_client.put_log_events( + client.put_log_events( logGroupName=log_group, logStreamName=log_stream, logEvents=log_events ) def ensure_log_stream_exists(log_group, log_stream): - log_client = boto3.client("logs") + client = log_client() try: - log_client.create_log_stream(logGroupName=log_group, logStreamName=log_stream) + print(client.create_log_stream(logGroupName=log_group, logStreamName=log_stream)) return True - except log_client.exceptions.ResourceAlreadyExistsException: + except client.exceptions.ResourceAlreadyExistsException: return True except Exception: print(f"Could not create log stream: {log_group}:{log_stream}") return False +def log_client(): + return boto3.client("logs", region_name=os.getenv("AWS_REGION", "us-east-1")) def timestamp(): return round(datetime.timestamp(datetime.now()) * 1000) diff --git a/chat/src/handlers/chat_sync.py b/chat/src/handlers/chat_sync.py deleted file mode 100644 index fad1808a..00000000 --- a/chat/src/handlers/chat_sync.py +++ /dev/null @@ -1,41 +0,0 @@ -import secrets # noqa -import json -import logging -import os -from http_event_config import HTTPEventConfig -from helpers.http_response import HTTPResponse -from honeybadger import honeybadger - -honeybadger.configure() -logging.getLogger('honeybadger').addHandler(logging.StreamHandler()) - -RESPONSE_TYPES = { - "base": ["answer", "ref", "context"], - "debug": ["answer", "attributes", "azure_endpoint", "deployment_name", "is_superuser", "k", "openai_api_version", "prompt", "question", "ref", "temperature", "text_key", "token_counts", "context"], - "log": ["answer", "deployment_name", "is_superuser", "k", "openai_api_version", "prompt", "question", "ref", "size", "source_documents", "temperature", "token_counts"], - "error": ["question", "error", "source_documents"] -} - -def handler(event, context): - config = HTTPEventConfig(event) - - if not config.is_logged_in: - return {"statusCode": 401, "body": "Unauthorized"} - - if config.question is None or config.question == "": - return {"statusCode": 400, "body": "Question cannot be blank"} - - if not os.getenv("SKIP_LLM_REQUEST"): - config.setup_llm_request() - response = HTTPResponse(config) - final_response = response.prepare_response() - if "error" in final_response: - logging.error(f'Error: {final_response["error"]}') - return {"statusCode": 500, "body": "Internal Server Error"} - else: - return {"statusCode": 200, "body": json.dumps(reshape_response(final_response, 'debug' if config.debug_mode else 'base'))} - - return {"statusCode": 200} - -def reshape_response(response, type): - return {k: response[k] for k in RESPONSE_TYPES[type]} \ No newline at end of file diff --git a/chat/src/handlers/streaming_socket_callback_handler.py b/chat/src/handlers/streaming_socket_callback_handler.py deleted file mode 100644 index 8fe32272..00000000 --- a/chat/src/handlers/streaming_socket_callback_handler.py +++ /dev/null @@ -1,22 +0,0 @@ -from langchain.callbacks.base import BaseCallbackHandler -from websocket import Websocket -from typing import Any -from langchain_core.outputs.llm_result import LLMResult - -class StreamingSocketCallbackHandler(BaseCallbackHandler): - def __init__(self, socket: Websocket, stream: bool = True): - self.socket = socket - self.stream = stream - - def on_llm_new_token(self, token: str, **kwargs): - if len(token) > 0 and self.socket and self.stream: - return self.socket.send({"token": token}) - - def on_llm_end(self, response: LLMResult, **kwargs: Any): - try: - finish_reason = response.generations[0][0].generation_info["finish_reason"] - if self.socket: - return self.socket.send({"end": {"reason": finish_reason}}) - except Exception as err: - finish_reason = f'Unknown ({str(err)})' - print(f"Stream ended: {finish_reason}") diff --git a/chat/src/helpers/http_response.py b/chat/src/helpers/http_response.py deleted file mode 100644 index 11ba2962..00000000 --- a/chat/src/helpers/http_response.py +++ /dev/null @@ -1,63 +0,0 @@ -from helpers.metrics import debug_response -from langchain_core.output_parsers import StrOutputParser -from langchain_core.runnables import RunnableLambda, RunnablePassthrough - -def extract_prompt_value(v): - if isinstance(v, list): - return [extract_prompt_value(item) for item in v] - elif isinstance(v, dict) and 'label' in v: - return [v.get('label')] - else: - return v - -class HTTPResponse: - def __init__(self, config): - self.config = config - self.store = {} - - def debug_response_passthrough(self): - return RunnableLambda(lambda x: debug_response(self.config, x, self.original_question)) - - def original_question_passthrough(self): - def get_and_send_original_question(docs): - source_documents = [] - for doc in docs["context"]: - doc.metadata = {key: extract_prompt_value(doc.metadata.get(key)) for key in self.config.attributes if key in doc.metadata} - source_document = doc.metadata.copy() - source_document["content"] = doc.page_content - source_documents.append(source_document) - - self.context = source_documents - - original_question = { - "question": self.config.question, - "source_documents": source_documents, - } - - self.original_question = original_question - return docs - - return RunnablePassthrough(get_and_send_original_question) - - def prepare_response(self): - try: - retriever = self.config.opensearch.as_retriever(search_type="similarity", search_kwargs={"k": self.config.k, "size": self.config.size, "_source": {"excludes": ["embedding"]}}) - chain = ( - {"context": retriever, "question": RunnablePassthrough()} - | self.original_question_passthrough() - | self.config.prompt - | self.config.client - | StrOutputParser() - | self.debug_response_passthrough() - ) - response = chain.invoke(self.config.question) - response["context"] = self.context - except Exception as err: - response = { - "question": self.config.question, - "error": str(err), - "source_documents": [], - } - return response - - \ No newline at end of file diff --git a/chat/src/helpers/utils.py b/chat/src/helpers/utils.py deleted file mode 100644 index d0d243d4..00000000 --- a/chat/src/helpers/utils.py +++ /dev/null @@ -1,7 +0,0 @@ -def to_bool(val): - """Converts a value to boolean. If the value is a string, it considers - "", "no", "false", "0" as False. Otherwise, it returns the boolean of the value. - """ - if isinstance(val, str): - return val.lower() not in ["", "no", "false", "0"] - return bool(val) diff --git a/chat/src/http_event_config.py b/chat/src/http_event_config.py deleted file mode 100644 index 47f479aa..00000000 --- a/chat/src/http_event_config.py +++ /dev/null @@ -1,188 +0,0 @@ -import os -import json - -from dataclasses import dataclass, field - -from langchain_core.prompts import ChatPromptTemplate -from setup import ( - opensearch_client, - opensearch_vector_store, - openai_chat_client, -) -from typing import List -from helpers.apitoken import ApiToken -from helpers.prompts import document_template, prompt_template - -CHAIN_TYPE = "stuff" -DOCUMENT_VARIABLE_NAME = "context" -K_VALUE = 40 -MAX_K = 100 -MAX_TOKENS = 1000 -SIZE = 5 -TEMPERATURE = 0.2 -TEXT_KEY = "id" -VERSION = "2024-02-01" - -@dataclass -class HTTPEventConfig: - """ - The EventConfig class represents the configuration for an event. - Default values are set for the following properties which can be overridden in the payload message. - """ - - DEFAULT_ATTRIBUTES = ["accession_number", "alternate_title", "api_link", "canonical_link", "caption", "collection", - "contributor", "date_created", "date_created_edtf", "description", "genre", "id", "identifier", - "keywords", "language", "notes", "physical_description_material", "physical_description_size", - "provenance", "publisher", "rights_statement", "subject", "table_of_contents", "thumbnail", - "title", "visibility", "work_type"] - - api_token: ApiToken = field(init=False) - attributes: List[str] = field(init=False) - azure_endpoint: str = field(init=False) - azure_resource_name: str = field(init=False) - debug_mode: bool = field(init=False) - deployment_name: str = field(init=False) - document_prompt: ChatPromptTemplate = field(init=False) - event: dict = field(default_factory=dict) - is_logged_in: bool = field(init=False) - k: int = field(init=False) - max_tokens: int = field(init=False) - openai_api_version: str = field(init=False) - payload: dict = field(default_factory=dict) - prompt_text: str = field(init=False) - prompt: ChatPromptTemplate = field(init=False) - question: str = field(init=False) - ref: str = field(init=False) - request_context: dict = field(init=False) - temperature: float = field(init=False) - size: int = field(init=False) - stream_response: bool = field(init=False) - text_key: str = field(init=False) - - def __post_init__(self): - self.payload = json.loads(self.event.get("body", "{}")) - self.api_token = ApiToken(signed_token=self.payload.get("auth")) - self.attributes = self._get_attributes() - self.azure_endpoint = self._get_azure_endpoint() - self.azure_resource_name = self._get_azure_resource_name() - self.debug_mode = self._is_debug_mode_enabled() - self.deployment_name = self._get_deployment_name() - self.is_logged_in = self.api_token.is_logged_in() - self.k = self._get_k() - self.max_tokens = min(self.payload.get("max_tokens", MAX_TOKENS), MAX_TOKENS) - self.openai_api_version = self._get_openai_api_version() - self.prompt_text = self._get_prompt_text() - self.request_context = self.event.get("requestContext", {}) - self.question = self.payload.get("question") - self.ref = self.payload.get("ref") - self.size = self._get_size() - self.stream_response = self.payload.get("stream_response", not self.debug_mode) - self.temperature = self._get_temperature() - self.text_key = self._get_text_key() - self.document_prompt = self._get_document_prompt() - self.prompt = ChatPromptTemplate.from_template(self.prompt_text) - - def _get_payload_value_with_superuser_check(self, key, default): - if self.api_token.is_superuser(): - return self.payload.get(key, default) - else: - return default - - def _get_attributes_function(self): - try: - opensearch = opensearch_client() - mapping = opensearch.indices.get_mapping(index="dc-v2-work") - return list(next(iter(mapping.values()))['mappings']['properties'].keys()) - except StopIteration: - return [] - - def _get_attributes(self): - return self._get_payload_value_with_superuser_check("attributes", self.DEFAULT_ATTRIBUTES) - - def _get_azure_endpoint(self): - default = f"https://{self._get_azure_resource_name()}.openai.azure.com/" - return self._get_payload_value_with_superuser_check("azure_endpoint", default) - - def _get_azure_resource_name(self): - azure_resource_name = self._get_payload_value_with_superuser_check( - "azure_resource_name", os.environ.get("AZURE_OPENAI_RESOURCE_NAME") - ) - if not azure_resource_name: - raise EnvironmentError( - "Either payload must contain 'azure_resource_name' or environment variable 'AZURE_OPENAI_RESOURCE_NAME' must be set" - ) - return azure_resource_name - - def _get_deployment_name(self): - return self._get_payload_value_with_superuser_check( - "deployment_name", os.getenv("AZURE_OPENAI_LLM_DEPLOYMENT_ID") - ) - - def _get_k(self): - value = self._get_payload_value_with_superuser_check("k", K_VALUE) - return min(value, MAX_K) - - def _get_openai_api_version(self): - return self._get_payload_value_with_superuser_check( - "openai_api_version", VERSION - ) - - def _get_prompt_text(self): - return self._get_payload_value_with_superuser_check("prompt", prompt_template()) - - def _get_size(self): - return self._get_payload_value_with_superuser_check("size", SIZE) - - def _get_temperature(self): - return self._get_payload_value_with_superuser_check("temperature", TEMPERATURE) - - def _get_text_key(self): - return self._get_payload_value_with_superuser_check("text_key", TEXT_KEY) - - def _get_document_prompt(self): - return ChatPromptTemplate.from_template(document_template(self.attributes)) - - def debug_message(self): - return { - "type": "debug", - "message": { - "attributes": self.attributes, - "azure_endpoint": self.azure_endpoint, - "deployment_name": self.deployment_name, - "k": self.k, - "openai_api_version": self.openai_api_version, - "prompt": self.prompt_text, - "question": self.question, - "ref": self.ref, - "size": self.ref, - "temperature": self.temperature, - "text_key": self.text_key, - }, - } - - def setup_llm_request(self): - self._setup_vector_store() - self._setup_chat_client() - - def _setup_vector_store(self): - self.opensearch = opensearch_vector_store() - - def _setup_chat_client(self): - self.client = openai_chat_client( - azure_deployment=self.deployment_name, - azure_endpoint=self.azure_endpoint, - openai_api_version=self.openai_api_version, - max_tokens=self.max_tokens - ) - - def _is_debug_mode_enabled(self): - debug = self.payload.get("debug", False) - return debug and self.api_token.is_superuser() - - def _to_bool(self, val): - """Converts a value to boolean. If the value is a string, it considers - "", "no", "false", "0" as False. Otherwise, it returns the boolean of the value. - """ - if isinstance(val, str): - return val.lower() not in ["", "no", "false", "0"] - return bool(val) diff --git a/chat/test/helpers/__init__.py b/chat/src/persistence/__init__.py similarity index 100% rename from chat/test/helpers/__init__.py rename to chat/src/persistence/__init__.py diff --git a/chat/src/persistence/compressible_json_serializer.py b/chat/src/persistence/compressible_json_serializer.py new file mode 100644 index 00000000..46965dca --- /dev/null +++ b/chat/src/persistence/compressible_json_serializer.py @@ -0,0 +1,67 @@ +from typing import Any, Optional, Tuple + +import base64 +import bz2 +import gzip +import json +import langchain_core.messages as langchain_messages +from langchain_core.messages import BaseMessage +from langgraph.checkpoint.serde.jsonplus import JsonPlusSerializer + +class CompressibleJsonSerializer(JsonPlusSerializer): + def __init__(self, compression: Optional[str] = None): + self.compression = compression + + def dumps_typed(self, obj: Any) -> Tuple[str, Any]: + def default(o): + if isinstance(o, BaseMessage): + return { + "__type__": o.__class__.__name__, + "data": o.model_dump(), + } + raise TypeError( + f"Object of type {o.__class__.__name__} is not JSON serializable" + ) + + json_str = json.dumps(obj, default=default) + + if self.compression is None: + return "json", json_str + elif self.compression == "bz2": + compressed_str = base64.b64encode( + bz2.compress(json_str.encode("utf-8")) + ).decode("utf-8") + return "bz2_json", compressed_str + elif self.compression == "gzip": + compressed_str = base64.b64encode( + gzip.compress(json_str.encode("utf-8")) + ).decode("utf-8") + return "gzip_json", compressed_str + else: + raise ValueError(f"Unsupported compression type: {self.compression}") + + def loads_typed(self, data: Tuple[str, Any]) -> Any: + type_, payload = data + + if type_ == "json": + json_str = payload + elif type_ == "bz2_json": + json_str = bz2.decompress(base64.b64decode(payload)).decode("utf-8") + elif type_ == "gzip_json": + json_str = gzip.decompress(base64.b64decode(payload)).decode("utf-8") + else: + raise ValueError(f"Unknown data type: {type_}") + + def object_hook(dct): + if "__type__" in dct: + type_name = dct["__type__"] + data = dct["data"] + cls = getattr(langchain_messages, type_name, None) + if cls and issubclass(cls, BaseMessage): + return cls.model_construct(**data) + else: + raise ValueError(f"Unknown type: {type_name}") + return dct + + obj = json.loads(json_str, object_hook=object_hook) + return obj diff --git a/chat/src/agent/s3_saver.py b/chat/src/persistence/s3_checkpointer.py similarity index 77% rename from chat/src/agent/s3_saver.py rename to chat/src/persistence/s3_checkpointer.py index 5c67b323..b7435bba 100644 --- a/chat/src/agent/s3_saver.py +++ b/chat/src/persistence/s3_checkpointer.py @@ -1,14 +1,10 @@ import boto3 import json -import base64 -import bz2 -import gzip import os import time +from persistence.compressible_json_serializer import CompressibleJsonSerializer from typing import Any, Dict, Iterator, Optional, Sequence, Tuple, List from langchain_core.runnables import RunnableConfig -from langchain_core.messages import BaseMessage -import langchain_core.messages as langchain_messages from langgraph.checkpoint.base import ( BaseCheckpointSaver, @@ -19,61 +15,8 @@ PendingWrite, get_checkpoint_id, ) -from langgraph.checkpoint.serde.jsonplus import JsonPlusSerializer as BaseJsonPlusSerializer -class JsonPlusSerializer(BaseJsonPlusSerializer): - def __init__(self, compression: Optional[str] = None): - self.compression = compression - - def dumps_typed(self, obj: Any) -> Tuple[str, Any]: - def default(o): - if isinstance(o, BaseMessage): - return { - '__type__': o.__class__.__name__, - 'data': o.model_dump(), - } - raise TypeError(f'Object of type {o.__class__.__name__} is not JSON serializable') - - json_str = json.dumps(obj, default=default) - - if self.compression is None: - return 'json', json_str - elif self.compression == 'bz2': - compressed_str = base64.b64encode(bz2.compress(json_str.encode("utf-8"))).decode("utf-8") - return 'bz2_json', compressed_str - elif self.compression == 'gzip': - compressed_str = base64.b64encode(gzip.compress(json_str.encode("utf-8"))).decode("utf-8") - return 'gzip_json', compressed_str - else: - raise ValueError(f"Unsupported compression type: {self.compression}") - - def loads_typed(self, data: Tuple[str, Any]) -> Any: - type_, payload = data - - if type_ == 'json': - json_str = payload - elif type_ == 'bz2_json': - json_str = bz2.decompress(base64.b64decode(payload)).decode("utf-8") - elif type_ == 'gzip_json': - json_str = gzip.decompress(base64.b64decode(payload)).decode("utf-8") - else: - raise ValueError(f'Unknown data type: {type_}') - - def object_hook(dct): - if '__type__' in dct: - type_name = dct['__type__'] - data = dct['data'] - cls = getattr(langchain_messages, type_name, None) - if cls and issubclass(cls, BaseMessage): - return cls.model_construct(**data) - else: - raise ValueError(f'Unknown type: {type_name}') - return dct - - obj = json.loads(json_str, object_hook=object_hook) - return obj - def _namespace(val): return "__default__" if val == "" else val @@ -113,7 +56,7 @@ def _parse_s3_checkpoint_key(key: str) -> Dict[str, str]: } -class S3Saver(BaseCheckpointSaver): +class S3Checkpointer(BaseCheckpointSaver): """S3-based checkpoint saver implementation.""" def __init__( @@ -124,7 +67,7 @@ def __init__( compression: Optional[str] = None, ) -> None: super().__init__() - self.serde = JsonPlusSerializer(compression=compression) + self.serde = CompressibleJsonSerializer(compression=compression) self.s3 = boto3.client('s3', region_name=region_name, endpoint_url=endpoint_url) self.bucket_name = bucket_name @@ -371,31 +314,30 @@ def _load_pending_writes(self, thread_id: str, checkpoint_ns: str, checkpoint_id return writes -def delete_checkpoints(bucket_name, thread_id, region_name="us-east-1"): - """ - Deletes all items with the specified thread_id from the checkpoint - bucket. - - :param bucket_name: The name of the S3 checkpoint bucket - :param thread_id: The thread_id value to delete. - :param region_name: The S3 region the bucket is in - """ - session = boto3.Session(region_name=region_name) - client = session.client("s3") - - def delete_objects(objects): - if objects['Objects']: - client.delete_objects(Bucket=bucket_name, Delete=objects) + def delete_checkpoints(self, thread_id: str) -> None: + """ + Deletes all items with the specified thread_id from the checkpoint bucket. - paginator = client.get_paginator("list_objects_v2") - pages = paginator.paginate(Bucket=bucket_name, Prefix=f"checkpoints/{thread_id}/") + Args: + thread_id: The thread_id value to delete + """ + def delete_objects(objects: dict) -> None: + if objects['Objects']: + self.s3.delete_objects(Bucket=self.bucket_name, Delete=objects) + + paginator = self.s3.get_paginator("list_objects_v2") + prefix = f"checkpoints/{thread_id}/" + pages = paginator.paginate(Bucket=self.bucket_name, Prefix=prefix) - to_delete = dict(Objects=[]) - for item in pages.search('Contents'): - if item is not None: - to_delete['Objects'].append(dict(Key=item['Key'])) + to_delete = {'Objects': []} + for item in pages.search('Contents'): + if item is not None: + to_delete['Objects'].append({'Key': item['Key']}) - if len(to_delete['Objects']) >= 1000: - delete_objects(to_delete) + # Batch deletions in groups of 1000 (S3's limit) + if len(to_delete['Objects']) >= 1000: + delete_objects(to_delete) + to_delete['Objects'] = [] - delete_objects(to_delete) + # Delete any remaining objects + delete_objects(to_delete) \ No newline at end of file diff --git a/chat/src/requirements-dev.txt b/chat/src/requirements-dev.txt index 13699722..c03376d2 100644 --- a/chat/src/requirements-dev.txt +++ b/chat/src/requirements-dev.txt @@ -1,3 +1,5 @@ # Dev/Test Dependencies -ruff~=0.1.0 -coverage~=7.3.2 +moto~=5.0 +pytest~=8.3 +ruff~=0.2 +coverage~=7.3 diff --git a/chat/src/search/__init__.py b/chat/src/search/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/chat/src/helpers/hybrid_query.py b/chat/src/search/hybrid_query.py similarity index 100% rename from chat/src/helpers/hybrid_query.py rename to chat/src/search/hybrid_query.py diff --git a/chat/src/handlers/opensearch_neural_search.py b/chat/src/search/opensearch_neural_search.py similarity index 98% rename from chat/src/handlers/opensearch_neural_search.py rename to chat/src/search/opensearch_neural_search.py index 83856ae6..9ff6e24d 100644 --- a/chat/src/handlers/opensearch_neural_search.py +++ b/chat/src/search/opensearch_neural_search.py @@ -2,7 +2,7 @@ from langchain_core.vectorstores import VectorStore from opensearchpy import OpenSearch from typing import Any, List, Tuple -from helpers.hybrid_query import hybrid_query +from search.hybrid_query import hybrid_query class OpenSearchNeuralSearch(VectorStore): """Read-only OpenSearch vectorstore with neural search.""" diff --git a/chat/template.yaml b/chat/template.yaml index 115c466a..a9dd4d20 100644 --- a/chat/template.yaml +++ b/chat/template.yaml @@ -55,8 +55,6 @@ Resources: CheckpointBucket: Type: 'AWS::S3::Bucket' Properties: - VersioningConfiguration: - Status: Enabled PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true @@ -209,7 +207,7 @@ Resources: #* Layers: #* - !Ref ChatDependencies MemorySize: 1024 - Handler: handlers/chat.handler + Handler: handlers.chat Timeout: 300 Environment: Variables: @@ -242,8 +240,25 @@ Resources: - logs:CreateLogStream - logs:PutLogEvents Resource: !Sub "${ChatMetricsLog.Arn}:*" - Metadata: - BuildMethod: nodejs20.x + - Statement: + - Effect: Allow + Action: + - s3:GetObject + - s3:ListBucket + - s3:PutObject + - s3:DeleteObject + - s3:ListObjectsV2 + Resource: + - !Sub "arn:aws:s3:::${CheckpointBucket}" + - !Sub "arn:aws:s3:::${CheckpointBucket}/*" + - Statement: + - Effect: Allow + Action: + - bedrock:InvokeModel + - bedrock:InvokeModelWithResponseStream + Resource: "*" + #* Metadata: + #* BuildMethod: nodejs20.x ChatSyncFunction: Type: AWS::Serverless::Function Properties: @@ -251,20 +266,22 @@ Resources: Runtime: python3.12 Architectures: - x86_64 - Layers: - - !Ref ChatDependencies + #* Layers: + #* - !Ref ChatDependencies MemorySize: 1024 - Handler: handlers/chat_sync.handler + Handler: handlers.chat_sync Timeout: 300 Environment: Variables: API_TOKEN_NAME: !Ref ApiTokenName + CHECKPOINT_BUCKET_NAME: !Ref CheckpointBucket ENV_PREFIX: !Ref EnvironmentPrefix HONEYBADGER_API_KEY: !Ref HoneybadgerApiKey HONEYBADGER_ENVIRONMENT: !Ref HoneybadgerEnv HONEYBADGER_REVISION: !Ref HoneybadgerRevision METRICS_LOG_GROUP: !Ref ChatMetricsLog SECRETS_PATH: !Ref SecretsPath + NO_COLOR: 1 FunctionUrlConfig: AuthType: NONE Policies: @@ -280,7 +297,7 @@ Resources: Action: - logs:CreateLogStream - logs:PutLogEvents - Resource: !Sub "${ChatMetricsLog.Arn}:*" + Resource: !Sub "${ChatMetricsLog.Arn}:*" - Statement: - Effect: Allow Action: diff --git a/chat/test/agent/__init__.py b/chat/test/agent/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/chat/test/agent/callbacks/__init__.py b/chat/test/agent/callbacks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/chat/test/agent/callbacks/test_metrics.py b/chat/test/agent/callbacks/test_metrics.py new file mode 100644 index 00000000..3da9f709 --- /dev/null +++ b/chat/test/agent/callbacks/test_metrics.py @@ -0,0 +1,207 @@ +from unittest import TestCase +from unittest.mock import patch +import sys + +sys.path.append("./src") + +from agent.callbacks.metrics import MetricsCallbackHandler + +class TestSocketCallbackHandler(TestCase): + def setUp(self): + self.ref = "test_ref" + self.handler = MetricsCallbackHandler() + + def test_on_llm_end_with_content(self): + # Mocking LLMResult and Generations + class MockMessage: + def __init__(self, text, response_metadata={}, usage_metadata={}): + self.text = text + self.message = self # For simplicity, reuse same object for .message + self.response_metadata = response_metadata + self.usage_metadata = usage_metadata + + class MockLLMResult: + def __init__(self, text, stop_reason="end_turn"): + response_metadata = {"stop_reason": stop_reason} + usage_metadata = {"input_tokens": 10, "output_tokens": 20, "total_tokens": 30} + message = MockMessage(text, response_metadata, usage_metadata) + self.generations = [[message]] + + # When response has content and end_turn stop reason + response = MockLLMResult("Here is the answer", stop_reason="end_turn") + with patch.object(self.handler, "on_llm_end", wraps=self.handler.on_llm_end) as mock: + self.handler.on_llm_end(response) + mock.assert_called_once_with(response) + self.assertEqual(self.handler.answers, ["Here is the answer"]) + self.assertEqual(self.handler.accumulator, {"input_tokens": 10, "output_tokens": 20, "total_tokens": 30}) + + def test_on_tool_end_search(self): + # Mock tool output + class MockDoc: + def __init__(self, metadata): + self.metadata = metadata + + class MockToolMessage: + def __init__(self, name, artifact): + self.name = name + self.artifact = artifact + + artifact = [ + MockDoc( + { + "id": 1, + "api_link": "https://example.edu/item/1", + "title": "Result 1", + "visibility": "public", + "work_type": "article", + "thumbnail": "img1", + } + ), + MockDoc( + { + "id": 2, + "api_link": "https://example.edu/item/2", + "title": "Result 2", + "visibility": "private", + "work_type": "document", + "thumbnail": "img2", + } + ), + ] + + output = MockToolMessage("search", artifact) + self.handler.on_tool_end(output) + self.assertEqual(self.handler.artifacts, [{"type": "source_urls", "artifact": ["https://example.edu/item/1", "https://example.edu/item/2"]}]) + + def test_on_tool_end_aggregate(self): + class MockToolMessage: + def __init__(self, name, artifact): + self.name = name + self.artifact = artifact + + output = MockToolMessage("aggregate", {"aggregation_result": {"count": 10}}) + self.handler.on_tool_end(output) + self.assertEqual(self.handler.artifacts, [{"type": "aggregation", "artifact": {"count": 10}}]) + + def test_on_tool_end_discover_fields(self): + class MockToolMessage: + def __init__(self, name, artifact): + self.name = name + self.artifact = artifact + + output = MockToolMessage("discover_fields", {}) + self.handler.on_tool_end(output) + self.assertEqual(self.handler.artifacts, []) + + def test_on_llm_end_with_none_response(self): + self.handler.on_llm_end(None) + self.assertEqual(self.handler.answers, []) + self.assertEqual(self.handler.accumulator, {}) + + def test_on_llm_end_with_empty_generations(self): + class MockLLMResult: + generations = [[]] # Empty list + + response = MockLLMResult() + self.handler.on_llm_end(response) + self.assertEqual(self.handler.answers, []) + self.assertEqual(self.handler.accumulator, {}) + + def test_on_llm_end_with_empty_text(self): + class MockMessage: + def __init__(self): + self.text = "" + self.message = self + self.usage_metadata = {"input_tokens": 5} + + class MockLLMResult: + generations = [[MockMessage()]] + + response = MockLLMResult() + self.handler.on_llm_end(response) + self.assertEqual(self.handler.answers, []) + self.assertEqual(self.handler.accumulator, {"input_tokens": 5}) + + def test_on_llm_end_missing_message(self): + class MockMessage: + def __init__(self): + self.text = "No message attribute" + + class MockLLMResult: + generations = [[MockMessage()]] + + response = MockLLMResult() + self.handler.on_llm_end(response) + self.assertEqual(self.handler.answers, ["No message attribute"]) + self.assertEqual(self.handler.accumulator, {}) + + def test_on_tool_end_invalid_json(self): + import json + + # Mocking ToolMessage and an invalid artifact that simulates JSONDecodeError + class MockDoc: + def __init__(self, metadata): + self.metadata = metadata + + class InvalidArtifact: + def __init__(self): + self.metadata = self # Simulate the `metadata` attribute + + def __getitem__(self, item): + if item == "api_link": + raise json.decoder.JSONDecodeError("Expecting value", "doc", 0) + return None + + class MockToolMessage: + def __init__(self, name, artifact, content): + self.name = name + self.artifact = artifact + self.content = content # Adding content attribute + + # Invalid artifact with a mocked `metadata` attribute + invalid_artifact = [ + InvalidArtifact(), # This will raise JSONDecodeError on access + ] + + output = MockToolMessage("search", invalid_artifact, "example_content") + + with patch("builtins.print") as mock_print: + self.handler.on_tool_end(output) + mock_print.assert_called_once_with( + "Invalid json (Expecting value: line 1 column 1 (char 0)) returned from search tool: example_content" + ) + self.assertEqual(self.handler.artifacts, []) + + def test_on_tool_end_unrecognized_tool(self): + class MockToolMessage: + def __init__(self, name, artifact): + self.name = name + self.artifact = artifact + + output = MockToolMessage("unknown_tool", {}) + self.handler.on_tool_end(output) + self.assertEqual(self.handler.artifacts, []) + + def test_on_llm_end_with_none_metadata(self): + """ + Test the on_llm_end method when usage_metadata is None. + Ensures that answers are processed correctly and accumulator remains unchanged. + """ + # Mocking LLMResult with usage_metadata as None + class MockMessage: + def __init__(self, text, usage_metadata=None): + self.text = text + self.message = self # For simplicity, reuse same object for .message + self.usage_metadata = usage_metadata + + class MockLLMResult: + def __init__(self, text): + message = MockMessage(text, usage_metadata=None) + self.generations = [[message]] + + response = MockLLMResult("Answer without metadata") + with patch.object(self.handler, "on_llm_end", wraps=self.handler.on_llm_end) as mock: + self.handler.on_llm_end(response) + mock.assert_called_once_with(response) + self.assertEqual(self.handler.answers, ["Answer without metadata"]) + self.assertEqual(self.handler.accumulator, {}) \ No newline at end of file diff --git a/chat/test/agent/callbacks/test_socket.py b/chat/test/agent/callbacks/test_socket.py new file mode 100644 index 00000000..e90aaa6b --- /dev/null +++ b/chat/test/agent/callbacks/test_socket.py @@ -0,0 +1,169 @@ +import unittest +from unittest import TestCase +from unittest.mock import MagicMock +import sys + +sys.path.append("./src") + +from agent.callbacks.socket import SocketCallbackHandler + +class MockClient: + def __init__(self): + self.received = [] + def post_to_connection(self, Data, ConnectionId): + self.received.append(Data) + return Data + +class TestSocketCallbackHandler(TestCase): + def setUp(self): + self.mock_socket = MagicMock() + self.ref = "test_ref" + self.handler = SocketCallbackHandler(socket=self.mock_socket, ref=self.ref) + + def test_on_llm_start(self): + # Given metadata that includes model name + metadata = {"ls_model_name": "test_model"} + + # When on_llm_start is called + self.handler.on_llm_start(serialized={}, prompts=["Hello"], metadata=metadata) + + # Then verify the socket was called with the correct start message + self.mock_socket.send.assert_called_once_with({ + "type": "start", + "ref": self.ref, + "message": {"model": "test_model"} + }) + + def test_on_llm_end_with_content(self): + # Mocking LLMResult and Generations + class MockMessage: + def __init__(self, text, response_metadata): + self.text = text + self.message = self # For simplicity, reuse same object for .message + self.response_metadata = response_metadata + + class MockLLMResult: + def __init__(self, text, stop_reason="end_turn"): + self.generations = [[MockMessage(text, {"stop_reason": stop_reason})]] + + # When response has content and end_turn stop reason + response = MockLLMResult("Here is the answer", stop_reason="end_turn") + self.handler.on_llm_end(response) + + # Verify "stop" and "answer" and then "final_message" were sent + expected_calls = [ + unittest.mock.call({"type": "stop", "ref": self.ref}), + unittest.mock.call({"type": "answer", "ref": self.ref, "message": "Here is the answer"}), + unittest.mock.call({"type": "final_message", "ref": self.ref}) + ] + self.mock_socket.send.assert_has_calls(expected_calls, any_order=False) + + def test_on_llm_new_token(self): + # When a new token arrives + self.handler.on_llm_new_token("hello") + + # Then verify the socket sent a token message + self.mock_socket.send.assert_called_once_with({ + "type": "token", + "ref": self.ref, + "message": "hello" + }) + + def test_on_tool_start(self): + # When tool starts + self.handler.on_tool_start({"name": "test_tool"}, "input_value") + + # Verify the tool_start message + self.mock_socket.send.assert_called_once_with({ + "type": "tool_start", + "ref": self.ref, + "message": { + "tool": "test_tool", + "input": "input_value" + } + }) + + def test_on_tool_end_search(self): + # Mock tool output + class MockDoc: + def __init__(self, metadata): + self.metadata = metadata + + class MockToolMessage: + def __init__(self, name, artifact): + self.name = name + self.artifact = artifact + + artifact = [ + MockDoc({"id": 1, "title": "Result 1", "visibility": "public", "work_type": "article", "thumbnail": "img1"}), + MockDoc({"id": 2, "title": "Result 2", "visibility": "private", "work_type": "document", "thumbnail": "img2"}) + ] + + output = MockToolMessage("search", artifact) + self.handler.on_tool_end(output) + + # Verify search_result message was sent + expected_message = [ + {"id": 1, "title": "Result 1", "visibility": "public", "work_type": "article", "thumbnail": "img1"}, + {"id": 2, "title": "Result 2", "visibility": "private", "work_type": "document", "thumbnail": "img2"} + ] + + self.mock_socket.send.assert_called_once_with({ + "type": "search_result", + "ref": self.ref, + "message": expected_message + }) + + def test_on_tool_end_aggregate(self): + class MockToolMessage: + def __init__(self, name, artifact): + self.name = name + self.artifact = artifact + + output = MockToolMessage("aggregate", {"aggregation_result": {"count": 10}}) + self.handler.on_tool_end(output) + + # Verify aggregation_result message was sent + self.mock_socket.send.assert_called_once_with({ + "type": "aggregation_result", + "ref": self.ref, + "message": {"count": 10} + }) + + def test_on_tool_end_discover_fields(self): + class MockToolMessage: + def __init__(self, name, artifact): + self.name = name + self.artifact = artifact + + output = MockToolMessage("discover_fields", {}) + self.handler.on_tool_end(output) + + self.mock_socket.send.assert_not_called() + + def test_on_tool_end_unknown(self): + class MockToolMessage: + def __init__(self, name, artifact): + self.name = name + self.artifact = artifact + + output = MockToolMessage("unknown", {}) + self.handler.on_tool_end(output) + + self.mock_socket.send.assert_not_called() + + def test_on_agent_finish(self): + self.handler.on_agent_finish(finish={}) + self.mock_socket.send.assert_called_once_with({ + "type": "final", + "ref": self.ref, + "message": "Finished" + }) + +class TestSocketCallbackHandlerErrors(TestCase): + def test_missing_socket(self): + with self.assertRaises(ValueError) as context: + SocketCallbackHandler(socket=None, ref="abc123") + + self.assertIn("Socket not provided to agent callback handler", str(context.exception)) + diff --git a/chat/test/agent/test_search_agent.py b/chat/test/agent/test_search_agent.py new file mode 100644 index 00000000..68d96a42 --- /dev/null +++ b/chat/test/agent/test_search_agent.py @@ -0,0 +1,85 @@ +from unittest import TestCase +from unittest.mock import patch + +from agent.search_agent import SearchAgent +from langchain_core.language_models.fake_chat_models import FakeListChatModel +from langgraph.checkpoint.memory import MemorySaver + + +class TestSearchAgent(TestCase): + + @patch('agent.search_agent.checkpoint_saver', return_value=MemorySaver()) + def test_search_agent_init(self, mock_create_saver): + chat_model = FakeListChatModel(responses=["fake response"]) + search_agent = SearchAgent(model=chat_model, streaming=True) + self.assertIsNotNone(search_agent) + + @patch('agent.search_agent.checkpoint_saver', return_value=MemorySaver()) + def test_search_agent_invoke_simple(self, mock_create_saver): + expected_response = "This is a mocked LLM response." + chat_model = FakeListChatModel(responses=[expected_response]) + search_agent = SearchAgent(model=chat_model, streaming=True) + result = search_agent.invoke(question="What is the capital of France?", ref="test_ref") + + self.assertIn("messages", result) + self.assertGreater(len(result["messages"]), 0) + self.assertEqual(result["messages"][-1].content, expected_response) + + @patch('agent.search_agent.checkpoint_saver') + def test_search_agent_invocation(self, mock_create_saver): + # Create a memory saver instance with a Mock for delete_checkpoints + memory_saver = MemorySaver() + from unittest.mock import Mock + memory_saver.delete_checkpoints = Mock() + mock_create_saver.return_value = memory_saver + + # Test that the SearchAgent invokes the model with the correct messages + chat_model = FakeListChatModel(responses=["first response", "second response"]) + search_agent = SearchAgent(model=chat_model, streaming=True) + + # First invocation with some question + result_1 = search_agent.invoke(question="First question?", ref="test_ref") + self.assertIn("messages", result_1) + self.assertEqual(result_1["messages"][-1].content, "first response") + + # Second invocation, same ref, should retain memory + result_2 = search_agent.invoke(question="Second question?", ref="test_ref") + self.assertEqual(result_2["messages"][-1].content, "second response") + + # Verify delete_checkpoints was not called + memory_saver.delete_checkpoints.assert_not_called() + + + @patch('agent.search_agent.checkpoint_saver') + def test_search_agent_invoke_forget(self, mock_create_saver): + # Create a memory saver instance with a Mock for delete_checkpoints + memory_saver = MemorySaver() + from unittest.mock import Mock + memory_saver.delete_checkpoints = Mock() + mock_create_saver.return_value = memory_saver + + + # Test `forget=True` to ensure that state is reset and doesn't carry over between invocations + chat_model = FakeListChatModel(responses=["first response", "second response"]) + search_agent = SearchAgent(model=chat_model, streaming=True) + + # First invocation with some question + result_1 = search_agent.invoke(question="First question?", ref="test_ref") + self.assertIn("messages", result_1) + self.assertEqual(result_1["messages"][-1].content, "first response") + + # Second invocation, same ref, should retain memory if we don't forget + result_2 = search_agent.invoke(question="Second question?", ref="test_ref") + self.assertEqual(result_2["messages"][-1].content, "second response") + + # Now invoke with forget=True, resetting the state + new_chat_model = FakeListChatModel(responses=["fresh response"]) + search_agent = SearchAgent(model=new_chat_model, streaming=True) + + # Forget the state for "test_ref" + result_3 = search_agent.invoke(question="Third question after forgetting?", ref="test_ref", forget=True) + # With a fresh FakeListChatModel, the response should now be "fresh response" + self.assertEqual(result_3["messages"][-1].content, "fresh response") + + # Verify delete_checkpoints was called + memory_saver.delete_checkpoints.assert_called_once_with("test_ref") \ No newline at end of file diff --git a/chat/test/agent/test_search_workflow.py b/chat/test/agent/test_search_workflow.py new file mode 100644 index 00000000..9d3a10e7 --- /dev/null +++ b/chat/test/agent/test_search_workflow.py @@ -0,0 +1,44 @@ +import unittest +from langchain_core.messages.base import BaseMessage +from langchain_core.messages.system import SystemMessage +from langgraph.graph import END + +from agent.search_agent import SearchWorkflow + +class FakeMessage(BaseMessage): + type: str = "fake" # specify a default type + content: str + tool_calls: list = [] + +class FakeModel: + def invoke(self, messages): + # Just return a mock response + return SystemMessage(content="Mock Response") + +class TestSearchWorkflow(unittest.TestCase): + def setUp(self): + self.model = FakeModel() + self.workflow = SearchWorkflow(model=self.model, system_message="Test system message") + + def test_should_continue_with_tool_calls(self): + state = {"messages": [ + FakeMessage(content="Hello"), + FakeMessage(content="Calling tool", tool_calls=["test_tool"]) + ]} + result = self.workflow.should_continue(state) + self.assertEqual(result, "tools") + + def test_should_continue_without_tool_calls(self): + state = {"messages": [ + FakeMessage(content="Hello"), + FakeMessage(content="No tool calls here") + ]} + result = self.workflow.should_continue(state) + self.assertEqual(result, END) + + def test_call_model(self): + state = {"messages": [FakeMessage(content="User input")]} + result = self.workflow.call_model(state) + self.assertIn("messages", result) + self.assertEqual(len(result["messages"]), 1) + self.assertEqual(result["messages"][0].content, "Mock Response") \ No newline at end of file diff --git a/chat/test/agent/test_tools.py b/chat/test/agent/test_tools.py new file mode 100644 index 00000000..4f01e77a --- /dev/null +++ b/chat/test/agent/test_tools.py @@ -0,0 +1,162 @@ +from unittest import TestCase +from unittest.mock import patch, MagicMock +import json + +from agent.tools import discover_fields, search, aggregate, get_keyword_fields +from test.fixtures.opensearch import TOP_PROPERTIES + + +class TestTools(TestCase): + @patch('agent.tools.opensearch_vector_store') + def test_discover_fields(self, mock_opensearch): + # Mock the OpenSearch response + mock_client = MagicMock() + mock_client.indices.get_mapping.return_value = { + 'index_name': { + 'mappings': { + 'properties': { + 'field1': {'type': 'keyword'}, + 'field3': { + 'properties': { + 'subfield1': {'type': 'keyword'} + } + } + } + } + } + } + mock_opensearch.return_value.client = mock_client + + # Pass required parameters based on the tool's schema + response = discover_fields.invoke({"query": ""}) # Assuming query is the required parameter + self.assertIsInstance(response, str) + parsed_response = json.loads(response) + self.assertEqual(parsed_response, ["field1", "field3.subfield1"]) + + @patch('agent.tools.opensearch_vector_store') + def test_search(self, mock_opensearch): + mock_results = [{"id": "doc1", "text": "example result"}] + mock_opensearch.return_value.similarity_search.return_value = mock_results + + response = search.invoke("test query") + self.assertIsInstance(response, str) # Remove .content check + parsed_response = json.loads(response) + self.assertEqual(parsed_response, mock_results) + + @patch('agent.tools.opensearch_vector_store') + def test_aggregate(self, mock_opensearch): + mock_response = { + "aggregations": { + "example_agg": { + "buckets": [] + } + } + } + mock_opensearch.return_value.aggregations_search.return_value = mock_response + + # Pass parameters directly instead of as JSON string + response = aggregate.invoke({ + "agg_field": "field1", + "term_field": "term_field", + "term": "term" + }) + self.assertIsInstance(response, str) + parsed_response = json.loads(response) + self.assertEqual(parsed_response, mock_response) + + @patch('agent.tools.opensearch_vector_store') + def test_aggregate_no_term(self, mock_opensearch): + mock_response = { + "aggregations": { + "all_docs": { + "buckets": [] + } + } + } + mock_opensearch.return_value.aggregations_search.return_value = mock_response + + response = aggregate.invoke({ + "agg_field": "field1", + "term_field": "", + "term": "" + }) + self.assertIsInstance(response, str) + parsed_response = json.loads(response) + self.assertEqual(parsed_response, mock_response) + + def test_get_keyword_fields(self): + properties = { + 'field1': {'type': 'keyword'}, + 'field2': {'type': 'text'}, + 'field3': { + 'fields': { + 'raw': {'type': 'keyword'} + } + } + } + result = get_keyword_fields(properties) + self.assertEqual(set(result), {'field1', 'field3.raw'}) + + def test_nested_get_keyword_fields(self): + properties = { + 'field1': { + 'properties': { + 'nested1': {'type': 'keyword'}, + 'nested2': {'type': 'text'} + } + } + } + result = get_keyword_fields(properties) + self.assertEqual(result, ['field1.nested1']) + + def test_complex_mapping_get_keyword_fields(self): + properties = { + 'field1': { + 'properties': { + 'nested1': { + 'type': 'keyword' + }, + 'nested2': { + 'properties': { + 'subnested1': {'type': 'keyword'} + } + } + } + }, + 'field2': { + 'fields': { + 'raw': {'type': 'keyword'} + } + } + } + result = get_keyword_fields(properties) + self.assertEqual(set(result), {'field1.nested1', 'field1.nested2.subnested1', 'field2.raw'}) + + def test_meadow_mapping_get_keyword_fields(self): + result = get_keyword_fields(TOP_PROPERTIES) + expected_result = ['accession_number', 'all_controlled_terms', 'all_ids', 'api_link', 'api_model', 'ark', 'batch_ids', 'box_name', 'box_number', 'canonical_link', 'catalog_key', 'collection.id', 'collection.title.keyword', 'contributor.facet', 'contributor.id', 'contributor.label', 'contributor.label_with_role', 'contributor.role', 'contributor.variants', 'creator.facet', 'creator.id', 'creator.label', 'creator.variants', 'csv_metadata_update_jobs', 'date_created', 'date_created_edtf', 'embedding_model', 'file_sets.accession_number', 'file_sets.download_url', 'file_sets.id', 'file_sets.label', 'file_sets.mime_type', 'file_sets.original_filename', 'file_sets.representative_image_url', 'file_sets.role', 'file_sets.streaming_url', 'file_sets.webvtt', 'folder_name', 'folder_number', 'genre.facet', 'genre.id', 'genre.label', 'genre.label_with_role', 'genre.role', 'genre.variants', 'id', 'identifier', 'iiif_manifest', 'ingest_project.id', 'ingest_project.title', 'ingest_sheet.id', 'ingest_sheet.title', 'keywords', 'language.facet', 'language.id', 'language.label', 'language.variants', 'legacy_identifier', 'library_unit', 'license.id', 'license.label', 'location.facet', 'location.id', 'location.label', 'location.variants', 'notes.note', 'notes.type', 'physical_description_material', 'physical_description_size', 'preservation_level', 'project.cycle', 'project.desc', 'project.manager', 'project.name', 'project.proposer', 'project.task_number', 'provenance', 'publisher', 'related_material', 'related_url.label', 'related_url.url', 'representative_file_set.id', 'representative_file_set.url', 'rights_holder', 'rights_statement.id', 'rights_statement.label', 'scope_and_contents', 'series', 'source', 'status', 'style_period.facet', 'style_period.id', 'style_period.label', 'style_period.variants', 'subject.facet', 'subject.id', 'subject.label', 'subject.label_with_role', 'subject.role', 'subject.variants', 'technique.facet', 'technique.id', 'technique.label', 'technique.variants', 'terms_of_use', 'thumbnail', 'title.keyword', 'visibility', 'work_type'] + self.assertEqual( + result, + expected_result) + + @patch('agent.tools.opensearch_vector_store') + def test_aggregate_exception(self, mock_opensearch): + # Configure the mock to raise an exception + mock_client = MagicMock() + mock_client.aggregations_search.side_effect = Exception("Test error") + mock_opensearch.return_value = mock_client + + # Call aggregate with some parameters + response = aggregate.invoke({ + "agg_field": "field1", + "term_field": "term_field", + "term": "term" + }) + + # Verify the response contains the error message + self.assertIsInstance(response, str) + parsed_response = json.loads(response) + self.assertEqual(parsed_response, {"error": "Test error"}) + + # Verify the mock was called with expected parameters + mock_client.aggregations_search.assert_called_once() \ No newline at end of file diff --git a/chat/test/core/__init__.py b/chat/test/core/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/chat/test/helpers/test_apitoken.py b/chat/test/core/test_apitoken.py similarity index 95% rename from chat/test/helpers/test_apitoken.py rename to chat/test/core/test_apitoken.py index e23a1646..cb1c8e60 100644 --- a/chat/test/helpers/test_apitoken.py +++ b/chat/test/core/test_apitoken.py @@ -1,10 +1,7 @@ # ruff: noqa: E402 import os -import sys -sys.path.append('./src') - -from helpers.apitoken import ApiToken +from core.apitoken import ApiToken from test.fixtures.apitoken import DEV_TEAM_TOKEN, SUPER_TOKEN, TEST_SECRET, TEST_TOKEN from unittest import mock, TestCase diff --git a/chat/test/core/test_event_config.py b/chat/test/core/test_event_config.py new file mode 100644 index 00000000..ffe09a91 --- /dev/null +++ b/chat/test/core/test_event_config.py @@ -0,0 +1,123 @@ +# ruff: noqa: E402 +import json +import unittest +from unittest import TestCase +from unittest.mock import MagicMock, patch + +from core.apitoken import ApiToken +from core.event_config import EventConfig +from core.websocket import Websocket + +class TestEventConfig(TestCase): + def test_defaults(self): + actual = EventConfig(event={"body": json.dumps({"question": "Question?"})}) + self.assertEqual(actual.question, "Question?") + + def test_attempt_override_without_superuser_status(self): + actual = EventConfig( + event={ + "body": json.dumps( + { + "k": 100, + "question": "test question", + "ref": "test ref", + "size": 90, + "temperature": 0.9, + } + ) + } + ) + expected_output = { + "k": 40, + "question": "test question", + "ref": "test ref", + "size": 20, + "temperature": 0.2, + } + self.assertEqual(actual.k, expected_output["k"]) + self.assertEqual(actual.question, expected_output["question"]) + self.assertEqual(actual.ref, expected_output["ref"]) + self.assertEqual(actual.size, expected_output["size"]) + self.assertEqual(actual.temperature, expected_output["temperature"]) + +class TestEventConfigSuperuser(unittest.TestCase): + def setUp(self): + self.event = { + "body": json.dumps({ + "auth": "some_superuser_token", + "model": "custom-superuser-model", + "prompt": "Custom superuser prompt", + "k": 80, + "size": 50, + "temperature": 0.7, + "text_key": "custom_text_key" + }), + "requestContext": { + "connectionId": "test_connection_id", + "domainName": "example.com", + "stage": "dev" + } + } + + @patch.object(ApiToken, 'is_superuser', return_value=True) + def test_superuser_overrides(self, mock_superuser): + """ + Test that when the user is a superuser, the payload values override the defaults. + """ + config = EventConfig(event=self.event) + self.assertTrue(config.is_superuser) + # As a superuser, these should reflect the payload values rather than defaults + self.assertEqual(config.model, "custom-superuser-model") + self.assertEqual(config.k, 80) # should not be clipped since 80 < MAX_K (100) + self.assertEqual(config.size, 50) + self.assertEqual(config.temperature, 0.7) + self.assertEqual(config.text_key, "custom_text_key") + self.assertEqual(config.prompt_text, "Custom superuser prompt") + + +class TestEventConfigWebsocket(unittest.TestCase): + def setUp(self): + self.event = { + "body": json.dumps({ + "auth": "some_superuser_token", + "model": "custom-superuser-model", + "prompt": "Custom superuser prompt", + "k": 80, + "size": 50, + "temperature": 0.7, + "text_key": "custom_text_key" + }), + "requestContext": { + "connectionId": "test_connection_id", + "domainName": "example.com", + "stage": "dev" + } + } + + @patch.object(ApiToken, 'is_superuser', return_value=True) + @patch('core.event_config.Websocket', autospec=True) + def test_setup_websocket_without_socket(self, mock_websocket_class, mock_superuser): + config = EventConfig(event=self.event) + returned_socket = config.setup_websocket() + + mock_websocket_class.assert_called_once_with( + endpoint_url='https://example.com/dev', + connection_id='test_connection_id', + ref=config.ref + ) + + # Instead of assertIsInstance(returned_socket, mock_websocket_class), + # we check that it's the return_value of the mock: + self.assertIs(returned_socket, mock_websocket_class.return_value) + self.assertEqual(config.socket, mock_websocket_class.return_value) + + @patch.object(ApiToken, 'is_superuser', return_value=True) + def test_setup_websocket_with_existing_socket(self, mock_superuser): + """ + Test that setup_websocket uses the provided socket if one is passed in. + """ + config = EventConfig(event=self.event) + mock_socket = MagicMock(spec=Websocket) + returned_socket = config.setup_websocket(socket=mock_socket) + self.assertEqual(returned_socket, mock_socket) + self.assertEqual(config.socket, mock_socket) \ No newline at end of file diff --git a/chat/test/helpers/test_prompts.py b/chat/test/core/test_prompts.py similarity index 90% rename from chat/test/helpers/test_prompts.py rename to chat/test/core/test_prompts.py index b9a7d950..7a1179e1 100644 --- a/chat/test/helpers/test_prompts.py +++ b/chat/test/core/test_prompts.py @@ -1,8 +1,5 @@ # ruff: noqa: E402 -import sys -sys.path.append('./src') - -from helpers.prompts import prompt_template, document_template +from core.prompts import prompt_template, document_template from unittest import TestCase diff --git a/chat/test/core/test_secrets.py b/chat/test/core/test_secrets.py new file mode 100644 index 00000000..34d70194 --- /dev/null +++ b/chat/test/core/test_secrets.py @@ -0,0 +1,29 @@ +import boto3 +import os +import pytest +from moto import mock_aws +from unittest import TestCase + +from core.secrets import load_secrets + +@mock_aws +@mock_aws +@pytest.mark.filterwarnings("ignore::DeprecationWarning") +class TestSecrets(TestCase): + def setUp(self): + client = boto3.client("secretsmanager", region_name="us-east-1") + client.create_secret( + Name="mock/infrastructure/index", + SecretString='{"endpoint": "https://opensearch-endpoint", "embedding_model": "opensearch-model"}') + client.create_secret( + Name="mock/config/dcapi", + SecretString='{"api_token_secret": "dcapi-token"}') + + def test_load_secrets(self): + self.assertNotEqual('dcapi-token', os.getenv('API_TOKEN_SECRET')) + self.assertNotEqual('https://opensearch-endpoint', os.getenv('OPENSEARCH_ENDPOINT')) + self.assertNotEqual('opensearch-model', os.getenv('OPENSEARCH_MODEL_ID')) + load_secrets('mock') + self.assertEqual('dcapi-token', os.getenv('API_TOKEN_SECRET')) + self.assertEqual('https://opensearch-endpoint', os.getenv('OPENSEARCH_ENDPOINT')) + self.assertEqual('opensearch-model', os.getenv('OPENSEARCH_MODEL_ID')) diff --git a/chat/test/core/test_setup.py b/chat/test/core/test_setup.py new file mode 100644 index 00000000..fb6c6eaa --- /dev/null +++ b/chat/test/core/test_setup.py @@ -0,0 +1,149 @@ +import unittest +from unittest.mock import patch, MagicMock +import os +from opensearchpy import RequestsHttpConnection + +from core.setup import chat_model, checkpoint_saver, prefix, opensearch_endpoint, opensearch_client, opensearch_vector_store, websocket_client + + +class TestChatModel(unittest.TestCase): + def test_chat_model_returns_bedrock_instance(self): + kwargs = {"model_id": "test_model"} + with patch("core.setup.ChatBedrock") as mock_bedrock: + result = chat_model(**kwargs) + mock_bedrock.assert_called_once_with(**kwargs) + self.assertEqual(result, mock_bedrock.return_value) + +class TestCheckpointSaver(unittest.TestCase): + @patch.dict(os.environ, {"CHECKPOINT_BUCKET_NAME": "test-bucket"}) + @patch("core.setup.S3Checkpointer") + def test_checkpoint_saver_initialization(self, mock_s3_checkpointer): + kwargs = {"prefix": "test"} + result = checkpoint_saver(**kwargs) + + mock_s3_checkpointer.assert_called_once_with( + bucket_name="test-bucket", + **kwargs + ) + self.assertEqual(result, mock_s3_checkpointer.return_value) + +class TestPrefix(unittest.TestCase): + def test_prefix_with_env_prefix(self): + with patch.dict(os.environ, {"ENV_PREFIX": "dev"}): + result = prefix("test") + self.assertEqual(result, "dev-test") + + def test_prefix_without_env_prefix(self): + with patch.dict(os.environ, {"ENV_PREFIX": ""}): + result = prefix("test") + self.assertEqual(result, "test") + + def test_prefix_with_none_env_prefix(self): + with patch.dict(os.environ, clear=True): + result = prefix("test") + self.assertEqual(result, "test") + +class TestOpenSearchEndpoint(unittest.TestCase): + def test_opensearch_endpoint_with_full_url(self): + with patch.dict(os.environ, {"OPENSEARCH_ENDPOINT": "https://test.amazonaws.com"}): + result = opensearch_endpoint() + self.assertEqual(result, "test.amazonaws.com") + + def test_opensearch_endpoint_with_hostname(self): + with patch.dict(os.environ, {"OPENSEARCH_ENDPOINT": "test.amazonaws.com"}): + result = opensearch_endpoint() + self.assertEqual(result, "test.amazonaws.com") + +class TestOpenSearchClient(unittest.TestCase): + @patch("core.setup.boto3.Session") + @patch("core.setup.AWS4Auth") + @patch("core.setup.OpenSearch") + def test_opensearch_client_initialization(self, mock_opensearch, mock_aws4auth, mock_session): + # Setup mock credentials + mock_credentials = MagicMock() + mock_session.return_value.get_credentials.return_value = mock_credentials + + with patch.dict(os.environ, { + "AWS_REGION": "us-west-2", + "OPENSEARCH_ENDPOINT": "test.amazonaws.com" + }): + _result = opensearch_client() + + # Verify AWS4Auth initialization + mock_aws4auth.assert_called_once_with( + region="us-west-2", + service="es", + refreshable_credentials=mock_credentials + ) + + # Verify OpenSearch initialization + mock_opensearch.assert_called_once_with( + hosts=[{"host": "test.amazonaws.com", "port": 443}], + use_ssl=True, + connection_class=RequestsHttpConnection, + http_auth=mock_aws4auth.return_value + ) + +class TestOpenSearchVectorStore(unittest.TestCase): + @patch("core.setup.boto3.Session") + @patch("core.setup.AWS4Auth") + @patch("core.setup.OpenSearchNeuralSearch") + def test_opensearch_vector_store_initialization(self, mock_neural_search, mock_aws4auth, mock_session): + # Setup mock credentials + mock_credentials = MagicMock() + mock_session.return_value.get_credentials.return_value = mock_credentials + + with patch.dict(os.environ, { + "AWS_REGION": "us-west-2", + "OPENSEARCH_ENDPOINT": "test.amazonaws.com", + "OPENSEARCH_MODEL_ID": "test-model", + "ENV_PREFIX": "dev" + }): + _result = opensearch_vector_store() + + # Verify AWS4Auth initialization + mock_aws4auth.assert_called_once_with( + region="us-west-2", + service="es", + refreshable_credentials=mock_credentials + ) + + # Verify OpenSearchNeuralSearch initialization + mock_neural_search.assert_called_once_with( + index="dev-dc-v2-work", + model_id="test-model", + endpoint="test.amazonaws.com", + connection_class=RequestsHttpConnection, + http_auth=mock_aws4auth.return_value, + text_field="id" + ) + +class TestWebsocketClient(unittest.TestCase): + @patch("core.setup.boto3.client") + def test_websocket_client_with_provided_endpoint(self, mock_boto3_client): + endpoint_url = "https://test-ws.amazonaws.com" + result = websocket_client(endpoint_url) + + mock_boto3_client.assert_called_once_with( + "apigatewaymanagementapi", + endpoint_url=endpoint_url + ) + self.assertEqual(result, mock_boto3_client.return_value) + + @patch("core.setup.boto3.client") + def test_websocket_client_with_env_endpoint(self, mock_boto3_client): + with patch.dict(os.environ, {"APIGATEWAY_URL": "https://test-ws-env.amazonaws.com"}): + result = websocket_client(None) + + mock_boto3_client.assert_called_once_with( + "apigatewaymanagementapi", + endpoint_url="https://test-ws-env.amazonaws.com" + ) + self.assertEqual(result, mock_boto3_client.return_value) + + @patch("core.setup.boto3.client") + def test_websocket_client_error_handling(self, mock_boto3_client): + mock_boto3_client.side_effect = Exception("Connection error") + + with self.assertRaises(Exception): + websocket_client("https://test-ws.amazonaws.com") \ No newline at end of file diff --git a/chat/test/core/test_websocket.py b/chat/test/core/test_websocket.py new file mode 100644 index 00000000..573c8748 --- /dev/null +++ b/chat/test/core/test_websocket.py @@ -0,0 +1,102 @@ +# ruff: noqa: E402 +import sys +import json +sys.path.append('./src') + +from unittest import TestCase, mock +from core.websocket import Websocket + + +class MockClient: + def post_to_connection(self, Data, ConnectionId): + return Data + + +class TestWebsocket(TestCase): + def setUp(self): + self.mock_client = MockClient() + self.test_connection_id = "test_connection_id" + self.test_ref = {"key": "value"} + + def test_init_with_all_parameters(self): + websocket = Websocket( + client=self.mock_client, + endpoint_url="wss://test.com", + connection_id=self.test_connection_id, + ref=self.test_ref + ) + self.assertEqual(websocket.client, self.mock_client) + self.assertEqual(websocket.connection_id, self.test_connection_id) + self.assertEqual(websocket.ref, self.test_ref) + + def test_init_with_minimal_parameters(self): + with mock.patch('core.websocket.websocket_client') as mock_client_func: + mock_client_func.return_value = self.mock_client + websocket = Websocket(endpoint_url="wss://test.com") + self.assertEqual(websocket.client, self.mock_client) + self.assertEqual(websocket.connection_id, None) + self.assertEqual(websocket.ref, {}) + + def test_send_string_message(self): + websocket = Websocket( + client=self.mock_client, + connection_id=self.test_connection_id, + ref=self.test_ref + ) + message = "test_message" + expected = {"message": "test_message", "ref": self.test_ref} + self.assertEqual(websocket.send(message), expected) + + def test_send_dict_message(self): + websocket = Websocket( + client=self.mock_client, + connection_id=self.test_connection_id, + ref=self.test_ref + ) + message = {"data": "test_data"} + expected = {"data": "test_data", "ref": self.test_ref} + self.assertEqual(websocket.send(message), expected) + + def test_send_in_debug_mode(self): + websocket = Websocket( + client=self.mock_client, + connection_id="debug", + ref=self.test_ref + ) + message = "test_message" + expected = {"message": "test_message", "ref": self.test_ref} + + # Capture printed output + with mock.patch('builtins.print') as mock_print: + result = websocket.send(message) + mock_print.assert_called_once_with(expected) + self.assertEqual(result, expected) + + def test_string_representation(self): + websocket = Websocket( + client=self.mock_client, + connection_id=self.test_connection_id, + ref=self.test_ref + ) + expected_str = f"Websocket({self.test_connection_id}, {self.test_ref})" + self.assertEqual(str(websocket), expected_str) + self.assertEqual(repr(websocket), expected_str) + + def test_send_converts_to_bytes(self): + websocket = Websocket( + client=self.mock_client, + connection_id=self.test_connection_id, + ref=self.test_ref + ) + message = "test_message" + expected_bytes = bytes( + json.dumps({"message": "test_message", "ref": self.test_ref}), + "utf-8" + ) + + with mock.patch.object(self.mock_client, 'post_to_connection') as mock_post: + websocket.send(message) + mock_post.assert_called_once_with( + Data=expected_bytes, + ConnectionId=self.test_connection_id + ) \ No newline at end of file diff --git a/chat/test/fixtures/opensearch.py b/chat/test/fixtures/opensearch.py new file mode 100644 index 00000000..1e791caf --- /dev/null +++ b/chat/test/fixtures/opensearch.py @@ -0,0 +1,335 @@ +TOP_PROPERTIES = { + "abstract": { + "type": "text", + "copy_to": ["all_text"], + "analyzer": "full_analyzer", + "search_analyzer": "stopword_analyzer", + "search_quote_analyzer": "full_analyzer", + }, + "accession_number": {"type": "keyword", "copy_to": ["all_ids"]}, + "all_controlled_labels": { + "type": "text", + "analyzer": "full_analyzer", + "search_analyzer": "stopword_analyzer", + "search_quote_analyzer": "full_analyzer", + }, + "all_controlled_terms": {"type": "keyword"}, + "all_ids": {"type": "keyword"}, + "all_text": { + "type": "text", + "analyzer": "full_analyzer", + "search_analyzer": "stopword_analyzer", + "search_quote_analyzer": "full_analyzer", + }, + "alternate_title": { + "type": "text", + "copy_to": ["all_text"], + "analyzer": "full_analyzer", + "search_analyzer": "stopword_analyzer", + "search_quote_analyzer": "full_analyzer", + }, + "api_link": {"type": "keyword", "copy_to": ["all_text"]}, + "api_model": {"type": "keyword", "copy_to": ["all_text"]}, + "ark": {"type": "keyword", "copy_to": ["all_ids"]}, + "batch_ids": {"type": "keyword", "copy_to": ["all_ids"]}, + "box_name": {"type": "keyword", "copy_to": ["all_text"]}, + "box_number": {"type": "keyword", "copy_to": ["all_text"]}, + "canonical_link": {"type": "keyword", "copy_to": ["all_text"]}, + "caption": { + "type": "text", + "copy_to": ["all_text"], + "analyzer": "full_analyzer", + "search_analyzer": "stopword_analyzer", + "search_quote_analyzer": "full_analyzer", + }, + "catalog_key": {"type": "keyword", "copy_to": ["all_ids"]}, + "collection": { + "properties": { + "description": { + "type": "text", + "copy_to": ["all_text"], + "analyzer": "full_analyzer", + "search_analyzer": "stopword_analyzer", + "search_quote_analyzer": "full_analyzer", + }, + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "title": { + "type": "text", + "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}, + "copy_to": ["all_text"], + "analyzer": "full_analyzer", + "search_analyzer": "stopword_analyzer", + "search_quote_analyzer": "full_analyzer", + }, + } + }, + "contributor": { + "properties": { + "facet": {"type": "keyword", "copy_to": ["all_text"]}, + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "label": { + "type": "keyword", + "copy_to": [ + "all_text", + "all_controlled_terms", + "all_controlled_labels", + ], + }, + "label_with_role": {"type": "keyword", "copy_to": ["all_text"]}, + "role": {"type": "keyword", "copy_to": ["all_text"]}, + "variants": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "create_date": {"type": "date_nanos"}, + "creator": { + "properties": { + "facet": {"type": "keyword", "copy_to": ["all_text"]}, + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "label": { + "type": "keyword", + "copy_to": [ + "all_text", + "all_controlled_terms", + "all_controlled_labels", + ], + }, + "variants": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "csv_metadata_update_jobs": {"type": "keyword", "copy_to": ["all_text"]}, + "cultural_context": { + "type": "text", + "copy_to": ["all_text"], + "analyzer": "full_analyzer", + "search_analyzer": "stopword_analyzer", + "search_quote_analyzer": "full_analyzer", + }, + "date_created": {"type": "keyword", "copy_to": ["all_text"]}, + "date_created_edtf": {"type": "keyword"}, + "description": { + "type": "text", + "copy_to": ["all_text"], + "analyzer": "full_analyzer", + "search_analyzer": "stopword_analyzer", + "search_quote_analyzer": "full_analyzer", + }, + "embedding": { + "type": "knn_vector", + "dimension": 1024, + "method": { + "engine": "lucene", + "space_type": "cosinesimil", + "name": "hnsw", + "parameters": {}, + }, + }, + "embedding_model": {"type": "keyword"}, + "embedding_text_length": {"type": "long"}, + "file_sets": { + "properties": { + "accession_number": {"type": "keyword", "copy_to": ["all_ids"]}, + "description": { + "type": "text", + "copy_to": ["all_text"], + "analyzer": "full_analyzer", + "search_analyzer": "stopword_analyzer", + "search_quote_analyzer": "full_analyzer", + }, + "download_url": {"type": "keyword", "copy_to": ["all_text"]}, + "duration": {"type": "float"}, + "height": {"type": "long"}, + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "label": {"type": "keyword", "copy_to": ["all_text"]}, + "mime_type": {"type": "keyword", "copy_to": ["all_text"]}, + "original_filename": {"type": "keyword", "copy_to": ["all_text"]}, + "poster_offset": {"type": "long"}, + "rank": {"type": "long"}, + "representative_image_url": {"type": "keyword", "copy_to": ["all_text"]}, + "role": {"type": "keyword", "copy_to": ["all_text"]}, + "streaming_url": {"type": "keyword", "copy_to": ["all_text"]}, + "webvtt": {"type": "keyword", "copy_to": ["all_text"]}, + "width": {"type": "long"}, + } + }, + "folder_name": {"type": "keyword", "copy_to": ["all_text"]}, + "folder_number": {"type": "keyword", "copy_to": ["all_text"]}, + "genre": { + "properties": { + "facet": {"type": "keyword", "copy_to": ["all_text"]}, + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "label": { + "type": "keyword", + "copy_to": [ + "all_text", + "all_controlled_terms", + "all_controlled_labels", + ], + }, + "label_with_role": {"type": "keyword", "copy_to": ["all_text"]}, + "role": {"type": "keyword", "copy_to": ["all_text"]}, + "variants": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "identifier": {"type": "keyword", "copy_to": ["all_ids"]}, + "iiif_manifest": {"type": "keyword", "copy_to": ["all_text"]}, + "indexed_at": {"type": "date_nanos"}, + "ingest_project": { + "properties": { + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "title": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "ingest_sheet": { + "properties": { + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "title": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "keywords": {"type": "keyword", "copy_to": ["all_text"]}, + "language": { + "properties": { + "facet": {"type": "keyword", "copy_to": ["all_text"]}, + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "label": { + "type": "keyword", + "copy_to": [ + "all_text", + "all_controlled_terms", + "all_controlled_labels", + ], + }, + "variants": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "legacy_identifier": {"type": "keyword", "copy_to": ["all_ids"]}, + "library_unit": {"type": "keyword", "copy_to": ["all_text"]}, + "license": { + "properties": { + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "label": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "location": { + "properties": { + "facet": {"type": "keyword", "copy_to": ["all_text"]}, + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "label": { + "type": "keyword", + "copy_to": [ + "all_text", + "all_controlled_terms", + "all_controlled_labels", + ], + }, + "variants": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "modified_date": {"type": "date_nanos"}, + "notes": { + "properties": { + "note": {"type": "keyword", "copy_to": ["all_text"]}, + "type": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "physical_description_material": {"type": "keyword", "copy_to": ["all_text"]}, + "physical_description_size": {"type": "keyword", "copy_to": ["all_text"]}, + "preservation_level": {"type": "keyword", "copy_to": ["all_text"]}, + "project": { + "properties": { + "cycle": {"type": "keyword", "copy_to": ["all_text"]}, + "desc": {"type": "keyword", "copy_to": ["all_text"]}, + "manager": {"type": "keyword", "copy_to": ["all_text"]}, + "name": {"type": "keyword", "copy_to": ["all_text"]}, + "proposer": {"type": "keyword", "copy_to": ["all_text"]}, + "task_number": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "provenance": {"type": "keyword", "copy_to": ["all_text"]}, + "published": {"type": "boolean"}, + "publisher": {"type": "keyword", "copy_to": ["all_text"]}, + "related_material": {"type": "keyword", "copy_to": ["all_text"]}, + "related_url": { + "properties": { + "label": {"type": "keyword", "copy_to": ["all_text"]}, + "url": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "representative_file_set": { + "properties": { + "aspect_ratio": {"type": "float"}, + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "url": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "rights_holder": {"type": "keyword", "copy_to": ["all_text"]}, + "rights_statement": { + "properties": { + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "label": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "scope_and_contents": {"type": "keyword", "copy_to": ["all_text"]}, + "series": {"type": "keyword", "copy_to": ["all_text"]}, + "source": {"type": "keyword", "copy_to": ["all_text"]}, + "status": {"type": "keyword", "copy_to": ["all_text"]}, + "style_period": { + "properties": { + "facet": {"type": "keyword", "copy_to": ["all_text"]}, + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "label": { + "type": "keyword", + "copy_to": [ + "all_text", + "all_controlled_terms", + "all_controlled_labels", + ], + }, + "variants": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "subject": { + "properties": { + "facet": {"type": "keyword", "copy_to": ["all_text"]}, + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "label": {"type": "keyword", "copy_to": ["all_text"]}, + "label_with_role": {"type": "keyword", "copy_to": ["all_text"]}, + "role": {"type": "keyword", "copy_to": ["all_text"]}, + "variants": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "table_of_contents": { + "type": "text", + "copy_to": ["all_text"], + "analyzer": "full_analyzer", + "search_analyzer": "stopword_analyzer", + "search_quote_analyzer": "full_analyzer", + }, + "technique": { + "properties": { + "facet": {"type": "keyword", "copy_to": ["all_text"]}, + "id": {"type": "keyword", "copy_to": ["all_ids"]}, + "label": { + "type": "keyword", + "copy_to": [ + "all_text", + "all_controlled_terms", + "all_controlled_labels", + ], + }, + "variants": {"type": "keyword", "copy_to": ["all_text"]}, + } + }, + "terms_of_use": {"type": "keyword", "copy_to": ["all_text"]}, + "thumbnail": {"type": "keyword", "copy_to": ["all_text"]}, + "title": { + "type": "text", + "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}, + "copy_to": ["all_text"], + "analyzer": "full_analyzer", + "search_analyzer": "stopword_analyzer", + "search_quote_analyzer": "full_analyzer", + }, + "visibility": {"type": "keyword", "copy_to": ["all_text"]}, + "work_type": {"type": "keyword", "copy_to": ["all_text"]}, +} diff --git a/chat/test/handlers/test_chat.py b/chat/test/handlers/test_chat.py index a2cd93e8..5c19a769 100644 --- a/chat/test/handlers/test_chat.py +++ b/chat/test/handlers/test_chat.py @@ -1,18 +1,18 @@ # ruff: noqa: E402 +import boto3 import json import os -import sys - -sys.path.append('./src') - -from unittest import mock, TestCase +import pytest +from unittest import TestCase from unittest.mock import patch -from handlers.chat import handler -from helpers.apitoken import ApiToken -from helpers.response import Response -from websocket import Websocket -from event_config import EventConfig +from moto import mock_aws + +from handlers import chat +from core.apitoken import ApiToken +from core.websocket import Websocket +from langchain_core.language_models.fake_chat_models import FakeListChatModel +from langgraph.checkpoint.memory import MemorySaver class MockClient: def __init__(self): @@ -23,98 +23,81 @@ def post_to_connection(self, Data, ConnectionId): return Data class MockContext: - def __init__(self): - self.log_stream_name = 'test' - -# TODO: Find a way to build a better mock response (maybe using helpers.metrics.debug_response) -def mock_response(**kwargs): - result = { - 'answer': 'Answer.', - 'attributes': ['accession_number', 'alternate_title', 'api_link', 'canonical_link', 'caption', 'collection', 'contributor', 'date_created', 'date_created_edtf', 'description', 'genre', 'id', 'identifier', 'keywords', 'language', 'notes', 'physical_description_material', 'physical_description_size', 'provenance', 'publisher', 'rights_statement', 'subject', 'table_of_contents', 'thumbnail', 'title', 'visibility', 'work_type'], - 'azure_endpoint': 'https://nul-ai-east.openai.azure.com/', - 'deployment_name': 'gpt-4o', - 'is_dev_team': False, - 'is_superuser': False, - 'k': 10, - 'openai_api_version': '2024-02-01', - 'prompt': "Prompt", - 'question': 'Question?', - 'ref': 'ref123', - 'size': 20, - 'source_documents': [], - 'temperature': 0.2, - 'text_key': 'id', - 'token_counts': {'question': 19, 'answer': 348, 'prompt': 329, 'source_documents': 10428,'total': 11124} - } - result.update(kwargs) - return result + def __init__(self): + self.log_stream_name = 'test_log_stream' -@mock.patch.dict( - os.environ, - { - "AZURE_OPENAI_RESOURCE_NAME": "test", - }, -) -@mock.patch.object(Response, "prepare_response", lambda _: mock_response()) +@mock_aws +@pytest.mark.filterwarnings("ignore::DeprecationWarning") class TestHandler(TestCase): - def test_handler_unauthorized(self): + + @patch.object(ApiToken, 'is_logged_in', return_value=False) + @patch('agent.search_agent.checkpoint_saver', return_value=MemorySaver()) + def test_handler_unauthorized(self, mock_create_saver, mock_is_logged_in): event = {"socket": Websocket(client=MockClient(), endpoint_url="test", connection_id="test", ref="test")} - self.assertEqual(handler(event, MockContext()), {'body': 'Unauthorized', 'statusCode': 401}) - - @patch.object(ApiToken, 'is_logged_in') - def test_handler_success(self, mock_is_logged_in): - mock_is_logged_in.return_value = True - event = {"socket": Websocket(client=MockClient(), endpoint_url="test", connection_id="test", ref="test"), "body": '{"question": "Question?"}' } - self.assertEqual(handler(event, MockContext()), {'statusCode': 200}) - - @patch.object(ApiToken, 'is_logged_in') - @patch.object(ApiToken, 'is_superuser') - @patch.object(EventConfig, '_is_debug_mode_enabled') - def test_handler_debug_mode(self, mock_is_debug_enabled, mock_is_superuser, mock_is_logged_in): - mock_is_debug_enabled.return_value = True - mock_is_logged_in.return_value = True - mock_is_superuser.return_value = True - mock_client = MockClient() - mock_websocket = Websocket(client=mock_client, endpoint_url="test", connection_id="test", ref="test") - event = {"socket": mock_websocket, "debug": True, "body": '{"question": "Question?"}' } - handler(event, MockContext()) - response = json.loads(mock_client.received_data) - expected_keys = {"attributes", "azure_endpoint", "deployment_name"} - received_keys = response.keys() - self.assertTrue(expected_keys.issubset(received_keys)) - - @patch.object(ApiToken, 'is_logged_in') - @patch.object(ApiToken, 'is_superuser') - def test_handler_debug_mode_for_superusers_only(self, mock_is_superuser, mock_is_logged_in): - mock_is_logged_in.return_value = True - mock_is_superuser.return_value = False - mock_client = MockClient() - mock_websocket = Websocket(client=mock_client, endpoint_url="test", connection_id="test", ref="test") - event = {"socket": mock_websocket, "body": '{"question": "Question?", "debug": "true"}'} - handler(event, MockContext()) - response = json.loads(mock_client.received_data) - expected_keys = {"answer", "ref"} - received_keys = set(response.keys()) - self.assertSetEqual(received_keys, expected_keys) + self.assertEqual(chat(event, MockContext()), {'statusCode': 401, 'body': 'Unauthorized'}) - @patch.object(ApiToken, 'is_logged_in') - def test_handler_question_missing(self, mock_is_logged_in): - mock_is_logged_in.return_value = True + @patch.object(ApiToken, 'is_logged_in', return_value=True) + @patch('agent.search_agent.checkpoint_saver', return_value=MemorySaver()) + @patch('handlers.chat_model', return_value=FakeListChatModel(responses=["fake response"])) + def test_handler_success(self, mock_chat_model, mock_create_saver, mock_is_logged_in): + event = { + "socket": Websocket(client=MockClient(), endpoint_url="test", connection_id="test", ref="test"), + "body": '{"question": "Question?"}' + } + self.assertEqual(chat(event, MockContext()), {'statusCode': 200}) + + @patch.object(ApiToken, 'is_logged_in', return_value=True) + @patch('agent.search_agent.checkpoint_saver', return_value=MemorySaver()) + def test_handler_question_missing(self, mock_create_saver, mock_is_logged_in): mock_client = MockClient() mock_websocket = Websocket(client=mock_client, endpoint_url="test", connection_id="test", ref="test") event = {"socket": mock_websocket} - handler(event, MockContext()) + chat(event, MockContext()) response = json.loads(mock_client.received_data) self.assertEqual(response["type"], "error") self.assertEqual(response["message"], "Question cannot be blank") - @patch.object(ApiToken, 'is_logged_in') - def test_handler_question_blank(self, mock_is_logged_in): - mock_is_logged_in.return_value = True + @patch.object(ApiToken, 'is_logged_in', return_value=True) + @patch('agent.search_agent.checkpoint_saver', return_value=MemorySaver()) + def test_handler_question_typo(self, mock_create_saver, mock_is_logged_in): mock_client = MockClient() mock_websocket = Websocket(client=mock_client, endpoint_url="test", connection_id="test", ref="test") event = {"socket": mock_websocket, "body": '{"quesion": ""}'} - handler(event, MockContext()) + chat(event, MockContext()) response = json.loads(mock_client.received_data) self.assertEqual(response["type"], "error") self.assertEqual(response["message"], "Question cannot be blank") + + @patch.dict(os.environ, {"METRICS_LOG_GROUP": "/nul/test/metrics/log/group"}) + @patch.object(ApiToken, 'is_logged_in', return_value=True) + @patch('agent.search_agent.checkpoint_saver', return_value=MemorySaver()) + @patch('handlers.chat_model', return_value=FakeListChatModel(responses=["fake response"])) + def test_handler_with_metrics(self, mock_model, mock_create_saver, mock_is_logged_in): + client = boto3.client("logs", region_name="us-east-1") + client.create_log_group(logGroupName=os.getenv("METRICS_LOG_GROUP")) + + event = { + "socket": Websocket(client=MockClient(), endpoint_url="test", connection_id="test", ref="test"), + "body": '{"question": "Question?", "ref": "test"}' + } + chat(event, MockContext()) + chat(event, MockContext()) # Second call to test if log stream already exists + + response = client.get_log_events( + logGroupName="/nul/test/metrics/log/group", + logStreamName="test_log_stream" + ) + expected = { + "answer": ["fake response"], + "artifacts": [], + "is_dev_team": False, + "is_superuser": False, + "k": 40, + "model": "us.anthropic.claude-3-5-sonnet-20241022-v2:0", + "question": "Question?", + "ref": "test", + "token_counts": {} + } + log_events = response["events"] + self.assertEqual(len(log_events), 2) + self.assertEqual(json.loads(log_events[0]["message"]), expected) diff --git a/chat/test/handlers/test_chat_sync.py b/chat/test/handlers/test_chat_sync.py index 773ebfe0..31487be8 100644 --- a/chat/test/handlers/test_chat_sync.py +++ b/chat/test/handlers/test_chat_sync.py @@ -1,35 +1,48 @@ # ruff: noqa: E402 -import os -import sys +import json +import pytest +from unittest import TestCase +from unittest.mock import patch +from moto import mock_aws -sys.path.append('./src') +from handlers import chat_sync +from core.apitoken import ApiToken +from langchain_core.language_models.fake_chat_models import FakeListChatModel +from langgraph.checkpoint.memory import MemorySaver -from unittest import mock, TestCase -from unittest.mock import patch -from handlers.chat_sync import handler -from helpers.apitoken import ApiToken class MockContext: def __init__(self): self.log_stream_name = 'test' -@mock.patch.dict( - os.environ, - { - "AZURE_OPENAI_RESOURCE_NAME": "test", - }, -) +@mock_aws +@pytest.mark.filterwarnings("ignore::DeprecationWarning") class TestHandler(TestCase): def test_handler_unauthorized(self): - self.assertEqual(handler({"body": '{ "question": "Question?"}'}, MockContext()), {'body': 'Unauthorized', 'statusCode': 401}) + self.assertEqual(chat_sync({"body": '{ "question": "Question?"}'}, MockContext()), {'body': 'Unauthorized', 'statusCode': 401}) - @patch.object(ApiToken, 'is_logged_in') + @patch.object(ApiToken, 'is_logged_in', return_value = True) def test_no_question(self, mock_is_logged_in): - mock_is_logged_in.return_value = True - self.assertEqual(handler({"body": '{ "question": ""}'}, MockContext()), {'statusCode': 400, 'body': 'Question cannot be blank'}) + self.assertEqual(chat_sync({"body": '{ "question": ""}'}, MockContext()), {'statusCode': 400, 'body': 'Question cannot be blank'}) - @patch.object(ApiToken, 'is_logged_in') - def test_handler_success(self, mock_is_logged_in): - mock_is_logged_in.return_value = True - self.assertEqual(handler({"body": '{"question": "Question?"}'}, MockContext()), {'statusCode': 200}) + @patch.object(ApiToken, 'is_logged_in', return_value = True) + @patch("agent.search_agent.checkpoint_saver", return_value=MemorySaver()) + @patch('handlers.chat_model', return_value=FakeListChatModel(responses=["fake response"])) + def test_handler_success(self, mock_chat_model, mock_create_saver, mock_is_logged_in): + expected_body = { + "answer": ["fake response"], + "is_dev_team": False, + "is_superuser": False, + "k": 40, + "model": "us.anthropic.claude-3-5-sonnet-20241022-v2:0", + "question": "Question?", + "ref": "test_ref", + "artifacts": [], + "token_counts": {} + } + response = chat_sync({"body": '{"question": "Question?", "ref": "test_ref"}'}, MockContext()) + + self.assertEqual(json.loads(response.get("body")), expected_body) + self.assertEqual(response.get("statusCode"), 200) + self.assertEqual(response.get("headers", {}).get("Content-Type"), "application/json") diff --git a/chat/test/handlers/test_opensearch_neural_search.py b/chat/test/handlers/test_opensearch_neural_search.py deleted file mode 100644 index d7448679..00000000 --- a/chat/test/handlers/test_opensearch_neural_search.py +++ /dev/null @@ -1,43 +0,0 @@ -# ruff: noqa: E402 -import sys -sys.path.append('./src') - -from unittest import TestCase -from handlers.opensearch_neural_search import OpenSearchNeuralSearch -from langchain_core.documents import Document - -class MockClient(): - def search(self, index, body, params): - return { - "hits": { - "hits": [ - { - "_source": { - "id": "test" - }, - "_score": 0.12345 - } - ] - } - } - -class TestOpenSearchNeuralSearch(TestCase): - def test_similarity_search(self): - docs = OpenSearchNeuralSearch(client=MockClient(), endpoint="test", index="test", model_id="test").similarity_search(query="test", subquery={"_source": {"excludes": ["embedding"]}}, size=10) - self.assertEqual(docs, [Document(page_content='test', metadata={'id': 'test'})]) - - def test_similarity_search_with_score(self): - docs = OpenSearchNeuralSearch(client=MockClient(), endpoint="test", index="test", model_id="test").similarity_search_with_score(query="test") - self.assertEqual(docs, [(Document(page_content='test', metadata={'id': 'test'}), 0.12345)]) - - def test_add_texts(self): - try: - OpenSearchNeuralSearch(client=MockClient(), endpoint="test", index="test", model_id="test").add_texts(texts=["test"], metadatas=[{"id": "test"}]) - except Exception as e: - self.fail(f"from_texts raised an exception: {e}") - - def test_from_texts(self): - try: - OpenSearchNeuralSearch.from_texts(clas="test", texts=["test"], metadatas=[{"id": "test"}]) - except Exception as e: - self.fail(f"from_texts raised an exception: {e}") \ No newline at end of file diff --git a/chat/test/handlers/test_streaming_socket_callback_handler.py b/chat/test/handlers/test_streaming_socket_callback_handler.py deleted file mode 100644 index 27d6cb2e..00000000 --- a/chat/test/handlers/test_streaming_socket_callback_handler.py +++ /dev/null @@ -1,49 +0,0 @@ -# ruff: noqa: E402 -import sys -sys.path.append('./src') - -from unittest import TestCase -from handlers.streaming_socket_callback_handler import ( - StreamingSocketCallbackHandler, -) -from websocket import Websocket -from langchain_core.outputs.llm_result import LLMResult -from langchain_core.outputs import ChatGeneration -from langchain_core.messages.ai import AIMessage - - -class MockClient: - def post_to_connection(self, Data, ConnectionId): - return Data - -class TestMyStreamingSocketCallbackHandler(TestCase): - def test_on_new_llm_token(self): - handler = StreamingSocketCallbackHandler(Websocket(client=MockClient())) - result = handler.on_llm_new_token(token="test") - self.assertEqual(result, {'token': 'test', 'ref': {}}) - self.assertTrue(handler.stream) - - def test_on_llm_end(self): - handler = StreamingSocketCallbackHandler(Websocket(client=MockClient())) - payload = LLMResult( - generations=[[ - ChatGeneration( - text='LLM Response', - generation_info={'finish_reason': 'stop', 'model_name': 'llm-model', 'system_fingerprint': 'fp_012345678'}, - message=AIMessage( - content='LLM Response', - response_metadata={'finish_reason': 'stop', 'model_name': 'llm-model', 'system_fingerprint': 'fp_012345678'}, - id='run-5da4fbbc-b663-4851-809d-fd11c27c5b76-0' - ) - ) - ]], - llm_output=None, - run=None - ) - result = handler.on_llm_end(payload) - self.assertEqual(result, {'end': {'reason': 'stop'}, 'ref': {}}) - self.assertTrue(handler.stream) - - def test_debug_mode(self): - handler = StreamingSocketCallbackHandler(Websocket(client=MockClient()), stream=False) - self.assertFalse(handler.stream) diff --git a/chat/test/helpers/test_http_event_config.py b/chat/test/helpers/test_http_event_config.py deleted file mode 100644 index 3bc67075..00000000 --- a/chat/test/helpers/test_http_event_config.py +++ /dev/null @@ -1,95 +0,0 @@ -# ruff: noqa: E402 -import json -import os -import sys -sys.path.append('./src') - -from http_event_config import HTTPEventConfig -from unittest import TestCase, mock - - -class TestEventConfigWithoutAzureResource(TestCase): - def test_requires_an_azure_resource(self): - with self.assertRaises(EnvironmentError): - HTTPEventConfig() - - -@mock.patch.dict( - os.environ, - { - "AZURE_OPENAI_RESOURCE_NAME": "test", - }, -) -class TestHTTPEventConfig(TestCase): - def test_fetches_attributes_from_vector_database(self): - os.environ.pop("AZURE_OPENAI_RESOURCE_NAME", None) - with self.assertRaises(EnvironmentError): - HTTPEventConfig() - - def test_defaults(self): - actual = HTTPEventConfig(event={"body": json.dumps({"attributes": ["title"]})}) - expected_defaults = {"azure_endpoint": "https://test.openai.azure.com/"} - self.assertEqual(actual.azure_endpoint, expected_defaults["azure_endpoint"]) - - def test_attempt_override_without_superuser_status(self): - actual = HTTPEventConfig( - event={ - "body": json.dumps( - { - "azure_resource_name": "new_name_for_test", - "attributes": ["title", "subject", "date_created"], - "index": "testIndex", - "k": 100, - "openai_api_version": "2024-01-01", - "question": "test question", - "ref": "test ref", - "size": 90, - "temperature": 0.9, - "text_key": "accession_number", - } - ) - } - ) - expected_output = { - "attributes": HTTPEventConfig.DEFAULT_ATTRIBUTES, - "azure_endpoint": "https://test.openai.azure.com/", - "k": 40, - "openai_api_version": "2024-02-01", - "question": "test question", - "size": 5, - "ref": "test ref", - "temperature": 0.2, - "text_key": "id", - } - self.assertEqual(actual.azure_endpoint, expected_output["azure_endpoint"]) - self.assertEqual(actual.attributes, expected_output["attributes"]) - self.assertEqual(actual.k, expected_output["k"]) - self.assertEqual( - actual.openai_api_version, expected_output["openai_api_version"] - ) - self.assertEqual(actual.question, expected_output["question"]) - self.assertEqual(actual.ref, expected_output["ref"]) - self.assertEqual(actual.temperature, expected_output["temperature"]) - self.assertEqual(actual.text_key, expected_output["text_key"]) - - def test_debug_message(self): - self.assertEqual( - HTTPEventConfig( - event={"body": json.dumps({"attributes": ["source"]})} - ).debug_message()["type"], - "debug", - ) - - def test_to_bool(self): - self.assertEqual(HTTPEventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool(""), False) - self.assertEqual(HTTPEventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("0"), False) - self.assertEqual(HTTPEventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("no"), False) - self.assertEqual(HTTPEventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("false"), False) - self.assertEqual(HTTPEventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("False"), False) - self.assertEqual(HTTPEventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("FALSE"), False) - self.assertEqual(HTTPEventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("no"), False) - self.assertEqual(HTTPEventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("No"), False) - self.assertEqual(HTTPEventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("NO"), False) - self.assertEqual(HTTPEventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("true"), True) - self.assertEqual(HTTPEventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool(True), True) - self.assertEqual(HTTPEventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool(False), False) diff --git a/chat/test/helpers/test_metrics.py b/chat/test/helpers/test_metrics.py deleted file mode 100644 index 84a9f9d0..00000000 --- a/chat/test/helpers/test_metrics.py +++ /dev/null @@ -1,91 +0,0 @@ -# ruff: noqa: E402 -import json -import os -import sys -sys.path.append('./src') - -from unittest import TestCase, mock -from helpers.metrics import count_tokens, debug_response, token_usage -from event_config import EventConfig - - - -class TestMetrics(TestCase): - @mock.patch.dict( - os.environ, - { - "AZURE_OPENAI_RESOURCE_NAME": "test", - "WEAVIATE_URL": "http://test", - "WEAVIATE_API_KEY": "test" - }, - ) - def setUp(self): - self.question = "What is your name?" - self.original_question = { - "question": self.question, - "source_documents": self.generate_source_documents(20), - } - self.event = { - "body": json.dumps({ - "deployment_name": "test", - "index": "test", - "k": 40, - "openai_api_version": "2019-05-06", - "prompt": "This is a test prompt.", - "question": self.question, - "ref": "test", - "size": 5, - "temperature": 0.5, - "text_key": "text", - "auth": "test123" - }) - } - self.config = EventConfig(event=self.event) - self.response = { - "output_text": "This is a test response.", - } - - def generate_source_documents(self, count): - return [ - { - "accession_number": f"SourceDoc:{i+1}", - "api_link": f"https://api.dc.library.northwestern.edu/api/v2/works/{i+1:0>32}", - "canonical_link": f"https://dc.library.northwestern.edu/items/{i+1:0>32}", - "title": f"Source Document {i+1}!" - } - for i in range(count) - ] - - def test_debug_response(self): - result = debug_response(self.config, self.response, self.original_question) - - self.assertEqual(result["k"], 40) - self.assertEqual(result["question"], self.question) - self.assertEqual(result["ref"], "test") - self.assertEqual(result["size"], 20) - self.assertEqual(len(result["source_documents"]), 20) - self.assertEqual( - result["source_documents"], - [doc["api_link"] for doc in self.original_question["source_documents"]] - ) - - def test_token_usage(self): - result = token_usage(self.config, self.response, self.original_question) - - expected_result = { - "answer": 12, - "prompt": 329, - "question": 5, - "source_documents": 1602, - "total": 1948 - } - - self.assertEqual(result, expected_result) - - def test_count_tokens(self): - val = "Hello, world!" - expected_result = 4 - - result = count_tokens(val) - - self.assertEqual(result, expected_result) diff --git a/chat/test/persistence/__init__.py b/chat/test/persistence/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/chat/test/persistence/test_compressible_json_serializer.py b/chat/test/persistence/test_compressible_json_serializer.py new file mode 100644 index 00000000..3fd09e12 --- /dev/null +++ b/chat/test/persistence/test_compressible_json_serializer.py @@ -0,0 +1,135 @@ +# ruff: noqa: E402 +import sys +sys.path.append("./src") + +from unittest import TestCase + +from langchain_core.messages import HumanMessage +from persistence.compressible_json_serializer import CompressibleJsonSerializer +import warnings + +warnings.simplefilter("ignore", DeprecationWarning) +class TestCompressibleJsonSerializer(TestCase): + def test_dumps_typed(self): + serializer = CompressibleJsonSerializer() + obj = {"key": "value"} + data = serializer.dumps_typed(obj) + self.assertEqual(data, ("json", '{"key": "value"}')) + + def test_loads_typed(self): + serializer = CompressibleJsonSerializer() + data = ("json", '{"key": "value"}') + obj = serializer.loads_typed(data) + self.assertEqual(obj, {"key": "value"}) + + def test_dumps_typed_with_bz2_compression(self): + serializer = CompressibleJsonSerializer(compression="bz2") + obj = {"key": "value"} + data = serializer.dumps_typed(obj) + self.assertEqual(data[0], "bz2_json") + + def test_loads_typed_with_bz2_compression(self): + serializer = CompressibleJsonSerializer(compression="bz2") + data = ( + "bz2_json", + "QlpoOTFBWSZTWYByjU0AAAcZgFAAABAiDAMqIAAim0BkEDQNAFPUpFyhWjhdyRThQkIByjU0", + ) + obj = serializer.loads_typed(data) + self.assertEqual(obj, {"key": "value"}) + + def test_dumps_typed_with_gzip_compression(self): + serializer = CompressibleJsonSerializer(compression="gzip") + obj = {"key": "value"} + data = serializer.dumps_typed(obj) + self.assertEqual(data[0], "gzip_json") + + def test_loads_typed_with_gzip_compression(self): + serializer = CompressibleJsonSerializer(compression="gzip") + data = ("gzip_json", "H4sIALfEW2cC/6tWyk6tVLJSUCpLzClNVaoFABtINTMQAAAA") + obj = serializer.loads_typed(data) + self.assertEqual(obj, {"key": "value"}) + + def test_nested_complex_object(self): + serializer = CompressibleJsonSerializer(compression="gzip") + data = ( + "gzip_json", + "H4sIAGwoW2cC/2WQMW/CMBCF/0rktU1lpyGELAxdunTrViHrjC8Q4Zyj2IEilP/enAtSpUoezv7e3Tu/mziLJlPPmYhhKUQhizJXxXI+Vd2oqlHFy6belFI+SdlIKRZlZ1mpsDW1WR\ +W5WRuTVxWa3LRtm5dQlXVRrlZr+8rq/RGI0OkzuAnZ4ya0DhHGqHW69RgCHBL6YhavAyYk3qce6OMX8ygLEVLL3lNEiqx5A8qufsoCwrg/Zq0fs4sfTyED46e43H004NyW+8HaLnaewOnTBcZD2mZewIhh8BRQ9xjh4c\ +KAd2GXI2/CIwh6fqDJuUcS9xq/oR8cwxZcwHnezfPf7+MYFuv/AShWPagOiHSXdDRM94zSpAHJdnRYJGRTWLv5B3RajDe+AQAA", + ) + obj = serializer.loads_typed(data) + self.assertEqual(obj, { + "v": 1, + "ts": "2024-12-12T18:16:12.989400+00:00", + "id": "1efb8b52-b7bb-66eb-bfff-4a64824557d3", + "channel_values": { + "__start__": { + "messages": [ + HumanMessage( + content="Can you search for works about football?", + additional_kwargs={}, + response_metadata={}, + ) + ] + } + }, + "channel_versions": {"__start__": 1}, + "versions_seen": {"__input__": {}}, + "pending_sends": [], + }) + + def test_dumps_typed_unsupported_compression(self): + serializer = CompressibleJsonSerializer(compression="unsupported") + with self.assertRaises(ValueError) as context: + serializer.dumps_typed({"key": "value"}) + + self.assertIn("Unsupported compression type", str(context.exception)) + + def test_loads_typed_unknown_type(self): + serializer = CompressibleJsonSerializer() + data = ("unknown_type", "payload") + with self.assertRaises(ValueError) as context: + serializer.loads_typed(data) + + self.assertIn("Unknown data type", str(context.exception)) + + def test_object_hook_unknown_type(self): + serializer = CompressibleJsonSerializer() + invalid_json = '{"__type__": "UnknownType", "data": {}}' + data = ("json", invalid_json) + with self.assertRaises(ValueError) as context: + serializer.loads_typed(data) + + self.assertIn("Unknown type", str(context.exception)) + + def test_loads_typed_empty_payload(self): + from json.decoder import JSONDecodeError + serializer = CompressibleJsonSerializer() + data = ("json", "") + with self.assertRaises(JSONDecodeError): + serializer.loads_typed(data) + + def test_dumps_typed_base_message(self): + serializer = CompressibleJsonSerializer() + # Create a BaseMessage instance (HumanMessage is one) + message = HumanMessage(content="Hello") + data_type, data_str = serializer.dumps_typed(message) + # Verify it returns a JSON string with the correct type and data + self.assertEqual(data_type, "json") + # We know that it returns {"__type__": "HumanMessage", "data": {...}} + # Check if the resulting JSON contains the expected keys + self.assertIn('"__type__": "HumanMessage"', data_str) + self.assertIn('"data":', data_str) + self.assertIn('"content": "Hello"', data_str) + + def test_dumps_typed_type_error(self): + serializer = CompressibleJsonSerializer() + + # Define a class that is not a BaseMessage + class NotSerializable: + pass + + with self.assertRaises(TypeError) as context: + serializer.dumps_typed(NotSerializable()) + + self.assertIn("is not JSON serializable", str(context.exception)) diff --git a/chat/test/persistence/test_s3_checkpointer.py b/chat/test/persistence/test_s3_checkpointer.py new file mode 100644 index 00000000..20d1bbb6 --- /dev/null +++ b/chat/test/persistence/test_s3_checkpointer.py @@ -0,0 +1,656 @@ +# ruff: noqa: E402 +import sys +sys.path.append("./src") + +import pytest +from unittest import TestCase + +import boto3 +import json +import time +from moto import mock_aws +from langchain_core.runnables import RunnableConfig +from langgraph.checkpoint.base import ( + Checkpoint, + CheckpointMetadata, +) +from typing import Optional +from persistence.s3_checkpointer import S3Checkpointer + +import bz2 +import base64 +import gzip + +BUCKET_NAME = "mybucket" +REGION = "us-east-1" +THREAD_ID = "thread1" +CHECKPOINT_NAMESPACE = "" +CHECKPOINT_ID_1 = "checkpoint1" +CHECKPOINT_ID_2 = "checkpoint2" + +CHECKPOINTS = [ + { + "id": CHECKPOINT_ID_1, + "key": "checkpoints/thread1/__default__/checkpoint1/checkpoint.json", + "body": json.dumps( + { + "checkpoint_type": "json", + "checkpoint_data": "{}", + "metadata_data": "{}", + "parent_checkpoint_id": None, + "timestamp": int(time.time() * 1000), + } + ), + }, + { + "id": CHECKPOINT_ID_2, + "key": "checkpoints/thread1/__default__/checkpoint2/checkpoint.json", + "body": json.dumps( + { + "checkpoint_type": "json", + "checkpoint_data": "{}", + "metadata_data": "{}", + "parent_checkpoint_id": CHECKPOINT_ID_1, + "timestamp": int(time.time() * 1000), + } + ), + }, +] + + +@mock_aws +@pytest.mark.filterwarnings("ignore::DeprecationWarning") +class TestS3Checkpointer(TestCase): + def setUp(self): + """Initialize the mock S3 bucket and S3Checkpointer instance before each test.""" + self.s3 = boto3.client("s3", region_name=REGION) + self.s3.create_bucket(Bucket=BUCKET_NAME) + self.checkpointer = S3Checkpointer(bucket_name=BUCKET_NAME, region_name=REGION) + + def tearDown(self): + """Clean up after each test.""" + self.checkpointer.delete_checkpoints(THREAD_ID) + + def setup_s3_bucket(self): + """Upload sample checkpoints to the mock S3 bucket.""" + for checkpoint in CHECKPOINTS: + self.s3.put_object( + Bucket=BUCKET_NAME, + Key=checkpoint["key"], + Body=checkpoint["body"], + ) + + def create_config(self, checkpoint_id: Optional[str] = None) -> RunnableConfig: + """Helper method to create RunnableConfig.""" + config_data = { + "configurable": { + "thread_id": THREAD_ID, + "checkpoint_ns": CHECKPOINT_NAMESPACE, + } + } + if checkpoint_id: + config_data["configurable"]["checkpoint_id"] = checkpoint_id + return RunnableConfig(config_data) + + # + # Basic Put and Get Checkpoints + # + + def test_put_checkpoint(self): + """Test that S3Checkpointer.put correctly saves a checkpoint to S3.""" + new_checkpoint = Checkpoint(id="checkpoint3") + metadata = CheckpointMetadata() + config = self.create_config() + + returned_config = self.checkpointer.put(config, new_checkpoint, metadata, {}) + + self.assertEqual(returned_config["configurable"]["checkpoint_id"], "checkpoint3") + expected_key = ( + f"checkpoints/{THREAD_ID}/__default__/checkpoint3/checkpoint.json" + ) + response = self.s3.get_object(Bucket=BUCKET_NAME, Key=expected_key) + body = json.loads(response["Body"].read().decode("utf-8")) + + self.assertEqual(body["checkpoint_type"], "json") + checkpoint_data = json.loads(body["checkpoint_data"]) + self.assertEqual(checkpoint_data["id"], "checkpoint3") + self.assertEqual(body["metadata_data"], "{}") + assert body["parent_checkpoint_id"] is None + assert "timestamp" in body + + def test_put_overwrite_checkpoint(self): + """Test that putting a checkpoint with an existing ID overwrites it.""" + initial_checkpoint = Checkpoint(id="checkpoint6") + initial_metadata = CheckpointMetadata() + config = self.create_config() + self.checkpointer.put(config, initial_checkpoint, initial_metadata, {}) + + updated_checkpoint = Checkpoint(id="checkpoint6") + updated_metadata = CheckpointMetadata() + self.checkpointer.put(config, updated_checkpoint, updated_metadata, {}) + + checkpoint_tuple = self.checkpointer.get_tuple(config) + assert checkpoint_tuple is not None + self.assertEqual(checkpoint_tuple.config["configurable"]["checkpoint_id"], "checkpoint6") + + def test_put_invalid_checkpoint(self): + """Test putting an invalid checkpoint raises appropriate errors.""" + with self.assertRaises(KeyError): + invalid_checkpoint = {} + config = self.create_config() + self.checkpointer.put(config, invalid_checkpoint, CheckpointMetadata(), {}) + + def test_get_tuple(self): + """Test that S3Checkpointer.get_tuple correctly retrieves a checkpoint tuple.""" + self.setup_s3_bucket() + config = self.create_config(checkpoint_id=CHECKPOINT_ID_2) + checkpoint_tuple = self.checkpointer.get_tuple(config) + + assert checkpoint_tuple is not None + assert ( + checkpoint_tuple.config["configurable"]["checkpoint_id"] == CHECKPOINT_ID_2 + ) + self.assertEqual(checkpoint_tuple.checkpoint, {}) + self.assertEqual(checkpoint_tuple.metadata, {}) + assert checkpoint_tuple.parent_config is not None + assert ( + checkpoint_tuple.parent_config["configurable"]["checkpoint_id"] + == CHECKPOINT_ID_1 + ) + self.assertEqual(checkpoint_tuple.pending_writes, []) + + def test_get_tuple_nonexistent_checkpoint(self): + """Test retrieving a checkpoint tuple that does not exist.""" + config = self.create_config(checkpoint_id="nonexistent") + checkpoint_tuple = self.checkpointer.get_tuple(config) + assert checkpoint_tuple is None + + def test_get_tuple_no_checkpoint_id_no_existing_checkpoints(self): + """Test get_tuple with no checkpoint_id and no existing checkpoints.""" + config = self.create_config() + result = self.checkpointer.get_tuple(config) + assert result is None + + def test_get_tuple_missing_metadata(self): + """Test get_tuple when metadata is missing.""" + key = f"checkpoints/{THREAD_ID}/__default__/missing_meta/checkpoint.json" + checkpoint_body = json.dumps( + { + "checkpoint_type": "json", + "checkpoint_data": "{}", + # "metadata_data": "{}" is intentionally omitted + "parent_checkpoint_id": None, + "timestamp": int(time.time() * 1000), + } + ) + self.s3.put_object(Bucket=BUCKET_NAME, Key=key, Body=checkpoint_body) + + config = self.create_config(checkpoint_id="missing_meta") + with self.assertRaises(ValueError) as context: + self.checkpointer.get_tuple(config) + + self.assertIn("Metadata is missing", str(context.exception)) + # + # Writes (Pending Writes) Tests + # + + def test_put_writes(self): + """Test that S3Checkpointer.put_writes correctly saves writes to S3.""" + checkpoint = Checkpoint(id="checkpoint4") + metadata = CheckpointMetadata() + config = self.create_config() + returned_config = self.checkpointer.put(config, checkpoint, metadata, {}) + + writes = [ + ("channel1", {"data": "value1"}), + ("channel2", {"data": "value2"}), + ] + task_id = "task123" + self.checkpointer.put_writes(returned_config, writes, task_id) + + for idx, (channel, value) in enumerate(writes): + write_key = f"checkpoints/{THREAD_ID}/__default__/checkpoint4/writes/{task_id}/{idx}.json" + response = self.s3.get_object(Bucket=BUCKET_NAME, Key=write_key) + body = json.loads(response["Body"].read().decode("utf-8")) + self.assertEqual(body["channel"], channel) + self.assertEqual(body["type"], "json") + self.assertEqual(body["value"], json.dumps(value)) + assert "timestamp" in body + + def test_put_writes_empty(self): + """Test putting an empty list of writes.""" + checkpoint = Checkpoint(id="checkpoint_empty_writes") + metadata = CheckpointMetadata() + config = self.create_config() + returned_config = self.checkpointer.put(config, checkpoint, metadata, {}) + self.checkpointer.put_writes(returned_config, [], "task_empty") + + checkpoint_tuple = self.checkpointer.get_tuple(returned_config) + assert checkpoint_tuple is not None + self.assertEqual(checkpoint_tuple.pending_writes, []) + + def test_put_writes_multiple_tasks(self): + """Test putting writes from multiple tasks.""" + checkpoint = Checkpoint(id="checkpoint_multi_tasks") + metadata = CheckpointMetadata() + config = self.create_config() + returned_config = self.checkpointer.put(config, checkpoint, metadata, {}) + + writes_task1 = [ + ("channel1", {"data": "task1_value1"}), + ("channel2", {"data": "task1_value2"}), + ] + writes_task2 = [ + ("channel1", {"data": "task2_value1"}), + ] + + self.checkpointer.put_writes(returned_config, writes_task1, "task1") + self.checkpointer.put_writes(returned_config, writes_task2, "task2") + + checkpoint_tuple = self.checkpointer.get_tuple(returned_config) + assert checkpoint_tuple is not None + self.assertEqual(len(checkpoint_tuple.pending_writes), 3) + + task1_writes = [w for w in checkpoint_tuple.pending_writes if w[0] == "task1"] + self.assertEqual(len(task1_writes), 2) + self.assertEqual(task1_writes[0][1], "channel1") + self.assertEqual(task1_writes[0][2], {"data": "task1_value1"}) + self.assertEqual(task1_writes[1][1], "channel2") + self.assertEqual(task1_writes[1][2], {"data": "task1_value2"}) + + task2_writes = [w for w in checkpoint_tuple.pending_writes if w[0] == "task2"] + self.assertEqual(len(task2_writes), 1) + self.assertEqual(task2_writes[0][1], "channel1") + self.assertEqual(task2_writes[0][2], {"data": "task2_value1"}) + + def test_get_tuple_with_writes(self): + """Test retrieving a checkpoint tuple that includes pending writes.""" + checkpoint = Checkpoint(id="checkpoint5") + metadata = CheckpointMetadata() + config = self.create_config() + returned_config = self.checkpointer.put(config, checkpoint, metadata, {}) + + writes = [ + ("channelA", {"info": "dataA"}), + ("channelB", {"info": "dataB"}), + ] + task_id = "task456" + self.checkpointer.put_writes(returned_config, writes, task_id) + + checkpoint_tuple = self.checkpointer.get_tuple(returned_config) + assert checkpoint_tuple is not None + self.assertEqual(checkpoint_tuple.config["configurable"]["checkpoint_id"], "checkpoint5") + self.assertEqual(checkpoint_tuple.checkpoint["id"], "checkpoint5") + self.assertEqual(checkpoint_tuple.metadata, {}) + assert checkpoint_tuple.parent_config is None + self.assertEqual(len(checkpoint_tuple.pending_writes), 2) + for i, (task, channel, value) in enumerate(checkpoint_tuple.pending_writes): + self.assertEqual(task, task_id) + self.assertEqual(channel, writes[i][0]) + self.assertEqual(value, writes[i][1]) + + # + # Listing Checkpoints and Filters + # + + def test_list_checkpoints_with_filters(self): + """Test listing checkpoints with filters like 'before' and 'limit'.""" + self.setup_s3_bucket() + saver = self.checkpointer + config = self.create_config() + + all_checkpoints = list(saver.list(config)) + self.assertEqual(len(all_checkpoints), len(CHECKPOINTS)) + + limited_checkpoints = list(saver.list(config, limit=1)) + self.assertEqual(len(limited_checkpoints), 1) + assert ( + limited_checkpoints[0].config["configurable"]["checkpoint_id"] + == CHECKPOINT_ID_2 + ) + + before_config = self.create_config(checkpoint_id=CHECKPOINT_ID_2) + before_checkpoints = list(saver.list(config, before=before_config)) + self.assertEqual(len(before_checkpoints), 1) + assert ( + before_checkpoints[0].config["configurable"]["checkpoint_id"] + == CHECKPOINT_ID_1 + ) + + def test_list_no_checkpoints(self): + """Test listing checkpoints when none exist.""" + config = self.create_config() + retrieved_checkpoints = list(self.checkpointer.list(config)) + self.assertEqual(len(retrieved_checkpoints), 0) + + def test_list_with_limit(self): + """Test listing with a limit.""" + self.setup_s3_bucket() + config = self.create_config() + results = list(self.checkpointer.list(config, limit=1)) + self.assertEqual(len(results), 1) + + def test_list_no_config(self): + """Test listing when no config is provided.""" + with self.assertRaises(ValueError) as context: + list(self.checkpointer.list(None)) + + self.assertIn("config must be provided", str(context.exception)) + + def test_list_before_removes_all(self): + """Test listing with a 'before' config that removes all results.""" + self.setup_s3_bucket() + config = self.create_config() + before_config = self.create_config(checkpoint_id="checkpoint0") + results = list(self.checkpointer.list(config, before=before_config)) + self.assertEqual(len(results), 0) + + # + # Parent-Child Checkpoint Relationship + # + + def test_put_and_get_with_parent_checkpoint(self): + """Test putting a checkpoint with a parent and retrieving the parent config.""" + parent_checkpoint = Checkpoint(id="parent_checkpoint") + parent_metadata = CheckpointMetadata() + parent_config = self.create_config() + self.checkpointer.put(parent_config, parent_checkpoint, parent_metadata, {}) + + child_checkpoint = Checkpoint(id="child_checkpoint") + child_metadata = CheckpointMetadata() + child_config = RunnableConfig( + { + "configurable": { + "thread_id": THREAD_ID, + "checkpoint_ns": CHECKPOINT_NAMESPACE, + "checkpoint_id": "parent_checkpoint", + } + } + ) + self.checkpointer.put(child_config, child_checkpoint, child_metadata, {}) + + child_tuple = self.checkpointer.get_tuple( + RunnableConfig( + { + "configurable": { + "thread_id": THREAD_ID, + "checkpoint_ns": CHECKPOINT_NAMESPACE, + "checkpoint_id": "child_checkpoint", + } + } + ) + ) + assert child_tuple is not None + self.assertEqual(child_tuple.config["configurable"]["checkpoint_id"], "child_checkpoint") + assert child_tuple.parent_config is not None + assert ( + child_tuple.parent_config["configurable"]["checkpoint_id"] + == "parent_checkpoint" + ) + + # + # Namespaces + # + + def test_put_with_namespace(self): + """Test putting and retrieving a checkpoint within a specific namespace.""" + namespace = "custom_ns" + config = RunnableConfig( + { + "configurable": { + "thread_id": THREAD_ID, + "checkpoint_ns": namespace, + } + } + ) + checkpoint = Checkpoint(id="checkpoint_ns1") + metadata = CheckpointMetadata() + returned_config = self.checkpointer.put(config, checkpoint, metadata, {}) + + retrieved_tuple = self.checkpointer.get_tuple(returned_config) + assert retrieved_tuple is not None + self.assertEqual(retrieved_tuple.config["configurable"]["checkpoint_ns"], namespace) + assert ( + retrieved_tuple.config["configurable"]["checkpoint_id"] == "checkpoint_ns1" + ) + + retrieved_checkpoints = list(self.checkpointer.list(config)) + self.assertEqual(len(retrieved_checkpoints), 1) + assert ( + retrieved_checkpoints[0].config["configurable"]["checkpoint_id"] + == "checkpoint_ns1" + ) + + def test_list_with_non_default_namespace(self): + """Test listing checkpoints in a non-default namespace.""" + namespace = "ns1" + config = RunnableConfig( + { + "configurable": { + "thread_id": THREAD_ID, + "checkpoint_ns": namespace, + } + } + ) + + checkpoint_ns1 = Checkpoint(id="ns1_ckpt1") + checkpoint_ns2 = Checkpoint(id="ns2_ckpt1") + metadata = CheckpointMetadata() + + self.checkpointer.put(config, checkpoint_ns1, metadata, {}) + + config_ns2 = RunnableConfig( + { + "configurable": { + "thread_id": THREAD_ID, + "checkpoint_ns": "ns2", + } + } + ) + self.checkpointer.put(config_ns2, checkpoint_ns2, metadata, {}) + + retrieved_ns1 = list(self.checkpointer.list(config)) + self.assertEqual(len(retrieved_ns1), 1) + self.assertEqual(retrieved_ns1[0].config["configurable"]["checkpoint_id"], "ns1_ckpt1") + + retrieved_ns2 = list(self.checkpointer.list(config_ns2)) + self.assertEqual(len(retrieved_ns2), 1) + self.assertEqual(retrieved_ns2[0].config["configurable"]["checkpoint_id"], "ns2_ckpt1") + + # + # Compression + # + + def test_put_with_compression(self): + """Test putting a checkpoint with compression enabled.""" + import base64 + + saver_compressed = S3Checkpointer( + bucket_name=BUCKET_NAME, region_name=REGION, compression="gzip" + ) + + checkpoint = Checkpoint(id="checkpoint_compressed") + metadata = CheckpointMetadata() + config = self.create_config() + saver_compressed.put(config, checkpoint, metadata, {}) + + expected_key = ( + f"checkpoints/{THREAD_ID}/__default__/checkpoint_compressed/checkpoint.json" + ) + response = self.s3.get_object(Bucket=BUCKET_NAME, Key=expected_key) + body = json.loads(response["Body"].read().decode("utf-8")) + + checkpoint_data_encoded = body["checkpoint_data"] + checkpoint_data = base64.b64decode(checkpoint_data_encoded) + assert checkpoint_data.startswith(b"\x1f\x8b") # Gzip magic number + + def test_list_bz2_checkpoints(self): + """Test listing a checkpoint where checkpoint_type starts with 'bz2'.""" + compressed_data = base64.b64encode(bz2.compress(b"{}")).decode("utf-8") + key = f"checkpoints/{THREAD_ID}/__default__/bz2_ckpt/checkpoint.json" + data = { + "checkpoint_type": "bz2_json", + "checkpoint_data": compressed_data, + "metadata_data": compressed_data, + "parent_checkpoint_id": None, + "timestamp": int(time.time() * 1000), + } + self.s3.put_object(Bucket=BUCKET_NAME, Key=key, Body=json.dumps(data)) + + config = self.create_config(checkpoint_id="bz2_ckpt") + retrieved_checkpoints = list(self.checkpointer.list(config)) + self.assertEqual(len(retrieved_checkpoints), 1) + self.assertEqual(retrieved_checkpoints[0].checkpoint, {}) + self.assertEqual(retrieved_checkpoints[0].metadata, {}) + + def test_list_gzip_checkpoints(self): + """Test listing a checkpoint where checkpoint_type starts with 'gzip'.""" + compressed_data = base64.b64encode(gzip.compress(b"{}")).decode("utf-8") + key = f"checkpoints/{THREAD_ID}/__default__/gzip_ckpt/checkpoint.json" + data = { + "checkpoint_type": "gzip_json", + "checkpoint_data": compressed_data, + "metadata_data": compressed_data, + "parent_checkpoint_id": None, + "timestamp": int(time.time() * 1000), + } + self.s3.put_object(Bucket=BUCKET_NAME, Key=key, Body=json.dumps(data)) + + config = self.create_config(checkpoint_id="gzip_ckpt") + retrieved_checkpoints = list(self.checkpointer.list(config)) + self.assertEqual(len(retrieved_checkpoints), 1) + self.assertEqual(retrieved_checkpoints[0].checkpoint, {}) + self.assertEqual(retrieved_checkpoints[0].metadata, {}) + + # + # Concurrency + # + + def test_concurrent_puts(self): + """Test concurrent puts to ensure thread safety (basic simulation).""" + import threading + + def put_checkpoint(id_suffix): + checkpoint = Checkpoint(id=f"checkpoint_concurrent_{id_suffix}") + metadata = CheckpointMetadata() + config = self.create_config() + self.checkpointer.put(config, checkpoint, metadata, {}) + + threads = [] + for i in range(5): + t = threading.Thread(target=put_checkpoint, args=(i,)) + threads.append(t) + t.start() + + for t in threads: + t.join() + + config = self.create_config() + retrieved_checkpoints = list(self.checkpointer.list(config)) + expected_ids = {f"checkpoint_concurrent_{i}" for i in range(5)} + retrieved_ids = { + ck.config["configurable"]["checkpoint_id"] for ck in retrieved_checkpoints + } + assert expected_ids.issubset(retrieved_ids) + + # + # Latest Checkpoint ID + # + + def test_get_latest_checkpoint_id(self): + """Test the internal method to get the latest checkpoint ID.""" + self.setup_s3_bucket() + latest_id = self.checkpointer._get_latest_checkpoint_id( + THREAD_ID, CHECKPOINT_NAMESPACE + ) + self.assertEqual(latest_id, CHECKPOINT_ID_2) + + def test_get_latest_checkpoint_id_no_keys(self): + """Test getting the latest checkpoint ID when none exist.""" + latest_id = self.checkpointer._get_latest_checkpoint_id( + THREAD_ID, CHECKPOINT_NAMESPACE + ) + assert latest_id is None + + # + # Deleting Checkpoints + # + + def test_delete_checkpoints(self): + """Test that delete_checkpoints correctly removes all checkpoints for a thread.""" + self.setup_s3_bucket() + config = self.create_config() + retrieved_checkpoints = list(self.checkpointer.list(config)) + self.assertEqual(len(retrieved_checkpoints), len(CHECKPOINTS)) + + self.checkpointer.delete_checkpoints(THREAD_ID) + retrieved_after_delete = list(self.checkpointer.list(config)) + self.assertEqual(len(retrieved_after_delete), 0) + + def test_delete_checkpoints_many(self): + """Test deleting multiple checkpoints in batches.""" + for i in range(3): + ckpt = Checkpoint(id=f"ckpt_del_{i}") + metadata = CheckpointMetadata() + config = self.create_config() + self.checkpointer.put(config, ckpt, metadata, {}) + + self.checkpointer.delete_checkpoints(THREAD_ID) + retrieved_after_delete = list(self.checkpointer.list(self.create_config())) + self.assertEqual(len(retrieved_after_delete), 0) + + # + # Invalid Key Formats and Other Edge Cases + # + + def test_load_pending_writes_invalid_key_format(self): + """Test _load_pending_writes handling invalid write key formats.""" + checkpoint = Checkpoint(id="ckpt_invalid_write") + metadata = CheckpointMetadata() + config = self.create_config() + returned_config = self.checkpointer.put(config, checkpoint, metadata, {}) + + invalid_write_key = f"checkpoints/{THREAD_ID}/__default__/ckpt_invalid_write/writes/invalid.json" + self.s3.put_object(Bucket=BUCKET_NAME, Key=invalid_write_key, Body="{}") + + tuple_result = self.checkpointer.get_tuple(returned_config) + assert tuple_result is not None + # No valid writes parsed due to invalid format + self.assertEqual(tuple_result.pending_writes, []) + + def test_invalid_checkpoint_key_format(self): + """Test handling of invalid checkpoint key formats.""" + invalid_key = "checkpoints/thread1/__default__/invalid_format.json" + self.s3.put_object( + Bucket=BUCKET_NAME, + Key=invalid_key, + Body='{"invalid": "data"}', + ) + + config = self.create_config() + with self.assertRaises(ValueError) as context: + list(self.checkpointer.list(config)) + + self.assertIn("Invalid checkpoint key format", str(context.exception)) + + @pytest.mark.slow + def test_delete_checkpoints_large_batch(self): + """Test deleting more than 1000 checkpoints to verify batch deletion logic.""" + # Create 1001 objects to force batch deletion + for i in range(1001): + ckpt = Checkpoint(id=f"ckpt_del_{i}") + metadata = CheckpointMetadata() + config = self.create_config() + self.checkpointer.put(config, ckpt, metadata, {}) + + # Verify objects were created + config = self.create_config() + retrieved_before_delete = list(self.checkpointer.list(config)) + self.assertEqual(len(retrieved_before_delete), 1001) + + # Delete all checkpoints + self.checkpointer.delete_checkpoints(THREAD_ID) + + # Verify all objects were deleted + retrieved_after_delete = list(self.checkpointer.list(config)) + self.assertEqual(len(retrieved_after_delete), 0) \ No newline at end of file diff --git a/chat/test/search/__init__.py b/chat/test/search/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/chat/test/helpers/test_hybrid_query.py b/chat/test/search/test_hybrid_query.py similarity index 89% rename from chat/test/helpers/test_hybrid_query.py rename to chat/test/search/test_hybrid_query.py index 4e38861e..7f104955 100644 --- a/chat/test/helpers/test_hybrid_query.py +++ b/chat/test/search/test_hybrid_query.py @@ -1,9 +1,6 @@ -import sys -from helpers.hybrid_query import hybrid_query +from search.hybrid_query import hybrid_query from unittest import TestCase -sys.path.append('./src') - class TestFunction(TestCase): def test_hybrid_query(self): dsl = hybrid_query("Question?", "MODEL_ID", k=10) diff --git a/chat/test/search/test_opensearch_neural_search.py b/chat/test/search/test_opensearch_neural_search.py new file mode 100644 index 00000000..ceb7ee72 --- /dev/null +++ b/chat/test/search/test_opensearch_neural_search.py @@ -0,0 +1,161 @@ +# ruff: noqa: E402 +from unittest import TestCase +from unittest.mock import Mock, patch +from opensearchpy import ConnectionError, AuthenticationException, NotFoundError +from search.opensearch_neural_search import OpenSearchNeuralSearch +from langchain_core.documents import Document + +class MockClient(): + def search(self, index, body, params): + return { + "hits": { + "hits": [ + { + "_source": { + "id": "test" + }, + "_score": 0.12345 + } + ] + } + } + +class MockErrorClient(): + def search(self, index, body, params): + raise ConnectionError("Failed to connect to OpenSearch") + +class TestOpenSearchNeuralSearch(TestCase): + def setUp(self): + self.search = OpenSearchNeuralSearch( + client=MockClient(), + endpoint="test", + index="test", + model_id="test" + ) + + self.error_search = OpenSearchNeuralSearch( + client=MockErrorClient(), + endpoint="test", + index="test", + model_id="test" + ) + + def test_similarity_search(self): + docs = self.search.similarity_search( + query="test", + subquery={"_source": {"excludes": ["embedding"]}}, + size=10 + ) + self.assertEqual( + docs, + [Document(page_content='test', metadata={'id': 'test'})] + ) + + def test_similarity_search_connection_error(self): + with self.assertRaises(ConnectionError): + self.error_search.similarity_search(query="test") + + @patch('opensearchpy.OpenSearch') + def test_similarity_search_auth_error(self, mock_opensearch): + mock_opensearch.return_value.search.side_effect = AuthenticationException( + "Authentication failed" + ) + search = OpenSearchNeuralSearch( + client=mock_opensearch.return_value, + endpoint="test", + index="test", + model_id="test" + ) + with self.assertRaises(AuthenticationException): + search.similarity_search(query="test") + + def test_similarity_search_with_score(self): + docs = self.search.similarity_search_with_score(query="test") + self.assertEqual( + docs, + [(Document(page_content='test', metadata={'id': 'test'}), 0.12345)] + ) + + def test_similarity_search_with_score_connection_error(self): + with self.assertRaises(ConnectionError): + self.error_search.similarity_search_with_score(query="test") + + @patch('opensearchpy.OpenSearch') + def test_aggregations_search_index_not_found(self, mock_opensearch): + mock_opensearch.return_value.search.side_effect = NotFoundError( + 404, + "index_not_found_exception", + {"error": "index not found"} + ) + search = OpenSearchNeuralSearch( + client=mock_opensearch.return_value, + endpoint="test", + index="test", + model_id="test" + ) + with self.assertRaises(NotFoundError): + search.aggregations_search(agg_field="test_field") + + def test_aggregations_search_connection_error(self): + with self.assertRaises(ConnectionError): + self.error_search.aggregations_search(agg_field="test_field") + + def test_add_texts_exception(self): + # Test to ensure the exception handler works + with self.assertRaises(AssertionError) as context: + search = self.search + search.add_texts = Mock(side_effect=Exception("Test exception")) + try: + search.add_texts(texts=["test"], metadatas=[{"id": "test"}]) + except Exception as e: + self.fail(f"add_texts raised an exception: {e}") + + self.assertTrue("add_texts raised an exception: Test exception" in str(context.exception)) + + def test_from_texts_exception(self): + with self.assertRaises(AssertionError) as context: + OpenSearchNeuralSearch.from_texts = Mock(side_effect=Exception("Test exception")) + try: + OpenSearchNeuralSearch.from_texts(texts=["test"], metadatas=[{"id": "test"}]) + except Exception as e: + self.fail(f"from_texts raised an exception: {e}") + + self.assertTrue("from_texts raised an exception: Test exception" in str(context.exception)) + + def test_client_initialization_error(self): + with self.assertRaises(ValueError): + OpenSearchNeuralSearch( + endpoint="", # Empty endpoint should raise ValueError + index="test", + model_id="test", + client=None + ) + + def test_add_texts_does_nothing(self): + """Test that add_texts method exists but does nothing.""" + try: + # Call add_texts with some sample data + result = self.search.add_texts( + texts=["test1", "test2"], + metadatas=[{"id": "1"}, {"id": "2"}] + ) + # Method should return None + self.assertIsNone(result) + except Exception as e: + self.fail(f"add_texts raised an unexpected exception: {e}") + + def test_from_texts_does_nothing(self): + """Test that from_texts classmethod exists but does nothing.""" + try: + # Call from_texts with some sample data + result = OpenSearchNeuralSearch.from_texts( + texts=["test1", "test2"], + metadatas=[{"id": "1"}, {"id": "2"}], + endpoint="test", + index="test", + model_id="test" + ) + # Method should return None + self.assertIsNone(result) + except Exception as e: + self.fail(f"from_texts raised an unexpected exception: {e}") \ No newline at end of file diff --git a/chat/test/test_event_config.py b/chat/test/test_event_config.py deleted file mode 100644 index 0d1a4654..00000000 --- a/chat/test/test_event_config.py +++ /dev/null @@ -1,95 +0,0 @@ -# ruff: noqa: E402 -import json -import os -import sys -sys.path.append('./src') - -from event_config import EventConfig -from unittest import TestCase, mock - - -class TestEventConfigWithoutAzureResource(TestCase): - def test_requires_an_azure_resource(self): - with self.assertRaises(EnvironmentError): - EventConfig() - - -@mock.patch.dict( - os.environ, - { - "AZURE_OPENAI_RESOURCE_NAME": "test", - }, -) -class TestEventConfig(TestCase): - def test_fetches_attributes_from_vector_database(self): - os.environ.pop("AZURE_OPENAI_RESOURCE_NAME", None) - with self.assertRaises(EnvironmentError): - EventConfig() - - def test_defaults(self): - actual = EventConfig(event={"body": json.dumps({"attributes": ["title"]})}) - expected_defaults = {"azure_endpoint": "https://test.openai.azure.com/"} - self.assertEqual(actual.azure_endpoint, expected_defaults["azure_endpoint"]) - - def test_attempt_override_without_superuser_status(self): - actual = EventConfig( - event={ - "body": json.dumps( - { - "azure_resource_name": "new_name_for_test", - "attributes": ["title", "subject", "date_created"], - "index": "testIndex", - "k": 100, - "openai_api_version": "2024-01-01", - "question": "test question", - "ref": "test ref", - "size": 90, - "temperature": 0.9, - "text_key": "accession_number", - } - ) - } - ) - expected_output = { - "attributes": EventConfig.DEFAULT_ATTRIBUTES, - "azure_endpoint": "https://test.openai.azure.com/", - "k": 40, - "openai_api_version": "2024-02-01", - "question": "test question", - "size": 20, - "ref": "test ref", - "temperature": 0.2, - "text_key": "id", - } - self.assertEqual(actual.azure_endpoint, expected_output["azure_endpoint"]) - self.assertEqual(actual.attributes, expected_output["attributes"]) - self.assertEqual(actual.k, expected_output["k"]) - self.assertEqual( - actual.openai_api_version, expected_output["openai_api_version"] - ) - self.assertEqual(actual.question, expected_output["question"]) - self.assertEqual(actual.ref, expected_output["ref"]) - self.assertEqual(actual.temperature, expected_output["temperature"]) - self.assertEqual(actual.text_key, expected_output["text_key"]) - - def test_debug_message(self): - self.assertEqual( - EventConfig( - event={"body": json.dumps({"attributes": ["source"]})} - ).debug_message()["type"], - "debug", - ) - - def test_to_bool(self): - self.assertEqual(EventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool(""), False) - self.assertEqual(EventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("0"), False) - self.assertEqual(EventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("no"), False) - self.assertEqual(EventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("false"), False) - self.assertEqual(EventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("False"), False) - self.assertEqual(EventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("FALSE"), False) - self.assertEqual(EventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("no"), False) - self.assertEqual(EventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("No"), False) - self.assertEqual(EventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("NO"), False) - self.assertEqual(EventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool("true"), True) - self.assertEqual(EventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool(True), True) - self.assertEqual(EventConfig(event={"body": json.dumps({"attributes": ["source"]})})._to_bool(False), False) diff --git a/chat/test/test_websocket.py b/chat/test/test_websocket.py deleted file mode 100644 index 4d4d8b76..00000000 --- a/chat/test/test_websocket.py +++ /dev/null @@ -1,18 +0,0 @@ -# ruff: noqa: E402 -import sys -sys.path.append('./src') - -from unittest import TestCase -from websocket import Websocket - - -class MockClient: - def post_to_connection(self, Data, ConnectionId): - return Data - -class TestWebsocket(TestCase): - def test_post_to_connection(self): - websocket = Websocket(client=MockClient(), connection_id="test_connection_id", ref="test_ref") - message = "test_message" - expected = {"message": "test_message", "ref": "test_ref"} - self.assertEqual(websocket.send(message), expected) \ No newline at end of file