From f999d26d8cec7a2fc08c82630c09cdc7f0fba4d3 Mon Sep 17 00:00:00 2001 From: James Kent Date: Sun, 18 Oct 2026 15:50:34 -0500 Subject: [PATCH 1/3] MetadataSource: publisher_page, a held copy's web page at its publisher An HTML copy read from the publisher's site (ingestion's ACE pages) states its own rights in dc.rights or prism.copyright metadata, or in the copyright line it prints. No MetadataSource value names that source, so a licence read there cannot say who stated it. Co-Authored-By: Claude Opus 5.5 --- src/study_schema/jsonschema/coordinate-parse.schema.json | 1 + src/study_schema/jsonschema/parsed-paper.schema.json | 1 + src/study_schema/jsonschema/storage-study.schema.json | 1 + .../linkml/neuroimaging-study-storage/license.yaml | 5 +++++ src/study_schema/models/paper_parse.py | 4 ++++ src/study_schema/models/storage.py | 4 ++++ 6 files changed, 16 insertions(+) diff --git a/src/study_schema/jsonschema/coordinate-parse.schema.json b/src/study_schema/jsonschema/coordinate-parse.schema.json index 4272b41..044d8e7 100644 --- a/src/study_schema/jsonschema/coordinate-parse.schema.json +++ b/src/study_schema/jsonschema/coordinate-parse.schema.json @@ -1203,6 +1203,7 @@ "jats", "elsevier", "pmc_cloud", + "publisher_page", "pubmed", "crossref", "openalex", diff --git a/src/study_schema/jsonschema/parsed-paper.schema.json b/src/study_schema/jsonschema/parsed-paper.schema.json index 8c355f4..fe45c63 100644 --- a/src/study_schema/jsonschema/parsed-paper.schema.json +++ b/src/study_schema/jsonschema/parsed-paper.schema.json @@ -1203,6 +1203,7 @@ "jats", "elsevier", "pmc_cloud", + "publisher_page", "pubmed", "crossref", "openalex", diff --git a/src/study_schema/jsonschema/storage-study.schema.json b/src/study_schema/jsonschema/storage-study.schema.json index fea5316..08bcede 100644 --- a/src/study_schema/jsonschema/storage-study.schema.json +++ b/src/study_schema/jsonschema/storage-study.schema.json @@ -3058,6 +3058,7 @@ "jats", "elsevier", "pmc_cloud", + "publisher_page", "pubmed", "crossref", "openalex", diff --git a/src/study_schema/linkml/neuroimaging-study-storage/license.yaml b/src/study_schema/linkml/neuroimaging-study-storage/license.yaml index 86c6a94..5a30819 100644 --- a/src/study_schema/linkml/neuroimaging-study-storage/license.yaml +++ b/src/study_schema/linkml/neuroimaging-study-storage/license.yaml @@ -164,6 +164,11 @@ enums: pmc_cloud: in_subset: [mvp, deterministic] description: PubMed Central's cloud record of a held copy. + publisher_page: + in_subset: [mvp, deterministic] + description: >- + A held copy's web page at its publisher: the rights metadata it carries + (`dc.rights`, `prism.copyright`) or the copyright line it prints. pubmed: in_subset: [mvp, deterministic] crossref: diff --git a/src/study_schema/models/paper_parse.py b/src/study_schema/models/paper_parse.py index 94f88a6..a1d5186 100644 --- a/src/study_schema/models/paper_parse.py +++ b/src/study_schema/models/paper_parse.py @@ -583,6 +583,10 @@ class MetadataSource(str, Enum): """ PubMed Central's cloud record of a held copy. """ + publisher_page = "publisher_page" + """ + A held copy's web page at its publisher: the rights metadata it carries (`dc.rights`, `prism.copyright`) or the copyright line it prints. + """ pubmed = "pubmed" crossref = "crossref" openalex = "openalex" diff --git a/src/study_schema/models/storage.py b/src/study_schema/models/storage.py index 0dd3fe5..ca9df5e 100644 --- a/src/study_schema/models/storage.py +++ b/src/study_schema/models/storage.py @@ -809,6 +809,10 @@ class MetadataSource(str, Enum): """ PubMed Central's cloud record of a held copy. """ + publisher_page = "publisher_page" + """ + A held copy's web page at its publisher: the rights metadata it carries (`dc.rights`, `prism.copyright`) or the copyright line it prints. + """ pubmed = "pubmed" crossref = "crossref" openalex = "openalex" From 6bcc0650c351503f2e70149abfe1b8217abbed94 Mon Sep 17 00:00:00 2001 From: James Kent Date: Sun, 18 Oct 2026 16:54:11 -0500 Subject: [PATCH 2/3] publisher_page: example from a ScienceDirect page, and the user licence in its description The example carries the sa-user-license line of an ACE-scraped ScienceDirect page (PMID 32664016), so dropping publisher_page from the enum fails the suite. Co-Authored-By: Claude Sonnet 5.5 --- .../licenses/publisher_page_user_license.json | 34 +++++++++++++++++++ .../neuroimaging-study-storage/license.yaml | 3 +- src/study_schema/models/paper_parse.py | 2 +- src/study_schema/models/storage.py | 2 +- tests/test_licensing.py | 1 + 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 examples/licenses/publisher_page_user_license.json diff --git a/examples/licenses/publisher_page_user_license.json b/examples/licenses/publisher_page_user_license.json new file mode 100644 index 0000000..3928ce0 --- /dev/null +++ b/examples/licenses/publisher_page_user_license.json @@ -0,0 +1,34 @@ +{ + "identifiers": { + "pmid": "32664016", + "pmcid": null, + "doi": "10.1016/j.jad.2020.05.145", + "preprint_dois": null, + "preprint_pmid": null, + "preprint_pmcid": null, + "publication_status": "published" + }, + "text_copy": { + "route": "publisher", + "version": "vor", + "access": "public", + "url": "https://doi.org/10.1016/j.jad.2020.05.145", + "license": { + "license_id": "other", + "determination": "stated", + "stated_by": "publisher_page", + "stated_as": "http://creativecommons.org/licenses/by-nc-nd/4.0/" + } + }, + "bibliography": { + "title": "Alterations of regional homogeneity in Parkinson's disease with “pure” apathy: A resting-state fMRI study", + "journal": "Journal of Affective Disorders", + "publication_year": 2020, + "license": { + "license_id": "all-rights-reserved", + "determination": "assumed" + }, + "oa_status": "closed", + "provider": "pubmed" + } +} diff --git a/src/study_schema/linkml/neuroimaging-study-storage/license.yaml b/src/study_schema/linkml/neuroimaging-study-storage/license.yaml index 5a30819..af8e10f 100644 --- a/src/study_schema/linkml/neuroimaging-study-storage/license.yaml +++ b/src/study_schema/linkml/neuroimaging-study-storage/license.yaml @@ -168,7 +168,8 @@ enums: in_subset: [mvp, deterministic] description: >- A held copy's web page at its publisher: the rights metadata it carries - (`dc.rights`, `prism.copyright`) or the copyright line it prints. + (`dc.rights`, `prism.copyright`), the copyright line it prints, or the user + licence it names. pubmed: in_subset: [mvp, deterministic] crossref: diff --git a/src/study_schema/models/paper_parse.py b/src/study_schema/models/paper_parse.py index a1d5186..dad99f3 100644 --- a/src/study_schema/models/paper_parse.py +++ b/src/study_schema/models/paper_parse.py @@ -585,7 +585,7 @@ class MetadataSource(str, Enum): """ publisher_page = "publisher_page" """ - A held copy's web page at its publisher: the rights metadata it carries (`dc.rights`, `prism.copyright`) or the copyright line it prints. + A held copy's web page at its publisher: the rights metadata it carries (`dc.rights`, `prism.copyright`), the copyright line it prints, or the user licence it names. """ pubmed = "pubmed" crossref = "crossref" diff --git a/src/study_schema/models/storage.py b/src/study_schema/models/storage.py index ca9df5e..23ee9a4 100644 --- a/src/study_schema/models/storage.py +++ b/src/study_schema/models/storage.py @@ -811,7 +811,7 @@ class MetadataSource(str, Enum): """ publisher_page = "publisher_page" """ - A held copy's web page at its publisher: the rights metadata it carries (`dc.rights`, `prism.copyright`) or the copyright line it prints. + A held copy's web page at its publisher: the rights metadata it carries (`dc.rights`, `prism.copyright`), the copyright line it prints, or the user licence it names. """ pubmed = "pubmed" crossref = "crossref" diff --git a/tests/test_licensing.py b/tests/test_licensing.py index f19c2a9..ba8d9bc 100644 --- a/tests/test_licensing.py +++ b/tests/test_licensing.py @@ -22,6 +22,7 @@ "tdm_manuscript_of_open_article": (False, True), "preprint_only": (True, True), "assumed_all_rights_reserved": (False, False), + "publisher_page_user_license": (False, False), } # Refused by the models and the JSON Schema alike. INVALID = { From 88038e5c7c7196034a1d2134e3221a6347e297fe Mon Sep 17 00:00:00 2001 From: James Kent Date: Sun, 18 Oct 2026 16:59:51 -0500 Subject: [PATCH 3/3] publisher_page example: CC id for the CC URL, accepted manuscript, access unrecorded The page says openaccessArticle false and entitlementReason subscription, and its sa-start-date is 12 months after the 2020-06-04 version of record, so the self-archiving licence covers the accepted manuscript. ACE copies have access unrecorded. Co-Authored-By: Claude Sonnet 5.5 --- examples/licenses/publisher_page_user_license.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/licenses/publisher_page_user_license.json b/examples/licenses/publisher_page_user_license.json index 3928ce0..83e4c2d 100644 --- a/examples/licenses/publisher_page_user_license.json +++ b/examples/licenses/publisher_page_user_license.json @@ -10,11 +10,11 @@ }, "text_copy": { "route": "publisher", - "version": "vor", - "access": "public", + "version": "am", + "access": "unrecorded", "url": "https://doi.org/10.1016/j.jad.2020.05.145", "license": { - "license_id": "other", + "license_id": "cc-by-nc-nd", "determination": "stated", "stated_by": "publisher_page", "stated_as": "http://creativecommons.org/licenses/by-nc-nd/4.0/"